Appearance
createHistoricActivityInstanceQuery
Flowable 7.1.0 摘要:创建历史活动实例查询对象,用于查询流程执行过的所有活动节点历史。
方法签名与说明
HistoricActivityInstanceQuery createHistoricActivityInstanceQuery()
创建历史活动实例查询构建器。可以查询流程执行过的所有节点(用户任务、服务任务、网关等)的历史记录。
Returns:
- HistoricActivityInstanceQuery - 历史活动实例查询构建器
常见使用场景
1. 流程轨迹追踪
追踪流程实例经过了哪些节点,何时开始何时结束。
2. 流程耗时分析
分析各个节点的执行耗时,找出瓶颈环节。
3. 流程图高亮
在流程图上高亮显示已执行的节点和当前节点。
Kotlin + Spring Boot 调用示例
示例1:查询流程实例的执行轨迹
kotlin
import org.flowable.engine.HistoryService
import org.springframework.stereotype.Service
import java.util.Date
data class ActivityRecord(
val activityId: String,
val activityName: String,
val activityType: String,
val startTime: Date,
val endTime: Date?,
val durationInMillis: Long?
)
@Service
class ProcessTraceService(
private val historyService: HistoryService
) {
/**
* 查询流程执行轨迹
* 企业场景:流程详情页展示完整执行路径
*/
fun getProcessTrace(processInstanceId: String): List<ActivityRecord> {
val activities = historyService.createHistoricActivityInstanceQuery()
.processInstanceId(processInstanceId)
.orderByHistoricActivityInstanceStartTime()
.asc()
.list()
return activities.map { activity ->
ActivityRecord(
activityId = activity.activityId,
activityName = activity.activityName,
activityType = activity.activityType,
startTime = activity.startTime,
endTime = activity.endTime,
durationInMillis = activity.durationInMillis
)
}
}
}示例2:分析节点执行耗时
kotlin
import org.flowable.engine.HistoryService
import org.springframework.stereotype.Service
data class ActivityDurationStats(
val activityName: String,
val avgDurationMinutes: Double,
val maxDurationMinutes: Double,
val minDurationMinutes: Double,
val executionCount: Int
)
@Service
class ActivityDurationAnalyzer(
private val historyService: HistoryService
) {
/**
* 分析活动节点耗时
* 企业场景:流程优化,找出耗时最长的环节
*/
fun analyzeActivityDuration(
processDefinitionKey: String
): List<ActivityDurationStats> {
val activities = historyService.createHistoricActivityInstanceQuery()
.processDefinitionKey(processDefinitionKey)
.finished()
.list()
val groupedActivities = activities.groupBy { it.activityId }
return groupedActivities.map { (activityId, activityList) ->
val durations = activityList.mapNotNull { it.durationInMillis }
.map { it.toDouble() / (1000 * 60) } // 转换为分钟
ActivityDurationStats(
activityName = activityList.first().activityName,
avgDurationMinutes = if (durations.isNotEmpty()) durations.average() else 0.0,
maxDurationMinutes = durations.maxOrNull() ?: 0.0,
minDurationMinutes = durations.minOrNull() ?: 0.0,
executionCount = activityList.size
)
}.sortedByDescending { it.avgDurationMinutes }
}
}示例3:获取流程图高亮节点
kotlin
import org.flowable.engine.HistoryService
import org.springframework.stereotype.Service
@Service
class ProcessDiagramHighlightService(
private val historyService: HistoryService
) {
/**
* 获取流程图高亮节点
* 企业场景:流程监控页面,高亮显示已执行的节点
*/
fun getHighlightedActivities(processInstanceId: String): Map<String, List<String>> {
val activities = historyService.createHistoricActivityInstanceQuery()
.processInstanceId(processInstanceId)
.list()
val finishedActivities = activities
.filter { it.endTime != null }
.map { it.activityId }
.distinct()
val currentActivities = activities
.filter { it.endTime == null }
.map { it.activityId }
.distinct()
return mapOf(
"finished" to finishedActivities,
"current" to currentActivities
)
}
}示例4:REST API
kotlin
import org.flowable.engine.HistoryService
import org.springframework.web.bind.annotation.*
@RestController
@RequestMapping("/api/history/activities")
class HistoricActivityController(
private val historyService: HistoryService
) {
@GetMapping("/process-instance/{processInstanceId}")
fun getActivities(@PathVariable processInstanceId: String): List<Map<String, Any>> {
val activities = historyService.createHistoricActivityInstanceQuery()
.processInstanceId(processInstanceId)
.orderByHistoricActivityInstanceStartTime()
.asc()
.list()
return activities.map { activity ->
mapOf(
"activityId" to activity.activityId,
"activityName" to activity.activityName,
"activityType" to activity.activityType,
"startTime" to activity.startTime,
"endTime" to activity.endTime,
"duration" to activity.durationInMillis
)
}
}
}注意事项
1. 活动类型
- userTask:用户任务
- serviceTask:服务任务
- startEvent:开始事件
- endEvent:结束事件
- exclusiveGateway:排他网关
2. 性能优化
- 添加流程实例ID过滤,避免全表扫描
- 大数据量时考虑分页
3. 未完成的活动
- endTime为null表示活动正在执行中
- durationInMillis只有已完成的活动才有值
相关 API
HistoryService.createHistoricActivityInstanceQuery()- 查询活动历史HistoryService.createHistoricProcessInstanceQuery()- 查询流程历史HistoryService.createHistoricTaskInstanceQuery()- 查询任务历史
本文档说明
- 基于 Flowable 7.1.0 版本编写
- 所有示例均可直接在 Spring Boot + Kotlin 项目中使用