ソースを参照

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	boman-common/boman-common-core/pom.xml
#	boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/SecurityUtils.java
king 4 年 前
コミット
b8d42d7bd1
41 ファイル変更2350 行追加626 行削除
  1. 17 0
      boman-common/boman-common-core/pom.xml
  2. 64 0
      boman-common/boman-common-core/src/main/java/com/boman/common/core/config/HuaWeiConfig.java
  3. 51 0
      boman-common/boman-common-core/src/main/java/com/boman/common/core/config/NginxConfig.java
  4. 116 0
      boman-common/boman-common-core/src/main/java/com/boman/common/core/config/RuoYiConfig.java
  5. 211 0
      boman-common/boman-common-core/src/main/java/com/boman/common/core/domain/LoginUser.java
  6. 42 0
      boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/SecurityUtils.java
  7. 226 0
      boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/file/FileUploadUtils.java
  8. 21 6
      boman-modules/boman-activity/pom.xml
  9. 0 117
      boman-modules/boman-activity/src/main/java/com/boman/activity/controller/WorkflowLeaveController.java
  10. 144 0
      boman-modules/boman-activity/src/main/java/com/boman/activity/domain/ActWorkflowFormData.java
  11. 0 162
      boman-modules/boman-activity/src/main/java/com/boman/activity/domain/WorkflowLeave.java
  12. 96 0
      boman-modules/boman-activity/src/main/java/com/boman/activity/domain/dto/ActTaskDTO.java
  13. 85 0
      boman-modules/boman-activity/src/main/java/com/boman/activity/domain/dto/ActWorkflowFormDataDTO.java
  14. 42 0
      boman-modules/boman-activity/src/main/java/com/boman/activity/domain/dto/ActivitiHighLineDTO.java
  15. 32 0
      boman-modules/boman-activity/src/main/java/com/boman/activity/domain/dto/DefinitionIdDTO.java
  16. 44 0
      boman-modules/boman-activity/src/main/java/com/boman/activity/domain/dto/HistoryDataDTO.java
  17. 36 0
      boman-modules/boman-activity/src/main/java/com/boman/activity/domain/dto/HistoryFormDataDTO.java
  18. 112 0
      boman-modules/boman-activity/src/main/java/com/boman/activity/domain/dto/ProcessDefinitionDTO.java
  19. 30 0
      boman-modules/boman-activity/src/main/java/com/boman/activity/domain/vo/ActReDeploymentVO.java
  20. 0 21
      boman-modules/boman-activity/src/main/java/com/boman/activity/instener/LeaveEndStateListener.java
  21. 19 0
      boman-modules/boman-activity/src/main/java/com/boman/activity/mapper/ActReDeploymentMapper.java
  22. 83 0
      boman-modules/boman-activity/src/main/java/com/boman/activity/mapper/ActWorkflowFormDataMapper.java
  23. 0 76
      boman-modules/boman-activity/src/main/java/com/boman/activity/mapper/WorkflowLeaveMapper.java
  24. 15 0
      boman-modules/boman-activity/src/main/java/com/boman/activity/service/IActTaskService.java
  25. 70 0
      boman-modules/boman-activity/src/main/java/com/boman/activity/service/IActWorkflowFormDataService.java
  26. 7 0
      boman-modules/boman-activity/src/main/java/com/boman/activity/service/IActivitiHistoryService.java
  27. 16 0
      boman-modules/boman-activity/src/main/java/com/boman/activity/service/IFormHistoryDataService.java
  28. 66 0
      boman-modules/boman-activity/src/main/java/com/boman/activity/service/IProcessDefinitionService.java
  29. 0 74
      boman-modules/boman-activity/src/main/java/com/boman/activity/service/IWorkflowLeaveService.java
  30. 125 0
      boman-modules/boman-activity/src/main/java/com/boman/activity/service/impl/ActTaskServiceImpl.java
  31. 112 0
      boman-modules/boman-activity/src/main/java/com/boman/activity/service/impl/ActWorkflowFormDataServiceImpl.java
  32. 125 0
      boman-modules/boman-activity/src/main/java/com/boman/activity/service/impl/ActivitiHistoryServiceImpl.java
  33. 53 0
      boman-modules/boman-activity/src/main/java/com/boman/activity/service/impl/FormHistoryDataServiceImpl.java
  34. 148 0
      boman-modules/boman-activity/src/main/java/com/boman/activity/service/impl/ProcessDefinitionServiceImpl.java
  35. 0 155
      boman-modules/boman-activity/src/main/java/com/boman/activity/service/impl/WorkflowLeaveServiceImpl.java
  36. 0 1
      boman-modules/boman-activity/src/main/resources/application.properties
  37. 27 0
      boman-modules/boman-activity/src/main/resources/mapper/activiti/ActReDeploymentMapper.xml
  38. 101 0
      boman-modules/boman-activity/src/main/resources/mapper/activiti/ActWorkflowFormDataMapper.xml
  39. 0 13
      boman-modules/boman-activity/src/test/java/com/boman/activity/BomanActivityApplicationTests.java
  40. 13 0
      boman-modules/boman-gen/src/main/java/com/boman/gen/domain/GenTableColumn.java
  41. 1 1
      boman-modules/boman-system/src/main/java/com/boman/system/controller/SysMenuController.java

+ 17 - 0
boman-common/boman-common-core/pom.xml

@@ -14,7 +14,18 @@
     <description>
         boman-common-core核心模块
     </description>
+
     <dependencies>
+        <dependency>
+            <groupId>com.boman</groupId>
+            <artifactId>boman-api-system</artifactId>
+        </dependency>
+        <!-- 华为云OBS-->
+        <dependency>
+            <groupId>com.huaweicloud</groupId>
+            <artifactId>esdk-obs-java</artifactId>
+            <version>[3.20.6.1,)</version>
+        </dependency>
     	<!-- SpringCloud Openfeign -->
         <dependency>
             <groupId>org.springframework.cloud</groupId>
@@ -32,6 +43,12 @@
             <groupId>org.springframework</groupId>
             <artifactId>spring-web</artifactId>
     	</dependency>
+        <!-- spring security 安全认证 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>
+
         <!-- Apache Commons Pool2 -->
         <dependency>
             <groupId>org.apache.commons</groupId>

+ 64 - 0
boman-common/boman-common-core/src/main/java/com/boman/common/core/config/HuaWeiConfig.java

@@ -0,0 +1,64 @@
+package com.boman.common.core.config;
+
+import com.obs.services.ObsClient;
+import com.obs.services.model.PutObjectResult;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+
+/**
+ * 读取项目相关配置
+ *
+ * @author danny
+ */
+@Component
+@ConfigurationProperties(prefix = "huawei")
+public class HuaWeiConfig {
+    private static boolean enabled;
+    private static String endPoint;
+    private static String ak;
+    private static String sk;
+    private static String url;
+    private static String bucketName;
+
+    public static boolean isEnabled() {
+        return enabled;
+    }
+
+    public void setEnabled(boolean enabled) {
+        HuaWeiConfig.enabled = enabled;
+    }
+
+    public void setEndPoint(String endPoint) {
+        HuaWeiConfig.endPoint = endPoint;
+    }
+
+    public void setAk(String ak) {
+        HuaWeiConfig.ak = ak;
+    }
+
+    public void setSk(String sk) {
+        HuaWeiConfig.sk = sk;
+    }
+
+
+    public void setUrl(String url) {
+        HuaWeiConfig.url = url;
+    }
+
+
+    public void setBucketName(String bucketName) {
+        HuaWeiConfig.bucketName = bucketName;
+    }
+
+    private static ObsClient getObsClient() {
+        return new ObsClient(ak, sk, endPoint);
+    }
+    public static String saveHuaWeiOBS(String baseDir, String fileName, MultipartFile file) throws IOException {
+        ObsClient obsClient = getObsClient();
+        PutObjectResult putObjectResult = obsClient.putObject(bucketName, baseDir+"/"+fileName, file.getInputStream());
+        return url+"/"+putObjectResult.getObjectKey();
+    }
+}

+ 51 - 0
boman-common/boman-common-core/src/main/java/com/boman/common/core/config/NginxConfig.java

@@ -0,0 +1,51 @@
+package com.boman.common.core.config;
+
+import com.obs.services.ObsClient;
+import com.obs.services.model.PutObjectResult;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * 读取项目相关配置
+ *
+ * @author danny
+ */
+@Component
+@ConfigurationProperties(prefix = "nginx")
+public class NginxConfig {
+    private static boolean enabled;
+    private static String path;
+    private static String url;
+
+    public static boolean isEnabled() {
+        return enabled;
+    }
+
+    public void setEnabled(boolean enabled) {
+        NginxConfig.enabled = enabled;
+    }
+
+
+
+    public void setPath(String path) {
+        NginxConfig.path = path;
+    }
+
+
+    public void setUrl(String url) {
+        NginxConfig.url = url;
+    }
+
+    public static String getPath() {
+        return path;
+    }
+
+    public static String getUrl() {
+        return url;
+    }
+}

+ 116 - 0
boman-common/boman-common-core/src/main/java/com/boman/common/core/config/RuoYiConfig.java

@@ -0,0 +1,116 @@
+package com.boman.common.core.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * 读取项目相关配置
+ * 
+ * @author ruoyi
+ */
+@Component
+@ConfigurationProperties(prefix = "ruoyi")
+public class RuoYiConfig
+{
+    /** 项目名称 */
+    private String name;
+
+    /** 版本 */
+    private String version;
+
+    /** 版权年份 */
+    private String copyrightYear;
+
+    /** 实例演示开关 */
+    private boolean demoEnabled;
+
+    /** 上传路径 */
+    private static String profile;
+
+    /** 获取地址开关 */
+    private static boolean addressEnabled;
+
+    public String getName()
+    {
+        return name;
+    }
+
+    public void setName(String name)
+    {
+        this.name = name;
+    }
+
+    public String getVersion()
+    {
+        return version;
+    }
+
+    public void setVersion(String version)
+    {
+        this.version = version;
+    }
+
+    public String getCopyrightYear()
+    {
+        return copyrightYear;
+    }
+
+    public void setCopyrightYear(String copyrightYear)
+    {
+        this.copyrightYear = copyrightYear;
+    }
+
+    public boolean isDemoEnabled()
+    {
+        return demoEnabled;
+    }
+
+    public void setDemoEnabled(boolean demoEnabled)
+    {
+        this.demoEnabled = demoEnabled;
+    }
+
+    public static String getProfile()
+    {
+        return profile;
+    }
+
+    public void setProfile(String profile)
+    {
+        RuoYiConfig.profile = profile;
+    }
+
+    public static boolean isAddressEnabled()
+    {
+        return addressEnabled;
+    }
+
+    public void setAddressEnabled(boolean addressEnabled)
+    {
+        RuoYiConfig.addressEnabled = addressEnabled;
+    }
+
+    /**
+     * 获取头像上传路径
+     */
+    public static String getAvatarPath()
+    {
+        return getProfile() + "/avatar";
+    }
+
+    /**
+     * 获取下载路径
+     */
+    public static String getDownloadPath()
+    {
+        return getProfile() + "/download/";
+    }
+
+    /**
+     * 获取上传路径
+     */
+    public static String getUploadPath()
+    {
+        return getProfile() + "/upload";
+    }
+}

+ 211 - 0
boman-common/boman-common-core/src/main/java/com/boman/common/core/domain/LoginUser.java

@@ -0,0 +1,211 @@
+package com.boman.common.core.domain;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import com.boman.system.api.domain.SysUser;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+/**
+ * 登录用户身份权限
+ *
+ * @author ruoyi
+ */
+public class LoginUser implements UserDetails {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户唯一标识
+     */
+    private String token;
+
+    /**
+     * 登录时间
+     */
+    private Long loginTime;
+
+    /**
+     * 过期时间
+     */
+    private Long expireTime;
+
+    /**
+     * 登录IP地址
+     */
+    private String ipaddr;
+
+    /**
+     * 登录地点
+     */
+    private String loginLocation;
+
+    /**
+     * 浏览器类型
+     */
+    private String browser;
+
+    /**
+     * 操作系统
+     */
+    private String os;
+
+    /**
+     * 权限列表
+     */
+    private Set<String> permissions;
+
+    private List<SimpleGrantedAuthority> authorities;
+
+    /**
+     * 用户信息
+     */
+    private SysUser user;
+
+    public String getToken() {
+        return token;
+    }
+
+    public void setToken(String token) {
+        this.token = token;
+    }
+
+    public LoginUser() {
+    }
+
+    public LoginUser(SysUser user, Set<String> permissions, List<SimpleGrantedAuthority> authorities) {
+        this.user = user;
+        this.permissions = permissions;
+        this.authorities = authorities;
+    }
+
+    @JsonIgnore
+    @Override
+    public String getPassword() {
+        return user.getPassword();
+    }
+
+    @Override
+    public String getUsername() {
+        return user.getUserName();
+    }
+
+    /**
+     * 账户是否未过期,过期无法验证
+     */
+    @JsonIgnore
+    @Override
+    public boolean isAccountNonExpired() {
+        return true;
+    }
+
+    /**
+     * 指定用户是否解锁,锁定的用户无法进行身份验证
+     *
+     * @return
+     */
+    @JsonIgnore
+    @Override
+    public boolean isAccountNonLocked() {
+        return true;
+    }
+
+    /**
+     * 指示是否已过期的用户的凭据(密码),过期的凭据防止认证
+     *
+     * @return
+     */
+    @JsonIgnore
+    @Override
+    public boolean isCredentialsNonExpired() {
+        return true;
+    }
+
+    /**
+     * 是否可用 ,禁用的用户不能身份验证
+     *
+     * @return
+     */
+    @JsonIgnore
+    @Override
+    public boolean isEnabled() {
+        return true;
+    }
+
+    public Long getLoginTime() {
+        return loginTime;
+    }
+
+    public void setLoginTime(Long loginTime) {
+        this.loginTime = loginTime;
+    }
+
+    public String getIpaddr() {
+        return ipaddr;
+    }
+
+    public void setIpaddr(String ipaddr) {
+        this.ipaddr = ipaddr;
+    }
+
+    public String getLoginLocation() {
+        return loginLocation;
+    }
+
+    public void setLoginLocation(String loginLocation) {
+        this.loginLocation = loginLocation;
+    }
+
+    public String getBrowser() {
+        return browser;
+    }
+
+    public void setBrowser(String browser) {
+        this.browser = browser;
+    }
+
+    public String getOs() {
+        return os;
+    }
+
+    public void setOs(String os) {
+        this.os = os;
+    }
+
+    public Long getExpireTime() {
+        return expireTime;
+    }
+
+    public void setExpireTime(Long expireTime) {
+        this.expireTime = expireTime;
+    }
+
+    public Set<String> getPermissions() {
+        return permissions;
+    }
+
+    public void setPermissions(Set<String> permissions) {
+        this.permissions = permissions;
+    }
+
+    public SysUser getUser() {
+        return user;
+    }
+
+    public void setUser(SysUser user) {
+        this.user = user;
+    }
+
+    public void setAuthorities(List<SimpleGrantedAuthority> authorities) {
+        this.authorities = authorities;
+    }
+
+    @Override
+    public Collection<? extends GrantedAuthority> getAuthorities() {
+
+        return authorities;
+
+    }
+}

+ 42 - 0
boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/SecurityUtils.java

@@ -2,6 +2,11 @@ package com.boman.common.core.utils;
 
 import javax.servlet.http.HttpServletRequest;
 
+import com.boman.common.core.domain.LoginUser;
+import com.boman.common.core.exception.CustomException;
+import com.boman.common.core.utils.constant.HttpStatus;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import com.boman.common.core.constant.CacheConstants;
 import com.boman.common.core.text.Convert;
@@ -13,6 +18,43 @@ import com.boman.common.core.text.Convert;
  */
 public class SecurityUtils
 {
+
+    /**
+     * 获取用户账户
+     **/
+    public static String getNickName()
+    {
+        try
+        {
+            return getLoginUser().getUser().getNickName();
+        }
+        catch (Exception e)
+        {
+            throw new CustomException("获取用户账户异常", HttpStatus.UNAUTHORIZED);
+        }
+    }
+
+    /**
+     * 获取用户
+     **/
+    public static LoginUser getLoginUser()
+    {
+        try
+        {
+            return (LoginUser) getAuthentication().getPrincipal();
+        }
+        catch (Exception e)
+        {
+            throw new CustomException("获取用户信息异常", HttpStatus.UNAUTHORIZED);
+        }
+    }
+    /**
+     * 获取Authentication
+     */
+    public static Authentication getAuthentication()
+    {
+        return SecurityContextHolder.getContext().getAuthentication();
+    }
     /**
      * 获取用户
      */

+ 226 - 0
boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/file/FileUploadUtils.java

@@ -0,0 +1,226 @@
+package com.boman.common.core.utils.file;
+
+import java.io.File;
+import java.io.IOException;
+
+import com.boman.common.core.config.HuaWeiConfig;
+import com.boman.common.core.config.NginxConfig;
+import com.boman.common.core.config.RuoYiConfig;
+import com.boman.common.core.constant.Constants;
+import com.boman.common.core.exception.file.FileNameLengthLimitExceededException;
+import com.boman.common.core.exception.file.FileSizeLimitExceededException;
+import com.boman.common.core.exception.file.InvalidExtensionException;
+import com.boman.common.core.utils.DateUtils;
+import com.boman.common.core.utils.IdUtils;
+import com.boman.common.core.utils.StringUtils;
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+
+/**
+ * 文件上传工具类
+ *
+ * @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;
+
+    /**
+     * 默认上传的地址
+     */
+    private static String defaultBaseDir = RuoYiConfig.getProfile();
+
+    public static void setDefaultBaseDir(String defaultBaseDir) {
+        FileUploadUtils.defaultBaseDir = defaultBaseDir;
+    }
+
+    public static String getDefaultBaseDir() {
+        return defaultBaseDir;
+    }
+
+    /**
+     * 以默认配置进行文件上传
+     *
+     * @param file 上传的文件
+     * @return 文件名称
+     * @throws Exception
+     */
+    public static final String upload(MultipartFile file) throws IOException {
+        try {
+            return upload(getDefaultBaseDir(), file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
+        } catch (Exception e) {
+            throw new IOException(e.getMessage(), e);
+        }
+    }
+
+    /**
+     * 根据文件路径上传
+     *
+     * @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);
+
+        String pathFileName = saveFile(baseDir, fileName, file);
+        return pathFileName;
+    }
+
+    public static String saveFile(String baseDir, String fileName, MultipartFile file) throws IOException {
+        String pathFileName = null;
+        if (HuaWeiConfig.isEnabled()) {
+            pathFileName = HuaWeiConfig.saveHuaWeiOBS(baseDir, fileName, file);
+        } else if (NginxConfig.isEnabled()) {
+            pathFileName = saveNginx(baseDir, fileName, file);
+        } else {
+            pathFileName = saveTheLocal(baseDir, fileName, file);
+        }
+        return pathFileName;
+    }
+
+
+    public static String saveTheLocal(String baseDir, String fileName, MultipartFile file) throws IOException {
+        File desc = getAbsoluteFile(baseDir, fileName);
+        file.transferTo(desc);
+        return getPathFileName(baseDir, fileName);
+    }
+
+    public static String saveNginx(String baseDir, String fileName, MultipartFile file) throws IOException {
+        File desc = getAbsoluteFile(NginxConfig.getPath() + baseDir, fileName);
+        file.transferTo(desc);
+        return NginxConfig.getUrl() + getPathFileName(NginxConfig.getPath() + baseDir, fileName);
+    }
+
+
+    /**
+     * 编码文件名
+     */
+    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.getParentFile().exists()) {
+            desc.getParentFile().mkdirs();
+        }
+        if (!desc.exists()) {
+            desc.createNewFile();
+        }
+        return desc;
+    }
+
+    private static final String getPathFileName(String uploadDir, String fileName) throws IOException {
+        int dirLastIndex = RuoYiConfig.getProfile().length() + 1;
+        String currentDir = StringUtils.substring(uploadDir, dirLastIndex);
+        String pathFileName = Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName;
+        return pathFileName;
+    }
+
+    /**
+     * 文件大小校验
+     *
+     * @param file 上传的文件
+     * @return
+     * @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 {
+                throw new InvalidExtensionException(allowedExtension, extension, fileName);
+            }
+        }
+
+    }
+
+    /**
+     * 判断MIME类型是否是允许的MIME类型
+     *
+     * @param extension
+     * @param allowedExtension
+     * @return
+     */
+    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;
+    }
+}

+ 21 - 6
boman-modules/boman-activity/pom.xml

@@ -2,19 +2,32 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
 	<modelVersion>4.0.0</modelVersion>
+
 	<parent>
 		<groupId>com.boman</groupId>
 		<artifactId>boman-modules</artifactId>
 		<version>2.5.0</version>
 	</parent>
-
-	<name>boman-activity</name>
+	<artifactId>boman-activity</artifactId>
 	<description>Demo project for Spring Boot</description>
 	<properties>
 		<java.version>1.8</java.version>
 		<spring-cloud.version>2020.0.3-SNAPSHOT</spring-cloud.version>
 	</properties>
 	<dependencies>
+
+		<dependency>
+			<groupId>org.activiti</groupId>
+			<artifactId>activiti-spring-boot-starter</artifactId>
+			<version>7.1.0.M4</version>
+		</dependency>
+		<dependency>
+			<groupId>org.activiti.dependencies</groupId>
+			<artifactId>activiti-dependencies</artifactId>
+			<version>7.1.0.M4</version>
+			<type>pom</type>
+		</dependency>
+
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-data-jpa</artifactId>
@@ -31,10 +44,7 @@
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-web</artifactId>
 		</dependency>
-		<dependency>
-			<groupId>org.springframework.cloud</groupId>
-			<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
-		</dependency>
+
 
 		<dependency>
 			<groupId>mysql</groupId>
@@ -46,6 +56,11 @@
 			<artifactId>spring-boot-starter-test</artifactId>
 			<scope>test</scope>
 		</dependency>
+		<!-- RuoYi Common Swagger -->
+		<dependency>
+			<groupId>com.boman</groupId>
+			<artifactId>boman-common-core</artifactId>
+		</dependency>
 	</dependencies>
 	<dependencyManagement>
 		<dependencies>

+ 0 - 117
boman-modules/boman-activity/src/main/java/com/boman/activity/controller/WorkflowLeaveController.java

@@ -1,117 +0,0 @@
-package com.ruoyi.leave.controller;
-
-import java.util.List;
-
-
-import com.ruoyi.common.utils.SecurityUtils;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import com.ruoyi.common.annotation.Log;
-import com.ruoyi.common.core.controller.BaseController;
-import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.enums.BusinessType;
-import com.ruoyi.leave.domain.WorkflowLeave;
-import com.ruoyi.leave.service.IWorkflowLeaveService;
-import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.common.core.page.TableDataInfo;
-
-/**
- * 请假Controller
- *
- * @author danny
- * @date 2020-10-28
- */
-@RestController
-@RequestMapping("/workflow/leave")
-public class WorkflowLeaveController extends BaseController {
-    @Autowired
-    private IWorkflowLeaveService workflowLeaveService;
-
-    /**
-     * 查询请假列表
-     */
-    @PreAuthorize("@ss.hasPermi('workflow:leave:list')")
-    @GetMapping("/list")
-    public TableDataInfo list(WorkflowLeave workflowLeave) {
-        startPage();
-        workflowLeave.setCreateBy(SecurityUtils.getUsername());
-        List<WorkflowLeave> list = workflowLeaveService.selectWorkflowLeaveAndTaskNameList(workflowLeave);
-        return getDataTable(list);
-    }
-    /**
-     * 查询请假列表
-     */
-    @PreAuthorize("@ss.hasPermi('workflow:leave:list')")
-    @GetMapping("/listAll")
-    public TableDataInfo listAll(WorkflowLeave workflowLeave) {
-        startPage();
-        List<WorkflowLeave> list = workflowLeaveService.selectWorkflowLeaveList(workflowLeave);
-        return getDataTable(list);
-    }
-
-    /**
-     * 导出请假列表
-     */
-    @PreAuthorize("@ss.hasPermi('workflow:leave:export')")
-    @Log(title = "请假", businessType = BusinessType.EXPORT)
-    @GetMapping("/export")
-    public AjaxResult export(WorkflowLeave workflowLeave) {
-        List<WorkflowLeave> list = workflowLeaveService.selectWorkflowLeaveList(workflowLeave);
-        ExcelUtil<WorkflowLeave> util = new ExcelUtil<WorkflowLeave>(WorkflowLeave.class);
-        return util.exportExcel(list, "leave");
-    }
-
-    /**
-     * 获取请假详细信息
-     */
-    @PreAuthorize("@ss.hasPermi('workflow:leave:query')")
-    @GetMapping(value = "/{id}")
-    public AjaxResult getInfo(@PathVariable("id") String id) {
-        return AjaxResult.success(workflowLeaveService.selectWorkflowLeaveById(id));
-    }   /**
-     * 获取请假详细信息
-     */
-    @PreAuthorize("@ss.hasPermi('workflow:leave:query')")
-    @GetMapping(value = "ByInstanceId/{instanceId}")
-    public AjaxResult getInfoByInstanceId(@PathVariable("instanceId") String instanceId) {
-        return AjaxResult.success(workflowLeaveService.selectWorkflowLeaveByInstanceId(instanceId));
-    }
-
-    /**
-     * 新增请假
-     */
-    @PreAuthorize("@ss.hasPermi('workflow:leave:add')")
-    @Log(title = "请假", businessType = BusinessType.INSERT)
-    @PostMapping
-    public AjaxResult add(@RequestBody WorkflowLeave workflowLeave) {
-        return toAjax(workflowLeaveService.insertWorkflowLeave(workflowLeave));
-    }
-
-    /**
-     * 修改请假
-     */
-    @PreAuthorize("@ss.hasPermi('workflow:leave:edit')")
-    @Log(title = "请假", businessType = BusinessType.UPDATE)
-    @PutMapping
-    public AjaxResult edit(@RequestBody WorkflowLeave workflowLeave) {
-        return toAjax(workflowLeaveService.insertWorkflowLeave(workflowLeave));
-    }
-
-    /**
-     * 删除请假
-     */
-    @PreAuthorize("@ss.hasPermi('workflow:leave:remove')")
-    @Log(title = "请假", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{ids}")
-    public AjaxResult remove(@PathVariable String[] ids) {
-        return toAjax(workflowLeaveService.deleteWorkflowLeaveByIds(ids));
-    }
-}

+ 144 - 0
boman-modules/boman-activity/src/main/java/com/boman/activity/domain/ActWorkflowFormData.java

@@ -0,0 +1,144 @@
+package com.boman.activity.domain;
+
+import com.boman.activity.domain.dto.ActWorkflowFormDataDTO;
+import com.boman.common.core.web.domain.BaseEntity;
+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 danny
+ * @date 2020-11-02
+ */
+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();
+    }
+}

+ 0 - 162
boman-modules/boman-activity/src/main/java/com/boman/activity/domain/WorkflowLeave.java

@@ -1,162 +0,0 @@
-package com.ruoyi.leave.domain;
-
-import java.util.Date;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-import com.ruoyi.common.annotation.Excel;
-import com.ruoyi.common.core.domain.BaseEntity;
-
-/**
- * 请假对象 workflow_leave
- * 
- * @author danny
- * @date 2020-10-28
- */
-public class WorkflowLeave extends BaseEntity
-{
-    private static final long serialVersionUID = 1L;
-
-    /** 主键ID */
-    private String id;
-
-    /** 请假类型 */
-    @Excel(name = "请假类型")
-    private String type;
-
-    /** 标题 */
-    @Excel(name = "标题")
-    private String title;
-
-    /** 原因 */
-    @Excel(name = "原因")
-    private String reason;
-
-    /** 开始时间 */
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @Excel(name = "开始时间", width = 30, dateFormat = "yyyy-MM-dd")
-    private Date leaveStartTime;
-
-    /** 结束时间 */
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @Excel(name = "结束时间", width = 30, dateFormat = "yyyy-MM-dd")
-    private Date leaveEndTime;
-
-
-    private String instanceId;
-    private String taskName;
-
-    /** 状态 */
-    @Excel(name = "状态")
-    private String state;
-
-    /** 创建人 */
-    @Excel(name = "创建人")
-    private String createName;
-
-    public void setId(String id) 
-    {
-        this.id = id;
-    }
-
-    public String getId() 
-    {
-        return id;
-    }
-    public void setType(String type) 
-    {
-        this.type = type;
-    }
-
-    public String getType() 
-    {
-        return type;
-    }
-    public void setTitle(String title) 
-    {
-        this.title = title;
-    }
-
-    public String getTitle() 
-    {
-        return title;
-    }
-    public void setReason(String reason) 
-    {
-        this.reason = reason;
-    }
-
-    public String getReason() 
-    {
-        return reason;
-    }
-    public void setLeaveStartTime(Date leaveStartTime) 
-    {
-        this.leaveStartTime = leaveStartTime;
-    }
-
-    public Date getLeaveStartTime() 
-    {
-        return leaveStartTime;
-    }
-    public void setLeaveEndTime(Date leaveEndTime) 
-    {
-        this.leaveEndTime = leaveEndTime;
-    }
-
-    public Date getLeaveEndTime() 
-    {
-        return leaveEndTime;
-    }
-    public void setInstanceId(String instanceId) 
-    {
-        this.instanceId = instanceId;
-    }
-
-    public String getInstanceId() 
-    {
-        return instanceId;
-    }
-    public void setState(String state) 
-    {
-        this.state = state;
-    }
-
-    public String getState() 
-    {
-        return state;
-    }
-
-    public String getCreateName() {
-        return createName;
-    }
-
-    public void setCreateName(String createName) {
-        this.createName = createName;
-    }
-
-    public String getTaskName() {
-        return taskName;
-    }
-
-    public void setTaskName(String taskName) {
-        this.taskName = taskName;
-    }
-
-    @Override
-    public String toString() {
-        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
-            .append("id", getId())
-            .append("type", getType())
-            .append("title", getTitle())
-            .append("reason", getReason())
-            .append("leaveStartTime", getLeaveStartTime())
-            .append("leaveEndTime", getLeaveEndTime())
-            .append("instanceId", getInstanceId())
-            .append("state", getState())
-            .append("createBy", getCreateBy())
-            .append("createTime", getCreateTime())
-            .append("updateTime", getUpdateTime())
-            .toString();
-    }
-}

+ 96 - 0
boman-modules/boman-activity/src/main/java/com/boman/activity/domain/dto/ActTaskDTO.java

@@ -0,0 +1,96 @@
+package com.boman.activity.domain.dto;
+
+import com.boman.common.core.web.domain.BaseEntity;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.activiti.api.task.model.Task;
+
+import org.activiti.engine.runtime.ProcessInstance;
+
+import java.util.Date;
+
+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;
+    }
+}

+ 85 - 0
boman-modules/boman-activity/src/main/java/com/boman/activity/domain/dto/ActWorkflowFormDataDTO.java

@@ -0,0 +1,85 @@
+package com.boman.activity.domain.dto;
+
+
+import com.boman.common.core.web.domain.BaseEntity;
+
+/**
+ * 动态单对象 act_workflow_formdata
+ * 
+ * @author danny
+ * @date 2020-11-01
+ */
+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;
+    }
+}

+ 42 - 0
boman-modules/boman-activity/src/main/java/com/boman/activity/domain/dto/ActivitiHighLineDTO.java

@@ -0,0 +1,42 @@
+package com.boman.activity.domain.dto;
+
+import java.util.Set;
+
+public class ActivitiHighLineDTO {
+    private Set<String> highPoint;
+    private Set<String> highLine;
+    private Set<String> waitingToDo;
+    private  Set<String>  iDo;
+
+    public Set<String> getHighPoint() {
+        return highPoint;
+    }
+
+    public void setHighPoint(Set<String> highPoint) {
+        this.highPoint = highPoint;
+    }
+
+    public Set<String> getHighLine() {
+        return highLine;
+    }
+
+    public void setHighLine(Set<String> highLine) {
+        this.highLine = highLine;
+    }
+
+    public Set<String> getWaitingToDo() {
+        return waitingToDo;
+    }
+
+    public void setWaitingToDo(Set<String> waitingToDo) {
+        this.waitingToDo = waitingToDo;
+    }
+
+    public Set<String> getiDo() {
+        return iDo;
+    }
+
+    public void setiDo(Set<String> iDo) {
+        this.iDo = iDo;
+    }
+}

+ 32 - 0
boman-modules/boman-activity/src/main/java/com/boman/activity/domain/dto/DefinitionIdDTO.java

@@ -0,0 +1,32 @@
+package com.boman.activity.domain.dto;
+
+import org.activiti.engine.repository.ProcessDefinition;
+
+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();
+    }
+}

+ 44 - 0
boman-modules/boman-activity/src/main/java/com/boman/activity/domain/dto/HistoryDataDTO.java

@@ -0,0 +1,44 @@
+package com.boman.activity.domain.dto;
+
+import java.util.List;
+
+public class HistoryDataDTO {
+    private String taskNodeName;
+    private String createName;
+    private String createdDate;
+    private List<HistoryFormDataDTO> 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<HistoryFormDataDTO> getFormHistoryDataDTO() {
+        return formHistoryDataDTO;
+    }
+
+    public void setFormHistoryDataDTO(List<HistoryFormDataDTO> formHistoryDataDTO) {
+        this.formHistoryDataDTO = formHistoryDataDTO;
+    }
+}

+ 36 - 0
boman-modules/boman-activity/src/main/java/com/boman/activity/domain/dto/HistoryFormDataDTO.java

@@ -0,0 +1,36 @@
+package com.boman.activity.domain.dto;
+
+/**
+ * 汇讯数码科技(深圳)有限公司
+ * 创建日期:2020/11/3-14:02
+ * 版本   开发者     日期
+ * 1.0    Danny    2020/11/3
+ */
+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;
+    }
+}

+ 112 - 0
boman-modules/boman-activity/src/main/java/com/boman/activity/domain/dto/ProcessDefinitionDTO.java

@@ -0,0 +1,112 @@
+package com.boman.activity.domain.dto;
+
+import com.boman.activity.domain.vo.ActReDeploymentVO;
+import com.boman.common.core.web.domain.BaseEntity;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntityImpl;
+
+import java.util.Date;
+
+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;
+    }
+}

+ 30 - 0
boman-modules/boman-activity/src/main/java/com/boman/activity/domain/vo/ActReDeploymentVO.java

@@ -0,0 +1,30 @@
+package com.boman.activity.domain.vo;
+
+import java.util.Date;
+
+/**
+ * 汇讯数码科技(深圳)有限公司
+ * 创建日期:2020/10/23-15:42
+ * 版本   开发者     日期
+ * 1.0    Danny    2020/10/23
+ */
+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;
+    }
+}

+ 0 - 21
boman-modules/boman-activity/src/main/java/com/boman/activity/instener/LeaveEndStateListener.java

@@ -1,21 +0,0 @@
-package com.ruoyi.leave.instener;
-
-import com.ruoyi.common.utils.spring.SpringUtils;
-import com.ruoyi.leave.domain.WorkflowLeave;
-import com.ruoyi.leave.service.IWorkflowLeaveService;
-import org.activiti.engine.delegate.DelegateExecution;
-import org.activiti.engine.delegate.ExecutionListener;
-import org.activiti.engine.delegate.Expression;
-
-
-public class LeaveEndStateListener implements ExecutionListener {
-    private Expression state;
-
-    @Override
-    public void notify(DelegateExecution delegateExecution) {
-        WorkflowLeave workflowLeave = new WorkflowLeave();
-        workflowLeave.setId(delegateExecution.getProcessInstanceBusinessKey());
-        workflowLeave.setState(state.getValue(delegateExecution).toString());
-        SpringUtils.getBean(IWorkflowLeaveService.class).updateWorkflowLeave(workflowLeave);
-    }
-}

+ 19 - 0
boman-modules/boman-activity/src/main/java/com/boman/activity/mapper/ActReDeploymentMapper.java

@@ -0,0 +1,19 @@
+package com.boman.activity.mapper;
+
+import com.boman.activity.domain.vo.ActReDeploymentVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * 汇讯数码科技(深圳)有限公司
+ * 创建日期:2020/10/23-15:47
+ * 版本   开发者     日期
+ * 1.0    Danny    2020/10/23
+ */
+public interface ActReDeploymentMapper {
+
+        public List<ActReDeploymentVO> selectActReDeploymentByIds(@Param("ids") Set<String> ids);
+
+}

+ 83 - 0
boman-modules/boman-activity/src/main/java/com/boman/activity/mapper/ActWorkflowFormDataMapper.java

@@ -0,0 +1,83 @@
+package com.boman.activity.mapper;
+
+import java.util.Date;
+import java.util.List;
+
+import com.boman.activity.domain.ActWorkflowFormData;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 动态单Mapper接口
+ * 
+ * @author danny
+ * @date 2020-11-02
+ */
+public interface ActWorkflowFormDataMapper
+{
+    /**
+     * 查询动态单
+     * 
+     * @param id 动态单ID
+     * @return 动态单
+     */
+    public ActWorkflowFormData selectActWorkflowFormDataById(Long id);
+    /**
+     * 查询动态单
+     *
+     * @param businessKey 动态单ID
+     * @return 动态单
+     */
+    public List<ActWorkflowFormData> selectActWorkflowFormDataByBusinessKey(String businessKey);
+
+    /**
+     * 查询动态单列表
+     * 
+     * @param ActWorkflowFormData 动态单
+     * @return 动态单集合
+     */
+    public List<ActWorkflowFormData> selectActWorkflowFormDataList(ActWorkflowFormData ActWorkflowFormData);
+
+    /**
+     * 新增动态单
+     * 
+     * @param ActWorkflowFormData 动态单
+     * @return 结果
+     */
+    public int insertActWorkflowFormData(ActWorkflowFormData ActWorkflowFormData);
+
+
+    /**
+     * 新增动态单
+     *
+     * @param
+     * @return 结果
+     */
+    public int insertActWorkflowFormDatas(@Param("createBy") String createBy, @Param("ActWorkflowFormData")List<ActWorkflowFormData> 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);
+}

+ 0 - 76
boman-modules/boman-activity/src/main/java/com/boman/activity/mapper/WorkflowLeaveMapper.java

@@ -1,76 +0,0 @@
-package com.ruoyi.leave.mapper;
-
-import java.util.List;
-import com.ruoyi.leave.domain.WorkflowLeave;
-import org.apache.ibatis.annotations.Param;
-
-/**
- * 请假Mapper接口
- * 
- * @author danny
- * @date 2020-10-28
- */
-public interface WorkflowLeaveMapper 
-{
-    /**
-     * 查询请假
-     * 
-     * @param id 请假ID
-     * @return 请假
-     */
-    public WorkflowLeave selectWorkflowLeaveById(String id); /**
-     * 查询请假
-     *
-     * @param instanceId 请假ID
-     * @return 请假
-     */
-    public WorkflowLeave selectWorkflowLeaveByInstanceId(String instanceId);
-
-    /**
-     * 查询请假列表根据部门编号和WorkflowLeave
-     * 
-     * @param workflowLeave 请假
-     * @return 请假集合
-     */
-    public List<WorkflowLeave> selectWorkflowLeaveListByWorkflowLeaveAndDeptId(@Param("workflowLeave")WorkflowLeave workflowLeave,@Param("deptId") Long deptId);
-    /**
-     * 查询请假列表
-     *
-     * @param workflowLeave 请假
-     * @return 请假集合
-     */
-    public List<WorkflowLeave> selectWorkflowLeaveList(WorkflowLeave workflowLeave);
-
-
-    /**
-     * 新增请假
-     * 
-     * @param workflowLeave 请假
-     * @return 结果
-     */
-    public int insertWorkflowLeave(WorkflowLeave workflowLeave);
-
-    /**
-     * 修改请假
-     * 
-     * @param workflowLeave 请假
-     * @return 结果
-     */
-    public int updateWorkflowLeave(WorkflowLeave workflowLeave);
-
-    /**
-     * 删除请假
-     * 
-     * @param id 请假ID
-     * @return 结果
-     */
-    public int deleteWorkflowLeaveById(String id);
-
-    /**
-     * 批量删除请假
-     * 
-     * @param ids 需要删除的数据ID
-     * @return 结果
-     */
-    public int deleteWorkflowLeaveByIds(String[] ids);
-}

+ 15 - 0
boman-modules/boman-activity/src/main/java/com/boman/activity/service/IActTaskService.java

@@ -0,0 +1,15 @@
+package com.boman.activity.service;
+
+import com.boman.activity.domain.dto.ActTaskDTO;
+import com.boman.activity.domain.dto.ActWorkflowFormDataDTO;
+import com.boman.common.core.web.page.PageDomain;
+import com.github.pagehelper.Page;
+
+import java.text.ParseException;
+import java.util.List;
+
+public interface IActTaskService {
+    public Page<ActTaskDTO> selectProcessDefinitionList(PageDomain pageDomain);
+    public List<String>formDataShow(String taskID);
+    public int formDataSave(String taskID, List<ActWorkflowFormDataDTO> awfs) throws ParseException;
+}

+ 70 - 0
boman-modules/boman-activity/src/main/java/com/boman/activity/service/IActWorkflowFormDataService.java

@@ -0,0 +1,70 @@
+package com.boman.activity.service;
+
+import com.boman.activity.domain.ActWorkflowFormData;
+import java.util.List;
+
+/**
+ * 动态单Service接口
+ * 
+ * @author danny
+ * @date 2020-11-02
+ */
+public interface IActWorkflowFormDataService
+{
+    /**
+     * 查询动态单
+     * 
+     * @param id 动态单ID
+     * @return 动态单
+     */
+    public ActWorkflowFormData selectActWorkflowFormDataById(Long id);
+
+    public List<ActWorkflowFormData> selectActWorkflowFormDataByBusinessKey(String businessKey);
+
+    /**
+     * 查询动态单列表
+     * 
+     * @param ActWorkflowFormData 动态单
+     * @return 动态单集合
+     */
+    public List<ActWorkflowFormData> selectActWorkflowFormDataList(ActWorkflowFormData ActWorkflowFormData);
+
+    /**
+     * 新增动态单
+     * 
+     * @param ActWorkflowFormData 动态单
+     * @return 结果
+     */
+    public int insertActWorkflowFormData(ActWorkflowFormData ActWorkflowFormData);
+
+    /**
+     * 新增动态单集合
+     * @param ActWorkflowFormDatas 动态表单集合
+     * @return
+     */
+    public int insertActWorkflowFormDatas(List<ActWorkflowFormData> ActWorkflowFormDatas);
+
+    /**
+     * 修改动态单
+     * 
+     * @param ActWorkflowFormData 动态单
+     * @return 结果
+     */
+    public int updateActWorkflowFormData(ActWorkflowFormData ActWorkflowFormData);
+
+    /**
+     * 批量删除动态单
+     * 
+     * @param ids 需要删除的动态单ID
+     * @return 结果
+     */
+    public int deleteActWorkflowFormDataByIds(Long[] ids);
+
+    /**
+     * 删除动态单信息
+     * 
+     * @param id 动态单ID
+     * @return 结果
+     */
+    public int deleteActWorkflowFormDataById(Long id);
+}

+ 7 - 0
boman-modules/boman-activity/src/main/java/com/boman/activity/service/IActivitiHistoryService.java

@@ -0,0 +1,7 @@
+package com.boman.activity.service;
+
+import com.boman.activity.domain.dto.ActivitiHighLineDTO;
+
+public interface IActivitiHistoryService {
+    public ActivitiHighLineDTO gethighLine(String instanceId);
+}

+ 16 - 0
boman-modules/boman-activity/src/main/java/com/boman/activity/service/IFormHistoryDataService.java

@@ -0,0 +1,16 @@
+package com.boman.activity.service;
+
+import com.boman.activity.domain.dto.HistoryDataDTO;
+
+import java.util.List;
+
+/**
+ * 汇讯数码科技(深圳)有限公司
+ * 创建日期:2020/11/3-10:19
+ * 版本   开发者     日期
+ * 1.0    Danny    2020/11/3
+ */
+public interface IFormHistoryDataService {
+
+    public List<HistoryDataDTO> historyDataShow(String instanceId);
+}

+ 66 - 0
boman-modules/boman-activity/src/main/java/com/boman/activity/service/IProcessDefinitionService.java

@@ -0,0 +1,66 @@
+package com.boman.activity.service;
+
+import com.boman.activity.domain.dto.DefinitionIdDTO;
+import com.boman.activity.domain.dto.ProcessDefinitionDTO;
+import com.boman.common.core.web.page.PageDomain;
+import com.github.pagehelper.Page;
+import org.springframework.web.multipart.MultipartFile;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * 汇讯数码科技(深圳)有限公司
+ * 创建日期:2020/10/22-16:34
+ * 版本   开发者     日期
+ * 1.0    Danny    2020/10/22
+ */
+public interface IProcessDefinitionService {
+    /**
+     * 获取流程定义集合
+     * @param processDefinition
+     * @return Page 分页信息
+     */
+    public Page<ProcessDefinitionDTO> selectProcessDefinitionList(ProcessDefinitionDTO processDefinition, PageDomain pageDomain);
+    public DefinitionIdDTO getDefinitionsByInstanceId(String instanceId);
+    /**
+     * 删除流程定义
+     * @param id
+     * @return
+     */
+    public int deleteProcessDefinitionById(String id);
+    /**
+     * 上传并部署流程定义
+     * @param file
+     * @return
+     * @throws IOException
+     */
+    public void uploadStreamAndDeployment(MultipartFile file) throws IOException;
+    /**
+     * 启动挂起流程流程定义
+     * @param id 流程定义id
+     * @param suspendState 流程状态
+     * @return
+     */
+    public void suspendOrActiveApply(String id, Integer suspendState);
+
+    /**
+     * 上传流程流程定义
+     * @param multipartFile
+     * @return
+     */
+    public String upload(MultipartFile multipartFile) throws IOException;
+    /**
+     * 通过stringBPMN添加流程定义
+     * @param stringBPMN
+     * @return
+     */
+    public void addDeploymentByString(String stringBPMN );
+
+    /**
+     * 获取流程定义XML
+     * @param response
+     * @param deploymentId
+     * @param resourceName
+     */
+    public void getProcessDefineXML(HttpServletResponse response, String deploymentId,String resourceName) throws IOException;
+}

+ 0 - 74
boman-modules/boman-activity/src/main/java/com/boman/activity/service/IWorkflowLeaveService.java

@@ -1,74 +0,0 @@
-package com.ruoyi.leave.service;
-
-import java.util.List;
-
-import com.ruoyi.activiti.domain.dto.HistoryDataDTO;
-import com.ruoyi.leave.domain.WorkflowLeave;
-
-/**
- * 请假Service接口
- * 
- * @author danny
- * @date 2020-10-28
- */
-public interface IWorkflowLeaveService 
-{
-    /**
-     * 查询请假
-     * 
-     * @param id 请假ID
-     * @return 请假
-     */
-    public WorkflowLeave selectWorkflowLeaveById(String id);
-
-    /**
-     * 查询请假列表
-     * 
-     * @param workflowLeave 请假
-     * @return 请假集合
-     */
-    public List<WorkflowLeave> selectWorkflowLeaveList(WorkflowLeave workflowLeave);
-
-    /**
-     * 查询请假列表
-     *
-     * @param workflowLeave 请假
-     * @return 请假集合
-     */
-    public List<WorkflowLeave> selectWorkflowLeaveAndTaskNameList(WorkflowLeave workflowLeave);
-
-    /**
-     * 新增请假
-     * 
-     * @param workflowLeave 请假
-     * @return 结果
-     */
-    public int insertWorkflowLeave(WorkflowLeave workflowLeave);
-
-    /**
-     * 修改请假
-     * 
-     * @param workflowLeave 请假
-     * @return 结果
-     */
-    public int updateWorkflowLeave(WorkflowLeave workflowLeave);
-
-    /**
-     * 批量删除请假
-     * 
-     * @param ids 需要删除的请假ID
-     * @return 结果
-     */
-    public int deleteWorkflowLeaveByIds(String[] ids);
-
-    /**
-     * 删除请假信息
-     * 
-     * @param id 请假ID
-     * @return 结果
-     */
-    public int deleteWorkflowLeaveById(String id);
-
-
-    public WorkflowLeave selectWorkflowLeaveByInstanceId(String instanceId);
-}

+ 125 - 0
boman-modules/boman-activity/src/main/java/com/boman/activity/service/impl/ActTaskServiceImpl.java

@@ -0,0 +1,125 @@
+
+
+package com.boman.activity.service.impl;
+
+import com.boman.activity.domain.ActWorkflowFormData;
+import com.boman.activity.domain.dto.ActTaskDTO;
+import com.boman.activity.domain.dto.ActWorkflowFormDataDTO;
+import com.boman.activity.service.IActTaskService;
+import com.boman.activity.service.IActWorkflowFormDataService;
+import com.boman.common.core.web.page.PageDomain;
+import com.github.pagehelper.Page;
+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;
+
+@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<ActTaskDTO> selectProcessDefinitionList(PageDomain pageDomain) {
+        Page<ActTaskDTO> list = new Page<ActTaskDTO>();
+        org.activiti.api.runtime.shared.query.Page<Task> pageTasks = taskRuntime.tasks(Pageable.of((pageDomain.getPageNum() - 1) * pageDomain.getPageSize(), pageDomain.getPageSize()));
+        List<Task> tasks = pageTasks.getContent();
+        int totalItems = pageTasks.getTotalItems();
+        list.setTotal(totalItems);
+        if (totalItems != 0) {
+            Set<String> processInstanceIdIds = tasks.parallelStream().map(t -> t.getProcessInstanceId()).collect(Collectors.toSet());
+            List<ProcessInstance> processInstanceList = runtimeService.createProcessInstanceQuery().processInstanceIds(processInstanceIdIds).list();
+            List<ActTaskDTO> 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<String> 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<FormProperty> formProperties = userTask.getFormProperties();
+        List<String> collect = formProperties.stream().map(fp -> fp.getId()).collect(Collectors.toList());
+
+        return collect;
+    }
+
+    @Override
+    public int formDataSave(String taskID, List<ActWorkflowFormDataDTO> awfs) throws ParseException {
+        Task task = taskRuntime.task(taskID);
+        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();
+
+        Boolean hasVariables = false;//没有任何参数
+        HashMap<String, Object> variables = new HashMap<String, Object>();
+        //前端传来的字符串,拆分成每个控件
+        List<ActWorkflowFormData> 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);
+    }
+}

+ 112 - 0
boman-modules/boman-activity/src/main/java/com/boman/activity/service/impl/ActWorkflowFormDataServiceImpl.java

@@ -0,0 +1,112 @@
+package com.boman.activity.service.impl;
+
+import java.util.Date;
+import java.util.List;
+
+import com.boman.activity.domain.ActWorkflowFormData;
+
+import com.boman.activity.mapper.ActWorkflowFormDataMapper;
+import com.boman.activity.service.IActWorkflowFormDataService;
+import com.boman.common.core.utils.DateUtils;
+import com.boman.common.core.utils.SecurityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+
+
+/**
+ * 动态单Service业务层处理
+ * 
+ * @author danny
+ * @date 2020-11-02
+ */
+@Service
+public class ActWorkflowFormDataServiceImpl implements IActWorkflowFormDataService
+{
+    @Autowired
+    private ActWorkflowFormDataMapper actWorkflowFormDataMapper;
+
+    /**
+     * 查询动态单
+     * 
+     * @param id 动态单ID
+     * @return 动态单
+     */
+    @Override
+    public ActWorkflowFormData selectActWorkflowFormDataById(Long id)
+    {
+        return actWorkflowFormDataMapper.selectActWorkflowFormDataById(id);
+    }
+
+    @Override
+    public List<ActWorkflowFormData> selectActWorkflowFormDataByBusinessKey(String businessKey){
+        return actWorkflowFormDataMapper.selectActWorkflowFormDataByBusinessKey(businessKey);
+    }
+
+    /**
+     * 查询动态单列表
+     * 
+     * @param ActWorkflowFormData 动态单
+     * @return 动态单
+     */
+    @Override
+    public List<ActWorkflowFormData> 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<ActWorkflowFormData> ActWorkflowFormDatas) {
+        return actWorkflowFormDataMapper.insertActWorkflowFormDatas(SecurityUtils.getUsername(), ActWorkflowFormDatas, new Date(),SecurityUtils.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);
+    }
+}

+ 125 - 0
boman-modules/boman-activity/src/main/java/com/boman/activity/service/impl/ActivitiHistoryServiceImpl.java

@@ -0,0 +1,125 @@
+package com.boman.activity.service.impl;
+
+import com.boman.activity.domain.dto.ActivitiHighLineDTO;
+import com.boman.activity.service.IActivitiHistoryService;
+import org.activiti.bpmn.model.*;
+import org.activiti.bpmn.model.Process;
+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.*;
+@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<FlowElement> flowElements = process.getFlowElements();
+
+        Map<String, String> 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<HistoricActivityInstance> list = historyService.createHistoricActivityInstanceQuery()
+                .processInstanceId(instanceId)
+                .list();
+        //各个历史节点   两两组合 key
+        Set<String> keyList = new HashSet<>();
+        for (HistoricActivityInstance i : list) {
+            for (HistoricActivityInstance j : list) {
+                if (i != j) {
+                    keyList.add(i.getActivityId() + j.getActivityId());
+                }
+            }
+        }
+        //高亮连线ID
+        Set<String> highLine = new HashSet<>();
+        keyList.forEach(s -> highLine.add(map.get(s)));
+
+
+        //获取流程实例 历史节点(已完成)
+        List<HistoricActivityInstance> listFinished = historyService.createHistoricActivityInstanceQuery()
+                .processInstanceId(instanceId)
+                .finished()
+                .list();
+        //高亮节点ID
+        Set<String> highPoint = new HashSet<>();
+        listFinished.forEach(s -> highPoint.add(s.getActivityId()));
+
+        //获取流程实例 历史节点(待办节点)
+        List<HistoricActivityInstance> listUnFinished = historyService.createHistoricActivityInstanceQuery()
+                .processInstanceId(instanceId)
+                .unfinished()
+                .list();
+
+        //需要移除的高亮连线
+        Set<String> set = new HashSet<>();
+        //待办高亮节点
+        Set<String> 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<SequenceFlow> 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<String> iDo = new HashSet<>(); //存放 高亮 我的办理节点
+        //当前用户已完成的任务
+        List<HistoricTaskInstance> 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;
+    }
+}

+ 53 - 0
boman-modules/boman-activity/src/main/java/com/boman/activity/service/impl/FormHistoryDataServiceImpl.java

@@ -0,0 +1,53 @@
+package com.boman.activity.service.impl;
+
+
+import com.boman.activity.domain.ActWorkflowFormData;
+import com.boman.activity.domain.dto.HistoryDataDTO;
+import com.boman.activity.domain.dto.HistoryFormDataDTO;
+import com.boman.activity.service.IActWorkflowFormDataService;
+import com.boman.activity.service.IFormHistoryDataService;
+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.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 汇讯数码科技(深圳)有限公司
+ * 创建日期:2020/11/3-10:20
+ * 版本   开发者     日期
+ * 1.0    Danny    2020/11/3
+ */
+@Service
+public class FormHistoryDataServiceImpl implements IFormHistoryDataService {
+    @Autowired
+    private IActWorkflowFormDataService actWorkflowFormDataService;
+
+    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+    @Override
+    public List<HistoryDataDTO> historyDataShow(String businessKey) {
+        List<HistoryDataDTO> returnHistoryFromDataDTOS=new ArrayList<>();
+        List<ActWorkflowFormData> actWorkflowFormData = actWorkflowFormDataService.selectActWorkflowFormDataByBusinessKey(businessKey);
+        Map<String, List<ActWorkflowFormData>> 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<HistoryDataDTO> collect1 = returnHistoryFromDataDTOS.stream().sorted((x, y) -> x.getCreatedDate().compareTo(y.getCreatedDate())).collect(Collectors.toList());
+
+        return collect1;
+    }
+
+
+
+}

+ 148 - 0
boman-modules/boman-activity/src/main/java/com/boman/activity/service/impl/ProcessDefinitionServiceImpl.java

@@ -0,0 +1,148 @@
+package com.boman.activity.service.impl;
+
+import com.boman.activity.domain.dto.DefinitionIdDTO;
+import com.boman.activity.domain.dto.ProcessDefinitionDTO;
+import com.boman.activity.domain.vo.ActReDeploymentVO;
+import com.boman.activity.mapper.ActReDeploymentMapper;
+import com.boman.activity.service.IProcessDefinitionService;
+import com.boman.common.core.config.RuoYiConfig;
+import com.boman.common.core.utils.StringUtils;
+import com.boman.common.core.utils.file.FileUploadUtils;
+import com.boman.common.core.web.page.PageDomain;
+import com.github.pagehelper.Page;
+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.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+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;
+
+/**
+ * 汇讯数码科技(深圳)有限公司
+ * 创建日期:2020/10/23-9:52
+ * 版本   开发者     日期
+ * 1.0    Danny    2020/10/23
+ */
+
+@Service
+public class ProcessDefinitionServiceImpl implements IProcessDefinitionService {
+    @Autowired
+    private RepositoryService repositoryService;
+
+    @Autowired
+    private ActReDeploymentMapper actReDeploymentMapper;
+    @Autowired
+    private HistoryService historyService;
+    @Autowired
+    private RuntimeService runtimeService;
+
+    @Override
+    public Page<ProcessDefinitionDTO> selectProcessDefinitionList(ProcessDefinitionDTO processDefinition, PageDomain pageDomain) {
+        Page<ProcessDefinitionDTO> 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<ProcessDefinition> processDefinitions = processDefinitionQuery.listPage((pageDomain.getPageNum() - 1) * pageDomain.getPageSize(), pageDomain.getPageSize());
+        long count = processDefinitionQuery.count();
+        list.setTotal(count);
+        if (count!=0) {
+            Set<String> ids = processDefinitions.parallelStream().map(pdl -> pdl.getDeploymentId()).collect(Collectors.toSet());
+            List<ActReDeploymentVO> actReDeploymentVOS = actReDeploymentMapper.selectActReDeploymentByIds(ids);
+            List<ProcessDefinitionDTO> 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);
+    }
+
+    @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();
+    }
+}

+ 0 - 155
boman-modules/boman-activity/src/main/java/com/boman/activity/service/impl/WorkflowLeaveServiceImpl.java

@@ -1,155 +0,0 @@
-package com.ruoyi.leave.service.impl;
-
-import java.util.List;
-
-import java.util.stream.Collectors;
-
-
-import com.ruoyi.common.utils.DateUtils;
-import com.ruoyi.common.utils.SecurityUtils;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.common.utils.uuid.UUID;
-import com.ruoyi.system.service.ISysUserService;
-import org.activiti.api.process.model.ProcessInstance;
-import org.activiti.api.process.model.builders.ProcessPayloadBuilder;
-import org.activiti.api.process.runtime.ProcessRuntime;
-import org.activiti.engine.TaskService;
-import org.activiti.engine.task.Task;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import com.ruoyi.leave.mapper.WorkflowLeaveMapper;
-import com.ruoyi.leave.domain.WorkflowLeave;
-import com.ruoyi.leave.service.IWorkflowLeaveService;
-
-/**
- * 请假Service业务层处理
- *
- * @author danny
- * @date 2020-10-28
- */
-@Service
-public class WorkflowLeaveServiceImpl implements IWorkflowLeaveService {
-
-    @Autowired
-    private WorkflowLeaveMapper workflowLeaveMapper;
-    @Autowired
-    private ProcessRuntime processRuntime;
-    @Autowired
-    private ISysUserService sysUserService;
-    @Autowired
-    private TaskService taskService;
-
-
-    /**
-     * 查询请假
-     *
-     * @param id 请假ID
-     * @return 请假
-     */
-    @Override
-    public WorkflowLeave selectWorkflowLeaveById(String id) {
-        return workflowLeaveMapper.selectWorkflowLeaveById(id);
-    }
-
-    /**
-     * 查询请假列表
-     *
-     * @param workflowLeave 请假
-     * @return 请假
-     */
-    @Override
-    public List<WorkflowLeave> selectWorkflowLeaveList(WorkflowLeave workflowLeave) {
-        return workflowLeaveMapper.selectWorkflowLeaveListByWorkflowLeaveAndDeptId(workflowLeave,SecurityUtils.getLoginUser().getUser().getDeptId());
-    }
-    /**
-     * 查询请假列表带任务状态
-     *
-     * @param workflowLeave 请假
-     * @return 请假
-     */
-    @Override
-    public List<WorkflowLeave> selectWorkflowLeaveAndTaskNameList(WorkflowLeave workflowLeave) {
-        List<WorkflowLeave> workflowLeaves = workflowLeaveMapper.selectWorkflowLeaveList(workflowLeave);
-        List<String> collect = workflowLeaves.parallelStream().map(wl -> wl.getInstanceId()).collect(Collectors.toList());
-        if(collect!=null&&!collect.isEmpty()) {
-            List<Task> tasks = taskService.createTaskQuery().processInstanceIdIn(collect).list();
-            workflowLeaves.forEach(
-                    wl->{
-                        Task task = tasks.parallelStream().filter(t -> t.getProcessInstanceId().equals(wl.getInstanceId())).findAny().orElse(null);
-                        if (task != null) {
-                            wl.setTaskName(task.getName());
-                        }
-                    }
-            );
-        }
-        return workflowLeaves;
-    }
-
-    /**
-     * 新增请假
-     *
-     * @param workflowLeave 请假
-     * @return 结果
-     */
-    @Override
-    public int insertWorkflowLeave(WorkflowLeave workflowLeave) {
-
-        String id = UUID.randomUUID().toString();
-        workflowLeave.setId(id);
-        workflowLeave.setCreateTime(DateUtils.getNowDate());
-        String join = StringUtils.join(sysUserService.selectUserNameByPostCodeAndDeptId("se", SecurityUtils.getLoginUser().getUser().getDeptId()), ",");
-        ProcessInstance processInstance = processRuntime.start(ProcessPayloadBuilder
-                .start()
-                .withProcessDefinitionKey("leave")
-                .withName(workflowLeave.getTitle())
-                .withBusinessKey(id)
-                .withVariable("deptLeader",join)
-                .build());
-        workflowLeave.setInstanceId(processInstance.getId());
-        workflowLeave.setState("0");
-        workflowLeave.setCreateName(SecurityUtils.getNickName());
-        workflowLeave.setCreateBy(SecurityUtils.getUsername());
-        workflowLeave.setCreateTime(DateUtils.getNowDate());
-        return workflowLeaveMapper.insertWorkflowLeave(workflowLeave);
-    }
-
-    /**
-     * 修改请假
-     *
-     * @param workflowLeave 请假
-     * @return 结果
-     */
-    @Override
-    public int updateWorkflowLeave(WorkflowLeave workflowLeave) {
-        workflowLeave.setUpdateTime(DateUtils.getNowDate());
-        return workflowLeaveMapper.updateWorkflowLeave(workflowLeave);
-    }
-
-    /**
-     * 批量删除请假
-     *
-     * @param ids 需要删除的请假ID
-     * @return 结果
-     */
-    @Override
-    public int deleteWorkflowLeaveByIds(String[] ids) {
-        return workflowLeaveMapper.deleteWorkflowLeaveByIds(ids);
-    }
-
-    /**
-     * 删除请假信息
-     *
-     * @param id 请假ID
-     * @return 结果
-     */
-    @Override
-    public int deleteWorkflowLeaveById(String id) {
-        return workflowLeaveMapper.deleteWorkflowLeaveById(id);
-    }
-
-    @Override
-    public WorkflowLeave selectWorkflowLeaveByInstanceId(String instanceId) {
-
-        return workflowLeaveMapper.selectWorkflowLeaveByInstanceId(instanceId);
-    }
-}

+ 0 - 1
boman-modules/boman-activity/src/main/resources/application.properties

@@ -1 +0,0 @@
-

+ 27 - 0
boman-modules/boman-activity/src/main/resources/mapper/activiti/ActReDeploymentMapper.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.boman.activity.mapper.ActReDeploymentMapper">
+
+	<resultMap type="ActReDeploymentVO" id="ActReDeploymentResult">
+		<id     property="id"       column="id"      />
+		<result property="deployTime"       column="deploy_time"      />
+	</resultMap>
+	
+
+	<sql id="selectDeploymentVo">
+       select ID_ id,DEPLOY_TIME_ deploy_time from `act_re_deployment`
+    </sql>
+
+	
+	<select id="selectActReDeploymentByIds"  parameterType="String" resultMap="ActReDeploymentResult">
+	    <include refid="selectDeploymentVo"/>
+		where ID_  in
+		<foreach collection="ids" item="id" index="index" open="(" separator="," close=")">
+			#{id}
+		</foreach>
+	</select>
+
+
+</mapper> 

+ 101 - 0
boman-modules/boman-activity/src/main/resources/mapper/activiti/ActWorkflowFormDataMapper.xml

@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.boman.activity.mapper.ActWorkflowFormDataMapper">
+    <resultMap type="ActWorkflowFormData" id="ActWorkflowFormDataResult">
+        <result property="id"    column="id"    />
+        <result property="businessKey"    column="business_key"    />
+        <result property="formKey"    column="form_key"    />
+        <result property="controlId"    column="control_id"    />
+        <result property="controlName"    column="control_name"    />
+        <result property="controlValue"    column="control_value"    />
+        <result property="taskNodeName"    column="task_node_name"    />
+        <result property="createName"    column="create_name"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+    </resultMap>
+
+    <sql id="selectActWorkflowFormDataVo">
+        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
+    </sql>
+
+    <select id="selectActWorkflowFormDataList" parameterType="ActWorkflowFormData" resultMap="ActWorkflowFormDataResult">
+        <include refid="selectActWorkflowFormDataVo"/>
+        <where>
+            <if test="businessKey != null  and businessKey != ''"> and business_key = #{businessKey}</if>
+            <if test="formKey != null  and formKey != ''"> and form_key = #{formKey}</if>
+            <if test="controlId != null  and controlId != ''"> and control_id = #{controlId}</if>
+            <if test="controlValue != null  and controlValue != ''"> and control_value = #{controlValue}</if>
+            <if test="taskNodeName != null  and taskNodeName != ''"> and task_node_name = #{taskNodeName}</if>
+        </where>
+    </select>
+
+    <select id="selectActWorkflowFormDataById" parameterType="Long" resultMap="ActWorkflowFormDataResult">
+        <include refid="selectActWorkflowFormDataVo"/>
+        where id = #{id}
+    </select>
+    <select id="selectActWorkflowFormDataByBusinessKey" parameterType="string" resultMap="ActWorkflowFormDataResult">
+        <include refid="selectActWorkflowFormDataVo"/>
+        where  business_key = #{businessKey}
+    </select>
+
+    <insert id="insertActWorkflowFormData" parameterType="ActWorkflowFormData" useGeneratedKeys="true" keyProperty="id">
+        insert into act_workflow_FormData
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="businessKey != null">business_key,</if>
+            <if test="formKey != null">form_key,</if>
+            <if test="controlId != null">control_id,</if>
+            <if test="controlName != null">control_name,</if>
+            <if test="controlValue != null">control_value,</if>
+            <if test="taskNodeName != null">task_node_name,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="businessKey != null">#{businessKey},</if>
+            <if test="formKey != null">#{formKey},</if>
+            <if test="controlId != null">#{controlId},</if>
+            <if test="controlName != null">#{controlName},</if>
+            <if test="controlValue != null">#{controlValue},</if>
+            <if test="taskNodeName != null">#{taskNodeName},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+        </trim>
+    </insert>
+
+    <insert id="insertActWorkflowFormDatas"  useGeneratedKeys="true" >
+        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
+        <foreach collection="param2" item="awfd" index="index" separator=",">
+            (#{awfd.businessKey},#{awfd.formKey},#{awfd.controlId},#{awfd.controlName}, #{awfd.controlValue},#{awfd.taskNodeName},#{param1},#{param3},#{param4})
+        </foreach>
+    </insert>
+
+    <update id="updateActWorkflowFormData" parameterType="ActWorkflowFormData">
+        update act_workflow_FormData
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="businessKey != null">business_key = #{businessKey},</if>
+            <if test="formKey != null">form_key = #{formKey},</if>
+            <if test="controlId != null">control_id = #{controlId},</if>
+            <if test="controlName != null">control_name = #{controlName},</if>
+            <if test="controlValue != null">control_value = #{controlValue},</if>
+            <if test="taskNodeName != null">task_node_name = #{taskNodeName},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteActWorkflowFormDataById" parameterType="Long">
+        delete from act_workflow_FormData where id = #{id}
+    </delete>
+
+    <delete id="deleteActWorkflowFormDataByIds" parameterType="String">
+        delete from act_workflow_FormData where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+</mapper>
+

+ 0 - 13
boman-modules/boman-activity/src/test/java/com/boman/activity/BomanActivityApplicationTests.java

@@ -1,13 +0,0 @@
-package com.boman.activity;
-
-import org.junit.jupiter.api.Test;
-import org.springframework.boot.test.context.SpringBootTest;
-
-@SpringBootTest
-class BomanActivityApplicationTests {
-
-	@Test
-	void contextLoads() {
-	}
-
-}

+ 13 - 0
boman-modules/boman-gen/src/main/java/com/boman/gen/domain/GenTableColumn.java

@@ -69,12 +69,25 @@ public class GenTableColumn extends BaseEntity
     /** 显示类型(input文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件、image图片上传控件、upload文件上传控件、editor富文本控件) */
     private String htmlType;
 
+    /**
+     * 外键(表明该表哪个字段是外键,取值id)
+     */
+    private String foreignKey;
+
     /** 字典类型 */
     private String dictType;
 
     /** 排序 */
     private Integer sort;
 
+    public String getForeignKey() {
+        return foreignKey;
+    }
+
+    public void setForeignKey(String foreignKey) {
+        this.foreignKey = foreignKey;
+    }
+
     public void setColumnId(Long columnId)
     {
         this.columnId = columnId;

+ 1 - 1
boman-modules/boman-system/src/main/java/com/boman/system/controller/SysMenuController.java

@@ -167,7 +167,7 @@ public class SysMenuController extends BaseController
      * @Author: tjf
      * @Date: 2021/3/24
      */
-    @PostMapping
+    @PostMapping("addTable")
     public AjaxResult add(@Validated @RequestBody GenTable genTable) {
         return menuService.insertGenTable(genTable);
     }