| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- <?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="com.qqflow.engine.domain.flow.mapper.AnalysisMapper">
- <resultMap id="ProcessEfficiencyResultMap" type="com.qqflow.engine.domain.flow.dto.analysis.ProcessEfficiencyDTO">
- <id column="process_definition_id" property="processDefinitionId"/>
- <result column="process_name" property="processName"/>
- <result column="instance_count" property="instanceCount"/>
- <result column="avg_duration_minutes" property="avgDurationMinutes"/>
- <result column="max_duration_minutes" property="maxDurationMinutes"/>
- <result column="min_duration_minutes" property="minDurationMinutes"/>
- </resultMap>
- <resultMap id="NodeStayStatResultMap" type="com.qqflow.engine.domain.flow.dto.analysis.NodeStayStatDTO">
- <id column="node_id" property="nodeId"/>
- <result column="node_name" property="nodeName"/>
- <result column="process_definition_id" property="processDefinitionId"/>
- <result column="process_name" property="processName"/>
- <result column="task_count" property="taskCount"/>
- <result column="avg_stay_minutes" property="avgStayMinutes"/>
- <result column="max_stay_minutes" property="maxStayMinutes"/>
- </resultMap>
- <resultMap id="StuckInstanceResultMap" type="com.qqflow.engine.domain.flow.dto.analysis.StuckInstanceDTO">
- <id column="instance_id" property="instanceId"/>
- <result column="instance_no" property="instanceNo"/>
- <result column="title" property="title"/>
- <result column="process_definition_id" property="processDefinitionId"/>
- <result column="process_name" property="processName"/>
- <result column="applicant_id" property="applicantId"/>
- <result column="applicant_name" property="applicantName"/>
- <result column="node_id" property="nodeId"/>
- <result column="node_name" property="nodeName"/>
- <result column="task_create_time" property="taskCreateTime"/>
- <result column="stay_minutes" property="stayMinutes"/>
- </resultMap>
- <!-- 已完成流程效率统计(H2 / MySQL 通用) -->
- <select id="selectCompletedEfficiency" resultMap="ProcessEfficiencyResultMap">
- SELECT
- pd.id AS process_definition_id,
- pd.process_name AS process_name,
- COUNT(pi.id) AS instance_count,
- ROUND(AVG(TIMESTAMPDIFF(MINUTE, pi.start_time, pi.end_time))) AS avg_duration_minutes,
- MAX(TIMESTAMPDIFF(MINUTE, pi.start_time, pi.end_time)) AS max_duration_minutes,
- MIN(TIMESTAMPDIFF(MINUTE, pi.start_time, pi.end_time)) AS min_duration_minutes
- FROM bpm_process_instance pi
- INNER JOIN bpm_process_definition pd ON pi.process_definition_id = pd.id
- WHERE pi.deleted = 0
- AND pi.status = 5
- AND pi.end_time IS NOT NULL
- <if test="processDefinitionId != null">
- AND pi.process_definition_id = #{processDefinitionId}
- </if>
- <if test="startTime != null">
- AND pi.end_time >= #{startTime}
- </if>
- <if test="endTime != null">
- AND pi.end_time <= #{endTime}
- </if>
- GROUP BY pd.id, pd.process_name
- ORDER BY avg_duration_minutes DESC
- LIMIT 20
- </select>
- <!-- 进行中流程节点停留统计 -->
- <select id="selectInProgressByNode" resultMap="NodeStayStatResultMap">
- SELECT
- t.node_id AS node_id,
- t.node_name AS node_name,
- pi.process_definition_id AS process_definition_id,
- pd.process_name AS process_name,
- COUNT(t.id) AS task_count,
- ROUND(AVG(TIMESTAMPDIFF(MINUTE, t.create_time, NOW()))) AS avg_stay_minutes,
- MAX(TIMESTAMPDIFF(MINUTE, t.create_time, NOW())) AS max_stay_minutes
- FROM bpm_approval_task t
- INNER JOIN bpm_process_instance pi ON t.instance_id = pi.id
- LEFT JOIN bpm_process_definition pd ON pi.process_definition_id = pd.id
- WHERE t.deleted = 0
- AND t.task_status = 0
- AND t.node_type != 'cc'
- AND pi.deleted = 0
- AND pi.status IN (0, 1, 4)
- <if test="processDefinitionId != null">
- AND pi.process_definition_id = #{processDefinitionId}
- </if>
- GROUP BY t.node_id, t.node_name, pi.process_definition_id, pd.process_name
- ORDER BY avg_stay_minutes DESC
- LIMIT 20
- </select>
- <!-- 卡住流程实例数量 -->
- <select id="countStuckInstances" resultType="java.lang.Long">
- SELECT COUNT(*)
- FROM bpm_approval_task t
- INNER JOIN bpm_process_instance pi ON t.instance_id = pi.id
- LEFT JOIN bpm_process_definition pd ON pi.process_definition_id = pd.id
- WHERE t.deleted = 0
- AND t.task_status = 0
- AND t.node_type != 'cc'
- AND pi.deleted = 0
- AND pi.status IN (0, 1, 4)
- <if test="nodeId != null and nodeId != ''">
- AND t.node_id = #{nodeId}
- </if>
- <if test="processDefinitionId != null">
- AND pi.process_definition_id = #{processDefinitionId}
- </if>
- <if test="minStayMinutes != null">
- AND TIMESTAMPDIFF(MINUTE, t.create_time, NOW()) >= #{minStayMinutes}
- </if>
- </select>
- <!-- 卡住流程实例明细 -->
- <select id="selectStuckInstances" resultMap="StuckInstanceResultMap">
- SELECT
- pi.id AS instance_id,
- pi.instance_no AS instance_no,
- pi.title AS title,
- pi.process_definition_id AS process_definition_id,
- pd.process_name AS process_name,
- pi.applicant_id AS applicant_id,
- su.real_name AS applicant_name,
- t.node_id AS node_id,
- t.node_name AS node_name,
- t.create_time AS task_create_time,
- TIMESTAMPDIFF(MINUTE, t.create_time, NOW()) AS stay_minutes
- FROM bpm_approval_task t
- INNER JOIN bpm_process_instance pi ON t.instance_id = pi.id
- LEFT JOIN bpm_process_definition pd ON pi.process_definition_id = pd.id
- LEFT JOIN sys_user su ON pi.applicant_id = su.id
- WHERE t.deleted = 0
- AND t.task_status = 0
- AND t.node_type != 'cc'
- AND pi.deleted = 0
- AND pi.status IN (0, 1, 4)
- <if test="nodeId != null and nodeId != ''">
- AND t.node_id = #{nodeId}
- </if>
- <if test="processDefinitionId != null">
- AND pi.process_definition_id = #{processDefinitionId}
- </if>
- <if test="minStayMinutes != null">
- AND TIMESTAMPDIFF(MINUTE, t.create_time, NOW()) >= #{minStayMinutes}
- </if>
- ORDER BY stay_minutes DESC
- LIMIT #{pageSize} OFFSET #{offset}
- </select>
- <!-- 流程实例概览统计 -->
- <select id="selectInstanceOverview" resultType="com.qqflow.engine.domain.flow.dto.analysis.AnalysisOverviewDTO">
- SELECT
- COUNT(id) AS total_instances,
- SUM(CASE WHEN status = 5 THEN 1 ELSE 0 END) AS completed_count,
- SUM(CASE WHEN status IN (0, 1, 4) THEN 1 ELSE 0 END) AS running_count,
- SUM(CASE WHEN status = 3 THEN 1 ELSE 0 END) AS rejected_count,
- SUM(CASE WHEN status = 6 THEN 1 ELSE 0 END) AS revoked_count,
- IFNULL(ROUND(AVG(CASE WHEN status = 5 THEN TIMESTAMPDIFF(MINUTE, start_time, end_time) END)), 0) AS avg_duration_minutes
- FROM bpm_process_instance
- WHERE deleted = 0
- <if test="startTime != null">
- AND start_time >= #{startTime}
- </if>
- <if test="endTime != null">
- AND start_time <= #{endTime}
- </if>
- <if test="processDefinitionId != null">
- AND process_definition_id = #{processDefinitionId}
- </if>
- </select>
- <!-- 超时任务数 -->
- <select id="countTimeoutTasks" resultType="java.lang.Long">
- SELECT COUNT(t.id)
- FROM bpm_approval_task t
- INNER JOIN bpm_process_instance pi ON t.instance_id = pi.id
- WHERE t.deleted = 0
- AND t.task_status = 0
- AND t.timeout_time IS NOT NULL
- AND t.timeout_time < NOW()
- AND pi.deleted = 0
- AND pi.status IN (0, 1, 4)
- <if test="processDefinitionId != null">
- AND pi.process_definition_id = #{processDefinitionId}
- </if>
- </select>
- <!-- 流程状态分布 -->
- <select id="selectStatusDistribution" resultType="com.qqflow.engine.domain.flow.dto.analysis.StatusDistributionDTO">
- SELECT
- status,
- COUNT(*) AS count
- FROM bpm_process_instance
- WHERE deleted = 0
- <if test="startTime != null">
- AND start_time >= #{startTime}
- </if>
- <if test="endTime != null">
- AND start_time <= #{endTime}
- </if>
- <if test="processDefinitionId != null">
- AND process_definition_id = #{processDefinitionId}
- </if>
- GROUP BY status
- ORDER BY status
- </select>
- <!-- 近30天流程趋势 -->
- <select id="selectTrend" resultType="com.qqflow.engine.domain.flow.dto.analysis.TrendDTO">
- SELECT
- CAST(DATE(start_time) AS CHAR) AS date,
- COUNT(*) AS started_count,
- SUM(CASE WHEN status = 5 THEN 1 ELSE 0 END) AS completed_count,
- SUM(CASE WHEN status = 3 THEN 1 ELSE 0 END) AS rejected_count
- FROM bpm_process_instance
- WHERE deleted = 0
- AND DATE(start_time) BETWEEN #{startDate} AND #{endDate}
- <if test="processDefinitionId != null">
- AND process_definition_id = #{processDefinitionId}
- </if>
- GROUP BY CAST(DATE(start_time) AS CHAR)
- ORDER BY date
- </select>
- </mapper>
|