是派小星呀 2024-03-08 18:15 采纳率: 65.1%
浏览 14
已结题

Activiti7如何设计归档节点?

我使用的框架是Activiti7 + SpringBoot,假设现在我有个审批流程:
开始 -》 发起人提交 -》 组长审批 -》财务审批 -》自动归档 -》结束

主要是这个“自动归档”的节点,这个节点主要的作用:
1、判断业务数据状态如果是否=1,如果=1,则该节点自动完成;
2、如果业务数据状态!=1,则等10min,继续判断 1步骤;
3、如果超过一天没完成该任务,则该节点自动完成;

这样子的业务需求要怎么做比较合理? 最好是用到框架自身的API或属性去做。

  • 写回答

22条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-08 18:15
    关注
    获得0.45元问题酬金

    引自免费微信小程序:皆我百晓生

    在Activiti 7.x中,实现你所描述的“自动归档”节点可以通过创建一个自定义服务任务(Service Task)并配置相应的表达式和定时器来达成。以下是一个详细步骤:

    1. 创建流程定义: 在你的流程定义XML文件中,设计流程如下:
    <process id="yourProcessId">
        <!-- 其他节点... -->
        <serviceTask id="archiveTask" name="自动归档" activiti:async="true" activiti:expression="${archiveService.archiveTask(execution)}"/>
        <boundaryEvent id="timerBoundary" attachedToRef="archiveTask">
            <timerEventDefinition>
                <timeDuration>PT24H</timeDuration> <!-- 设置一天后触发边界事件 -->
            </timerEventDefinition>
        </boundaryEvent>
        <sequenceFlow sourceRef="archiveTask" targetRef="endEvent" />
        <sequenceFlow sourceRef="timerBoundary" targetRef="archiveForceComplete" />
        
        <!-- 自动完成归档 -->
        <serviceTask id="archiveForceComplete" name="超时自动完成归档" activiti:async="true" activiti:expression="${archiveService.forceArchiveTask(execution)}"/>
        <sequenceFlow sourceRef="archiveForceComplete" targetRef="endEvent" />
        
        <endEvent id="endEvent" />
    </process>
    
    1. 编写业务逻辑服务类: 创建一个Spring Bean,例如ArchiveService,该类包含两个方法分别处理正常状态判断以及超时后的强制归档。
    @Service
    public class ArchiveService {
    
        @Autowired
        private YourBusinessDataService yourDataService;
    
        public void archiveTask(DelegateExecution execution) {
            // 获取业务数据ID或其他标识
            String businessDataId = (String) execution.getVariable("businessDataId");
    
            // 查询业务数据状态
            int status = yourDataService.getStatusById(businessDataId);
    
            if (status == 1) {
                // 状态为1时,执行归档操作,并结束当前任务
                doArchive(businessDataId);
                execution.setVariable("archiveCompleted", true);
                execution.signal();
            } else {
                // 状态不为1,挂起当前任务,并设置定时器重新激活任务
                Job job = execution.createTimerJob(new Date(new Date().getTime() + 10 * 60 * 1000)); // 10分钟后重新激活
                managementService.saveJob(job);
            }
        }
    
        public void forceArchiveTask(DelegateExecution execution) {
            // 当接收到边界事件时,强制执行归档
            String businessDataId = (String) execution.getVariable("businessDataId");
            doArchive(businessDataId);
            execution.setVariable("archiveCompleted", true);
            execution.signal();
        }
    
        private void doArchive(String businessDataId) {
            // 实现具体的归档逻辑
            // ...
        }
    }
    
    1. 配置与使用: 确保在Spring Boot项目中正确配置了Activiti流程引擎,并将上述ArchiveService注入到Spring容器中。

    通过以上步骤,当流程流转到“自动归档”节点时,会调用archiveTask方法检查业务数据状态,如果满足条件则立即归档;否则启动一个定时器,在10分钟后重新激活任务以再次检查。同时,设置了一个一天的边界事件,若超过一天仍未完成,则调用forceArchiveTask方法强制执行归档操作。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 3月16日
  • 创建了问题 3月8日

悬赏问题

  • ¥20 公众号如何实现点击超链接后自动发送文字
  • ¥15 用php隐藏类名和增加类名
  • ¥15 算法设计与分析课程的提问
  • ¥15 用MATLAB汇总拟合图
  • ¥15 智能除草机器人方案设计
  • ¥15 对接wps协作接口实现消息发送
  • ¥15 SQLite 出现“Database is locked” 如何解决?
  • ¥15 已经加了学校的隶属邮箱了,为什么还是进不去github education?😭
  • ¥15 求会做聚类,TCN的朋友有偿线上指导。以下是目前遇到的问题
  • ¥100 无网格伽辽金方法研究裂纹扩展的程序