我使用的框架是Activiti7 + SpringBoot,假设现在我有个审批流程:
开始 -》 发起人提交 -》 组长审批 -》财务审批 -》自动归档 -》结束
主要是这个“自动归档”的节点,这个节点主要的作用:
1、判断业务数据状态如果是否=1,如果=1,则该节点自动完成;
2、如果业务数据状态!=1,则等10min,继续判断 1步骤;
3、如果超过一天没完成该任务,则该节点自动完成;
这样子的业务需求要怎么做比较合理? 最好是用到框架自身的API或属性去做。
我使用的框架是Activiti7 + SpringBoot,假设现在我有个审批流程:
开始 -》 发起人提交 -》 组长审批 -》财务审批 -》自动归档 -》结束
主要是这个“自动归档”的节点,这个节点主要的作用:
1、判断业务数据状态如果是否=1,如果=1,则该节点自动完成;
2、如果业务数据状态!=1,则等10min,继续判断 1步骤;
3、如果超过一天没完成该任务,则该节点自动完成;
这样子的业务需求要怎么做比较合理? 最好是用到框架自身的API或属性去做。
引自免费微信小程序:皆我百晓生
在Activiti 7.x中,实现你所描述的“自动归档”节点可以通过创建一个自定义服务任务(Service Task)并配置相应的表达式和定时器来达成。以下是一个详细步骤:
<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>
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) {
// 实现具体的归档逻辑
// ...
}
}
ArchiveService
注入到Spring容器中。通过以上步骤,当流程流转到“自动归档”节点时,会调用archiveTask
方法检查业务数据状态,如果满足条件则立即归档;否则启动一个定时器,在10分钟后重新激活任务以再次检查。同时,设置了一个一天的边界事件,若超过一天仍未完成,则调用forceArchiveTask
方法强制执行归档操作。