zxl
2025-03-21 c4ab6a24d2825f11a0de0f165667dc533c458a01
Merge remote-tracking branch 'origin/master'
13个文件已修改
1个文件已添加
192 ■■■■■ 已修改文件
business/src/main/java/com/ycl/controller/HiddenAdminController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/ProcessLogService.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/impl/ProcessLogServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/resources/mapper/ProjectInfoMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/cmd/RemoveDeploymentCacheCMD.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/controller/FlowDefinitionController.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/domain/dto/FlowSaveXmlVo.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/domain/dto/FlowViewerDto.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/domain/vo/FormDetailVO.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/mapper/FlowDeployMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/service/IFlowDefinitionService.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/service/impl/FlowDefinitionServiceImpl.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/resources/mapper/FlowDeployMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/controller/HiddenAdminController.java
@@ -82,7 +82,6 @@
    }
    @GetMapping("/list")
    @PreAuthorize("@ss.hasPermi('hiddenAdmin:list')")
    @ApiOperation(value = "列表", notes = "列表")
    public Result list() {
        return hiddenAdminService.all();
business/src/main/java/com/ycl/service/ProcessLogService.java
@@ -79,6 +79,24 @@
    Boolean taskIsHangup(String taskId, String processInsId);
    /**
     * 检查任务是否容缺
     *
     * @param taskId
     * @param processInsId
     * @return
     */
    Boolean taskIsWait(String taskId, String processInsId);
    /**
     * 检查任务是否跳过
     *
     * @param taskId
     * @param processInsId
     * @return
     */
    Boolean taskIsJump(String taskId, String processInsId);
    /**
     * 检查任务是否协同办理了
     *
     * @param taskId 任务id
business/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java
@@ -1336,6 +1336,8 @@
                if (StringUtils.isBlank(s.getDeleteReason())) {
                    flowViewerList.add(flowViewerDto);
                }
                flowViewerDto.setHasJump(processLogService.taskIsJump(s.getTaskId(), procInsId));
                flowViewerDto.setHasWait(processLogService.taskIsWait(s.getTaskId(), procInsId));
            });
            // 获取代办节点
@@ -1353,8 +1355,10 @@
                // 扩展内容 代办的通过当前时间作为endTime
                ProcessCoding processCoding = processCodingMap.get(s.getTaskId());
                //如果有监控数据 不反的话前端默认是进行中(蓝色)
                if (processCoding != null && (RED.equals(processCoding.getStatus()) || YELLOW.equals(processCoding.getStatus()))) {
                    flowViewerDto.setOvertime(processCoding.getStatus());
                if (Objects.nonNull(processCoding)) {
                    if (RED.equals(processCoding.getStatus()) || YELLOW.equals(processCoding.getStatus())) {
                        flowViewerDto.setOvertime(processCoding.getStatus());
                    }
                }
                flowViewerList.add(flowViewerDto);
            });
@@ -1402,6 +1406,7 @@
        Map<String, List<FormDetailVO>> map = new HashMap<>(2);
        beforeNodes.stream().forEach(node -> {
            if (node.getCurrent()) {
                node.setTaskId(taskId);
                dataList.add(node);
            } else {
                List<HistoricTaskInstance> beforeTasks = historyService.createHistoricTaskInstanceQuery()
@@ -1412,6 +1417,7 @@
                        .desc()
                        .list();
                if (CollectionUtils.isNotEmpty(beforeTasks) && Objects.nonNull(beforeTasks.get(0))) {
                    node.setTaskId(beforeTasks.get(0).getId());
                    List<FormDetailVO> l = map.get(beforeTasks.get(0));
                    if (CollectionUtils.isEmpty(l)) {
                        map.put(beforeTasks.get(0).getExecutionId(), Arrays.asList(node));
@@ -1435,7 +1441,7 @@
            }
            // 判断任务是否存在特殊操作(如跳过、转办等),需要在前端展示出来
            ProcessLogQuery query = new ProcessLogQuery();
            query.setTaskDefKey(node.getUserTask().getId());
            query.setTaskId(node.getTaskId());
            query.setProcessInsId(finalProcessInsId);
            Result result = processLogService.projectProcessLogPage(query);
            List<ProcessLogVO> logList = (List<ProcessLogVO>) result.get("data");
@@ -1479,6 +1485,7 @@
            Map<String, List<FormDetailVO>> map = new HashMap<>(2);
            beforeNodes.stream().forEach(node -> {
                if (node.getCurrent()) {
                    node.setTaskId(taskId);
                    dataList.add(node);
                } else {
                    List<HistoricTaskInstance> beforeTasks = historyService.createHistoricTaskInstanceQuery()
@@ -1489,6 +1496,7 @@
                            .desc()
                            .list();
                    if (CollectionUtils.isNotEmpty(beforeTasks) && Objects.nonNull(beforeTasks.get(0))) {
                        node.setTaskId(beforeTasks.get(0).getId());
                        List<FormDetailVO> l = map.get(beforeTasks.get(0));
                        if (CollectionUtils.isEmpty(l)) {
                            map.put(beforeTasks.get(0).getExecutionId(), Arrays.asList(node));
@@ -1512,7 +1520,7 @@
                }
                // 判断任务是否存在特殊操作(如跳过、转办等),需要在前端展示出来
                ProcessLogQuery query = new ProcessLogQuery();
                query.setTaskDefKey(node.getUserTask().getId());
                query.setTaskId(node.getTaskId());
                query.setProcessInsId(hisTask.getProcessInstanceId());
                Result result = processLogService.projectProcessLogPage(query);
                List<ProcessLogVO> logList = (List<ProcessLogVO>) result.get("data");
@@ -1548,6 +1556,7 @@
            Map<String, List<FormDetailVO>> map = new HashMap<>(2);
            beforeNodes.stream().forEach(node -> {
                if (node.getCurrent()) {
                    node.setTaskId(taskId);
                    dataList.add(node);
                } else {
                    List<HistoricTaskInstance> beforeTasks = historyService.createHistoricTaskInstanceQuery()
@@ -1558,6 +1567,7 @@
                            .desc()
                            .list();
                    if (CollectionUtils.isNotEmpty(beforeTasks) && Objects.nonNull(beforeTasks.get(0))) {
                        node.setTaskId(beforeTasks.get(0).getId());
                        List<FormDetailVO> l = map.get(beforeTasks.get(0));
                        if (CollectionUtils.isEmpty(l)) {
                            map.put(beforeTasks.get(0).getExecutionId(), Arrays.asList(node));
@@ -1581,7 +1591,7 @@
                }
                // 判断任务是否存在特殊操作(如跳过、转办等),需要在前端展示出来
                ProcessLogQuery query = new ProcessLogQuery();
                query.setTaskDefKey(node.getUserTask().getId());
                query.setTaskId(node.getTaskId());
                query.setProcessInsId(processInsId);
                Result result = processLogService.projectProcessLogPage(query);
                List<ProcessLogVO> logList = (List<ProcessLogVO>) result.get("data");
business/src/main/java/com/ycl/service/impl/ProcessLogServiceImpl.java
@@ -145,6 +145,26 @@
    }
    @Override
    public Boolean taskIsWait(String taskId, String processInsId) {
        List<ProcessLog> list = new LambdaQueryChainWrapper<>(baseMapper)
                .eq(ProcessLog::getProcessInsId, processInsId)
                .eq(ProcessLog::getTaskId, taskId)
                .list();
        return list.stream().anyMatch(log -> ProcessLogEventTypeEnum.WAIT.equals(log.getEventType()))
                && list.stream().filter(log -> ProcessLogEventTypeEnum.FINISHED.equals(log.getEventType())).count() < 1;
    }
    @Override
    public Boolean taskIsJump(String taskId, String processInsId) {
        List<ProcessLog> list = new LambdaQueryChainWrapper<>(baseMapper)
                .eq(ProcessLog::getProcessInsId, processInsId)
                .eq(ProcessLog::getTaskId, taskId)
                .eq(ProcessLog::getEventType, ProcessLogEventTypeEnum.JUMP)
                .list();
        return list.size() > 0;
    }
    @Override
    public Boolean taskIsTeamwork(String taskId, String processInsId) {
        ProcessLog log = new LambdaQueryChainWrapper<>(baseMapper)
                .eq(ProcessLog::getProcessInsId, processInsId)
business/src/main/resources/mapper/ProjectInfoMapper.xml
@@ -175,7 +175,7 @@
                ${query.params.dataScope}
            </if>
        </where>
        order by TPI.id DESC
        ORDER BY FIELD(TPI.used_status, 1, -1, 0, 2), TPI.gmt_create DESC
    </select>
    <select id="homeCount" parameterType="com.ycl.common.core.domain.BaseEntity" resultType="com.ycl.domain.vo.ProjectVO">
flowable/src/main/java/com/ycl/cmd/RemoveDeploymentCacheCMD.java
New file
@@ -0,0 +1,46 @@
package com.ycl.cmd;
import lombok.RequiredArgsConstructor;
import org.flowable.common.engine.impl.interceptor.Command;
import org.flowable.common.engine.impl.interceptor.CommandContext;
import org.flowable.common.engine.impl.persistence.deploy.DeploymentCache;
import org.flowable.engine.impl.persistence.deploy.DeploymentManager;
import org.flowable.engine.impl.persistence.deploy.ProcessDefinitionCacheEntry;
import org.flowable.engine.impl.util.CommandContextUtil;
import org.flowable.engine.repository.Deployment;
import org.springframework.util.StringUtils;
/**
 * @author:xp
 * @date:2025/3/17 14:54
 */
public class RemoveDeploymentCacheCMD implements Command<Deployment> {
    /**
     * 流程定义id
     */
    private String processDefId;
    public RemoveDeploymentCacheCMD(String processDefId) {
        this.processDefId = processDefId;
    }
    /**
     * 如果传入了流程定义id,那么只删除特定的缓存。没传就删除所有的缓存
     *
     * @param commandContext
     * @return
     */
    @Override
    public Deployment execute(CommandContext commandContext) {
        DeploymentManager deploymentManager = CommandContextUtil.getProcessEngineConfiguration().getDeploymentManager();
        DeploymentCache<ProcessDefinitionCacheEntry> deploymentCache = deploymentManager.getProcessDefinitionCache();
        if (StringUtils.hasText(processDefId)) {
            deploymentCache.remove(processDefId);
        } else {
            deploymentCache.clear();
        }
        return null;
    }
}
flowable/src/main/java/com/ycl/controller/FlowDefinitionController.java
@@ -152,6 +152,30 @@
        return AjaxResult.success("导入成功");
    }
    @ApiOperation(value = "修改原来部署的流程,不再以新版本部署")
    @Log(title = "修改原来部署的流程,不再以新版本部署", businessType = BusinessType.UPDATE)
    @PostMapping("/update")
    public AjaxResult update(@RequestBody FlowSaveXmlVo vo) {
        InputStream in = null;
        try {
            in = new ByteArrayInputStream(vo.getXml().getBytes(StandardCharsets.UTF_8));
            flowDefinitionService.updateProcess(vo.getDeploymentId(), vo.getName(), vo.getCategory(), in);
        } catch (Exception e) {
            log.error("导入失败:", e);
            return AjaxResult.error(e.getMessage());
        } finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (IOException e) {
                log.error("关闭输入流出错", e);
            }
        }
        return AjaxResult.success("导入成功");
    }
    @ApiOperation(value = "发起流程")
    @Log(title = "发起流程", businessType = BusinessType.INSERT)
    @PostMapping("/start/{procDefId}")
flowable/src/main/java/com/ycl/domain/dto/FlowSaveXmlVo.java
@@ -12,6 +12,11 @@
public class FlowSaveXmlVo implements Serializable {
    /**
     * 流程部署id,只有二次保存时才会有
     */
    private String deploymentId;
    /**
     * 流程名称
     */
    private String name;
flowable/src/main/java/com/ycl/domain/dto/FlowViewerDto.java
@@ -25,4 +25,14 @@
     * 项目超时颜色码 green/yellow/red
     */
    private String overtime;
    /**
     * 是否容缺了
     */
    private Boolean hasWait;
    /**
     * 是否跳过了
     */
    private Boolean hasJump;
}
flowable/src/main/java/com/ycl/domain/vo/FormDetailVO.java
@@ -69,4 +69,9 @@
     *
     */
    private UserTask userTask;
    /**
     * 任务的id
     */
    private String taskId;
}
flowable/src/main/java/com/ycl/mapper/FlowDeployMapper.java
@@ -39,4 +39,6 @@
     * @param query
     */
    IPage selectDeployListWithConfigPage(IPage<FlowProcDefWithConfigDto> page, @Param("query") ProcessConfigInfoQuery query);
    void updateProcess(@Param("bytes") Object bytes, @Param("deployId") String deployId);
}
flowable/src/main/java/com/ycl/service/IFlowDefinitionService.java
@@ -37,6 +37,17 @@
    void importFile(String name, String category, InputStream in);
    /**
     * 更新部署的流程,不再重新部署
     *
     * @param deploymentId
     * @param name
     * @param category
     * @param in
     */
    void updateProcess(String deploymentId, String name, String category, InputStream in);
    /**
     * 读取xml
     * @param deployId
     * @return
@@ -77,4 +88,6 @@
     * @return
     */
    InputStream readImage(String deployId);
}
flowable/src/main/java/com/ycl/service/impl/FlowDefinitionServiceImpl.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.ycl.cmd.RemoveDeploymentCacheCMD;
import com.ycl.common.constant.ProcessConstants;
import com.ycl.common.core.domain.AjaxResult;
import com.ycl.common.core.domain.entity.SysUser;
@@ -20,6 +21,7 @@
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.flowable.bpmn.model.BpmnModel;
import org.flowable.engine.ManagementService;
import org.flowable.engine.repository.Deployment;
import org.flowable.engine.repository.ProcessDefinition;
import org.flowable.engine.repository.ProcessDefinitionQuery;
@@ -28,6 +30,7 @@
import org.flowable.task.api.Task;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.io.IOException;
@@ -50,12 +53,10 @@
public class FlowDefinitionServiceImpl extends FlowServiceFactory implements IFlowDefinitionService {
    private final ISysDeployFormService sysDeployFormService;
    private final ISysUserService sysUserService;
    private final ISysDeptService sysDeptService;
    private final FlowDeployMapper flowDeployMapper;
    private final ManagementService managementService;
    private static final String BPMN_FILE_SUFFIX = ".bpmn";
@@ -135,6 +136,21 @@
    }
    @Override
    public void updateProcess(String deploymentId, String name, String category, InputStream in) {
        if (! StringUtils.hasText(deploymentId)) {
            throw new RuntimeException("该流程第一次部署,请直接选择保存按钮");
        }
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deploymentId).singleResult();
        if (Objects.isNull(processDefinition)) {
            throw new RuntimeException("流程定义不存在");
        }
        // 1.更新流程图数据
        flowDeployMapper.updateProcess(in, deploymentId);
        // 2.清除该流程的缓存,使其重新加载新的流程图
        managementService.executeCommand(new RemoveDeploymentCacheCMD(processDefinition.getId()));
    }
    /**
     * 读取xml
     *
flowable/src/main/resources/mapper/FlowDeployMapper.xml
@@ -82,4 +82,8 @@
        order by rd.deploy_time_ desc
    </select>
    <update id="updateProcess">
        UPDATE act_ge_bytearray SET BYTES_ = #{bytes, jdbcType=BLOB} WHERE DEPLOYMENT_ID_ = #{deployId} AND GENERATED_ = 0
    </update>
</mapper>