gssong
2024-03-21 6f5a368c86c3818b968ad1055f5215f86c989084
add 添加流程表单配置
已添加8个文件
已修改9个文件
524 ■■■■■ 文件已修改
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormDefinitionController.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormDefinition.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormDefinitionBo.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessDefinitionVo.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormDefinitionVo.java 59 ●●●●● 补丁 | 查看 | 原始文档 | 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/service/IWfFormDefinitionService.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java 4 ●●● 补丁 | 查看 | 原始文档 | 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/utils/WorkflowUtils.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormDefinitionMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
script/sql/flowable.sql 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java
@@ -76,6 +76,11 @@
    String PROCESS_INSTANCE_VO = "processInstanceVo";
    /**
     * æµç¨‹è¡¨å•配置对象
     */
    String WF_FORM_DEFINITION_VO = "wfFormDefinitionVo";
    /**
     * æµç¨‹å‘起人
     */
    String INITIATOR = "initiator";
@@ -91,6 +96,11 @@
    String BUSINESS_KEY = "businessKey";
    /**
     * æµç¨‹å®šä¹‰id
     */
    String PROCESS_DEFINITION_ID = "processDefinitionId";
    /**
     * å¼€å¯è·³è¿‡è¡¨è¾¾å¼å˜é‡
     */
    String FLOWABLE_SKIP_EXPRESSION_ENABLED = "_FLOWABLE_SKIP_EXPRESSION_ENABLED";
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormDefinitionController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
package org.dromara.workflow.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.validation.constraints.*;
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.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;
/**
 * è¡¨å•配置
 *
 * @author gssong
 * @date 2024-03-18
 */
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/workflow/formDefinition")
public class WfFormDefinitionController extends BaseController {
    private final IWfFormDefinitionService wfFormDefinitionService;
    /**
     * èŽ·å–è¡¨å•é…ç½®è¯¦ç»†ä¿¡æ¯
     *
     * @param definitionId ä¸»é”®
     */
    @GetMapping("/getByDefId/{definitionId}")
    public R<WfFormDefinitionVo> getByDefId(@NotBlank(message = "流程定义ID不能为空")
                                            @PathVariable String definitionId) {
        return R.ok(wfFormDefinitionService.getByDefId(definitionId));
    }
    /**
     * æ–°å¢žè¡¨å•配置
     */
    @Log(title = "表单配置", businessType = BusinessType.INSERT)
    @RepeatSubmit()
    @PostMapping("/saveOrUpdate")
    public R<Void> saveOrUpdate(@Validated(AddGroup.class) @RequestBody WfFormDefinitionBo bo) {
        return toAjax(wfFormDefinitionService.saveOrUpdate(bo));
    }
    /**
     * åˆ é™¤è¡¨å•配置
     *
     * @param ids ä¸»é”®ä¸²
     */
    @Log(title = "表单配置", businessType = BusinessType.DELETE)
    @DeleteMapping("/{ids}")
    public R<Void> remove(@NotEmpty(message = "主键不能为空")
                          @PathVariable Long[] ids) {
        return toAjax(wfFormDefinitionService.deleteByIds(List.of(ids)));
    }
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormDefinition.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
package org.dromara.workflow.domain;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
 * è¡¨å•配置对象 wf_form_definition
 *
 * @author gssong
 * @date 2024-03-18
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("wf_form_definition")
public class WfFormDefinition extends BaseEntity {
    @Serial
    private static final long serialVersionUID = 1L;
    /**
     * ä¸»é”®
     */
    @TableId(value = "id")
    private Long id;
    /**
     * è·¯ç”±åœ°å€
     */
    private String path;
    /**
     * æµç¨‹å®šä¹‰ID
     */
    private String definitionId;
    /**
     * æµç¨‹KEY
     */
    private String processKey;
    /**
     * å¤‡æ³¨
     */
    private String remark;
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormDefinitionBo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,53 @@
package org.dromara.workflow.domain.bo;
import org.dromara.workflow.domain.WfFormDefinition;
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_definition
 *
 * @author gssong
 * @date 2024-03-18
 */
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = WfFormDefinition.class, reverseConvertGenerate = false)
public class WfFormDefinitionBo extends BaseEntity {
    /**
     * ä¸»é”®
     */
    @NotNull(message = "主键不能为空", groups = {EditGroup.class})
    private Long id;
    /**
     * è·¯ç”±åœ°å€
     */
    @NotBlank(message = "路由地址不能为空", groups = {AddGroup.class})
    private String path;
    /**
     * æµç¨‹å®šä¹‰ID
     */
    @NotBlank(message = "流程定义ID不能为空", groups = {AddGroup.class})
    private String definitionId;
    /**
     * æµç¨‹KEY
     */
    @NotBlank(message = "流程KEY不能为空", groups = {AddGroup.class})
    private String processKey;
    /**
     * å¤‡æ³¨
     */
    private String remark;
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessDefinitionVo.java
@@ -62,4 +62,9 @@
     */
    private Date deploymentTime;
    /**
     * è¡¨å•配置
     */
    private WfFormDefinitionVo wfFormDefinitionVo;
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java
@@ -150,4 +150,14 @@
     * æ˜¯å¦ä¼šç­¾
     */
    private Boolean multiInstance;
    /**
     * ä¸šåŠ¡id
     */
    private String businessKey;
    /**
     * è¡¨å•配置
     */
    private WfFormDefinitionVo wfFormDefinitionVo;
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormDefinitionVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,59 @@
package org.dromara.workflow.domain.vo;
import org.dromara.workflow.domain.WfFormDefinition;
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_definition
 *
 * @author gssong
 * @date 2024-03-18
 */
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = WfFormDefinition.class)
public class WfFormDefinitionVo implements Serializable {
    @Serial
    private static final long serialVersionUID = 1L;
    /**
     * ä¸»é”®
     */
    @ExcelProperty(value = "主键")
    private Long id;
    /**
     * è·¯ç”±åœ°å€
     */
    @ExcelProperty(value = "路由地址")
    private String path;
    /**
     * æµç¨‹å®šä¹‰ID
     */
    @ExcelProperty(value = "流程定义ID")
    private String definitionId;
    /**
     * æµç¨‹KEY
     */
    @ExcelProperty(value = "流程KEY")
    private String processKey;
    /**
     * å¤‡æ³¨
     */
    @ExcelProperty(value = "备注")
    private String remark;
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormDefinitionMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package org.dromara.workflow.mapper;
import org.dromara.workflow.domain.WfFormDefinition;
import org.dromara.workflow.domain.vo.WfFormDefinitionVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
 * è¡¨å•配置Mapper接口
 *
 * @author gssong
 * @date 2024-03-18
 */
public interface WfFormDefinitionMapper extends BaseMapperPlus<WfFormDefinition, WfFormDefinitionVo> {
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormDefinitionService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
package org.dromara.workflow.service;
import org.dromara.workflow.domain.vo.WfFormDefinitionVo;
import org.dromara.workflow.domain.bo.WfFormDefinitionBo;
import java.util.Collection;
import java.util.List;
/**
 * è¡¨å•配置Service接口
 *
 * @author gssong
 * @date 2024-03-18
 */
public interface IWfFormDefinitionService {
    /**
     * æŸ¥è¯¢è¡¨å•配置
     *
     * @param definitionId æµç¨‹å®šä¹‰id
     * @return ç»“æžœ
     */
    WfFormDefinitionVo getByDefId(String definitionId);
    /**
     * æŸ¥è¯¢è¡¨å•配置列表
     *
     * @param definitionIds æµç¨‹å®šä¹‰id
     * @return ç»“æžœ
     */
    List<WfFormDefinitionVo> queryList(List<String> definitionIds);
    /**
     * æ–°å¢žè¡¨å•配置
     *
     * @param bo å‚æ•°
     * @return ç»“æžœ
     */
    Boolean saveOrUpdate(WfFormDefinitionBo bo);
    /**
     * åˆ é™¤
     *
     * @param ids id
     * @return ç»“æžœ
     */
    Boolean deleteByIds(Collection<Long> ids);
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java
@@ -20,8 +20,10 @@
import org.dromara.workflow.domain.WfCategory;
import org.dromara.workflow.domain.bo.ProcessDefinitionBo;
import org.dromara.workflow.domain.vo.ProcessDefinitionVo;
import org.dromara.workflow.domain.vo.WfFormDefinitionVo;
import org.dromara.workflow.service.IActProcessDefinitionService;
import org.dromara.workflow.service.IWfCategoryService;
import org.dromara.workflow.service.IWfFormDefinitionService;
import org.dromara.workflow.utils.QueryUtils;
import org.flowable.engine.ProcessMigrationService;
import org.flowable.engine.RepositoryService;
@@ -37,7 +39,6 @@
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
@@ -53,6 +54,7 @@
    private final RepositoryService repositoryService;
    private final ProcessMigrationService processMigrationService;
    private final IWfCategoryService wfCategoryService;
    private final IWfFormDefinitionService iWfFormDefinitionService;
    /**
     * åˆ†é¡µæŸ¥è¯¢
@@ -81,15 +83,22 @@
            List<String> deploymentIds = StreamUtils.toList(definitionList, ProcessDefinition::getDeploymentId);
            deploymentList = QueryUtils.deploymentQuery(deploymentIds).list();
        }
        for (ProcessDefinition processDefinition : definitionList) {
            ProcessDefinitionVo processDefinitionVo = BeanUtil.toBean(processDefinition, ProcessDefinitionVo.class);
            if (CollUtil.isNotEmpty(deploymentList)) {
                // éƒ¨ç½²æ—¶é—´
                deploymentList.stream().filter(e -> e.getId().equals(processDefinition.getDeploymentId())).findFirst().ifPresent(e -> {
                    processDefinitionVo.setDeploymentTime(e.getDeploymentTime());
                });
        if (CollUtil.isNotEmpty(definitionList)) {
            List<String> ids = StreamUtils.toList(definitionList, ProcessDefinition::getId);
            List<WfFormDefinitionVo> wfFormDefinitionVos = iWfFormDefinitionService.queryList(ids);
            for (ProcessDefinition processDefinition : definitionList) {
                ProcessDefinitionVo processDefinitionVo = BeanUtil.toBean(processDefinition, ProcessDefinitionVo.class);
                if (CollUtil.isNotEmpty(deploymentList)) {
                    // éƒ¨ç½²æ—¶é—´
                    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);
                }
                processDefinitionVoList.add(processDefinitionVo);
            }
            processDefinitionVoList.add(processDefinitionVo);
        }
        // æ€»è®°å½•æ•°
        long total = query.count();
@@ -109,18 +118,25 @@
        List<ProcessDefinition> definitionList = query.processDefinitionKey(key).list();
        List<Deployment> deploymentList = null;
        if (CollUtil.isNotEmpty(definitionList)) {
            List<String> deploymentIds = definitionList.stream().map(ProcessDefinition::getDeploymentId).collect(Collectors.toList());
            List<String> deploymentIds = StreamUtils.toList(definitionList, ProcessDefinition::getDeploymentId);
            deploymentList = QueryUtils.deploymentQuery(deploymentIds).list();
        }
        for (ProcessDefinition processDefinition : definitionList) {
            ProcessDefinitionVo processDefinitionVo = BeanUtil.toBean(processDefinition, ProcessDefinitionVo.class);
            if (CollUtil.isNotEmpty(deploymentList)) {
                // éƒ¨ç½²æ—¶é—´
                deploymentList.stream().filter(e -> e.getId().equals(processDefinition.getDeploymentId())).findFirst().ifPresent(e -> {
                    processDefinitionVo.setDeploymentTime(e.getDeploymentTime());
                });
        if (CollUtil.isNotEmpty(definitionList)) {
            List<String> ids = StreamUtils.toList(definitionList, ProcessDefinition::getId);
            List<WfFormDefinitionVo> wfFormDefinitionVos = iWfFormDefinitionService.queryList(ids);
            for (ProcessDefinition processDefinition : definitionList) {
                ProcessDefinitionVo processDefinitionVo = BeanUtil.toBean(processDefinition, ProcessDefinitionVo.class);
                if (CollUtil.isNotEmpty(deploymentList)) {
                    // éƒ¨ç½²æ—¶é—´
                    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);
                    }
                }
                processDefinitionVoList.add(processDefinitionVo);
            }
            processDefinitionVoList.add(processDefinitionVo);
        }
        return CollectionUtil.reverse(processDefinitionVoList);
    }
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java
@@ -264,10 +264,14 @@
        Page<TaskVo> page = actTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper);
        List<TaskVo> taskList = page.getRecords();
        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(taskList)) {
            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);
            }
            List<String> processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId);
            WorkflowUtils.setWfFormDefinitionVo(taskList, processDefinitionIds, PROCESS_DEFINITION_ID);
        }
        return new TableDataInfo<>(taskList, page.getTotal());
    }
@@ -345,8 +349,12 @@
        Page<TaskVo> page = actTaskMapper.getTaskFinishByPage(pageQuery.build(), queryWrapper);
        List<TaskVo> taskList = page.getRecords();
        for (TaskVo task : taskList) {
            task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus()));
        if (CollUtil.isNotEmpty(taskList)) {
            for (TaskVo task : taskList) {
                task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus()));
            }
            List<String> processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId);
            WorkflowUtils.setWfFormDefinitionVo(taskList, processDefinitionIds, PROCESS_DEFINITION_ID);
        }
        return new TableDataInfo<>(taskList, page.getTotal());
    }
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java
@@ -42,7 +42,9 @@
     */
    @Override
    public TestLeaveVo queryById(Long id) {
        return baseMapper.selectVoById(id);
        TestLeaveVo testLeaveVo = baseMapper.selectVoById(id);
        WorkflowUtils.setProcessInstanceVo(testLeaveVo,String.valueOf(id));
        return testLeaveVo;
    }
    /**
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormDefinitionServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
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.springframework.stereotype.Service;
import org.dromara.workflow.domain.bo.WfFormDefinitionBo;
import org.dromara.workflow.domain.vo.WfFormDefinitionVo;
import org.dromara.workflow.domain.WfFormDefinition;
import org.dromara.workflow.mapper.WfFormDefinitionMapper;
import org.dromara.workflow.service.IWfFormDefinitionService;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Collection;
/**
 * è¡¨å•配置Service业务层处理
 *
 * @author gssong
 * @date 2024-03-18
 */
@RequiredArgsConstructor
@Service
public class WfFormDefinitionServiceImpl implements IWfFormDefinitionService {
    private final WfFormDefinitionMapper baseMapper;
    /**
     * æŸ¥è¯¢è¡¨å•配置
     */
    @Override
    public WfFormDefinitionVo getByDefId(String definitionId) {
        return baseMapper.selectVoOne(new LambdaQueryWrapper<WfFormDefinition>().eq(WfFormDefinition::getDefinitionId, definitionId));
    }
    /**
     * æŸ¥è¯¢è¡¨å•配置列表
     */
    @Override
    public List<WfFormDefinitionVo> queryList(List<String> definitionIds) {
        return baseMapper.selectVoList(new LambdaQueryWrapper<WfFormDefinition>().in(WfFormDefinition::getDefinitionId, definitionIds));
    }
    /**
     * æ–°å¢žè¡¨å•配置
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean saveOrUpdate(WfFormDefinitionBo bo) {
        WfFormDefinition add = MapstructUtils.convert(bo, WfFormDefinition.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;
    }
}
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java
@@ -26,9 +26,11 @@
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.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.flowable.bpmn.model.BpmnModel;
import org.flowable.bpmn.model.FlowNode;
@@ -45,6 +47,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;
/**
 * å·¥ä½œæµå·¥å…·
@@ -58,6 +61,7 @@
    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);
    /**
     * åˆ›å»ºä¸€ä¸ªæ–°ä»»åŠ¡
@@ -241,7 +245,7 @@
     * @param businessKey ä¸šåŠ¡id
     */
    public static void setProcessInstanceVo(Object obj, String businessKey) {
        if (StringUtils.isBlank(businessKey)) {
        if (StringUtils.isBlank(businessKey) || obj == null) {
            return;
        }
        ActHiProcinst actHiProcinst = ACT_HI_PROCINST_SERVICE.selectByBusinessKey(businessKey);
@@ -264,7 +268,7 @@
     * @param fieldName ä¸»é”®å±žæ€§åç§°
     */
    public static void setProcessInstanceListVo(Object obj, List<String> idList, String fieldName) {
        if (CollUtil.isEmpty(idList)) {
        if (CollUtil.isEmpty(idList) || obj == null) {
            return;
        }
        List<ActHiProcinst> actHiProcinstList = ACT_HI_PROCINST_SERVICE.selectByBusinessKeyIn(idList);
@@ -294,6 +298,31 @@
    }
    /**
     * è®¾ç½®æµç¨‹è¡¨å•配置
     *
     * @param obj       ä¸šåŠ¡å¯¹è±¡
     * @param idList    æµç¨‹å®šä¹‰id
     * @param fieldName æµç¨‹å®šä¹‰ID属性名称
     */
    public static void setWfFormDefinitionVo(Object obj, List<String> idList, String fieldName) {
        if (CollUtil.isEmpty(idList) || obj == null) {
            return;
        }
        List<WfFormDefinitionVo> wfFormDefinitionVoList = I_WF_FORM_DEFINITION_SERVICE.queryList(idList);
        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));
                    });
                }
            }
        }
    }
    /**
     * å‘送消息
     *
     * @param list        ä»»åŠ¡
ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml
@@ -27,12 +27,14 @@
        <result property="businessStatus" column="BUSINESS_STATUS_"/>
        <result property="processDefinitionName" column="processDefinitionName"/>
        <result property="processDefinitionKey" column="processDefinitionName"/>
        <result property="businessKey" column="BUSINESS_KEY_"/>
    </resultMap>
    <select id="getTaskWaitByPage" resultMap="TaskVoResult">
        select *
        from (SELECT RES.*,
                     AHP.BUSINESS_STATUS_,
                     AHP.BUSINESS_KEY_,
                     ARP.NAME_ AS processDefinitionName,
                     ARP.KEY_  AS processDefinitionKey
              FROM ACT_RU_TASK RES
@@ -46,6 +48,7 @@
        select *
        from (SELECT HTI.*,
                     AHP.BUSINESS_STATUS_,
                     AHP.BUSINESS_KEY_,
                     ARP.NAME_ AS processDefinitionName,
                     ARP.KEY_  AS processDefinitionKey
              FROM ACT_HI_TASKINST HTI
@@ -59,6 +62,7 @@
        select *
        from (SELECT AHT.*,
                     AHP.BUSINESS_STATUS_,
                     AHP.BUSINESS_KEY_,
                     ARP.NAME_ as processDefinitionName,
                     ARP.KEY_  as processDefinitionKey
              FROM ACT_HI_TASKINST AHT
ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormDefinitionMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
<?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="org.dromara.workflow.mapper.WfFormDefinitionMapper">
</mapper>
script/sql/flowable.sql
@@ -78,6 +78,26 @@
)
    comment '节点审批记录';
create table wf_form_definition
(
    id            bigint                        not null comment '主键'
        primary key,
    path          varchar(200) default ''       not null comment '路由地址',
    definition_id varchar(255)                  not null comment '流程定义ID',
    process_key   varchar(255)                  not null comment '流程KEY',
    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 '更新时间',
    remark        varchar(500) default ''       null comment '备注',
    tenant_id     varchar(20)  default '000000' null comment '租户编号',
    constraint uni_definition_id
        unique (definition_id)
)
    comment '表单配置';
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'demo:leave:list', '#', 103, 1, sysdate(), NULL, NULL, '请假申请菜单');
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11639, '请假申请查询', 11638, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:query', '#', 103, 1, sysdate(), NULL, NULL, '');