gssong
2024-03-31 651b2e140ba842126c4177df1b909b2b764ecdb8
add 添加表单配置
已添加18个文件
已复制2个文件
已重命名5个文件
已删除3个文件
已修改19个文件
1753 ■■■■ 文件已修改
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/FormTypeEnum.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfDefinitionConfigController.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormManageController.java 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiTaskinst.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfDefinitionConfig.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormManage.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfNodeConfig.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfDefinitionConfigBo.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormManageBo.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfNodeConfigBo.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessDefinitionVo.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfDefinitionConfigVo.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormManageVo.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfNodeConfigVo.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/CustomInjectUserTaskCmd.java 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiTaskinstMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActTaskMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfDefinitionConfigMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormDefinitionMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormManageMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfNodeConfigMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActHiTaskinstService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfDefinitionConfigService.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormDefinitionService.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormManageService.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfNodeConfigService.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiTaskinstServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java 48 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java 75 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfDefinitionConfigServiceImpl.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormDefinitionServiceImpl.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormManageServiceImpl.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfNodeConfigServiceImpl.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/ModelUtils.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfDefinitionConfigMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormManageMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfNodeConfigMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
script/sql/flowable.sql 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
script/sql/oracle/flowable.sql 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
script/sql/postgres/flowable.sql 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
script/sql/sqlserver/flowable.sql 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java
@@ -76,9 +76,9 @@
    String PROCESS_INSTANCE_VO = "processInstanceVo";
    /**
     * æµç¨‹è¡¨å•配置对象
     * æµç¨‹å®šä¹‰é…ç½®
     */
    String WF_FORM_DEFINITION_VO = "wfFormDefinitionVo";
    String WF_DEFINITION_CONFIG_VO = "wfDefinitionConfigVo";
    /**
     * æµç¨‹å‘起人
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/FormTypeEnum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,54 @@
package org.dromara.workflow.common.enums;
import cn.hutool.core.util.StrUtil;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;
import java.util.Arrays;
/**
 * ä»»åŠ¡çŠ¶æ€æžšä¸¾
 *
 * @author may
 */
@Getter
@AllArgsConstructor
public enum FormTypeEnum {
    /**
     * è‡ªå®šä¹‰è¡¨å•
     */
    STATIC("static", "自定义表单"),
    /**
     * åŠ¨æ€è¡¨å•
     */
    DYNAMIC("dynamic", "动态表单");
    /**
     * ç±»åž‹
     */
    private final String type;
    /**
     * æè¿°
     */
    private final String desc;
    /**
     * è¡¨å•类型
     *
     * @param formType è¡¨å•类型
     */
    public static String findByType(String formType) {
        if (StringUtils.isBlank(formType)) {
            return StrUtil.EMPTY;
        }
        return Arrays.stream(FormTypeEnum.values())
            .filter(statusEnum -> statusEnum.getType().equals(formType))
            .findFirst()
            .map(FormTypeEnum::getDesc)
            .orElse(StrUtil.EMPTY);
    }
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfDefinitionConfigController.java
ÎļþÃû´Ó ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormDefinitionController.java ÐÞ¸Ä
@@ -4,6 +4,7 @@
import lombok.RequiredArgsConstructor;
import jakarta.validation.constraints.*;
import org.dromara.workflow.domain.bo.WfDefinitionConfigBo;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
@@ -12,23 +13,22 @@
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.workflow.domain.vo.WfFormDefinitionVo;
import org.dromara.workflow.domain.bo.WfFormDefinitionBo;
import org.dromara.workflow.service.IWfFormDefinitionService;
import org.dromara.workflow.domain.vo.WfDefinitionConfigVo;
import org.dromara.workflow.service.IWfDefinitionConfigService;
/**
 * è¡¨å•配置
 *
 * @author gssong
 * @author may
 * @date 2024-03-18
 */
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/workflow/formDefinition")
public class WfFormDefinitionController extends BaseController {
@RequestMapping("/workflow/definitionConfig")
public class WfDefinitionConfigController extends BaseController {
    private final IWfFormDefinitionService wfFormDefinitionService;
    private final IWfDefinitionConfigService wfDefinitionConfigService;
    /**
@@ -37,9 +37,9 @@
     * @param definitionId ä¸»é”®
     */
    @GetMapping("/getByDefId/{definitionId}")
    public R<WfFormDefinitionVo> getByDefId(@NotBlank(message = "流程定义ID不能为空")
    public R<WfDefinitionConfigVo> getByDefId(@NotBlank(message = "流程定义ID不能为空")
                                            @PathVariable String definitionId) {
        return R.ok(wfFormDefinitionService.getByDefId(definitionId));
        return R.ok(wfDefinitionConfigService.getByDefId(definitionId));
    }
    /**
@@ -48,8 +48,8 @@
    @Log(title = "表单配置", businessType = BusinessType.INSERT)
    @RepeatSubmit()
    @PostMapping("/saveOrUpdate")
    public R<Void> saveOrUpdate(@Validated(AddGroup.class) @RequestBody WfFormDefinitionBo bo) {
        return toAjax(wfFormDefinitionService.saveOrUpdate(bo));
    public R<Void> saveOrUpdate(@Validated(AddGroup.class) @RequestBody WfDefinitionConfigBo bo) {
        return toAjax(wfDefinitionConfigService.saveOrUpdate(bo));
    }
    /**
@@ -61,6 +61,6 @@
    @DeleteMapping("/{ids}")
    public R<Void> remove(@NotEmpty(message = "主键不能为空")
                          @PathVariable Long[] ids) {
        return toAjax(wfFormDefinitionService.deleteByIds(List.of(ids)));
        return toAjax(wfDefinitionConfigService.deleteByIds(List.of(ids)));
    }
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormManageController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,114 @@
package org.dromara.workflow.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.workflow.domain.vo.WfFormManageVo;
import org.dromara.workflow.domain.bo.WfFormManageBo;
import org.dromara.workflow.service.IWfFormManageService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
 * è¡¨å•管理
 *
 * @author may
 * @date 2024-03-29
 */
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/workflow/formManage")
public class WfFormManageController extends BaseController {
    private final IWfFormManageService wfFormManageService;
    /**
     * æŸ¥è¯¢è¡¨å•管理列表
     */
    @SaCheckPermission("workflow:formManage:list")
    @GetMapping("/list")
    public TableDataInfo<WfFormManageVo> list(WfFormManageBo bo, PageQuery pageQuery) {
        return wfFormManageService.queryPageList(bo, pageQuery);
    }
    /**
     * æŸ¥è¯¢è¡¨å•管理列表
     */
    @SaCheckPermission("workflow:formManage:list")
    @GetMapping("/list/selectList")
    public R<List<WfFormManageVo>> selectList() {
        return R.ok(wfFormManageService.selectList());
    }
    /**
     * å¯¼å‡ºè¡¨å•管理列表
     */
    @SaCheckPermission("workflow:formManage:export")
    @Log(title = "表单管理", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(WfFormManageBo bo, HttpServletResponse response) {
        List<WfFormManageVo> list = wfFormManageService.queryList(bo);
        ExcelUtil.exportExcel(list, "表单管理", WfFormManageVo.class, response);
    }
    /**
     * èŽ·å–è¡¨å•ç®¡ç†è¯¦ç»†ä¿¡æ¯
     *
     * @param id ä¸»é”®
     */
    @SaCheckPermission("workflow:formManage:query")
    @GetMapping("/{id}")
    public R<WfFormManageVo> getInfo(@NotNull(message = "主键不能为空")
                                     @PathVariable Long id) {
        return R.ok(wfFormManageService.queryById(id));
    }
    /**
     * æ–°å¢žè¡¨å•管理
     */
    @SaCheckPermission("workflow:formManage:add")
    @Log(title = "表单管理", businessType = BusinessType.INSERT)
    @RepeatSubmit()
    @PostMapping()
    public R<Void> add(@Validated(AddGroup.class) @RequestBody WfFormManageBo bo) {
        return toAjax(wfFormManageService.insertByBo(bo));
    }
    /**
     * ä¿®æ”¹è¡¨å•管理
     */
    @SaCheckPermission("workflow:formManage:edit")
    @Log(title = "表单管理", businessType = BusinessType.UPDATE)
    @RepeatSubmit()
    @PutMapping()
    public R<Void> edit(@Validated(EditGroup.class) @RequestBody WfFormManageBo bo) {
        return toAjax(wfFormManageService.updateByBo(bo));
    }
    /**
     * åˆ é™¤è¡¨å•管理
     *
     * @param ids ä¸»é”®ä¸²
     */
    @SaCheckPermission("workflow:formManage:remove")
    @Log(title = "表单管理", businessType = BusinessType.DELETE)
    @DeleteMapping("/{ids}")
    public R<Void> remove(@NotEmpty(message = "主键不能为空")
                          @PathVariable Long[] ids) {
        return toAjax(wfFormManageService.deleteByIds(List.of(ids)));
    }
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiTaskinst.java
@@ -11,7 +11,7 @@
/**
 * æµç¨‹åŽ†å²ä»»åŠ¡å¯¹è±¡ act_hi_taskinst
 *
 * @author gssong
 * @author may
 * @date 2024-03-02
 */
@Data
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfDefinitionConfig.java
ÎļþÃû´Ó ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormDefinition.java ÐÞ¸Ä
@@ -10,13 +10,13 @@
/**
 * è¡¨å•配置对象 wf_form_definition
 *
 * @author gssong
 * @author may
 * @date 2024-03-18
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("wf_form_definition")
public class WfFormDefinition extends BaseEntity {
@TableName("wf_definition_config")
public class WfDefinitionConfig extends BaseEntity {
    @Serial
    private static final long serialVersionUID = 1L;
@@ -28,9 +28,9 @@
    private Long id;
    /**
     * è·¯ç”±åœ°å€
     * è¡¨å•ID
     */
    private String path;
    private Long formId;
    /**
     * æµç¨‹å®šä¹‰ID
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormManage.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
package org.dromara.workflow.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
 * è¡¨å•管理对象 wf_form_manage
 *
 * @author may
 * @date 2024-03-29
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("wf_form_manage")
public class WfFormManage extends TenantEntity {
    @Serial
    private static final long serialVersionUID = 1L;
    /**
     * ä¸»é”®
     */
    @TableId(value = "id")
    private Long id;
    /**
     * è¡¨å•名称
     */
    private String formName;
    /**
     * è¡¨å•类型
     */
    private String formType;
    /**
     * è·¯ç”±åœ°å€/表单ID
     */
    private String router;
    /**
     * å¤‡æ³¨
     */
    private String remark;
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfNodeConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
package org.dromara.workflow.domain;
import org.dromara.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
 * èŠ‚ç‚¹é…ç½®å¯¹è±¡ wf_node_config
 *
 * @author may
 * @date 2024-03-30
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("wf_node_config")
public class WfNodeConfig extends TenantEntity {
    @Serial
    private static final long serialVersionUID = 1L;
    /**
     * ä¸»é”®
     */
    @TableId(value = "id")
    private Long id;
    /**
     * è¡¨å•id
     */
    private Long formId;
    /**
     * è¡¨å•类型
     */
    private String formType;
    /**
     * èŠ‚ç‚¹åç§°
     */
    private String nodeName;
    /**
     * èŠ‚ç‚¹id
     */
    private String nodeId;
    /**
     * æµç¨‹å®šä¹‰id
     */
    private String definitionId;
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfDefinitionConfigBo.java
ÎļþÃû´Ó ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormDefinitionBo.java ÐÞ¸Ä
@@ -1,6 +1,6 @@
package org.dromara.workflow.domain.bo;
import org.dromara.workflow.domain.WfFormDefinition;
import org.dromara.workflow.domain.WfDefinitionConfig;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
@@ -12,13 +12,13 @@
/**
 * è¡¨å•配置业务对象 wf_form_definition
 *
 * @author gssong
 * @author may
 * @date 2024-03-18
 */
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = WfFormDefinition.class, reverseConvertGenerate = false)
public class WfFormDefinitionBo extends BaseEntity {
@AutoMapper(target = WfDefinitionConfig.class, reverseConvertGenerate = false)
public class WfDefinitionConfigBo extends BaseEntity {
    /**
     * ä¸»é”®
@@ -27,10 +27,10 @@
    private Long id;
    /**
     * è·¯ç”±åœ°å€
     * è¡¨å•ID
     */
    @NotBlank(message = "路由地址不能为空", groups = {AddGroup.class})
    private String path;
    @NotNull(message = "表单ID不能为空", groups = {AddGroup.class})
    private Long formId;
    /**
     * æµç¨‹å®šä¹‰ID
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormManageBo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,53 @@
package org.dromara.workflow.domain.bo;
import org.dromara.workflow.domain.WfFormManage;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
/**
 * è¡¨å•管理业务对象 wf_form_manage
 *
 * @author may
 * @date 2024-03-29
 */
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = WfFormManage.class, reverseConvertGenerate = false)
public class WfFormManageBo extends BaseEntity {
    /**
     * ä¸»é”®
     */
    @NotNull(message = "主键不能为空", groups = { EditGroup.class })
    private Long id;
    /**
     * è¡¨å•名称
     */
    @NotBlank(message = "表单名称不能为空", groups = { AddGroup.class, EditGroup.class })
    private String formName;
    /**
     * è¡¨å•类型
     */
    @NotBlank(message = "表单类型不能为空", groups = { AddGroup.class, EditGroup.class })
    private String formType;
    /**
     * è·¯ç”±åœ°å€/表单ID
     */
    @NotBlank(message = "路由地址/表单ID不能为空", groups = { AddGroup.class, EditGroup.class })
    private String router;
    /**
     * å¤‡æ³¨
     */
    private String remark;
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfNodeConfigBo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,58 @@
package org.dromara.workflow.domain.bo;
import org.dromara.workflow.domain.WfNodeConfig;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
/**
 * èŠ‚ç‚¹é…ç½®ä¸šåŠ¡å¯¹è±¡ wf_node_config
 *
 * @author may
 * @date 2024-03-30
 */
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = WfNodeConfig.class, reverseConvertGenerate = false)
public class WfNodeConfigBo extends BaseEntity {
    /**
     * ä¸»é”®
     */
    @NotNull(message = "主键不能为空", groups = { EditGroup.class })
    private Long id;
    /**
     * è¡¨å•id
     */
    private Long formId;
    /**
     * è¡¨å•类型
     */
    private String formType;
    /**
     * èŠ‚ç‚¹åç§°
     */
    @NotBlank(message = "节点名称不能为空", groups = { AddGroup.class, EditGroup.class })
    private String nodeName;
    /**
     * èŠ‚ç‚¹id
     */
    @NotBlank(message = "节点id不能为空", groups = { AddGroup.class, EditGroup.class })
    private String nodeId;
    /**
     * æµç¨‹å®šä¹‰id
     */
    @NotBlank(message = "流程定义id不能为空", groups = { AddGroup.class, EditGroup.class })
    private String definitionId;
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessDefinitionVo.java
@@ -65,6 +65,6 @@
    /**
     * è¡¨å•配置
     */
    private WfFormDefinitionVo wfFormDefinitionVo;
    private WfDefinitionConfigVo wfDefinitionConfigVo;
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java
@@ -96,5 +96,5 @@
    /**
     * è¡¨å•配置
     */
    private WfFormDefinitionVo wfFormDefinitionVo;
    private WfDefinitionConfigVo wfDefinitionConfigVo;
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java
@@ -159,5 +159,10 @@
    /**
     * è¡¨å•配置
     */
    private WfFormDefinitionVo wfFormDefinitionVo;
    private WfDefinitionConfigVo wfDefinitionConfigVo;
    /**
     * èŠ‚ç‚¹é…ç½®
     */
    private WfNodeConfigVo wfNodeConfigVo;
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfDefinitionConfigVo.java
ÎļþÃû´Ó ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormDefinitionVo.java ÐÞ¸Ä
@@ -1,6 +1,6 @@
package org.dromara.workflow.domain.vo;
import org.dromara.workflow.domain.WfFormDefinition;
import org.dromara.workflow.domain.WfDefinitionConfig;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
@@ -10,17 +10,16 @@
import java.io.Serializable;
/**
 * è¡¨å•配置视图对象 wf_form_definition
 *
 * @author gssong
 * @author may
 * @date 2024-03-18
 */
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = WfFormDefinition.class)
public class WfFormDefinitionVo implements Serializable {
@AutoMapper(target = WfDefinitionConfig.class)
public class WfDefinitionConfigVo implements Serializable {
    @Serial
    private static final long serialVersionUID = 1L;
@@ -32,10 +31,10 @@
    private Long id;
    /**
     * è·¯ç”±åœ°å€
     * è¡¨å•ID
     */
    @ExcelProperty(value = "路由地址")
    private String path;
    @ExcelProperty(value = "表单ID")
    private Long formId;
    /**
     * æµç¨‹å®šä¹‰ID
@@ -55,5 +54,10 @@
    @ExcelProperty(value = "备注")
    private String remark;
    /**
     * è¡¨å•管理
     */
    private WfFormManageVo wfFormManageVo;
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormManageVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
package org.dromara.workflow.domain.vo;
import org.dromara.workflow.domain.WfFormManage;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
 * è¡¨å•管理视图对象 wf_form_manage
 *
 * @author may
 * @date 2024-03-29
 */
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = WfFormManage.class)
public class WfFormManageVo implements Serializable {
    @Serial
    private static final long serialVersionUID = 1L;
    /**
     * ä¸»é”®
     */
    @ExcelProperty(value = "主键")
    private Long id;
    /**
     * è¡¨å•名称
     */
    @ExcelProperty(value = "表单名称")
    private String formName;
    /**
     * è¡¨å•类型
     */
    @ExcelProperty(value = "表单类型")
    private String formType;
    /**
     * è¡¨å•类型名称
     */
    private String formTypeName;
    /**
     * è·¯ç”±åœ°å€/表单ID
     */
    @ExcelProperty(value = "路由地址/表单ID")
    private String router;
    /**
     * å¤‡æ³¨
     */
    @ExcelProperty(value = "备注")
    private String remark;
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfNodeConfigVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,69 @@
package org.dromara.workflow.domain.vo;
import org.dromara.workflow.domain.WfNodeConfig;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
 * èŠ‚ç‚¹é…ç½®è§†å›¾å¯¹è±¡ wf_node_config
 *
 * @author may
 * @date 2024-03-30
 */
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = WfNodeConfig.class)
public class WfNodeConfigVo implements Serializable {
    @Serial
    private static final long serialVersionUID = 1L;
    /**
     * ä¸»é”®
     */
    @ExcelProperty(value = "主键")
    private Long id;
    /**
     * è¡¨å•id
     */
    @ExcelProperty(value = "表单id")
    private Long formId;
    /**
     * è¡¨å•类型
     */
    @ExcelProperty(value = "表单类型")
    private String formType;
    /**
     * èŠ‚ç‚¹åç§°
     */
    @ExcelProperty(value = "节点名称")
    private String nodeName;
    /**
     * èŠ‚ç‚¹id
     */
    @ExcelProperty(value = "节点id")
    private String nodeId;
    /**
     * æµç¨‹å®šä¹‰id
     */
    @ExcelProperty(value = "流程定义id")
    private String definitionId;
    /**
     * è¡¨å•管理
     */
    private WfFormManageVo wfFormManageVo;
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/CustomInjectUserTaskCmd.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,114 @@
package org.dromara.workflow.flowable.cmd;
import org.flowable.bpmn.BpmnAutoLayout;
import org.flowable.bpmn.model.*;
import org.flowable.bpmn.model.Process;
import org.flowable.common.engine.impl.interceptor.Command;
import org.flowable.common.engine.impl.interceptor.CommandContext;
import org.flowable.engine.impl.cmd.AbstractDynamicInjectionCmd;
import org.flowable.engine.impl.dynamic.BaseDynamicSubProcessInjectUtil;
import org.flowable.engine.impl.dynamic.DynamicUserTaskBuilder;
import org.flowable.engine.impl.persistence.entity.DeploymentEntity;
import org.flowable.engine.impl.persistence.entity.ExecutionEntity;
import org.flowable.engine.impl.persistence.entity.ProcessDefinitionEntity;
import java.util.List;
import java.util.Map;
public class CustomInjectUserTaskCmd extends AbstractDynamicInjectionCmd implements Command<Void> {
    private final FlowElement currentElement;
    private final String processInstanceId;
    private final DynamicUserTaskBuilder dynamicUserTaskBuilder;
    public CustomInjectUserTaskCmd(String processInstanceId, DynamicUserTaskBuilder dynamicUserTaskBuilder, FlowElement currentElement) {
        this.currentElement = currentElement;
        this.processInstanceId = processInstanceId;
        this.dynamicUserTaskBuilder = dynamicUserTaskBuilder;
    }
    @Override
    protected void updateBpmnProcess(CommandContext commandContext, Process process, BpmnModel bpmnModel, ProcessDefinitionEntity originalProcessDefinitionEntity, DeploymentEntity newDeploymentEntity) {
        if (!(this.currentElement instanceof UserTask currentUserTask)) {
            return;
        }
        if (currentUserTask.getOutgoingFlows().isEmpty() || currentUserTask.getOutgoingFlows().size() > 1) {
            return;
        }
        SequenceFlow currentOutgoingFlow = currentUserTask.getOutgoingFlows().get(0);
        FlowElement targetFlowElement = currentOutgoingFlow.getTargetFlowElement();
        //创建新的任务节点和两条连线
        UserTask newUserTask = createUserTask(process);
        SequenceFlow newSequenceFlow1 = new SequenceFlow(currentUserTask.getId(), newUserTask.getId());
        newSequenceFlow1.setId(dynamicUserTaskBuilder.nextFlowId(process.getFlowElementMap()));
        SequenceFlow newSequenceFlow2 = new SequenceFlow(newUserTask.getId(), targetFlowElement.getId());
        newSequenceFlow2.setId(dynamicUserTaskBuilder.nextFlowId(process.getFlowElementMap()));
        //添加到流程
        process.addFlowElement(newUserTask);
        process.addFlowElement(newSequenceFlow1);
        process.addFlowElement(newSequenceFlow2);
        process.removeFlowElement(currentOutgoingFlow.getId());
        //获取开始节点
        StartEvent startEvent = process.findFlowElementsOfType(StartEvent.class, false).get(0);
        //绘制新的流程图
        GraphicInfo elementGraphicInfo = bpmnModel.getGraphicInfo(currentUserTask.getId());
        if (elementGraphicInfo != null) {
            double yDiff = 0;
            double xDiff = 80;
            if (elementGraphicInfo.getY() < 173) {
                yDiff = 173 - elementGraphicInfo.getY();
                elementGraphicInfo.setY(173);
            }
            Map<String, GraphicInfo> locationMap = bpmnModel.getLocationMap();
            for (String locationId : locationMap.keySet()) {
                if (startEvent.getId().equals(locationId)) {
                    continue;
                }
                GraphicInfo locationGraphicInfo = locationMap.get(locationId);
                locationGraphicInfo.setX(locationGraphicInfo.getX() + xDiff);
                locationGraphicInfo.setY(locationGraphicInfo.getY() + yDiff);
            }
            Map<String, List<GraphicInfo>> flowLocationMap = bpmnModel.getFlowLocationMap();
            for (String flowId : flowLocationMap.keySet()) {
                List<GraphicInfo> flowGraphicInfoList = flowLocationMap.get(flowId);
                for (GraphicInfo flowGraphicInfo : flowGraphicInfoList) {
                    flowGraphicInfo.setX(flowGraphicInfo.getX() + xDiff);
                    flowGraphicInfo.setY(flowGraphicInfo.getY() + yDiff);
                }
            }
            //移除当前流程连线
            bpmnModel.removeFlowGraphicInfoList(currentOutgoingFlow.getId());
            //重新绘制
            new BpmnAutoLayout(bpmnModel).execute();
        }
        BaseDynamicSubProcessInjectUtil.processFlowElements(commandContext, process, bpmnModel, originalProcessDefinitionEntity, newDeploymentEntity);
    }
    @Override
    protected void updateExecutions(CommandContext commandContext, ProcessDefinitionEntity processDefinitionEntity, ExecutionEntity processInstance, List<ExecutionEntity> childExecutions) {
    }
    private UserTask createUserTask(Process process) {
        UserTask userTask = new UserTask();
        if (dynamicUserTaskBuilder.getId() != null) {
            userTask.setId(dynamicUserTaskBuilder.getId());
        } else {
            userTask.setId(dynamicUserTaskBuilder.nextTaskId(process.getFlowElementMap()));
        }
        dynamicUserTaskBuilder.setDynamicTaskId(userTask.getId());
        userTask.setName(dynamicUserTaskBuilder.getName());
        userTask.setAssignee(dynamicUserTaskBuilder.getAssignee());
        return userTask;
    }
    @Override
    public Void execute(CommandContext commandContext) {
        createDerivedProcessDefinitionForProcessInstance(commandContext, processInstanceId);
        return null;
    }
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiTaskinstMapper.java
@@ -7,7 +7,7 @@
/**
 * æµç¨‹åŽ†å²ä»»åŠ¡Mapper接口
 *
 * @author gssong
 * @author may
 * @date 2024-03-02
 */
@InterceptorIgnore(tenantLine = "true")
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActTaskMapper.java
@@ -13,7 +13,7 @@
/**
 * ä»»åŠ¡ä¿¡æ¯Mapper接口
 *
 * @author gssong
 * @author may
 * @date 2024-03-02
 */
@InterceptorIgnore(tenantLine = "true")
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfDefinitionConfigMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package org.dromara.workflow.mapper;
import org.dromara.workflow.domain.WfDefinitionConfig;
import org.dromara.workflow.domain.vo.WfDefinitionConfigVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
 * è¡¨å•配置Mapper接口
 *
 * @author may
 * @date 2024-03-18
 */
public interface WfDefinitionConfigMapper extends BaseMapperPlus<WfDefinitionConfig, WfDefinitionConfigVo> {
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormDefinitionMapper.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormManageMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package org.dromara.workflow.mapper;
import org.dromara.workflow.domain.WfFormManage;
import org.dromara.workflow.domain.vo.WfFormManageVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
 * è¡¨å•管理Mapper接口
 *
 * @author may
 * @date 2024-03-29
 */
public interface WfFormManageMapper extends BaseMapperPlus<WfFormManage, WfFormManageVo> {
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfNodeConfigMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package org.dromara.workflow.mapper;
import org.dromara.workflow.domain.WfNodeConfig;
import org.dromara.workflow.domain.vo.WfNodeConfigVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
 * èŠ‚ç‚¹é…ç½®Mapper接口
 *
 * @author may
 * @date 2024-03-30
 */
public interface WfNodeConfigMapper extends BaseMapperPlus<WfNodeConfig, WfNodeConfigVo> {
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActHiTaskinstService.java
@@ -4,7 +4,7 @@
/**
 * æµç¨‹åŽ†å²ä»»åŠ¡Service接口
 *
 * @author gssong
 * @author may
 * @date 2024-03-02
 */
public interface IActHiTaskinstService {
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfDefinitionConfigService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
package org.dromara.workflow.service;
import org.dromara.workflow.domain.vo.WfDefinitionConfigVo;
import org.dromara.workflow.domain.bo.WfDefinitionConfigBo;
import java.util.Collection;
import java.util.List;
/**
 * è¡¨å•配置Service接口
 *
 * @author may
 * @date 2024-03-18
 */
public interface IWfDefinitionConfigService {
    /**
     * æŸ¥è¯¢è¡¨å•配置
     *
     * @param definitionId æµç¨‹å®šä¹‰id
     * @return ç»“æžœ
     */
    WfDefinitionConfigVo getByDefId(String definitionId);
    /**
     * æŸ¥è¯¢è¡¨å•配置列表
     *
     * @param definitionIds æµç¨‹å®šä¹‰id
     * @return ç»“æžœ
     */
    List<WfDefinitionConfigVo> queryList(List<String> definitionIds);
    /**
     * æ–°å¢žè¡¨å•配置
     *
     * @param bo å‚æ•°
     * @return ç»“æžœ
     */
    Boolean saveOrUpdate(WfDefinitionConfigBo bo);
    /**
     * åˆ é™¤
     *
     * @param ids id
     * @return ç»“æžœ
     */
    Boolean deleteByIds(Collection<Long> ids);
    /**
     * æŒ‰ç…§æµç¨‹å®šä¹‰id删除
     *
     * @param ids æµç¨‹å®šä¹‰id
     * @return ç»“æžœ
     */
    Boolean deleteByDefIds(Collection<String> ids);
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormDefinitionService.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormManageService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,81 @@
package org.dromara.workflow.service;
import org.dromara.workflow.domain.vo.WfFormManageVo;
import org.dromara.workflow.domain.bo.WfFormManageBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
 * è¡¨å•管理Service接口
 *
 * @author may
 * @date 2024-03-29
 */
public interface IWfFormManageService {
    /**
     * æŸ¥è¯¢è¡¨å•管理
     *
     * @param id ä¸»é”®
     * @return ç»“æžœ
     */
    WfFormManageVo queryById(Long id);
    /**
     * æŸ¥è¯¢è¡¨å•管理
     *
     * @param ids ä¸»é”®
     * @return ç»“æžœ
     */
    List<WfFormManageVo> queryByIds(List<Long> ids);
    /**
     * æŸ¥è¯¢è¡¨å•管理列表
     *
     * @param bo        å‚æ•°
     * @param pageQuery åˆ†é¡µ
     * @return ç»“æžœ
     */
    TableDataInfo<WfFormManageVo> queryPageList(WfFormManageBo bo, PageQuery pageQuery);
    /**
     * æŸ¥è¯¢è¡¨å•管理列表
     *
     * @return ç»“æžœ
     */
    List<WfFormManageVo> selectList();
    /**
     * æŸ¥è¯¢è¡¨å•管理列表
     *
     * @param bo å‚æ•°
     * @return ç»“æžœ
     */
    List<WfFormManageVo> queryList(WfFormManageBo bo);
    /**
     * æ–°å¢žè¡¨å•管理
     *
     * @param bo å‚æ•°
     * @return ç»“æžœ
     */
    Boolean insertByBo(WfFormManageBo bo);
    /**
     * ä¿®æ”¹è¡¨å•管理
     *
     * @param bo å‚æ•°
     * @return ç»“æžœ
     */
    Boolean updateByBo(WfFormManageBo bo);
    /**
     * æ‰¹é‡åˆ é™¤è¡¨å•管理信息
     *
     * @param ids ä¸»é”®
     * @return ç»“æžœ
     */
    Boolean deleteByIds(Collection<Long> ids);
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfNodeConfigService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
package org.dromara.workflow.service;
import org.dromara.workflow.domain.WfNodeConfig;
import org.dromara.workflow.domain.vo.WfNodeConfigVo;
import java.util.Collection;
import java.util.List;
/**
 * èŠ‚ç‚¹é…ç½®Service接口
 *
 * @author may
 * @date 2024-03-30
 */
public interface IWfNodeConfigService {
    /**
     * æŸ¥è¯¢èŠ‚ç‚¹é…ç½®
     *
     * @param id ä¸»é”®
     * @return ç»“æžœ
     */
    WfNodeConfigVo queryById(Long id);
    /**
     * ä¿å­˜èŠ‚ç‚¹é…ç½®
     *
     * @param list å‚æ•°
     * @return ç»“æžœ
     */
    Boolean saveOrUpdate(List<WfNodeConfig> list);
    /**
     * æ‰¹é‡åˆ é™¤èŠ‚ç‚¹é…ç½®ä¿¡æ¯
     *
     * @param ids ä¸»é”®
     * @return ç»“æžœ
     */
    Boolean deleteByIds(Collection<Long> ids);
    /**
     * æŒ‰ç…§æµç¨‹å®šä¹‰id删除
     *
     * @param ids æµç¨‹å®šä¹‰id
     * @return ç»“æžœ
     */
    Boolean deleteByDefIds(Collection<String> ids);
    /**
     * æŒ‰ç…§æµç¨‹å®šä¹‰id查询
     *
     * @param ids æµç¨‹å®šä¹‰id
     * @return ç»“æžœ
     */
    List<WfNodeConfigVo> selectByDefIds(Collection<String> ids);
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiTaskinstServiceImpl.java
@@ -8,7 +8,7 @@
/**
 * æµç¨‹åŽ†å²ä»»åŠ¡Service业务层处理
 *
 * @author gssong
 * @author may
 * @date 2024-03-02
 */
@RequiredArgsConstructor
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java
@@ -7,27 +7,30 @@
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.ZipUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.excel.util.StringUtils;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.batik.transcoder.image.PNGTranscoder;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.workflow.common.constant.FlowConstant;
import org.dromara.workflow.domain.WfNodeConfig;
import org.dromara.workflow.domain.bo.ModelBo;
import org.dromara.workflow.domain.bo.WfFormDefinitionBo;
import org.dromara.workflow.domain.bo.WfDefinitionConfigBo;
import org.dromara.workflow.domain.vo.ModelVo;
import org.dromara.workflow.domain.vo.WfFormDefinitionVo;
import org.dromara.workflow.domain.vo.WfDefinitionConfigVo;
import org.dromara.workflow.service.IActModelService;
import org.dromara.workflow.service.IWfFormDefinitionService;
import org.dromara.workflow.service.IWfDefinitionConfigService;
import org.dromara.workflow.service.IWfNodeConfigService;
import org.dromara.workflow.utils.ModelUtils;
import org.dromara.workflow.utils.QueryUtils;
import org.flowable.bpmn.model.BpmnModel;
import org.flowable.bpmn.model.UserTask;
import org.flowable.engine.RepositoryService;
import org.flowable.engine.repository.*;
import org.flowable.validation.ValidationError;
@@ -40,6 +43,7 @@
import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
@@ -55,7 +59,8 @@
public class ActModelServiceImpl implements IActModelService {
    private final RepositoryService repositoryService;
    private final IWfFormDefinitionService iWfFormDefinitionService;
    private final IWfDefinitionConfigService iWfDefinitionConfigService;
    private final IWfNodeConfigService iWfNodeConfigService;
    /**
     * åˆ†é¡µæŸ¥è¯¢æ¨¡åž‹
@@ -66,13 +71,13 @@
    @Override
    public TableDataInfo<Model> page(ModelBo modelBo, PageQuery pageQuery) {
        ModelQuery query = QueryUtils.modelQuery();
        if (StringUtils.isNotEmpty(modelBo.getName())) {
        if (StringUtils.isNotBlank(modelBo.getName())) {
            query.modelNameLike("%" + modelBo.getName() + "%");
        }
        if (StringUtils.isNotEmpty(modelBo.getKey())) {
        if (StringUtils.isNotBlank(modelBo.getKey())) {
            query.modelKey(modelBo.getKey());
        }
        if (StringUtils.isNotEmpty(modelBo.getCategoryCode())) {
        if (StringUtils.isNotBlank(modelBo.getCategoryCode())) {
            query.modelCategory(modelBo.getCategoryCode());
        }
        query.orderByLastUpdateTime().desc();
@@ -279,17 +284,36 @@
            // æ›´æ–°åˆ†ç±»
            ProcessDefinition definition = QueryUtils.definitionQuery().deploymentId(deployment.getId()).singleResult();
            repositoryService.setProcessDefinitionCategory(definition.getId(), model.getCategory());
            //更新流程定义表单
            if (processDefinition != null) {
                WfFormDefinitionVo definitionVo = iWfFormDefinitionService.getByDefId(processDefinition.getId());
                WfDefinitionConfigVo definitionVo = iWfDefinitionConfigService.getByDefId(processDefinition.getId());
                if (definitionVo != null) {
                    WfFormDefinitionBo wfFormDefinition = new WfFormDefinitionBo();
                    WfDefinitionConfigBo wfFormDefinition = new WfDefinitionConfigBo();
                    wfFormDefinition.setDefinitionId(definition.getId());
                    wfFormDefinition.setProcessKey(definition.getKey());
                    wfFormDefinition.setPath(definitionVo.getPath());
                    wfFormDefinition.setFormId(ObjectUtil.isNotNull(definitionVo.getFormId()) ? definitionVo.getFormId() : null);
                    wfFormDefinition.setRemark(definitionVo.getRemark());
                    iWfFormDefinitionService.saveOrUpdate(wfFormDefinition);
                    iWfDefinitionConfigService.saveOrUpdate(wfFormDefinition);
                }
            }
            //更新流程节点配置表单
            List<UserTask> userTasks = ModelUtils.getuserTaskFlowElements(definition.getId());
            List<WfNodeConfig> wfNodeConfigList = new ArrayList<>();
            for (UserTask userTask : userTasks) {
                if (StringUtils.isNotBlank(userTask.getFormKey()) && userTask.getFormKey().contains(StrUtil.COLON)) {
                    WfNodeConfig wfNodeConfig = new WfNodeConfig();
                    wfNodeConfig.setNodeId(userTask.getId());
                    wfNodeConfig.setNodeName(userTask.getName());
                    wfNodeConfig.setDefinitionId(definition.getId());
                    String[] split = userTask.getFormKey().split(StrUtil.COLON);
                    wfNodeConfig.setFormType(split[0]);
                    wfNodeConfig.setFormId(Long.valueOf(split[1]));
                    wfNodeConfigList.add(wfNodeConfig);
                }
            }
            if (CollUtil.isNotEmpty(wfNodeConfigList)) {
                iWfNodeConfigService.saveOrUpdate(wfNodeConfigList);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java
@@ -7,6 +7,7 @@
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import org.apache.commons.io.IOUtils;
@@ -18,13 +19,18 @@
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.workflow.common.constant.FlowConstant;
import org.dromara.workflow.domain.WfCategory;
import org.dromara.workflow.domain.WfNodeConfig;
import org.dromara.workflow.domain.bo.ProcessDefinitionBo;
import org.dromara.workflow.domain.bo.WfDefinitionConfigBo;
import org.dromara.workflow.domain.vo.ProcessDefinitionVo;
import org.dromara.workflow.domain.vo.WfFormDefinitionVo;
import org.dromara.workflow.domain.vo.WfDefinitionConfigVo;
import org.dromara.workflow.service.IActProcessDefinitionService;
import org.dromara.workflow.service.IWfCategoryService;
import org.dromara.workflow.service.IWfFormDefinitionService;
import org.dromara.workflow.service.IWfDefinitionConfigService;
import org.dromara.workflow.service.IWfNodeConfigService;
import org.dromara.workflow.utils.ModelUtils;
import org.dromara.workflow.utils.QueryUtils;
import org.flowable.bpmn.model.UserTask;
import org.flowable.engine.ProcessMigrationService;
import org.flowable.engine.RepositoryService;
import org.flowable.engine.impl.bpmn.deployer.ResourceNameUtil;
@@ -38,6 +44,7 @@
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
@@ -54,7 +61,8 @@
    private final RepositoryService repositoryService;
    private final ProcessMigrationService processMigrationService;
    private final IWfCategoryService wfCategoryService;
    private final IWfFormDefinitionService iWfFormDefinitionService;
    private final IWfDefinitionConfigService iWfDefinitionConfigService;
    private final IWfNodeConfigService iWfNodeConfigService;
    /**
     * åˆ†é¡µæŸ¥è¯¢
@@ -85,7 +93,7 @@
        }
        if (CollUtil.isNotEmpty(definitionList)) {
            List<String> ids = StreamUtils.toList(definitionList, ProcessDefinition::getId);
            List<WfFormDefinitionVo> wfFormDefinitionVos = iWfFormDefinitionService.queryList(ids);
            List<WfDefinitionConfigVo> wfDefinitionConfigVos = iWfDefinitionConfigService.queryList(ids);
            for (ProcessDefinition processDefinition : definitionList) {
                ProcessDefinitionVo processDefinitionVo = BeanUtil.toBean(processDefinition, ProcessDefinitionVo.class);
                if (CollUtil.isNotEmpty(deploymentList)) {
@@ -94,8 +102,8 @@
                        processDefinitionVo.setDeploymentTime(e.getDeploymentTime());
                    });
                }
                if (CollUtil.isNotEmpty(wfFormDefinitionVos)) {
                    wfFormDefinitionVos.stream().filter(e -> e.getDefinitionId().equals(processDefinition.getId())).findFirst().ifPresent(processDefinitionVo::setWfFormDefinitionVo);
                if (CollUtil.isNotEmpty(wfDefinitionConfigVos)) {
                    wfDefinitionConfigVos.stream().filter(e -> e.getDefinitionId().equals(processDefinition.getId())).findFirst().ifPresent(processDefinitionVo::setWfDefinitionConfigVo);
                }
                processDefinitionVoList.add(processDefinitionVo);
            }
@@ -125,7 +133,7 @@
        }
        if (CollUtil.isNotEmpty(definitionList)) {
            List<String> ids = StreamUtils.toList(definitionList, ProcessDefinition::getId);
            List<WfFormDefinitionVo> wfFormDefinitionVos = iWfFormDefinitionService.queryList(ids);
            List<WfDefinitionConfigVo> wfDefinitionConfigVos = iWfDefinitionConfigService.queryList(ids);
            for (ProcessDefinition processDefinition : definitionList) {
                ProcessDefinitionVo processDefinitionVo = BeanUtil.toBean(processDefinition, ProcessDefinitionVo.class);
                if (CollUtil.isNotEmpty(deploymentList)) {
@@ -133,8 +141,8 @@
                    deploymentList.stream().filter(e -> e.getId().equals(processDefinition.getDeploymentId())).findFirst().ifPresent(e -> {
                        processDefinitionVo.setDeploymentTime(e.getDeploymentTime());
                    });
                    if (CollUtil.isNotEmpty(wfFormDefinitionVos)) {
                        wfFormDefinitionVos.stream().filter(e -> e.getDefinitionId().equals(processDefinition.getId())).findFirst().ifPresent(processDefinitionVo::setWfFormDefinitionVo);
                    if (CollUtil.isNotEmpty(wfDefinitionConfigVos)) {
                        wfDefinitionConfigVos.stream().filter(e -> e.getDefinitionId().equals(processDefinition.getId())).findFirst().ifPresent(processDefinitionVo::setWfDefinitionConfigVo);
                    }
                }
                processDefinitionVoList.add(processDefinitionVo);
@@ -192,7 +200,9 @@
            //删除流程定义
            repositoryService.deleteDeployment(deploymentId);
            //删除表单配置
            iWfFormDefinitionService.getByDefId(processDefinitionId);
            iWfDefinitionConfigService.deleteByDefIds(Collections.singletonList(processDefinitionId));
            //删除节点配置
            iWfNodeConfigService.deleteByDefIds(Collections.singletonList(processDefinitionId));
            return true;
        } catch (Exception e) {
            e.printStackTrace();
@@ -313,12 +323,14 @@
                    String processName = splitFilename[0];
                    //流程key
                    String processKey = splitFilename[1];
                    ProcessDefinition oldProcessDefinition = QueryUtils.definitionQuery().processDefinitionKey(processKey).latestVersion().singleResult();
                    DeploymentBuilder builder = repositoryService.createDeployment();
                    Deployment deployment = builder.addInputStream(filename, zipInputStream)
                        .tenantId(TenantHelper.getTenantId())
                        .name(processName).key(processKey).category(categoryCode).deploy();
                    ProcessDefinition definition = QueryUtils.definitionQuery().deploymentId(deployment.getId()).singleResult();
                    repositoryService.setProcessDefinitionCategory(definition.getId(), categoryCode);
                    setForm(oldProcessDefinition, definition);
                    zipInputStream.closeEntry();
                }
            } catch (IOException e) {
@@ -341,6 +353,8 @@
                String processName = splitFilename[0];
                //流程key
                String processKey = splitFilename[1];
                ProcessDefinition oldProcessDefinition = QueryUtils.definitionQuery().processDefinitionKey(processKey).latestVersion().singleResult();
                DeploymentBuilder builder = repositoryService.createDeployment();
                Deployment deployment = builder.addInputStream(originalFilename, inputStream)
                    .tenantId(TenantHelper.getTenantId())
@@ -348,10 +362,51 @@
                // æ›´æ–°åˆ†ç±»
                ProcessDefinition definition = QueryUtils.definitionQuery().deploymentId(deployment.getId()).singleResult();
                repositoryService.setProcessDefinitionCategory(definition.getId(), categoryCode);
                setForm(oldProcessDefinition, definition);
            } else {
                throw new ServiceException("文件类型上传错误!");
            }
        }
    }
    /**
     * è®¾ç½®è¡¨å•内容
     *
     * @param oldProcessDefinition éƒ¨ç½²å‰æœ€æ–°æµç¨‹å®šä¹‰
     * @param definition           éƒ¨ç½²åŽæœ€æ–°æµç¨‹å®šä¹‰
     */
    private void setForm(ProcessDefinition oldProcessDefinition, ProcessDefinition definition) {
        //更新流程定义表单
        if (oldProcessDefinition != null) {
            WfDefinitionConfigVo definitionVo = iWfDefinitionConfigService.getByDefId(oldProcessDefinition.getId());
            if (definitionVo != null) {
                WfDefinitionConfigBo wfFormDefinition = new WfDefinitionConfigBo();
                wfFormDefinition.setDefinitionId(definition.getId());
                wfFormDefinition.setProcessKey(definition.getKey());
                wfFormDefinition.setFormId(ObjectUtil.isNotNull(definitionVo.getFormId()) ? definitionVo.getFormId() : null);
                wfFormDefinition.setRemark(definitionVo.getRemark());
                iWfDefinitionConfigService.saveOrUpdate(wfFormDefinition);
            }
        }
        //更新流程节点配置表单
        List<UserTask> userTasks = ModelUtils.getuserTaskFlowElements(definition.getId());
        List<WfNodeConfig> wfNodeConfigList = new ArrayList<>();
        for (UserTask userTask : userTasks) {
            if (StringUtils.isNotBlank(userTask.getFormKey()) && userTask.getFormKey().contains(StrUtil.COLON)) {
                WfNodeConfig wfNodeConfig = new WfNodeConfig();
                wfNodeConfig.setNodeId(userTask.getId());
                wfNodeConfig.setNodeName(userTask.getName());
                wfNodeConfig.setDefinitionId(definition.getId());
                String[] split = userTask.getFormKey().split(StrUtil.COLON);
                wfNodeConfig.setFormType(split[0]);
                wfNodeConfig.setFormId(Long.valueOf(split[1]));
                wfNodeConfigList.add(wfNodeConfig);
            }
        }
        if (CollUtil.isNotEmpty(wfNodeConfigList)) {
            iWfNodeConfigService.saveOrUpdate(wfNodeConfigList);
        }
    }
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java
@@ -122,7 +122,7 @@
        }
        if (CollUtil.isNotEmpty(list)) {
            List<String> processDefinitionIds = StreamUtils.toList(list, ProcessInstanceVo::getProcessDefinitionId);
            WorkflowUtils.setWfFormDefinitionVo(list, processDefinitionIds, PROCESS_DEFINITION_ID);
            WorkflowUtils.setWfDefinitionConfigVo(list, processDefinitionIds, PROCESS_DEFINITION_ID);
        }
        long count = query.count();
        TableDataInfo<ProcessInstanceVo> build = TableDataInfo.build();
@@ -164,7 +164,7 @@
        }
        if (CollUtil.isNotEmpty(list)) {
            List<String> processDefinitionIds = StreamUtils.toList(list, ProcessInstanceVo::getProcessDefinitionId);
            WorkflowUtils.setWfFormDefinitionVo(list, processDefinitionIds, PROCESS_DEFINITION_ID);
            WorkflowUtils.setWfDefinitionConfigVo(list, processDefinitionIds, PROCESS_DEFINITION_ID);
        }
        long count = query.count();
        TableDataInfo<ProcessInstanceVo> build = TableDataInfo.build();
@@ -669,7 +669,7 @@
        }
        if (CollUtil.isNotEmpty(list)) {
            List<String> processDefinitionIds = StreamUtils.toList(list, ProcessInstanceVo::getProcessDefinitionId);
            WorkflowUtils.setWfFormDefinitionVo(list, processDefinitionIds, PROCESS_DEFINITION_ID);
            WorkflowUtils.setWfDefinitionConfigVo(list, processDefinitionIds, PROCESS_DEFINITION_ID);
        }
        long count = query.count();
        TableDataInfo<ProcessInstanceVo> build = TableDataInfo.build();
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java
@@ -30,6 +30,7 @@
import org.dromara.workflow.mapper.ActHiTaskinstMapper;
import org.dromara.workflow.mapper.ActTaskMapper;
import org.dromara.workflow.service.IActTaskService;
import org.dromara.workflow.service.IWfNodeConfigService;
import org.dromara.workflow.service.IWfTaskBackNodeService;
import org.dromara.workflow.utils.ModelUtils;
import org.dromara.workflow.utils.QueryUtils;
@@ -76,6 +77,7 @@
    private final ActTaskMapper actTaskMapper;
    private final IWfTaskBackNodeService iWfTaskBackNodeService;
    private final ActHiTaskinstMapper actHiTaskinstMapper;
    private final IWfNodeConfigService iWfNodeConfigService;
    /**
     * å¯åŠ¨ä»»åŠ¡
@@ -273,13 +275,17 @@
        List<TaskVo> taskList = page.getRecords();
        if (CollUtil.isNotEmpty(taskList)) {
            List<String> processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId);
            List<WfNodeConfigVo> wfNodeConfigVoList = iWfNodeConfigService.selectByDefIds(processDefinitionIds);
            for (TaskVo task : taskList) {
                task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus()));
                task.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId()));
                task.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null);
                if (CollUtil.isNotEmpty(wfNodeConfigVoList)) {
                    wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey())).findFirst().ifPresent(task::setWfNodeConfigVo);
                }
            }
            List<String> processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId);
            WorkflowUtils.setWfFormDefinitionVo(taskList, processDefinitionIds, PROCESS_DEFINITION_ID);
            WorkflowUtils.setWfDefinitionConfigVo(taskList, processDefinitionIds, PROCESS_DEFINITION_ID);
        }
        return TableDataInfo.build(page);
    }
@@ -322,25 +328,29 @@
            processInstanceList = QueryUtils.instanceQuery(processInstanceIds).list();
        }
        List<TaskVo> list = new ArrayList<>();
        for (Task task : taskList) {
            TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class);
            if (CollUtil.isNotEmpty(processInstanceList)) {
                processInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> {
                    taskVo.setBusinessStatus(e.getBusinessStatus());
                    taskVo.setBusinessStatusName(BusinessStatusEnum.findByStatus(taskVo.getBusinessStatus()));
                    taskVo.setProcessDefinitionKey(e.getProcessDefinitionKey());
                    taskVo.setProcessDefinitionName(e.getProcessDefinitionName());
                    taskVo.setBusinessKey(e.getBusinessKey());
                });
        if (CollUtil.isNotEmpty(taskList)) {
            List<String> processDefinitionIds = StreamUtils.toList(taskList, Task::getProcessDefinitionId);
            List<WfNodeConfigVo> wfNodeConfigVoList = iWfNodeConfigService.selectByDefIds(processDefinitionIds);
            for (Task task : taskList) {
                TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class);
                if (CollUtil.isNotEmpty(processInstanceList)) {
                    processInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> {
                        taskVo.setBusinessStatus(e.getBusinessStatus());
                        taskVo.setBusinessStatusName(BusinessStatusEnum.findByStatus(taskVo.getBusinessStatus()));
                        taskVo.setProcessDefinitionKey(e.getProcessDefinitionKey());
                        taskVo.setProcessDefinitionName(e.getProcessDefinitionName());
                        taskVo.setBusinessKey(e.getBusinessKey());
                    });
                }
                taskVo.setAssignee(StringUtils.isNotBlank(task.getAssignee()) ? Long.valueOf(task.getAssignee()) : null);
                taskVo.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId()));
                taskVo.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null);
                if (CollUtil.isNotEmpty(wfNodeConfigVoList)) {
                    wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey())).findFirst().ifPresent(taskVo::setWfNodeConfigVo);
                }
                list.add(taskVo);
            }
            taskVo.setAssignee(StringUtils.isNotBlank(task.getAssignee()) ? Long.valueOf(task.getAssignee()) : null);
            taskVo.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId()));
            taskVo.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null);
            list.add(taskVo);
        }
        if (CollUtil.isNotEmpty(list)) {
            List<String> processDefinitionIds = StreamUtils.toList(list, TaskVo::getProcessDefinitionId);
            WorkflowUtils.setWfFormDefinitionVo(list, processDefinitionIds, PROCESS_DEFINITION_ID);
            WorkflowUtils.setWfDefinitionConfigVo(list, processDefinitionIds, PROCESS_DEFINITION_ID);
        }
        long count = query.count();
        TableDataInfo<TaskVo> build = TableDataInfo.build();
@@ -366,11 +376,15 @@
        List<TaskVo> taskList = page.getRecords();
        if (CollUtil.isNotEmpty(taskList)) {
            List<String> processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId);
            List<WfNodeConfigVo> wfNodeConfigVoList = iWfNodeConfigService.selectByDefIds(processDefinitionIds);
            for (TaskVo task : taskList) {
                task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus()));
                if (CollUtil.isNotEmpty(wfNodeConfigVoList)) {
                    wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey())).findFirst().ifPresent(task::setWfNodeConfigVo);
                }
            }
            List<String> processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId);
            WorkflowUtils.setWfFormDefinitionVo(taskList, processDefinitionIds, PROCESS_DEFINITION_ID);
            WorkflowUtils.setWfDefinitionConfigVo(taskList, processDefinitionIds, PROCESS_DEFINITION_ID);
        }
        return TableDataInfo.build(page);
    }
@@ -397,12 +411,17 @@
        Page<TaskVo> page = actTaskMapper.getTaskCopyByPage(pageQuery.build(), queryWrapper);
        List<TaskVo> taskList = page.getRecords();
        for (TaskVo task : taskList) {
            task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus()));
        }
        if (CollUtil.isNotEmpty(taskList)) {
            List<String> processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId);
            WorkflowUtils.setWfFormDefinitionVo(taskList, processDefinitionIds, PROCESS_DEFINITION_ID);
            List<WfNodeConfigVo> wfNodeConfigVoList = iWfNodeConfigService.selectByDefIds(processDefinitionIds);
            for (TaskVo task : taskList) {
                task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus()));
                if (CollUtil.isNotEmpty(wfNodeConfigVoList)) {
                    wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey())).findFirst().ifPresent(task::setWfNodeConfigVo);
                }
            }
            WorkflowUtils.setWfDefinitionConfigVo(taskList, processDefinitionIds, PROCESS_DEFINITION_ID);
        }
        return TableDataInfo.build(page);
    }
@@ -426,7 +445,7 @@
        }
        if (CollUtil.isNotEmpty(taskList)) {
            List<String> processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId);
            WorkflowUtils.setWfFormDefinitionVo(taskList, processDefinitionIds, PROCESS_DEFINITION_ID);
            WorkflowUtils.setWfDefinitionConfigVo(taskList, processDefinitionIds, PROCESS_DEFINITION_ID);
        }
        return TableDataInfo.build(page);
    }
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfDefinitionConfigServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,71 @@
package org.dromara.workflow.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import org.dromara.workflow.domain.WfDefinitionConfig;
import org.dromara.workflow.domain.bo.WfDefinitionConfigBo;
import org.dromara.workflow.domain.vo.WfDefinitionConfigVo;
import org.dromara.workflow.service.IWfDefinitionConfigService;
import org.springframework.stereotype.Service;
import org.dromara.workflow.mapper.WfDefinitionConfigMapper;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Collection;
/**
 * è¡¨å•配置Service业务层处理
 *
 * @author may
 * @date 2024-03-18
 */
@RequiredArgsConstructor
@Service
public class WfDefinitionConfigServiceImpl implements IWfDefinitionConfigService {
    private final WfDefinitionConfigMapper baseMapper;
    /**
     * æŸ¥è¯¢è¡¨å•配置
     */
    @Override
    public WfDefinitionConfigVo getByDefId(String definitionId) {
        return baseMapper.selectVoOne(new LambdaQueryWrapper<WfDefinitionConfig>().eq(WfDefinitionConfig::getDefinitionId, definitionId));
    }
    /**
     * æŸ¥è¯¢è¡¨å•配置列表
     */
    @Override
    public List<WfDefinitionConfigVo> queryList(List<String> definitionIds) {
        return baseMapper.selectVoList(new LambdaQueryWrapper<WfDefinitionConfig>().in(WfDefinitionConfig::getDefinitionId, definitionIds));
    }
    /**
     * æ–°å¢žè¡¨å•配置
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean saveOrUpdate(WfDefinitionConfigBo bo) {
        WfDefinitionConfig add = MapstructUtils.convert(bo, WfDefinitionConfig.class);
        boolean flag = baseMapper.insertOrUpdate(add);
        if (baseMapper.insertOrUpdate(add)) {
            bo.setId(add.getId());
        }
        return flag;
    }
    /**
     * æ‰¹é‡åˆ é™¤è¡¨å•配置
     */
    @Override
    public Boolean deleteByIds(Collection<Long> ids) {
        return baseMapper.deleteBatchIds(ids) > 0;
    }
    @Override
    public Boolean deleteByDefIds(Collection<String> ids) {
        return baseMapper.delete(new LambdaQueryWrapper<WfDefinitionConfig>().in(WfDefinitionConfig::getDefinitionId, ids)) > 0;
    }
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormDefinitionServiceImpl.java
ÎļþÒÑɾ³ý
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormManageServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,111 @@
package org.dromara.workflow.service.impl;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.workflow.common.enums.FormTypeEnum;
import org.springframework.stereotype.Service;
import org.dromara.workflow.domain.bo.WfFormManageBo;
import org.dromara.workflow.domain.vo.WfFormManageVo;
import org.dromara.workflow.domain.WfFormManage;
import org.dromara.workflow.mapper.WfFormManageMapper;
import org.dromara.workflow.service.IWfFormManageService;
import java.util.List;
import java.util.Collection;
/**
 * è¡¨å•管理Service业务层处理
 *
 * @author may
 * @date 2024-03-29
 */
@RequiredArgsConstructor
@Service
public class WfFormManageServiceImpl implements IWfFormManageService {
    private final WfFormManageMapper baseMapper;
    /**
     * æŸ¥è¯¢è¡¨å•管理
     */
    @Override
    public WfFormManageVo queryById(Long id) {
        return baseMapper.selectVoById(id);
    }
    @Override
    public List<WfFormManageVo> queryByIds(List<Long> ids) {
        return baseMapper.selectVoBatchIds(ids);
    }
    /**
     * æŸ¥è¯¢è¡¨å•管理列表
     */
    @Override
    public TableDataInfo<WfFormManageVo> queryPageList(WfFormManageBo bo, PageQuery pageQuery) {
        LambdaQueryWrapper<WfFormManage> lqw = buildQueryWrapper(bo);
        Page<WfFormManageVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
        return TableDataInfo.build(result);
    }
    @Override
    public List<WfFormManageVo> selectList() {
        List<WfFormManageVo> wfFormManageVos = baseMapper.selectVoList(new LambdaQueryWrapper<WfFormManage>().orderByDesc(WfFormManage::getUpdateTime));
        for (WfFormManageVo wfFormManageVo : wfFormManageVos) {
            wfFormManageVo.setFormTypeName(FormTypeEnum.findByType(wfFormManageVo.getFormType()));
        }
        return wfFormManageVos;
    }
    /**
     * æŸ¥è¯¢è¡¨å•管理列表
     */
    @Override
    public List<WfFormManageVo> queryList(WfFormManageBo bo) {
        LambdaQueryWrapper<WfFormManage> lqw = buildQueryWrapper(bo);
        return baseMapper.selectVoList(lqw);
    }
    private LambdaQueryWrapper<WfFormManage> buildQueryWrapper(WfFormManageBo bo) {
        LambdaQueryWrapper<WfFormManage> lqw = Wrappers.lambdaQuery();
        lqw.like(StringUtils.isNotBlank(bo.getFormName()), WfFormManage::getFormName, bo.getFormName());
        lqw.eq(StringUtils.isNotBlank(bo.getFormType()), WfFormManage::getFormType, bo.getFormType());
        return lqw;
    }
    /**
     * æ–°å¢žè¡¨å•管理
     */
    @Override
    public Boolean insertByBo(WfFormManageBo bo) {
        WfFormManage add = MapstructUtils.convert(bo, WfFormManage.class);
        boolean flag = baseMapper.insert(add) > 0;
        if (flag) {
            bo.setId(add.getId());
        }
        return flag;
    }
    /**
     * ä¿®æ”¹è¡¨å•管理
     */
    @Override
    public Boolean updateByBo(WfFormManageBo bo) {
        WfFormManage update = MapstructUtils.convert(bo, WfFormManage.class);
        return baseMapper.updateById(update) > 0;
    }
    /**
     * æ‰¹é‡åˆ é™¤è¡¨å•管理
     */
    @Override
    public Boolean deleteByIds(Collection<Long> ids) {
        return baseMapper.deleteBatchIds(ids) > 0;
    }
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfNodeConfigServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,73 @@
package org.dromara.workflow.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.workflow.domain.vo.WfFormManageVo;
import org.dromara.workflow.service.IWfFormManageService;
import org.springframework.stereotype.Service;
import org.dromara.workflow.domain.vo.WfNodeConfigVo;
import org.dromara.workflow.domain.WfNodeConfig;
import org.dromara.workflow.mapper.WfNodeConfigMapper;
import org.dromara.workflow.service.IWfNodeConfigService;
import java.util.Collection;
import java.util.List;
/**
 * èŠ‚ç‚¹é…ç½®Service业务层处理
 *
 * @author may
 * @date 2024-03-30
 */
@RequiredArgsConstructor
@Service
public class WfNodeConfigServiceImpl implements IWfNodeConfigService {
    private final WfNodeConfigMapper baseMapper;
    private final IWfFormManageService iWfFormManageService;
    /**
     * æŸ¥è¯¢èŠ‚ç‚¹é…ç½®
     */
    @Override
    public WfNodeConfigVo queryById(Long id) {
        return baseMapper.selectVoById(id);
    }
    /**
     * ä¿å­˜èŠ‚ç‚¹é…ç½®
     */
    @Override
    public Boolean saveOrUpdate(List<WfNodeConfig> list) {
        return baseMapper.insertOrUpdateBatch(list);
    }
    /**
     * æ‰¹é‡åˆ é™¤èŠ‚ç‚¹é…ç½®
     */
    @Override
    public Boolean deleteByIds(Collection<Long> ids) {
        return baseMapper.deleteBatchIds(ids) > 0;
    }
    @Override
    public Boolean deleteByDefIds(Collection<String> ids) {
        return baseMapper.delete(new LambdaQueryWrapper<WfNodeConfig>().in(WfNodeConfig::getDefinitionId, ids)) > 0;
    }
    @Override
    public List<WfNodeConfigVo> selectByDefIds(Collection<String> ids) {
        List<WfNodeConfigVo> wfNodeConfigVos = baseMapper.selectVoList(new LambdaQueryWrapper<WfNodeConfig>().in(WfNodeConfig::getDefinitionId, ids));
        if (CollUtil.isNotEmpty(wfNodeConfigVos)) {
            List<Long> formIds = StreamUtils.toList(wfNodeConfigVos, WfNodeConfigVo::getFormId);
            List<WfFormManageVo> wfFormManageVos = iWfFormManageService.queryByIds(formIds);
            for (WfNodeConfigVo wfNodeConfigVo : wfNodeConfigVos) {
                wfFormManageVos.stream().filter(e -> ObjectUtil.equals(e.getId(), wfNodeConfigVo.getFormId())).findFirst().ifPresent(wfNodeConfigVo::setWfFormManageVo);
            }
        }
        return wfNodeConfigVos;
    }
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/ModelUtils.java
@@ -164,6 +164,37 @@
    }
    /**
     * èŽ·å–æµç¨‹å…¨éƒ¨ç”¨æˆ·èŠ‚ç‚¹
     *
     * @param processDefinitionId æµç¨‹å®šä¹‰id
     */
    public static List<UserTask> getuserTaskFlowElements(String processDefinitionId) {
        BpmnModel bpmnModel = PROCESS_ENGINE.getRepositoryService().getBpmnModel(processDefinitionId);
        List<UserTask> list = new ArrayList<>();
        List<Process> processes = bpmnModel.getProcesses();
        Collection<FlowElement> flowElements = processes.get(0).getFlowElements();
        buildUserTaskFlowElements(flowElements, list);
        return list;
    }
    /**
     * é€’归获取所有节点
     *
     * @param flowElements èŠ‚ç‚¹ä¿¡æ¯
     * @param list         é›†åˆ
     */
    private static void buildUserTaskFlowElements(Collection<FlowElement> flowElements, List<UserTask> list) {
        for (FlowElement flowElement : flowElements) {
            if (flowElement instanceof SubProcess) {
                Collection<FlowElement> subFlowElements = ((SubProcess) flowElement).getFlowElements();
                buildUserTaskFlowElements(subFlowElements, list);
            } else if (flowElement instanceof UserTask) {
                list.add((UserTask) flowElement);
            }
        }
    }
    /**
     * èŽ·å–æµç¨‹å…¨éƒ¨èŠ‚ç‚¹
     *
     * @param processDefinitionId æµç¨‹å®šä¹‰id
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java
@@ -23,15 +23,10 @@
import org.dromara.workflow.common.enums.TaskStatusEnum;
import org.dromara.workflow.domain.ActHiProcinst;
import org.dromara.workflow.domain.ActHiTaskinst;
import org.dromara.workflow.domain.vo.MultiInstanceVo;
import org.dromara.workflow.domain.vo.ParticipantVo;
import org.dromara.workflow.domain.vo.ProcessInstanceVo;
import org.dromara.workflow.domain.vo.WfFormDefinitionVo;
import org.dromara.workflow.domain.vo.*;
import org.dromara.workflow.flowable.cmd.UpdateHiTaskInstCmd;
import org.dromara.workflow.mapper.ActHiTaskinstMapper;
import org.dromara.workflow.service.IActHiProcinstService;
import org.dromara.workflow.service.IWfFormDefinitionService;
import org.dromara.workflow.service.IWorkflowUserService;
import org.dromara.workflow.service.*;
import org.flowable.bpmn.model.BpmnModel;
import org.flowable.bpmn.model.FlowNode;
import org.flowable.common.engine.api.delegate.Expression;
@@ -46,8 +41,7 @@
import java.util.*;
import static org.dromara.workflow.common.constant.FlowConstant.PROCESS_INSTANCE_VO;
import static org.dromara.workflow.common.constant.FlowConstant.WF_FORM_DEFINITION_VO;
import static org.dromara.workflow.common.constant.FlowConstant.*;
/**
 * å·¥ä½œæµå·¥å…·
@@ -61,7 +55,8 @@
    private static final IWorkflowUserService WORKFLOW_USER_SERVICE = SpringUtils.getBean(IWorkflowUserService.class);
    private static final IActHiProcinstService ACT_HI_PROCINST_SERVICE = SpringUtils.getBean(IActHiProcinstService.class);
    private static final ActHiTaskinstMapper ACT_HI_TASKINST_MAPPER = SpringUtils.getBean(ActHiTaskinstMapper.class);
    private static final IWfFormDefinitionService I_WF_FORM_DEFINITION_SERVICE = SpringUtils.getBean(IWfFormDefinitionService.class);
    private static final IWfDefinitionConfigService I_WF_FORM_DEFINITION_SERVICE = SpringUtils.getBean(IWfDefinitionConfigService.class);
    private static final IWfFormManageService I_WF_FORM_MANAGE_SERVICE = SpringUtils.getBean(IWfFormManageService.class);
    /**
     * åˆ›å»ºä¸€ä¸ªæ–°ä»»åŠ¡
@@ -304,17 +299,26 @@
     * @param idList    æµç¨‹å®šä¹‰id
     * @param fieldName æµç¨‹å®šä¹‰ID属性名称
     */
    public static void setWfFormDefinitionVo(Object obj, List<String> idList, String fieldName) {
    public static void setWfDefinitionConfigVo(Object obj, List<String> idList, String fieldName) {
        if (CollUtil.isEmpty(idList) || obj == null) {
            return;
        }
        List<WfFormDefinitionVo> wfFormDefinitionVoList = I_WF_FORM_DEFINITION_SERVICE.queryList(idList);
        List<WfDefinitionConfigVo> wfDefinitionConfigVoList = I_WF_FORM_DEFINITION_SERVICE.queryList(idList);
        if (CollUtil.isNotEmpty(wfDefinitionConfigVoList)) {
            List<Long> formIds = StreamUtils.toList(wfDefinitionConfigVoList, WfDefinitionConfigVo::getFormId);
            List<WfFormManageVo> wfFormManageVos = I_WF_FORM_MANAGE_SERVICE.queryByIds(formIds);
            if (CollUtil.isNotEmpty(wfFormManageVos)) {
                for (WfDefinitionConfigVo wfDefinitionConfigVo : wfDefinitionConfigVoList) {
                    wfFormManageVos.stream().filter(e -> ObjectUtil.equals(wfDefinitionConfigVo.getFormId(), e.getId())).findFirst().ifPresent(wfDefinitionConfigVo::setWfFormManageVo);
                }
            }
        }
        if (obj instanceof Collection<?> collection) {
            for (Object o : collection) {
                String fieldValue = ReflectUtils.invokeGetter(o, fieldName).toString();
                if (!CollUtil.isEmpty(wfFormDefinitionVoList)) {
                    wfFormDefinitionVoList.stream().filter(e -> e.getDefinitionId().equals(fieldValue)).findFirst().ifPresent(e -> {
                        ReflectUtils.invokeSetter(o, WF_FORM_DEFINITION_VO, BeanUtil.toBean(e, WfFormDefinitionVo.class));
                if (!CollUtil.isEmpty(wfDefinitionConfigVoList)) {
                    wfDefinitionConfigVoList.stream().filter(e -> e.getDefinitionId().equals(fieldValue)).findFirst().ifPresent(e -> {
                        ReflectUtils.invokeSetter(o, WF_DEFINITION_CONFIG_VO, BeanUtil.toBean(e, WfDefinitionConfigVo.class));
                    });
                }
            }
ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfDefinitionConfigMapper.xml
copy from ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormDefinitionMapper.xml copy to ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfDefinitionConfigMapper.xml
Îļþ´Ó ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormDefinitionMapper.xml ¸´ÖÆ
@@ -2,6 +2,6 @@
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.workflow.mapper.WfFormDefinitionMapper">
<mapper namespace="org.dromara.workflow.mapper.WfDefinitionConfigMapper">
</mapper>
ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormManageMapper.xml
ÎļþÃû´Ó ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormDefinitionMapper.xml ÐÞ¸Ä
@@ -2,6 +2,6 @@
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.workflow.mapper.WfFormDefinitionMapper">
<mapper namespace="org.dromara.workflow.mapper.WfFormManageMapper">
</mapper>
ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfNodeConfigMapper.xml
copy from ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormDefinitionMapper.xml copy to ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfNodeConfigMapper.xml
Îļþ´Ó ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormDefinitionMapper.xml ¸´ÖÆ
@@ -2,6 +2,6 @@
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.workflow.mapper.WfFormDefinitionMapper">
<mapper namespace="org.dromara.workflow.mapper.WfNodeConfigMapper">
</mapper>
script/sql/flowable.sql
@@ -78,12 +78,12 @@
)
    comment '节点审批记录';
DROP TABLE if EXISTS wf_form_definition;
create table wf_form_definition
DROP TABLE if EXISTS wf_definition_config;
create table wf_definition_config
(
    id            bigint                        not null comment '主键'
        primary key,
    path          varchar(200) default ''       not null comment '路由地址',
    form_id       bigint                        not null comment '表单ID',
    definition_id varchar(255)                  not null comment '流程定义ID',
    process_key   varchar(255)                  not null comment '流程KEY',
    create_dept   bigint                        null comment '创建部门',
@@ -96,8 +96,44 @@
    constraint uni_definition_id
        unique (definition_id)
)
    comment '表单配置';
    comment '流程定义配置';
create table wf_form_manage
(
    id          bigint       not null comment '主键'
        primary key,
    form_name   varchar(255) not null comment '表单名称',
    form_type   varchar(255) not null comment '表单类型',
    router      varchar(255) not null comment '路由地址/表单ID',
    remark      varchar(500) null comment '备注',
    tenant_id   varchar(20)  null comment '租户编号',
    create_dept bigint       null comment '创建部门',
    create_by   bigint       null comment '创建者',
    create_time datetime     null comment '创建时间',
    update_by   bigint       null comment '更新者',
    update_time datetime     null comment '更新时间'
)
    comment '表单管理';
insert into wf_form_manage(id, form_name, form_type, router, remark, tenant_id, create_dept, create_by, create_time, update_by, update_time) VALUES (1, '请假申请', 'static', '/demo/leaveEdit/index', NULL, '000000', 103, 1, sysdate(), 1, sysdate());
create table wf_node_config
(
    id            bigint       not null comment '主键'
        primary key,
    form_id       bigint       null comment '表单id',
    form_type     varchar(255) null comment '表单类型',
    node_name     varchar(255) not null comment '节点名称',
    node_id       varchar(255) not null comment '节点id',
    definition_id varchar(255) not null comment '流程定义id',
    create_dept   bigint       null comment '创建部门',
    create_by     bigint       null comment '创建者',
    create_time   datetime     null comment '创建时间',
    update_by     bigint       null comment '更新者',
    update_time   datetime     null comment '更新时间',
    tenant_id     varchar(20)  null comment '租户编号'
)
    comment '节点配置';
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'demo:leave:list', '#', 103, 1, sysdate(), NULL, NULL, '请假申请菜单');
script/sql/oracle/flowable.sql
@@ -120,12 +120,12 @@
comment on column WF_TASK_BACK_NODE.UPDATE_BY is '更新者'
comment on column WF_TASK_BACK_NODE.UPDATE_TIME is '更新时间'
create table WF_FORM_DEFINITION
create table WF_DEFINITION_CONFIG
(
    ID            NUMBER(20) NOT NULL
        CONSTRAINT PK_WF_FORM_DEFINITION
        CONSTRAINT PK_WF_DEFINITION_CONFIG
        PRIMARY KEY,
    PATH          VARCHAR2(200) NOT NULL,
    FORM_ID       NUMBER(20) NOT NULL,
    DEFINITION_ID VARCHAR2(255) NOT NULL,
    PROCESS_KEY   VARCHAR2(255)  NOT NULL,
    TENANT_ID     VARCHAR2(20),
@@ -137,16 +137,17 @@
    constraint uni_definition_id
        unique (definition_id)
);
comment on table WF_FORM_DEFINITION is '表单配置'
comment on column WF_FORM_DEFINITION.ID is '主键'
comment on column WF_FORM_DEFINITION.DEFINITION_ID is '流程定义ID'
comment on column WF_FORM_DEFINITION.PROCESS_KEY is '流程KEY'
comment on column WF_FORM_DEFINITION.TENANT_ID is '租户编号'
comment on column WF_FORM_DEFINITION.CREATE_DEPT is '创建部门'
comment on column WF_FORM_DEFINITION.CREATE_BY is '创建者'
comment on column WF_FORM_DEFINITION.CREATE_TIME is '创建时间'
comment on column WF_FORM_DEFINITION.UPDATE_BY is '更新者'
comment on column WF_FORM_DEFINITION.UPDATE_TIME is '更新时间'
comment on table WF_DEFINITION_CONFIG is '流程定义配置'
comment on column WF_DEFINITION_CONFIG.ID is '主键'
comment on column WF_DEFINITION_CONFIG.FORM_ID is '表单ID'
comment on column WF_DEFINITION_CONFIG.DEFINITION_ID is '流程定义ID'
comment on column WF_DEFINITION_CONFIG.PROCESS_KEY is '流程KEY'
comment on column WF_DEFINITION_CONFIG.TENANT_ID is '租户编号'
comment on column WF_DEFINITION_CONFIG.CREATE_DEPT is '创建部门'
comment on column WF_DEFINITION_CONFIG.CREATE_BY is '创建者'
comment on column WF_DEFINITION_CONFIG.CREATE_TIME is '创建时间'
comment on column WF_DEFINITION_CONFIG.UPDATE_BY is '更新者'
comment on column WF_DEFINITION_CONFIG.UPDATE_TIME is '更新时间'
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'demo:leave:list', '#', 103, 1, sysdate, NULL, NULL, '请假申请菜单');
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11639, '请假申请查询', 11638, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:query', '#', 103, 1, sysdate, NULL, NULL, '');
script/sql/postgres/flowable.sql
@@ -166,12 +166,12 @@
alter table wf_task_back_node
    owner to postgres;
create table wf_form_definition
create table wf_definition_config
(
    id            bigint(20) not null
        constraint pk_wf_form_definition
        constraint pk_wf_definition_config
        primary key,
    path          varchar(200) not null,
    form_id       bigint(20) not null,
    definition_id varchar(255) not null,
    process_key   varchar(255)  not null,
    tenant_id     varchar(20),
@@ -182,32 +182,32 @@
    update_time   timestamp
);
comment on table wf_form_definition is '表单配置';
comment on table wf_definition_config is '流程定义配置';
comment on column wf_form_definition.id is '主键';
comment on column wf_definition_config.id is '主键';
comment on column wf_form_definition.path is '路由地址';
comment on column wf_definition_config.form_id is '表单ID';
comment on column wf_form_definition.definition_id is '流程定义ID';
comment on column wf_definition_config.definition_id is '流程定义ID';
comment on column wf_form_definition.process_key is '流程KEY';
comment on column wf_definition_config.process_key is '流程KEY';
comment on column wf_form_definition.tenant_id is '租户id';
comment on column wf_definition_config.tenant_id is '租户id';
comment on column wf_form_definition.create_dept is '创建部门';
comment on column wf_definition_config.create_dept is '创建部门';
comment on column wf_form_definition.create_by is '创建者';
comment on column wf_definition_config.create_by is '创建者';
comment on column wf_form_definition.create_time is '创建时间';
comment on column wf_definition_config.create_time is '创建时间';
comment on column wf_form_definition.update_by is '修改者';
comment on column wf_definition_config.update_by is '修改者';
comment on column wf_form_definition.update_time is '修改时间';
comment on column wf_definition_config.update_time is '修改时间';
alter table wf_form_definition
alter table wf_definition_config
    owner to postgres;
create unique index uni_definition_id
    on wf_form_definition (definition_id);
    on wf_definition_config (definition_id);
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'demo:leave:list', '#', 103, 1, now(), NULL, NULL, '请假申请菜单');
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11639, '请假申请查询', 11638, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:query', '#', 103, 1, now(), NULL, NULL, '');
script/sql/sqlserver/flowable.sql
@@ -214,10 +214,10 @@
     'update_time'
go
create table wf_form_definition
create table wf_definition_config
(
    id            bigint(20) not null primary key,
    path          nvarchar(200) not null,
    form_id       bigint(20) not null,
    definition_id nvarchar(255)
        constraint uni_definition_id
        unique,
@@ -231,43 +231,43 @@
)
go
exec sp_addextendedproperty 'MS_Description', N'表单配置', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_definition'
exec sp_addextendedproperty 'MS_Description', N'流程定义配置', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config'
go
exec sp_addextendedproperty 'MS_Description', N'主键', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_definition', 'COLUMN', 'id'
exec sp_addextendedproperty 'MS_Description', N'主键', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN', 'id'
go
exec sp_addextendedproperty 'MS_Description', N'路由地址', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_definition', 'COLUMN',
     'path'
exec sp_addextendedproperty 'MS_Description', N'表单ID', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN',
     'form_id'
go
exec sp_addextendedproperty 'MS_Description', N'流程定义ID', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_definition', 'COLUMN',
exec sp_addextendedproperty 'MS_Description', N'流程定义ID', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN',
     'definition_id'
go
exec sp_addextendedproperty 'MS_Description', N'流程KEY', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_definition', 'COLUMN',
exec sp_addextendedproperty 'MS_Description', N'流程KEY', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN',
     'process_key'
go
exec sp_addextendedproperty 'MS_Description', N'租户编号', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_definition', 'COLUMN',
exec sp_addextendedproperty 'MS_Description', N'租户编号', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN',
     'tenant_id'
go
exec sp_addextendedproperty 'MS_Description', N'创建部门', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_definition', 'COLUMN',
exec sp_addextendedproperty 'MS_Description', N'创建部门', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN',
     'create_dept'
go
exec sp_addextendedproperty 'MS_Description', N'创建者', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_definition', 'COLUMN', 'create_by'
exec sp_addextendedproperty 'MS_Description', N'创建者', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN', 'create_by'
go
exec sp_addextendedproperty 'MS_Description', N'创建时间', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_definition', 'COLUMN',
exec sp_addextendedproperty 'MS_Description', N'创建时间', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN',
     'create_time'
go
exec sp_addextendedproperty 'MS_Description', N'更新者', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_definition', 'COLUMN', 'update_by'
exec sp_addextendedproperty 'MS_Description', N'更新者', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN', 'update_by'
go
exec sp_addextendedproperty 'MS_Description', N'更新时间', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_definition', 'COLUMN',
exec sp_addextendedproperty 'MS_Description', N'更新时间', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN',
     'update_time'
go