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 @@ + + + + + + + + + + + + +