From 0f6ad79c8cf05b1ba98e6ba6b9f722b8af3ce5f3 Mon Sep 17 00:00:00 2001
From: xjs <1294405880@qq.com>
Date: Sun, 17 Apr 2022 15:10:49 +0800
Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E5=B7=A5=E4=BD=9C=E6=B5=81=E5=9F=BA?=
=?UTF-8?q?=E6=9C=AC=E4=BB=A3=E7=A0=81=E7=BC=96=E5=86=99=202=E3=80=81?=
=?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=BC=95=E5=85=A5=E5=B7=A5=E4=BD=9C=E6=B5=81?=
=?UTF-8?q?maven=E4=B8=ADmybatis=E4=BE=9D=E8=B5=96=E5=86=B2=E7=AA=81?=
=?UTF-8?q?=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../core/utils/file}/FileUploadUtils.java | 392 +++++++++---------
.../service/AliyunOssFileServiceImpl.java | 2 +-
.../file/service/FtpSysFileServiceImpl.java | 2 +-
.../file/service/LocalSysFileServiceImpl.java | 8 +-
.../file/service/MinioSysFileServiceImpl.java | 6 +-
xjs-business/xjs-business-workflow/pom.xml | 9 +
.../controller/ActivitiHistoryController.java | 34 ++
.../controller/HistoryFormDataCoroller.java | 24 ++
.../ProcessDefinitionController.java | 143 +++++++
.../activiti/controller/TaskController.java | 57 +++
.../activiti/domain/ActWorkflowFormData.java | 149 +++++++
.../xjs/activiti/domain/dto/ActTaskDTO.java | 99 +++++
.../domain/dto/ActWorkflowFormDataDTO.java | 85 ++++
.../domain/dto/ActivitiHighLineDTO.java | 48 +++
.../activiti/domain/dto/DefinitionIdDTO.java | 37 ++
.../activiti/domain/dto/HistoryDataDTO.java | 49 +++
.../domain/dto/HistoryFormDataDTO.java | 36 ++
.../domain/dto/ProcessDefinitionDTO.java | 118 ++++++
.../activiti/domain/vo/ActReDeploymentVO.java | 30 ++
.../mapper/ActReDeploymentMapper.java | 24 ++
.../mapper/ActWorkflowFormDataMapper.java | 83 ++++
.../xjs/activiti/service/IActTaskService.java | 43 ++
.../service/IActWorkflowFormDataService.java | 72 ++++
.../service/IActivitiHistoryService.java | 19 +
.../service/IFormHistoryDataService.java | 22 +
.../service/IProcessDefinitionService.java | 85 ++++
.../service/impl/ActTaskServiceImpl.java | 133 ++++++
.../impl/ActWorkflowFormDataServiceImpl.java | 105 +++++
.../impl/ActivitiHistoryServiceImpl.java | 132 ++++++
.../impl/FormHistoryDataServiceImpl.java | 53 +++
.../impl/ProcessDefinitionServiceImpl.java | 147 +++++++
.../mapper/activiti/ActReDeploymentMapper.xml | 28 ++
.../activiti/ActWorkflowFormDataMapper.xml | 118 ++++++
.../main/resources/mybatis/mybatis-config.xml | 15 +
34 files changed, 2202 insertions(+), 205 deletions(-)
rename {ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/utils => ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file}/FileUploadUtils.java (95%)
create mode 100644 xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/controller/ActivitiHistoryController.java
create mode 100644 xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/controller/HistoryFormDataCoroller.java
create mode 100644 xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/controller/ProcessDefinitionController.java
create mode 100644 xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/controller/TaskController.java
create mode 100644 xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/ActWorkflowFormData.java
create mode 100644 xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/dto/ActTaskDTO.java
create mode 100644 xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/dto/ActWorkflowFormDataDTO.java
create mode 100644 xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/dto/ActivitiHighLineDTO.java
create mode 100644 xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/dto/DefinitionIdDTO.java
create mode 100644 xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/dto/HistoryDataDTO.java
create mode 100644 xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/dto/HistoryFormDataDTO.java
create mode 100644 xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/dto/ProcessDefinitionDTO.java
create mode 100644 xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/vo/ActReDeploymentVO.java
create mode 100644 xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/mapper/ActReDeploymentMapper.java
create mode 100644 xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/mapper/ActWorkflowFormDataMapper.java
create mode 100644 xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/IActTaskService.java
create mode 100644 xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/IActWorkflowFormDataService.java
create mode 100644 xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/IActivitiHistoryService.java
create mode 100644 xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/IFormHistoryDataService.java
create mode 100644 xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/IProcessDefinitionService.java
create mode 100644 xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/impl/ActTaskServiceImpl.java
create mode 100644 xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/impl/ActWorkflowFormDataServiceImpl.java
create mode 100644 xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/impl/ActivitiHistoryServiceImpl.java
create mode 100644 xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/impl/FormHistoryDataServiceImpl.java
create mode 100644 xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/impl/ProcessDefinitionServiceImpl.java
create mode 100644 xjs-business/xjs-business-workflow/src/main/resources/mapper/activiti/ActReDeploymentMapper.xml
create mode 100644 xjs-business/xjs-business-workflow/src/main/resources/mapper/activiti/ActWorkflowFormDataMapper.xml
create mode 100644 xjs-business/xjs-business-workflow/src/main/resources/mybatis/mybatis-config.xml
diff --git a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/utils/FileUploadUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/FileUploadUtils.java
similarity index 95%
rename from ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/utils/FileUploadUtils.java
rename to ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/FileUploadUtils.java
index 02eb1cd2..1aa9381b 100644
--- a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/utils/FileUploadUtils.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/FileUploadUtils.java
@@ -1,196 +1,196 @@
-package com.ruoyi.file.utils;
-
-import java.io.File;
-import java.io.IOException;
-import org.apache.commons.io.FilenameUtils;
-import org.springframework.web.multipart.MultipartFile;
-import com.ruoyi.common.core.exception.file.FileNameLengthLimitExceededException;
-import com.ruoyi.common.core.exception.file.FileSizeLimitExceededException;
-import com.ruoyi.common.core.exception.file.InvalidExtensionException;
-import com.ruoyi.common.core.utils.DateUtils;
-import com.ruoyi.common.core.utils.IdUtils;
-import com.ruoyi.common.core.utils.StringUtils;
-import com.ruoyi.common.core.utils.file.MimeTypeUtils;
-
-/**
- * 文件上传工具类
- *
- * @author ruoyi
- */
-public class FileUploadUtils
-{
- /**
- * 默认大小 50M
- */
- public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024;
-
- /**
- * 默认的文件名最大长度 100
- */
- public static final int DEFAULT_FILE_NAME_LENGTH = 100;
-
- /**
- * 根据文件路径上传
- *
- * @param baseDir 相对应用的基目录
- * @param file 上传的文件
- * @return 文件名称
- * @throws IOException
- */
- public static final String upload(String baseDir, MultipartFile file) throws IOException
- {
- try
- {
- return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
- }
- catch (Exception e)
- {
- throw new IOException(e.getMessage(), e);
- }
- }
-
- /**
- * 文件上传
- *
- * @param baseDir 相对应用的基目录
- * @param file 上传的文件
- * @param allowedExtension 上传文件类型
- * @return 返回上传成功的文件名
- * @throws FileSizeLimitExceededException 如果超出最大大小
- * @throws FileNameLengthLimitExceededException 文件名太长
- * @throws IOException 比如读写文件出错时
- * @throws InvalidExtensionException 文件校验异常
- */
- public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension)
- throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,
- InvalidExtensionException
- {
- int fileNamelength = file.getOriginalFilename().length();
- if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH)
- {
- throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
- }
-
- assertAllowed(file, allowedExtension);
-
- String fileName = extractFilename(file);
-
- File desc = getAbsoluteFile(baseDir, fileName);
- file.transferTo(desc);
- String pathFileName = getPathFileName(fileName);
- return pathFileName;
- }
-
- /**
- * 编码文件名
- */
- public static final String extractFilename(MultipartFile file)
- {
- String fileName = file.getOriginalFilename();
- String extension = getExtension(file);
- fileName = DateUtils.datePath() + "/" + IdUtils.fastUUID() + "." + extension;
- return fileName;
- }
-
- private static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException
- {
- File desc = new File(uploadDir + File.separator + fileName);
-
- if (!desc.exists())
- {
- if (!desc.getParentFile().exists())
- {
- desc.getParentFile().mkdirs();
- }
- }
- return desc.isAbsolute() ? desc : desc.getAbsoluteFile();
- }
-
- private static final String getPathFileName(String fileName) throws IOException
- {
- String pathFileName = "/" + fileName;
- return pathFileName;
- }
-
- /**
- * 文件大小校验
- *
- * @param file 上传的文件
- * @throws FileSizeLimitExceededException 如果超出最大大小
- * @throws InvalidExtensionException 文件校验异常
- */
- public static final void assertAllowed(MultipartFile file, String[] allowedExtension)
- throws FileSizeLimitExceededException, InvalidExtensionException
- {
- long size = file.getSize();
- if (DEFAULT_MAX_SIZE != -1 && size > DEFAULT_MAX_SIZE)
- {
- throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024);
- }
-
- String fileName = file.getOriginalFilename();
- String extension = getExtension(file);
- if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension))
- {
- if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION)
- {
- throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension,
- fileName);
- }
- else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION)
- {
- throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension,
- fileName);
- }
- else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION)
- {
- throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension,
- fileName);
- }
- else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION)
- {
- throw new InvalidExtensionException.InvalidVideoExtensionException(allowedExtension, extension,
- fileName);
- }
- else
- {
- throw new InvalidExtensionException(allowedExtension, extension, fileName);
- }
- }
- }
-
- /**
- * 判断MIME类型是否是允许的MIME类型
- *
- * @param extension 上传文件类型
- * @param allowedExtension 允许上传文件类型
- * @return true/false
- */
- public static final boolean isAllowedExtension(String extension, String[] allowedExtension)
- {
- for (String str : allowedExtension)
- {
- if (str.equalsIgnoreCase(extension))
- {
- return true;
- }
- }
- return false;
- }
-
- /**
- * 获取文件名的后缀
- *
- * @param file 表单文件
- * @return 后缀名
- */
- public static final String getExtension(MultipartFile file)
- {
- String extension = FilenameUtils.getExtension(file.getOriginalFilename());
- if (StringUtils.isEmpty(extension))
- {
- extension = MimeTypeUtils.getExtension(file.getContentType());
- }
- return extension;
- }
-}
\ No newline at end of file
+package com.ruoyi.common.core.utils.file;
+
+import com.ruoyi.common.core.exception.file.FileNameLengthLimitExceededException;
+import com.ruoyi.common.core.exception.file.FileSizeLimitExceededException;
+import com.ruoyi.common.core.exception.file.InvalidExtensionException;
+import com.ruoyi.common.core.utils.DateUtils;
+import com.ruoyi.common.core.utils.IdUtils;
+import com.ruoyi.common.core.utils.StringUtils;
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * 文件上传工具类
+ *
+ * @author ruoyi
+ */
+public class FileUploadUtils
+{
+ /**
+ * 默认大小 50M
+ */
+ public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024;
+
+ /**
+ * 默认的文件名最大长度 100
+ */
+ public static final int DEFAULT_FILE_NAME_LENGTH = 100;
+
+ /**
+ * 根据文件路径上传
+ *
+ * @param baseDir 相对应用的基目录
+ * @param file 上传的文件
+ * @return 文件名称
+ * @throws IOException
+ */
+ public static final String upload(String baseDir, MultipartFile file) throws IOException
+ {
+ try
+ {
+ return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
+ }
+ catch (Exception e)
+ {
+ throw new IOException(e.getMessage(), e);
+ }
+ }
+
+ /**
+ * 文件上传
+ *
+ * @param baseDir 相对应用的基目录
+ * @param file 上传的文件
+ * @param allowedExtension 上传文件类型
+ * @return 返回上传成功的文件名
+ * @throws FileSizeLimitExceededException 如果超出最大大小
+ * @throws FileNameLengthLimitExceededException 文件名太长
+ * @throws IOException 比如读写文件出错时
+ * @throws InvalidExtensionException 文件校验异常
+ */
+ public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension)
+ throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,
+ InvalidExtensionException
+ {
+ int fileNamelength = file.getOriginalFilename().length();
+ if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH)
+ {
+ throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
+ }
+
+ assertAllowed(file, allowedExtension);
+
+ String fileName = extractFilename(file);
+
+ File desc = getAbsoluteFile(baseDir, fileName);
+ file.transferTo(desc);
+ String pathFileName = getPathFileName(fileName);
+ return pathFileName;
+ }
+
+ /**
+ * 编码文件名
+ */
+ public static final String extractFilename(MultipartFile file)
+ {
+ String fileName = file.getOriginalFilename();
+ String extension = getExtension(file);
+ fileName = DateUtils.datePath() + "/" + IdUtils.fastUUID() + "." + extension;
+ return fileName;
+ }
+
+ private static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException
+ {
+ File desc = new File(uploadDir + File.separator + fileName);
+
+ if (!desc.exists())
+ {
+ if (!desc.getParentFile().exists())
+ {
+ desc.getParentFile().mkdirs();
+ }
+ }
+ return desc.isAbsolute() ? desc : desc.getAbsoluteFile();
+ }
+
+ private static final String getPathFileName(String fileName) throws IOException
+ {
+ String pathFileName = "/" + fileName;
+ return pathFileName;
+ }
+
+ /**
+ * 文件大小校验
+ *
+ * @param file 上传的文件
+ * @throws FileSizeLimitExceededException 如果超出最大大小
+ * @throws InvalidExtensionException 文件校验异常
+ */
+ public static final void assertAllowed(MultipartFile file, String[] allowedExtension)
+ throws FileSizeLimitExceededException, InvalidExtensionException
+ {
+ long size = file.getSize();
+ if (DEFAULT_MAX_SIZE != -1 && size > DEFAULT_MAX_SIZE)
+ {
+ throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024);
+ }
+
+ String fileName = file.getOriginalFilename();
+ String extension = getExtension(file);
+ if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension))
+ {
+ if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION)
+ {
+ throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension,
+ fileName);
+ }
+ else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION)
+ {
+ throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension,
+ fileName);
+ }
+ else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION)
+ {
+ throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension,
+ fileName);
+ }
+ else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION)
+ {
+ throw new InvalidExtensionException.InvalidVideoExtensionException(allowedExtension, extension,
+ fileName);
+ }
+ else
+ {
+ throw new InvalidExtensionException(allowedExtension, extension, fileName);
+ }
+ }
+ }
+
+ /**
+ * 判断MIME类型是否是允许的MIME类型
+ *
+ * @param extension 上传文件类型
+ * @param allowedExtension 允许上传文件类型
+ * @return true/false
+ */
+ public static final boolean isAllowedExtension(String extension, String[] allowedExtension)
+ {
+ for (String str : allowedExtension)
+ {
+ if (str.equalsIgnoreCase(extension))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * 获取文件名的后缀
+ *
+ * @param file 表单文件
+ * @return 后缀名
+ */
+ public static final String getExtension(MultipartFile file)
+ {
+ String extension = FilenameUtils.getExtension(file.getOriginalFilename());
+ if (StringUtils.isEmpty(extension))
+ {
+ extension = MimeTypeUtils.getExtension(file.getContentType());
+ }
+ return extension;
+ }
+}
diff --git a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/AliyunOssFileServiceImpl.java b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/AliyunOssFileServiceImpl.java
index f87217c9..1e694641 100644
--- a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/AliyunOssFileServiceImpl.java
+++ b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/AliyunOssFileServiceImpl.java
@@ -3,7 +3,7 @@ package com.ruoyi.file.service;
import cn.hutool.core.date.DateUtil;
import com.aliyun.oss.OSS;
import com.ruoyi.common.core.text.UUID;
-import com.ruoyi.file.utils.FileUploadUtils;
+import com.ruoyi.common.core.utils.file.FileUploadUtils;
import com.ruoyi.file.utils.OssClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
diff --git a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/FtpSysFileServiceImpl.java b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/FtpSysFileServiceImpl.java
index 059123c0..a75015e9 100644
--- a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/FtpSysFileServiceImpl.java
+++ b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/FtpSysFileServiceImpl.java
@@ -2,7 +2,7 @@ package com.ruoyi.file.service;
import cn.hutool.core.date.DateUtil;
import com.ruoyi.file.config.FtpProperties;
-import com.ruoyi.file.utils.FileUploadUtils;
+import com.ruoyi.common.core.utils.file.FileUploadUtils;
import com.ruoyi.file.utils.FtpUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
diff --git a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/LocalSysFileServiceImpl.java b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/LocalSysFileServiceImpl.java
index 67363a0f..e8c7f54b 100644
--- a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/LocalSysFileServiceImpl.java
+++ b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/LocalSysFileServiceImpl.java
@@ -1,13 +1,13 @@
package com.ruoyi.file.service;
-import com.ruoyi.file.utils.FileUploadUtils;
+import com.ruoyi.common.core.utils.file.FileUploadUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
/**
* 本地文件存储
- *
+ *
* @author ruoyi
*/
@Service
@@ -24,7 +24,7 @@ public class LocalSysFileServiceImpl implements ISysFileService
*/
@Value("${file.domain}")
public String domain;
-
+
/**
* 上传文件存储在本地的根路径
*/
@@ -33,7 +33,7 @@ public class LocalSysFileServiceImpl implements ISysFileService
/**
* 本地文件上传接口
- *
+ *
* @param file 上传的文件
* @return 访问地址
* @throws Exception
diff --git a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/MinioSysFileServiceImpl.java b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/MinioSysFileServiceImpl.java
index 2a3b709e..96c4734b 100644
--- a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/MinioSysFileServiceImpl.java
+++ b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/MinioSysFileServiceImpl.java
@@ -4,13 +4,13 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.file.config.MinioConfig;
-import com.ruoyi.file.utils.FileUploadUtils;
+import com.ruoyi.common.core.utils.file.FileUploadUtils;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
/**
* Minio 文件存储
- *
+ *
* @author ruoyi
*/
@Service
@@ -24,7 +24,7 @@ public class MinioSysFileServiceImpl implements ISysFileService
/**
* 本地文件上传接口
- *
+ *
* @param file 上传的文件
* @return 访问地址
* @throws Exception
diff --git a/xjs-business/xjs-business-workflow/pom.xml b/xjs-business/xjs-business-workflow/pom.xml
index b0f6e8e5..b9e8c0ed 100644
--- a/xjs-business/xjs-business-workflow/pom.xml
+++ b/xjs-business/xjs-business-workflow/pom.xml
@@ -28,6 +28,15 @@
activiti-dependencies
pom
+
+
+ org.mybatis
+ mybatis
+ 3.5.9
+
com.xjs
diff --git a/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/controller/ActivitiHistoryController.java b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/controller/ActivitiHistoryController.java
new file mode 100644
index 00000000..37a0a2c8
--- /dev/null
+++ b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/controller/ActivitiHistoryController.java
@@ -0,0 +1,34 @@
+package com.xjs.activiti.controller;
+
+
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.xjs.activiti.domain.dto.ActivitiHighLineDTO;
+import com.xjs.activiti.service.IActivitiHistoryService;
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+
+@RestController
+@RequestMapping("/activitiHistory")
+@Api(tags = "工作流-历史流程")
+public class ActivitiHistoryController {
+
+ @Autowired
+ private IActivitiHistoryService activitiHistoryService;
+
+ //流程图高亮
+ @GetMapping("/gethighLine")
+ public AjaxResult gethighLine(@RequestParam("instanceId") String instanceId) {
+
+ ActivitiHighLineDTO activitiHighLineDTO = activitiHistoryService.gethighLine(instanceId);
+ return AjaxResult.success(activitiHighLineDTO);
+
+
+ }
+
+
+}
diff --git a/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/controller/HistoryFormDataCoroller.java b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/controller/HistoryFormDataCoroller.java
new file mode 100644
index 00000000..734638eb
--- /dev/null
+++ b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/controller/HistoryFormDataCoroller.java
@@ -0,0 +1,24 @@
+package com.xjs.activiti.controller;
+
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.xjs.activiti.service.IFormHistoryDataService;
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@Api(tags = "工作流-历史表格数据")
+@RequestMapping("/historyFromData")
+public class HistoryFormDataCoroller {
+ @Autowired
+ private IFormHistoryDataService formHistoryDataService;
+
+ @GetMapping(value = "/ByInstanceId/{instanceId}")
+ public AjaxResult historyFromData(@PathVariable("instanceId") String instanceId) {
+ return AjaxResult.success(formHistoryDataService.historyDataShow(instanceId));
+
+ }
+}
diff --git a/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/controller/ProcessDefinitionController.java b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/controller/ProcessDefinitionController.java
new file mode 100644
index 00000000..6ce92f0c
--- /dev/null
+++ b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/controller/ProcessDefinitionController.java
@@ -0,0 +1,143 @@
+package com.xjs.activiti.controller;
+
+
+import com.ruoyi.common.core.web.controller.BaseController;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.core.web.page.PageDomain;
+import com.ruoyi.common.core.web.page.TableDataInfo;
+import com.ruoyi.common.core.web.page.TableSupport;
+import com.ruoyi.common.log.annotation.Log;
+import com.ruoyi.common.log.enums.BusinessType;
+import com.xjs.activiti.domain.dto.ProcessDefinitionDTO;
+import com.xjs.activiti.service.IProcessDefinitionService;
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+
+@RestController
+@RequestMapping("/processDefinition")
+@Api(tags = "工作流-流程定义")
+public class ProcessDefinitionController extends BaseController {
+
+ @Autowired
+ private IProcessDefinitionService processDefinitionService;
+
+
+ /**
+ * 获取流程定义集合
+ *
+ * @param processDefinition
+ * @return
+ */
+ @GetMapping(value = "/list")
+ public TableDataInfo list(ProcessDefinitionDTO processDefinition) {
+ PageDomain pageDomain = TableSupport.buildPageRequest();
+ return getDataTable(processDefinitionService.selectProcessDefinitionList(processDefinition, pageDomain));
+
+ }
+
+ /**
+ * @return
+ */
+ @GetMapping(value = "/getDefinitions/{instanceId}")
+ public AjaxResult getDefinitionsByInstanceId(@PathVariable("instanceId") String instanceId) {
+ return AjaxResult.success(processDefinitionService.getDefinitionsByInstanceId(instanceId));
+ }
+
+ /**
+ * 删除流程定义
+ *
+ * @param deploymentId
+ * @return
+ */
+ @Log(title = "流程定义管理", businessType = BusinessType.DELETE)
+ @DeleteMapping(value = "/remove/{deploymentId}")
+ public AjaxResult delDefinition(@PathVariable("deploymentId") String deploymentId) {
+ return toAjax(processDefinitionService.deleteProcessDefinitionById(deploymentId));
+ }
+
+ /**
+ * 上传并部署流程定义
+ *
+ * @param file
+ * @return
+ * @throws IOException
+ */
+ @Log(title = "流程定义管理", businessType = BusinessType.IMPORT)
+ @PostMapping(value = "/uploadStreamAndDeployment")
+ public AjaxResult uploadStreamAndDeployment(@RequestParam("file") MultipartFile file) throws IOException {
+ processDefinitionService.uploadStreamAndDeployment(file);
+ return AjaxResult.success();
+
+ }
+
+ /**
+ * 启动挂起流程流程定义
+ *
+ * @param processDefinition
+ * @return
+ */
+ @Log(title = "流程定义管理", businessType = BusinessType.UPDATE)
+ @PostMapping("/suspendOrActiveApply")
+ @ResponseBody
+ public AjaxResult suspendOrActiveApply(@RequestBody ProcessDefinitionDTO processDefinition) {
+ processDefinitionService.suspendOrActiveApply(processDefinition.getId(), processDefinition.getSuspendState());
+ return AjaxResult.success();
+ }
+
+ /**
+ * 上传流程流程定义
+ *
+ * @param multipartFile
+ * @return
+ * @throws IOException
+ */
+ @Log(title = "流程定义管理", businessType = BusinessType.IMPORT)
+ @PostMapping(value = "/upload")
+ public AjaxResult upload(@RequestParam("processFile") MultipartFile multipartFile) throws IOException {
+
+ if (!multipartFile.isEmpty()) {
+ String fileName = processDefinitionService.upload(multipartFile);
+ return AjaxResult.success("操作成功", fileName);
+
+ }
+ return AjaxResult.error("不允许上传空文件!");
+ }
+
+
+ /**
+ * 通过stringBPMN添加流程定义
+ *
+ * @param stringBPMN
+ * @return
+ */
+ @PostMapping(value = "/addDeploymentByString")
+ public AjaxResult addDeploymentByString(@RequestParam("stringBPMN") String stringBPMN) {
+ processDefinitionService.addDeploymentByString(stringBPMN);
+ return AjaxResult.success();
+
+ }
+
+
+ /**
+ * 获取流程定义XML
+ *
+ * @param response
+ * @param deploymentId
+ * @param resourceName
+ */
+ @GetMapping(value = "/getDefinitionXML")
+ public void getProcessDefineXML(HttpServletResponse response,
+ @RequestParam("deploymentId") String deploymentId,
+ @RequestParam("resourceName") String resourceName) throws IOException {
+
+ processDefinitionService.getProcessDefineXML(response, deploymentId, resourceName);
+ }
+
+
+}
diff --git a/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/controller/TaskController.java b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/controller/TaskController.java
new file mode 100644
index 00000000..a0c1f59f
--- /dev/null
+++ b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/controller/TaskController.java
@@ -0,0 +1,57 @@
+package com.xjs.activiti.controller;
+
+
+import com.github.pagehelper.Page;
+import com.ruoyi.common.core.web.controller.BaseController;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.core.web.page.PageDomain;
+import com.ruoyi.common.core.web.page.TableDataInfo;
+import com.ruoyi.common.core.web.page.TableSupport;
+import com.xjs.activiti.domain.dto.ActTaskDTO;
+import com.xjs.activiti.domain.dto.ActWorkflowFormDataDTO;
+import com.xjs.activiti.service.IActTaskService;
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.text.ParseException;
+import java.util.List;
+
+
+@RestController
+@RequestMapping("/task")
+@Api(tags = "工作流-任务流程")
+public class TaskController extends BaseController {
+
+
+ @Autowired
+ private IActTaskService actTaskService;
+
+
+ //获取我的代办任务
+ @GetMapping(value = "/list")
+ public TableDataInfo getTasks() {
+ PageDomain pageDomain = TableSupport.buildPageRequest();
+ Page hashMaps = actTaskService.selectProcessDefinitionList(pageDomain);
+ return getDataTable(hashMaps);
+
+
+ }
+
+
+ //渲染表单
+ @GetMapping(value = "/formDataShow/{taskID}")
+ public AjaxResult formDataShow(@PathVariable("taskID") String taskID) {
+
+ return AjaxResult.success(actTaskService.formDataShow(taskID));
+ }
+
+ //保存表单
+ @PostMapping(value = "/formDataSave/{taskID}")
+ public AjaxResult formDataSave(@PathVariable("taskID") String taskID,
+ @RequestBody List formData) throws ParseException {
+ return toAjax(actTaskService.formDataSave(taskID, formData));
+
+ }
+
+}
diff --git a/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/ActWorkflowFormData.java b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/ActWorkflowFormData.java
new file mode 100644
index 00000000..0838bd8a
--- /dev/null
+++ b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/ActWorkflowFormData.java
@@ -0,0 +1,149 @@
+package com.xjs.activiti.domain;
+
+import com.ruoyi.common.core.web.domain.BaseEntity;
+import com.xjs.activiti.domain.dto.ActWorkflowFormDataDTO;
+import org.activiti.api.task.model.Task;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 动态单对象 act_workflow_formdata
+ *
+ * @author xiejs
+ * @since 2022-04-17 02:07:29
+ */
+public class ActWorkflowFormData extends BaseEntity {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 唯一标识符
+ */
+ private Long id;
+
+ /**
+ * 事务Id
+ */
+ private String businessKey;
+
+ /**
+ * 表单Key
+ */
+ private String formKey;
+
+
+ /**
+ * 表单id
+ */
+ private String controlId;
+ /**
+ * 表单名称
+ */
+ private String controlName;
+
+ /**
+ * 表单值
+ */
+ private String controlValue;
+
+ /**
+ * 任务节点名称
+ */
+ private String taskNodeName;
+
+ private String createName;
+
+ public ActWorkflowFormData() {
+ }
+
+ public ActWorkflowFormData(String businessKey, ActWorkflowFormDataDTO actWorkflowFormDataDTO, Task task) {
+ this.businessKey = businessKey;
+ this.formKey = task.getFormKey();
+ this.controlId = actWorkflowFormDataDTO.getControlId();
+ this.controlName = actWorkflowFormDataDTO.getControlLable();
+ if ("radio".equals(actWorkflowFormDataDTO.getControlType())) {
+ int i = Integer.parseInt(actWorkflowFormDataDTO.getControlValue());
+ this.controlValue = actWorkflowFormDataDTO.getControlDefault().split("--__--")[i];
+ } else {
+ this.controlValue = actWorkflowFormDataDTO.getControlValue();
+ }
+ this.taskNodeName = task.getName();
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public String getBusinessKey() {
+ return businessKey;
+ }
+
+ public void setBusinessKey(String businessKey) {
+ this.businessKey = businessKey;
+ }
+
+ public void setFormKey(String formKey) {
+ this.formKey = formKey;
+ }
+
+ public String getFormKey() {
+ return formKey;
+ }
+
+ public void setControlId(String controlId) {
+ this.controlId = controlId;
+ }
+
+ public String getControlId() {
+ return controlId;
+ }
+
+ public String getControlName() {
+ return controlName;
+ }
+
+ public void setControlName(String controlName) {
+ this.controlName = controlName;
+ }
+
+ public void setControlValue(String controlValue) {
+ this.controlValue = controlValue;
+ }
+
+ public String getControlValue() {
+ return controlValue;
+ }
+
+ public void setTaskNodeName(String taskNodeName) {
+ this.taskNodeName = taskNodeName;
+ }
+
+ public String getTaskNodeName() {
+ return taskNodeName;
+ }
+
+ public String getCreateName() {
+ return createName;
+ }
+
+ public void setCreateName(String createName) {
+ this.createName = createName;
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+ .append("id", getId())
+ .append("procInstId", getBusinessKey())
+ .append("formKey", getFormKey())
+ .append("controlId", getControlId())
+ .append("controlValue", getControlValue())
+ .append("taskNodeName", getTaskNodeName())
+ .append("createBy", getCreateBy())
+ .append("createTime", getCreateTime())
+ .toString();
+ }
+}
diff --git a/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/dto/ActTaskDTO.java b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/dto/ActTaskDTO.java
new file mode 100644
index 00000000..4b4b3b77
--- /dev/null
+++ b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/dto/ActTaskDTO.java
@@ -0,0 +1,99 @@
+package com.xjs.activiti.domain.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.core.web.domain.BaseEntity;
+import org.activiti.api.task.model.Task;
+import org.activiti.engine.runtime.ProcessInstance;
+
+import java.util.Date;
+
+/**
+ * act任务dto
+ * @author xiejs
+ * @since 2022-04-17 02:08:24
+ */
+public class ActTaskDTO extends BaseEntity {
+
+ private static final long serialVersionUID = 1L;
+
+ private String id;
+
+ private String name;
+
+ private String status;
+
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date createdDate;
+ private String instanceName;
+ private String definitionKey;
+ private String businessKey;
+
+ public ActTaskDTO() {
+ }
+
+ public ActTaskDTO(Task task, ProcessInstance processInstance) {
+ this.id = task.getId();
+ this.name = task.getName();
+ this.status = task.getStatus().toString();
+ this.createdDate = task.getCreatedDate();
+ this.instanceName = processInstance.getName();
+ this.definitionKey = processInstance.getProcessDefinitionKey();
+ this.businessKey = processInstance.getBusinessKey();
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public Date getCreatedDate() {
+ return createdDate;
+ }
+
+ public void setCreatedDate(Date createdDate) {
+ this.createdDate = createdDate;
+ }
+
+ public String getInstanceName() {
+ return instanceName;
+ }
+
+ public void setInstanceName(String instanceName) {
+ this.instanceName = instanceName;
+ }
+
+ public String getDefinitionKey() {
+ return definitionKey;
+ }
+
+ public void setDefinitionKey(String definitionKey) {
+ this.definitionKey = definitionKey;
+ }
+
+ public String getBusinessKey() {
+ return businessKey;
+ }
+
+ public void setBusinessKey(String businessKey) {
+ this.businessKey = businessKey;
+ }
+}
diff --git a/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/dto/ActWorkflowFormDataDTO.java b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/dto/ActWorkflowFormDataDTO.java
new file mode 100644
index 00000000..93733119
--- /dev/null
+++ b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/dto/ActWorkflowFormDataDTO.java
@@ -0,0 +1,85 @@
+package com.xjs.activiti.domain.dto;
+
+
+import com.ruoyi.common.core.web.domain.BaseEntity;
+
+/**
+ * 动态单对象 act_workflow_formdata
+ *
+ * @author xiejs
+ * @since 2022-04-17 02:08:45
+ */
+public class ActWorkflowFormDataDTO extends BaseEntity {
+ private static final long serialVersionUID = 1L;
+
+
+ /**
+ * 表单id
+ */
+ private String controlId;
+ private String controlType;
+
+
+ /**
+ * 表单名称
+ */
+ private String controlLable;
+
+ private String controlIsParam;
+
+ /**
+ * 表单值
+ */
+ private String controlValue;
+ private String controlDefault;
+
+
+ public void setControlId(String controlId) {
+ this.controlId = controlId;
+ }
+
+ public String getControlId() {
+ return controlId;
+ }
+
+ public void setControlValue(String controlValue) {
+ this.controlValue = controlValue;
+ }
+
+ public String getControlValue() {
+ return controlValue;
+ }
+
+
+ public String getControlIsParam() {
+ return controlIsParam;
+ }
+
+ public void setControlIsParam(String controlIsParam) {
+ this.controlIsParam = controlIsParam;
+ }
+
+ public String getControlLable() {
+ return controlLable;
+ }
+
+ public void setControlLable(String controlLable) {
+ this.controlLable = controlLable;
+ }
+
+ public String getControlDefault() {
+ return controlDefault;
+ }
+
+ public void setControlDefault(String controlDefault) {
+ this.controlDefault = controlDefault;
+ }
+
+ public String getControlType() {
+ return controlType;
+ }
+
+ public void setControlType(String controlType) {
+ this.controlType = controlType;
+ }
+}
diff --git a/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/dto/ActivitiHighLineDTO.java b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/dto/ActivitiHighLineDTO.java
new file mode 100644
index 00000000..8d1e5a47
--- /dev/null
+++ b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/dto/ActivitiHighLineDTO.java
@@ -0,0 +1,48 @@
+package com.xjs.activiti.domain.dto;
+
+import java.util.Set;
+
+/**
+ * act 高亮dto
+ *
+ * @author xiejs
+ * @since 2022-04-17 02:07:58
+ */
+public class ActivitiHighLineDTO {
+ private Set highPoint;
+ private Set highLine;
+ private Set waitingToDo;
+ private Set iDo;
+
+ public Set getHighPoint() {
+ return highPoint;
+ }
+
+ public void setHighPoint(Set highPoint) {
+ this.highPoint = highPoint;
+ }
+
+ public Set getHighLine() {
+ return highLine;
+ }
+
+ public void setHighLine(Set highLine) {
+ this.highLine = highLine;
+ }
+
+ public Set getWaitingToDo() {
+ return waitingToDo;
+ }
+
+ public void setWaitingToDo(Set waitingToDo) {
+ this.waitingToDo = waitingToDo;
+ }
+
+ public Set getiDo() {
+ return iDo;
+ }
+
+ public void setiDo(Set iDo) {
+ this.iDo = iDo;
+ }
+}
diff --git a/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/dto/DefinitionIdDTO.java b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/dto/DefinitionIdDTO.java
new file mode 100644
index 00000000..23acfe6c
--- /dev/null
+++ b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/dto/DefinitionIdDTO.java
@@ -0,0 +1,37 @@
+package com.xjs.activiti.domain.dto;
+
+import org.activiti.engine.repository.ProcessDefinition;
+
+/**
+ * act定义对象id dto
+ * @author xiejs
+ * @since 2022-04-17 02:09:10
+ */
+public class DefinitionIdDTO {
+ private String deploymentID;
+ private String resourceName;
+
+ public String getDeploymentID() {
+ return deploymentID;
+ }
+
+ public void setDeploymentID(String deploymentID) {
+ this.deploymentID = deploymentID;
+ }
+
+ public String getResourceName() {
+ return resourceName;
+ }
+
+ public void setResourceName(String resourceName) {
+ this.resourceName = resourceName;
+ }
+
+ public DefinitionIdDTO() {
+ }
+
+ public DefinitionIdDTO(ProcessDefinition processDefinition) {
+ this.deploymentID = processDefinition.getDeploymentId();
+ this.resourceName = processDefinition.getResourceName();
+ }
+}
diff --git a/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/dto/HistoryDataDTO.java b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/dto/HistoryDataDTO.java
new file mode 100644
index 00000000..bdee1458
--- /dev/null
+++ b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/dto/HistoryDataDTO.java
@@ -0,0 +1,49 @@
+package com.xjs.activiti.domain.dto;
+
+import java.util.List;
+
+/**
+ * act历史数据dto
+ *
+ * @author xiejs
+ * @since 2022-04-17 02:09:28
+ */
+public class HistoryDataDTO {
+ private String taskNodeName;
+ private String createName;
+ private String createdDate;
+ private List formHistoryDataDTO;
+
+
+ public String getTaskNodeName() {
+ return taskNodeName;
+ }
+
+ public void setTaskNodeName(String taskNodeName) {
+ this.taskNodeName = taskNodeName;
+ }
+
+ public String getCreateName() {
+ return createName;
+ }
+
+ public void setCreateName(String createName) {
+ this.createName = createName;
+ }
+
+ public String getCreatedDate() {
+ return createdDate;
+ }
+
+ public void setCreatedDate(String createdDate) {
+ this.createdDate = createdDate;
+ }
+
+ public List getFormHistoryDataDTO() {
+ return formHistoryDataDTO;
+ }
+
+ public void setFormHistoryDataDTO(List formHistoryDataDTO) {
+ this.formHistoryDataDTO = formHistoryDataDTO;
+ }
+}
diff --git a/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/dto/HistoryFormDataDTO.java b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/dto/HistoryFormDataDTO.java
new file mode 100644
index 00000000..5ffa8ce6
--- /dev/null
+++ b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/dto/HistoryFormDataDTO.java
@@ -0,0 +1,36 @@
+package com.xjs.activiti.domain.dto;
+
+/**
+ * 历史表格数据 DTO
+ *
+ * @author xiejs
+ * @since 2022-04-17 02:09:41
+ */
+public class HistoryFormDataDTO {
+ private String title;
+ private String value;
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ public HistoryFormDataDTO() {
+ }
+
+ public HistoryFormDataDTO(String title, String value) {
+ this.title = title;
+ this.value = value;
+ }
+}
diff --git a/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/dto/ProcessDefinitionDTO.java b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/dto/ProcessDefinitionDTO.java
new file mode 100644
index 00000000..ad6fb99e
--- /dev/null
+++ b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/dto/ProcessDefinitionDTO.java
@@ -0,0 +1,118 @@
+package com.xjs.activiti.domain.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.core.web.domain.BaseEntity;
+import com.xjs.activiti.domain.vo.ActReDeploymentVO;
+import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntityImpl;
+
+import java.util.Date;
+
+/**
+ * act流程定义dto
+ *
+ * @author xiejs
+ * @since 2022-04-17 02:10:06
+ */
+public class ProcessDefinitionDTO extends BaseEntity {
+
+ private static final long serialVersionUID = 1L;
+
+ private String id;
+
+ private String name;
+
+ private String key;
+
+ private int version;
+
+ private String deploymentId;
+ private String resourceName;
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date deploymentTime;
+
+
+ /**
+ * 流程实例状态 1 激活 2 挂起
+ */
+ private Integer suspendState;
+
+ public ProcessDefinitionDTO() {
+ }
+
+ public ProcessDefinitionDTO(ProcessDefinitionEntityImpl processDefinition, ActReDeploymentVO actReDeploymentVO) {
+ this.id = processDefinition.getId();
+ this.name = processDefinition.getName();
+ this.key = processDefinition.getKey();
+ this.version = processDefinition.getVersion();
+ this.deploymentId = processDefinition.getDeploymentId();
+ this.resourceName = processDefinition.getResourceName();
+ this.deploymentTime = actReDeploymentVO.getDeployTime();
+ this.suspendState = processDefinition.getSuspensionState();
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getResourceName() {
+ return resourceName;
+ }
+
+ public void setResourceName(String resourceName) {
+ this.resourceName = resourceName;
+ }
+
+ public int getVersion() {
+ return version;
+ }
+
+ public void setVersion(int version) {
+ this.version = version;
+ }
+
+
+ public String getDeploymentId() {
+ return deploymentId;
+ }
+
+ public void setDeploymentId(String deploymentId) {
+ this.deploymentId = deploymentId;
+ }
+
+ public Date getDeploymentTime() {
+ return deploymentTime;
+ }
+
+ public void setDeploymentTime(Date deploymentTime) {
+ this.deploymentTime = deploymentTime;
+ }
+
+
+ public Integer getSuspendState() {
+ return suspendState;
+ }
+
+ public void setSuspendState(Integer suspendState) {
+ this.suspendState = suspendState;
+ }
+}
diff --git a/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/vo/ActReDeploymentVO.java b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/vo/ActReDeploymentVO.java
new file mode 100644
index 00000000..0fdcf640
--- /dev/null
+++ b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/domain/vo/ActReDeploymentVO.java
@@ -0,0 +1,30 @@
+package com.xjs.activiti.domain.vo;
+
+import java.util.Date;
+
+
+/**
+ * Act部署vo
+ * @author xiejs
+ * @since 2022-04-17 02:07:39
+ */
+public class ActReDeploymentVO {
+ private String id;
+ private Date deployTime;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public Date getDeployTime() {
+ return deployTime;
+ }
+
+ public void setDeployTime(Date deployTime) {
+ this.deployTime = deployTime;
+ }
+}
diff --git a/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/mapper/ActReDeploymentMapper.java b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/mapper/ActReDeploymentMapper.java
new file mode 100644
index 00000000..38aa3fd1
--- /dev/null
+++ b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/mapper/ActReDeploymentMapper.java
@@ -0,0 +1,24 @@
+package com.xjs.activiti.mapper;
+
+import com.xjs.activiti.domain.vo.ActReDeploymentVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * act部署Mapper
+ *
+ * @author xiejs
+ * @since 2022-04-17 01:47:24
+ */
+public interface ActReDeploymentMapper {
+
+ /**
+ * 根据id s批量查询部署信息
+ * @param ids 部署ids
+ * @return list
+ */
+ List selectActReDeploymentByIds(@Param("ids") Set ids);
+
+}
diff --git a/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/mapper/ActWorkflowFormDataMapper.java b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/mapper/ActWorkflowFormDataMapper.java
new file mode 100644
index 00000000..e29d6e24
--- /dev/null
+++ b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/mapper/ActWorkflowFormDataMapper.java
@@ -0,0 +1,83 @@
+package com.xjs.activiti.mapper;
+
+import com.xjs.activiti.domain.ActWorkflowFormData;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 动态单Mapper接口
+ *
+ * @author xiejs
+ * @date 2022-04-17 01:48:08
+ */
+public interface ActWorkflowFormDataMapper
+{
+ /**
+ * 查询动态单
+ *
+ * @param id 动态单ID
+ * @return 动态单
+ */
+ public ActWorkflowFormData selectActWorkflowFormDataById(Long id);
+ /**
+ * 查询动态单
+ *
+ * @param businessKey 动态单ID
+ * @return 动态单
+ */
+ public List selectActWorkflowFormDataByBusinessKey(String businessKey);
+
+ /**
+ * 查询动态单列表
+ *
+ * @param ActWorkflowFormData 动态单
+ * @return 动态单集合
+ */
+ public List selectActWorkflowFormDataList(ActWorkflowFormData ActWorkflowFormData);
+
+ /**
+ * 新增动态单
+ *
+ * @param ActWorkflowFormData 动态单
+ * @return 结果
+ */
+ public int insertActWorkflowFormData(ActWorkflowFormData ActWorkflowFormData);
+
+
+ /**
+ * 新增动态单
+ *
+ * @param
+ * @return 结果
+ */
+ public int insertActWorkflowFormDatas(@Param("createBy") String createBy, @Param("ActWorkflowFormData")List ActWorkflowFormData, Date date ,String createName);
+
+
+
+
+ /**
+ * 修改动态单
+ *
+ * @param ActWorkflowFormData 动态单
+ * @return 结果
+ */
+ public int updateActWorkflowFormData(ActWorkflowFormData ActWorkflowFormData);
+
+ /**
+ * 删除动态单
+ *
+ * @param id 动态单ID
+ * @return 结果
+ */
+ public int deleteActWorkflowFormDataById(Long id);
+
+ /**
+ * 批量删除动态单
+ *
+ * @param ids 需要删除的数据ID
+ * @return 结果
+ */
+ public int deleteActWorkflowFormDataByIds(Long[] ids);
+}
diff --git a/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/IActTaskService.java b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/IActTaskService.java
new file mode 100644
index 00000000..ccd25580
--- /dev/null
+++ b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/IActTaskService.java
@@ -0,0 +1,43 @@
+package com.xjs.activiti.service;
+
+import com.github.pagehelper.Page;
+import com.ruoyi.common.core.web.page.PageDomain;
+import com.xjs.activiti.domain.dto.ActTaskDTO;
+import com.xjs.activiti.domain.dto.ActWorkflowFormDataDTO;
+
+import java.text.ParseException;
+import java.util.List;
+
+/**
+ * Activiti任务服务接口
+ *
+ * @author xiejs
+ * @since 2022-04-17 01:54:51
+ */
+public interface IActTaskService {
+
+ /**
+ * 查询流程定义列表
+ * @param pageDomain 分页参数
+ * @return
+ */
+ Page selectProcessDefinitionList(PageDomain pageDomain);
+
+ /**
+ * 根据任务id查询表格数据
+ *
+ * @param taskID 任务id
+ * @return list
+ */
+ List formDataShow(String taskID);
+
+
+ /**
+ * 表格数据保存
+ * @param taskID 任务id
+ * @param awfs
+ * @return
+ * @throws ParseException
+ */
+ int formDataSave(String taskID, List awfs) throws ParseException;
+}
diff --git a/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/IActWorkflowFormDataService.java b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/IActWorkflowFormDataService.java
new file mode 100644
index 00000000..d6ef49df
--- /dev/null
+++ b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/IActWorkflowFormDataService.java
@@ -0,0 +1,72 @@
+package com.xjs.activiti.service;
+
+
+import com.xjs.activiti.domain.ActWorkflowFormData;
+
+import java.util.List;
+
+/**
+ * 动态单Service接口
+ *
+ * @author xiejs
+ * @since 2022-04-17 01:49:39
+ */
+public interface IActWorkflowFormDataService {
+ /**
+ * 查询动态单
+ *
+ * @param id 动态单ID
+ * @return 动态单
+ */
+ ActWorkflowFormData selectActWorkflowFormDataById(Long id);
+
+ List selectActWorkflowFormDataByBusinessKey(String businessKey);
+
+ /**
+ * 查询动态单列表
+ *
+ * @param ActWorkflowFormData 动态单
+ * @return 动态单集合
+ */
+ List selectActWorkflowFormDataList(ActWorkflowFormData ActWorkflowFormData);
+
+ /**
+ * 新增动态单
+ *
+ * @param ActWorkflowFormData 动态单
+ * @return 结果
+ */
+ int insertActWorkflowFormData(ActWorkflowFormData ActWorkflowFormData);
+
+ /**
+ * 新增动态单集合
+ *
+ * @param ActWorkflowFormDatas 动态表单集合
+ * @return
+ */
+ int insertActWorkflowFormDatas(List ActWorkflowFormDatas);
+
+ /**
+ * 修改动态单
+ *
+ * @param ActWorkflowFormData 动态单
+ * @return 结果
+ */
+ int updateActWorkflowFormData(ActWorkflowFormData ActWorkflowFormData);
+
+ /**
+ * 批量删除动态单
+ *
+ * @param ids 需要删除的动态单ID
+ * @return 结果
+ */
+ int deleteActWorkflowFormDataByIds(Long[] ids);
+
+ /**
+ * 删除动态单信息
+ *
+ * @param id 动态单ID
+ * @return 结果
+ */
+ int deleteActWorkflowFormDataById(Long id);
+}
diff --git a/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/IActivitiHistoryService.java b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/IActivitiHistoryService.java
new file mode 100644
index 00000000..0d85ec86
--- /dev/null
+++ b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/IActivitiHistoryService.java
@@ -0,0 +1,19 @@
+package com.xjs.activiti.service;
+
+
+import com.xjs.activiti.domain.dto.ActivitiHighLineDTO;
+
+/**
+ * Activiti历史任务服务接口
+ *
+ * @author xiejs
+ * @since 2022-04-17 01:48:55
+ */
+public interface IActivitiHistoryService {
+ /**
+ * 获取高亮
+ * @param instanceId 流程实例id
+ * @return ActivitiHighLineDTO
+ */
+ ActivitiHighLineDTO gethighLine(String instanceId);
+}
diff --git a/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/IFormHistoryDataService.java b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/IFormHistoryDataService.java
new file mode 100644
index 00000000..13b80c7c
--- /dev/null
+++ b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/IFormHistoryDataService.java
@@ -0,0 +1,22 @@
+package com.xjs.activiti.service;
+
+
+import com.xjs.activiti.domain.dto.HistoryDataDTO;
+
+import java.util.List;
+
+/**
+ * 历史数据表单服务接口
+ *
+ * @author xiejs
+ * @since 2022-04-17 01:50:13
+ */
+public interface IFormHistoryDataService {
+
+ /**
+ * 查询历史数据展示
+ * @param instanceId 流程实例id
+ * @return list
+ */
+ List historyDataShow(String instanceId);
+}
diff --git a/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/IProcessDefinitionService.java b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/IProcessDefinitionService.java
new file mode 100644
index 00000000..45af2bd6
--- /dev/null
+++ b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/IProcessDefinitionService.java
@@ -0,0 +1,85 @@
+package com.xjs.activiti.service;
+
+import com.github.pagehelper.Page;
+import com.ruoyi.common.core.web.page.PageDomain;
+import com.xjs.activiti.domain.dto.DefinitionIdDTO;
+import com.xjs.activiti.domain.dto.ProcessDefinitionDTO;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * 流程定义服务接口
+ *
+ * @author xiejs
+ * @since 2022-04-17 01:50:42
+ */
+public interface IProcessDefinitionService {
+ /**
+ * 获取流程定义集合
+ *
+ * @param processDefinition
+ * @return Page 分页信息
+ */
+ Page selectProcessDefinitionList(ProcessDefinitionDTO processDefinition, PageDomain pageDomain);
+
+ /**
+ * 按实例 ID 获取定义
+ *
+ * @param instanceId 实例id
+ * @return 定义实体
+ */
+ DefinitionIdDTO getDefinitionsByInstanceId(String instanceId);
+
+ /**
+ * 删除流程定义
+ *
+ * @param id
+ * @return
+ */
+ int deleteProcessDefinitionById(String id);
+
+ /**
+ * 上传并部署流程定义
+ *
+ * @param file
+ * @return
+ * @throws IOException
+ */
+ void uploadStreamAndDeployment(MultipartFile file) throws IOException;
+
+ /**
+ * 启动挂起流程流程定义
+ *
+ * @param id 流程定义id
+ * @param suspendState 流程状态
+ * @return
+ */
+ void suspendOrActiveApply(String id, Integer suspendState);
+
+ /**
+ * 上传流程流程定义
+ *
+ * @param multipartFile
+ * @return
+ */
+ String upload(MultipartFile multipartFile) throws IOException;
+
+ /**
+ * 通过stringBPMN添加流程定义
+ *
+ * @param stringBPMN
+ * @return
+ */
+ void addDeploymentByString(String stringBPMN);
+
+ /**
+ * 获取流程定义XML
+ *
+ * @param response
+ * @param deploymentId
+ * @param resourceName
+ */
+ void getProcessDefineXML(HttpServletResponse response, String deploymentId, String resourceName) throws IOException;
+}
diff --git a/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/impl/ActTaskServiceImpl.java b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/impl/ActTaskServiceImpl.java
new file mode 100644
index 00000000..bfec3428
--- /dev/null
+++ b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/impl/ActTaskServiceImpl.java
@@ -0,0 +1,133 @@
+
+
+package com.xjs.activiti.service.impl;
+
+import com.github.pagehelper.Page;
+import com.ruoyi.common.core.web.page.PageDomain;
+import com.xjs.activiti.domain.ActWorkflowFormData;
+import com.xjs.activiti.domain.dto.ActTaskDTO;
+import com.xjs.activiti.domain.dto.ActWorkflowFormDataDTO;
+import com.xjs.activiti.service.IActTaskService;
+import com.xjs.activiti.service.IActWorkflowFormDataService;
+import org.activiti.api.runtime.shared.query.Pageable;
+import org.activiti.api.task.model.Task;
+import org.activiti.api.task.model.builders.TaskPayloadBuilder;
+import org.activiti.api.task.runtime.TaskRuntime;
+import org.activiti.bpmn.model.FormProperty;
+import org.activiti.bpmn.model.UserTask;
+import org.activiti.engine.RepositoryService;
+import org.activiti.engine.RuntimeService;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * Activiti任务服务接口
+ *
+ * @author xiejs
+ * @since 2022-04-17 01:54:51
+ */
+
+@Service
+public class ActTaskServiceImpl implements IActTaskService {
+
+ @Autowired
+ private RepositoryService repositoryService;
+
+ @Autowired
+ private TaskRuntime taskRuntime;
+ @Autowired
+ private RuntimeService runtimeService;
+ @Autowired
+ private IActWorkflowFormDataService actWorkflowFormDataService;
+
+
+ @Override
+ public Page selectProcessDefinitionList(PageDomain pageDomain) {
+ Page list = new Page();
+ org.activiti.api.runtime.shared.query.Page pageTasks = taskRuntime.tasks(Pageable.of((pageDomain.getPageNum() - 1) * pageDomain.getPageSize(), pageDomain.getPageSize()));
+ List tasks = pageTasks.getContent();
+ int totalItems = pageTasks.getTotalItems();
+ list.setTotal(totalItems);
+ if (totalItems != 0) {
+ Set processInstanceIdIds = tasks.parallelStream().map(t -> t.getProcessInstanceId()).collect(Collectors.toSet());
+ List processInstanceList = runtimeService.createProcessInstanceQuery().processInstanceIds(processInstanceIdIds).list();
+ List actTaskDTOS = tasks.stream()
+ .map(t -> new ActTaskDTO(t, processInstanceList.parallelStream().filter(pi -> t.getProcessInstanceId().equals(pi.getId())).findAny().get()))
+ .collect(Collectors.toList());
+ list.addAll(actTaskDTOS);
+
+ }
+ return list;
+ }
+
+ @Override
+ public List formDataShow(String taskID) {
+ Task task = taskRuntime.task(taskID);
+/* ------------------------------------------------------------------------------
+ FormProperty_0ueitp2--__!!类型--__!!名称--__!!是否参数--__!!默认值
+ 例子:
+ FormProperty_0lovri0--__!!string--__!!姓名--__!!f--__!!同意!!__--驳回
+ FormProperty_1iu6onu--__!!int--__!!年龄--__!!s
+
+ 默认值:无、字符常量、FormProperty_开头定义过的控件ID
+ 是否参数:f为不是参数,s是字符,t是时间(不需要int,因为这里int等价于string)
+ 注:类型是可以获取到的,但是为了统一配置原则,都配置到
+ */
+
+ //注意!!!!!!!!:表单Key必须要任务编号一模一样,因为参数需要任务key,但是无法获取,只能获取表单key“task.getFormKey()”当做任务key
+ UserTask userTask = (UserTask) repositoryService.getBpmnModel(task.getProcessDefinitionId())
+ .getFlowElement(task.getFormKey());
+
+ if (userTask == null) {
+ return null;
+ }
+ List formProperties = userTask.getFormProperties();
+ List collect = formProperties.stream().map(fp -> fp.getId()).collect(Collectors.toList());
+
+ return collect;
+ }
+
+ @Override
+ public int formDataSave(String taskID, List awfs) throws ParseException {
+ Task task = taskRuntime.task(taskID);
+ ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();
+
+ Boolean hasVariables = false;//没有任何参数
+ HashMap variables = new HashMap();
+ //前端传来的字符串,拆分成每个控件
+ List acwfds = new ArrayList<>();
+ for (ActWorkflowFormDataDTO awf : awfs) {
+ ActWorkflowFormData actWorkflowFormData = new ActWorkflowFormData(processInstance.getBusinessKey(), awf, task);
+ acwfds.add(actWorkflowFormData);
+ //构建参数集合
+ if (!"f".equals(awf.getControlIsParam())) {
+ variables.put(awf.getControlId(), awf.getControlValue());
+ hasVariables = true;
+ }
+ }//for结束
+ if (task.getAssignee() == null) {
+ taskRuntime.claim(TaskPayloadBuilder.claim().withTaskId(task.getId()).build());
+ }
+ if (hasVariables) {
+ //带参数完成任务
+ taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(taskID)
+ .withVariables(variables)
+ .build());
+ } else {
+ taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(taskID)
+ .build());
+ }
+
+
+ //写入数据库
+ return actWorkflowFormDataService.insertActWorkflowFormDatas(acwfds);
+ }
+}
diff --git a/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/impl/ActWorkflowFormDataServiceImpl.java b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/impl/ActWorkflowFormDataServiceImpl.java
new file mode 100644
index 00000000..5c08db24
--- /dev/null
+++ b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/impl/ActWorkflowFormDataServiceImpl.java
@@ -0,0 +1,105 @@
+package com.xjs.activiti.service.impl;
+
+
+import com.ruoyi.common.core.utils.DateUtils;
+import com.ruoyi.common.security.utils.SecurityUtils;
+import com.xjs.activiti.domain.ActWorkflowFormData;
+import com.xjs.activiti.mapper.ActWorkflowFormDataMapper;
+import com.xjs.activiti.service.IActWorkflowFormDataService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * 动态单Service业务层处理
+ *
+ * @author xiejs
+ * @since 2022-04-17 01:51:27
+ */
+@Service
+public class ActWorkflowFormDataServiceImpl implements IActWorkflowFormDataService {
+ @Resource
+ private ActWorkflowFormDataMapper actWorkflowFormDataMapper;
+
+ /**
+ * 查询动态单
+ *
+ * @param id 动态单ID
+ * @return 动态单
+ */
+ @Override
+ public ActWorkflowFormData selectActWorkflowFormDataById(Long id) {
+ return actWorkflowFormDataMapper.selectActWorkflowFormDataById(id);
+ }
+
+ @Override
+ public List selectActWorkflowFormDataByBusinessKey(String businessKey) {
+ return actWorkflowFormDataMapper.selectActWorkflowFormDataByBusinessKey(businessKey);
+ }
+
+ /**
+ * 查询动态单列表
+ *
+ * @param ActWorkflowFormData 动态单
+ * @return 动态单
+ */
+ @Override
+ public List selectActWorkflowFormDataList(ActWorkflowFormData ActWorkflowFormData) {
+ return actWorkflowFormDataMapper.selectActWorkflowFormDataList(ActWorkflowFormData);
+ }
+
+ /**
+ * 新增动态单
+ *
+ * @param ActWorkflowFormData 动态单
+ * @return 结果
+ */
+ @Override
+ public int insertActWorkflowFormData(ActWorkflowFormData ActWorkflowFormData) {
+ ActWorkflowFormData.setCreateTime(DateUtils.getNowDate());
+ return actWorkflowFormDataMapper.insertActWorkflowFormData(ActWorkflowFormData);
+ }
+
+ @Override
+ public int insertActWorkflowFormDatas(List ActWorkflowFormDatas) {
+ return actWorkflowFormDataMapper.insertActWorkflowFormDatas(SecurityUtils.getUsername(), ActWorkflowFormDatas, new Date(),
+ SecurityUtils.getLoginUser().getSysUser().getNickName());
+ }
+
+
+ /**
+ * 修改动态单
+ *
+ * @param ActWorkflowFormData 动态单
+ * @return 结果
+ */
+ @Override
+ public int updateActWorkflowFormData(ActWorkflowFormData ActWorkflowFormData) {
+ return actWorkflowFormDataMapper.updateActWorkflowFormData(ActWorkflowFormData);
+ }
+
+ /**
+ * 批量删除动态单
+ *
+ * @param ids 需要删除的动态单ID
+ * @return 结果
+ */
+ @Override
+ public int deleteActWorkflowFormDataByIds(Long[] ids) {
+ return actWorkflowFormDataMapper.deleteActWorkflowFormDataByIds(ids);
+ }
+
+ /**
+ * 删除动态单信息
+ *
+ * @param id 动态单ID
+ * @return 结果
+ */
+ @Override
+ public int deleteActWorkflowFormDataById(Long id) {
+ return actWorkflowFormDataMapper.deleteActWorkflowFormDataById(id);
+ }
+}
diff --git a/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/impl/ActivitiHistoryServiceImpl.java b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/impl/ActivitiHistoryServiceImpl.java
new file mode 100644
index 00000000..f0ccc252
--- /dev/null
+++ b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/impl/ActivitiHistoryServiceImpl.java
@@ -0,0 +1,132 @@
+package com.xjs.activiti.service.impl;
+
+import com.xjs.activiti.domain.dto.ActivitiHighLineDTO;
+import com.xjs.activiti.service.IActivitiHistoryService;
+import org.activiti.bpmn.model.Process;
+import org.activiti.bpmn.model.*;
+import org.activiti.engine.HistoryService;
+import org.activiti.engine.RepositoryService;
+import org.activiti.engine.history.HistoricActivityInstance;
+import org.activiti.engine.history.HistoricProcessInstance;
+import org.activiti.engine.history.HistoricTaskInstance;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+/**
+ * Activiti历史任务服务接口实现
+ *
+ * @author xiejs
+ * @since 2022-04-17 01:48:55
+ */
+@Service
+public class ActivitiHistoryServiceImpl implements IActivitiHistoryService {
+
+ @Autowired
+ private HistoryService historyService;
+ @Autowired
+ private RepositoryService repositoryService;
+
+
+ @Override
+ public ActivitiHighLineDTO gethighLine(String instanceId) {
+ HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
+ .processInstanceId(instanceId).singleResult();
+ //获取bpmnModel对象
+ BpmnModel bpmnModel = repositoryService.getBpmnModel(historicProcessInstance.getProcessDefinitionId());
+ //因为我们这里只定义了一个Process 所以获取集合中的第一个即可
+ Process process = bpmnModel.getProcesses().get(0);
+ //获取所有的FlowElement信息
+ Collection flowElements = process.getFlowElements();
+
+ Map map = new HashMap<>();
+ for (FlowElement flowElement : flowElements) {
+ //判断是否是连线
+ if (flowElement instanceof SequenceFlow) {
+ SequenceFlow sequenceFlow = (SequenceFlow) flowElement;
+ String ref = sequenceFlow.getSourceRef();
+ String targetRef = sequenceFlow.getTargetRef();
+ map.put(ref + targetRef, sequenceFlow.getId());
+ }
+ }
+
+ //获取流程实例 历史节点(全部)
+ List list = historyService.createHistoricActivityInstanceQuery()
+ .processInstanceId(instanceId)
+ .list();
+ //各个历史节点 两两组合 key
+ Set keyList = new HashSet<>();
+ for (HistoricActivityInstance i : list) {
+ for (HistoricActivityInstance j : list) {
+ if (i != j) {
+ keyList.add(i.getActivityId() + j.getActivityId());
+ }
+ }
+ }
+ //高亮连线ID
+ Set highLine = new HashSet<>();
+ keyList.forEach(s -> highLine.add(map.get(s)));
+
+
+ //获取流程实例 历史节点(已完成)
+ List listFinished = historyService.createHistoricActivityInstanceQuery()
+ .processInstanceId(instanceId)
+ .finished()
+ .list();
+ //高亮节点ID
+ Set highPoint = new HashSet<>();
+ listFinished.forEach(s -> highPoint.add(s.getActivityId()));
+
+ //获取流程实例 历史节点(待办节点)
+ List listUnFinished = historyService.createHistoricActivityInstanceQuery()
+ .processInstanceId(instanceId)
+ .unfinished()
+ .list();
+
+ //需要移除的高亮连线
+ Set set = new HashSet<>();
+ //待办高亮节点
+ Set waitingToDo = new HashSet<>();
+ listUnFinished.forEach(s -> {
+ waitingToDo.add(s.getActivityId());
+
+ for (FlowElement flowElement : flowElements) {
+ //判断是否是 用户节点
+ if (flowElement instanceof UserTask) {
+ UserTask userTask = (UserTask) flowElement;
+
+ if (userTask.getId().equals(s.getActivityId())) {
+ List outgoingFlows = userTask.getOutgoingFlows();
+ //因为 高亮连线查询的是所有节点 两两组合 把待办 之后 往外发出的连线 也包含进去了 所以要把高亮待办节点 之后 即出的连线去掉
+ if (outgoingFlows != null && outgoingFlows.size() > 0) {
+ outgoingFlows.forEach(a -> {
+ if (a.getSourceRef().equals(s.getActivityId())) {
+ set.add(a.getId());
+ }
+ });
+ }
+ }
+ }
+ }
+ });
+
+ highLine.removeAll(set);
+ Set iDo = new HashSet<>(); //存放 高亮 我的办理节点
+ //当前用户已完成的任务
+ List taskInstanceList = historyService.createHistoricTaskInstanceQuery()
+// .taskAssignee(SecurityUtils.getUsername())
+ .finished()
+ .processInstanceId(instanceId).list();
+
+ taskInstanceList.forEach(a -> iDo.add(a.getTaskDefinitionKey()));
+
+ ActivitiHighLineDTO activitiHighLineDTO = new ActivitiHighLineDTO();
+ activitiHighLineDTO.setHighPoint(highPoint);
+ activitiHighLineDTO.setHighLine(highLine);
+ activitiHighLineDTO.setWaitingToDo(waitingToDo);
+ activitiHighLineDTO.setiDo(iDo);
+
+ return activitiHighLineDTO;
+ }
+}
diff --git a/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/impl/FormHistoryDataServiceImpl.java b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/impl/FormHistoryDataServiceImpl.java
new file mode 100644
index 00000000..a42e12d6
--- /dev/null
+++ b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/impl/FormHistoryDataServiceImpl.java
@@ -0,0 +1,53 @@
+package com.xjs.activiti.service.impl;
+
+
+import com.xjs.activiti.domain.ActWorkflowFormData;
+import com.xjs.activiti.domain.dto.HistoryDataDTO;
+import com.xjs.activiti.domain.dto.HistoryFormDataDTO;
+import com.xjs.activiti.service.IActWorkflowFormDataService;
+import com.xjs.activiti.service.IFormHistoryDataService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 历史数据表单服务接口实现
+ *
+ * @author xiejs
+ * @since 2022-04-17 01:50:13
+ */
+@Service
+public class FormHistoryDataServiceImpl implements IFormHistoryDataService {
+ @Autowired
+ private IActWorkflowFormDataService actWorkflowFormDataService;
+
+
+ private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+ @Override
+ public List historyDataShow(String businessKey) {
+ List returnHistoryFromDataDTOS = new ArrayList<>();
+ List actWorkflowFormData = actWorkflowFormDataService.selectActWorkflowFormDataByBusinessKey(businessKey);
+ Map> collect = actWorkflowFormData.stream().collect(Collectors.groupingBy(ActWorkflowFormData::getTaskNodeName));
+ collect.entrySet().forEach(
+ entry -> {
+ HistoryDataDTO returnHistoryFromDataDTO = new HistoryDataDTO();
+ returnHistoryFromDataDTO.setTaskNodeName(entry.getValue().get(0).getTaskNodeName());
+ returnHistoryFromDataDTO.setCreateName(entry.getValue().get(0).getCreateName());
+ returnHistoryFromDataDTO.setCreatedDate(sdf.format(entry.getValue().get(0).getCreateTime()));
+ returnHistoryFromDataDTO.setFormHistoryDataDTO(entry.getValue().stream().map(awfd -> new HistoryFormDataDTO(awfd.getControlName(), awfd.getControlValue())).collect(Collectors.toList()));
+ returnHistoryFromDataDTOS.add(returnHistoryFromDataDTO);
+ }
+ );
+ List collect1 = returnHistoryFromDataDTOS.stream().sorted((x, y) -> x.getCreatedDate().compareTo(y.getCreatedDate())).collect(Collectors.toList());
+
+ return collect1;
+ }
+
+
+}
diff --git a/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/impl/ProcessDefinitionServiceImpl.java b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/impl/ProcessDefinitionServiceImpl.java
new file mode 100644
index 00000000..26437a03
--- /dev/null
+++ b/xjs-business/xjs-business-workflow/src/main/java/com/xjs/activiti/service/impl/ProcessDefinitionServiceImpl.java
@@ -0,0 +1,147 @@
+package com.xjs.activiti.service.impl;
+
+import com.github.pagehelper.Page;
+import com.ruoyi.common.core.web.page.PageDomain;
+import com.xjs.activiti.domain.dto.DefinitionIdDTO;
+import com.xjs.activiti.domain.dto.ProcessDefinitionDTO;
+import com.xjs.activiti.domain.vo.ActReDeploymentVO;
+import com.xjs.activiti.mapper.ActReDeploymentMapper;
+import com.xjs.activiti.service.IProcessDefinitionService;
+import org.activiti.engine.HistoryService;
+import org.activiti.engine.RepositoryService;
+import org.activiti.engine.RuntimeService;
+import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntityImpl;
+import org.activiti.engine.repository.ProcessDefinition;
+import org.activiti.engine.repository.ProcessDefinitionQuery;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.zip.ZipInputStream;
+
+/**
+ * 流程定义服务接口实现
+ * @author xiejs
+ * @since 2022-04-17 01:50:42
+ */
+@Service
+public class ProcessDefinitionServiceImpl implements IProcessDefinitionService {
+ @Autowired
+ private RepositoryService repositoryService;
+
+ @Resource
+ private ActReDeploymentMapper actReDeploymentMapper;
+ @Autowired
+ private HistoryService historyService;
+ @Autowired
+ private RuntimeService runtimeService;
+
+ @Override
+ public Page selectProcessDefinitionList(ProcessDefinitionDTO processDefinition, PageDomain pageDomain) {
+ Page list = new Page<>();
+ ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery().orderByProcessDefinitionId().orderByProcessDefinitionVersion().desc();
+ if (StringUtils.isNotBlank(processDefinition.getName())) {
+ processDefinitionQuery.processDefinitionNameLike("%" + processDefinition.getName() + "%");
+ }
+ if (StringUtils.isNotBlank(processDefinition.getKey())) {
+ processDefinitionQuery.processDefinitionKeyLike("%" + processDefinition.getKey() + "%");
+ }
+ List processDefinitions = processDefinitionQuery.listPage((pageDomain.getPageNum() - 1) * pageDomain.getPageSize(), pageDomain.getPageSize());
+ long count = processDefinitionQuery.count();
+ list.setTotal(count);
+ if (count!=0) {
+ Set ids = processDefinitions.parallelStream().map(pdl -> pdl.getDeploymentId()).collect(Collectors.toSet());
+ List actReDeploymentVOS = actReDeploymentMapper.selectActReDeploymentByIds(ids);
+ List processDefinitionDTOS = processDefinitions.stream()
+ .map(pd -> new ProcessDefinitionDTO((ProcessDefinitionEntityImpl) pd, actReDeploymentVOS.parallelStream().filter(ard -> pd.getDeploymentId().equals(ard.getId())).findAny().orElse(new ActReDeploymentVO())))
+ .collect(Collectors.toList());
+ list.addAll(processDefinitionDTOS);
+ }
+ return list;
+ }
+
+ @Override
+ public DefinitionIdDTO getDefinitionsByInstanceId(String instanceId) {
+ ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(instanceId).singleResult();
+ String deploymentId = processInstance.getDeploymentId();
+ ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deploymentId).singleResult();
+ return new DefinitionIdDTO(processDefinition);
+ }
+
+ @Override
+ public int deleteProcessDefinitionById(String id) {
+ repositoryService.deleteDeployment(id, false);
+ return 1;
+ }
+
+ @Override
+ public void uploadStreamAndDeployment(MultipartFile file) throws IOException {
+ // 获取上传的文件名
+ String fileName = file.getOriginalFilename();
+ // 得到输入流(字节流)对象
+ InputStream fileInputStream = file.getInputStream();
+ // 文件的扩展名
+ String extension = FilenameUtils.getExtension(fileName);
+
+ if (extension.equals("zip")) {
+ ZipInputStream zip = new ZipInputStream(fileInputStream);
+ repositoryService.createDeployment()//初始化流程
+ .addZipInputStream(zip)
+ .deploy();
+ } else {
+ repositoryService.createDeployment()//初始化流程
+ .addInputStream(fileName, fileInputStream)
+
+ .deploy();
+ }
+ }
+
+ @Override
+ public void suspendOrActiveApply(String id, Integer suspendState) {
+ if (1==suspendState) {
+ // 当流程定义被挂起时,已经发起的该流程定义的流程实例不受影响(如果选择级联挂起则流程实例也会被挂起)。
+ // 当流程定义被挂起时,无法发起新的该流程定义的流程实例。
+ // 直观变化:act_re_procdef 的 SUSPENSION_STATE_ 为 2
+ repositoryService.suspendProcessDefinitionById(id);
+ } else if (2==suspendState) {
+ repositoryService.activateProcessDefinitionById(id);
+ }
+ }
+
+ @Override
+ public String upload(MultipartFile multipartFile) throws IOException {
+ //return FileUploadUtils.upload(RuoYiConfig.getUploadPath()+"/processDefinition" , multipartFile);
+ return "";
+ }
+
+ @Override
+ public void addDeploymentByString(String stringBPMN) {
+ repositoryService.createDeployment()
+ .addString("CreateWithBPMNJS.bpmn", stringBPMN)
+ .deploy();
+ }
+
+ @Override
+ public void getProcessDefineXML(HttpServletResponse response, String deploymentId, String resourceName) throws IOException {
+ InputStream inputStream = repositoryService.getResourceAsStream(deploymentId, resourceName);
+ int count = inputStream.available();
+ byte[] bytes = new byte[count];
+ response.setContentType("text/xml");
+ OutputStream outputStream = response.getOutputStream();
+ while (inputStream.read(bytes) != -1) {
+ outputStream.write(bytes);
+ }
+ inputStream.close();
+ }
+}
diff --git a/xjs-business/xjs-business-workflow/src/main/resources/mapper/activiti/ActReDeploymentMapper.xml b/xjs-business/xjs-business-workflow/src/main/resources/mapper/activiti/ActReDeploymentMapper.xml
new file mode 100644
index 00000000..7ae144df
--- /dev/null
+++ b/xjs-business/xjs-business-workflow/src/main/resources/mapper/activiti/ActReDeploymentMapper.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+ select ID_ id, DEPLOY_TIME_ deploy_time
+ from `act_re_deployment`
+
+
+
+
+
+
+
diff --git a/xjs-business/xjs-business-workflow/src/main/resources/mapper/activiti/ActWorkflowFormDataMapper.xml b/xjs-business/xjs-business-workflow/src/main/resources/mapper/activiti/ActWorkflowFormDataMapper.xml
new file mode 100644
index 00000000..7399f194
--- /dev/null
+++ b/xjs-business/xjs-business-workflow/src/main/resources/mapper/activiti/ActWorkflowFormDataMapper.xml
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ select id,
+ business_key,
+ form_key,
+ control_id,
+ control_name,
+ control_value,
+ task_node_name,
+ create_name,
+ create_by,
+ create_time
+ from act_workflow_FormData
+
+
+
+
+
+
+
+
+ insert into act_workflow_FormData
+
+ business_key,
+ form_key,
+ control_id,
+ control_name,
+ control_value,
+ task_node_name,
+ create_by,
+ create_time,
+
+
+ #{businessKey},
+ #{formKey},
+ #{controlId},
+ #{controlName},
+ #{controlValue},
+ #{taskNodeName},
+ #{createBy},
+ #{createTime},
+
+
+
+
+ insert into act_workflow_FormData
+ (business_key,form_key,control_id,control_name,control_value,task_node_name,create_by,create_time,create_name)
+ values
+
+ (#{awfd.businessKey},#{awfd.formKey},#{awfd.controlId},#{awfd.controlName},
+ #{awfd.controlValue},#{awfd.taskNodeName},#{param1},#{param3},#{param4})
+
+
+
+
+ update act_workflow_FormData
+
+ business_key = #{businessKey},
+ form_key = #{formKey},
+ control_id = #{controlId},
+ control_name = #{controlName},
+ control_value = #{controlValue},
+ task_node_name = #{taskNodeName},
+ create_by = #{createBy},
+ create_time = #{createTime},
+
+ where id = #{id}
+
+
+
+ delete
+ from act_workflow_FormData
+ where id = #{id}
+
+
+
+ delete from act_workflow_FormData where id in
+
+ #{id}
+
+
+
+
+
diff --git a/xjs-business/xjs-business-workflow/src/main/resources/mybatis/mybatis-config.xml b/xjs-business/xjs-business-workflow/src/main/resources/mybatis/mybatis-config.xml
new file mode 100644
index 00000000..e8b52be8
--- /dev/null
+++ b/xjs-business/xjs-business-workflow/src/main/resources/mybatis/mybatis-config.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+