feat(oa): 优化项目进度统计逻辑并完善VO字段

- 移除XML中冗余的关联查询与计算逻辑
- 新增三个统计字段:totalCount、unFinishCount、delayCount
- 通过子查询方式实现更准确的进度统计
- 在Java实体类中添加对应的统计属性
- 修复OaProjectScheduleStepServiceImpl中的空指针判断逻辑
This commit is contained in:
2025-12-11 15:29:19 +08:00
parent 6bcbdf6bca
commit 1bbbba050c
4 changed files with 25 additions and 24 deletions

View File

@@ -27,13 +27,11 @@
ops.project_id,
ops.template_id,
ops.current_step,
opss.step_name AS currentStepName,
ops.start_time,
ops.end_time,
ops.status,
ops.steward,
ops.remark,
/* ======================== 项目信息 ==================== */
op.project_id AS opProjectId,
op.project_name,
@@ -51,31 +49,22 @@
op.project_code,
op.pre_pay,
op.is_top AS isTop,
opss.plan_end,
opss.header,
DATEDIFF(DATE(opss.plan_end), CURDATE()) AS remainTime,
ROUND(
(
(ops.current_step - CASE WHEN opss.status = 0 THEN 1 ELSE 0 END)
/ NULLIF(maxs.max_order, 0)
) * 100,
2
) AS schedulePercentage
(SELECT COUNT(*) FROM oa_project_schedule_step opss
WHERE opss.schedule_id = ops.schedule_id AND opss.del_flag = '0') AS totalCount,
(SELECT COUNT(*) FROM oa_project_schedule_step opss
WHERE opss.schedule_id = ops.schedule_id AND opss.del_flag = '0' AND opss.status IN (0,1)) AS unFinishCount,
(SELECT COUNT(*) FROM oa_project_schedule_step opss
WHERE opss.schedule_id = ops.schedule_id AND opss.del_flag = '0'
AND (
opss.use_flag = 0
OR (opss.original_end_time IS NOT NULL AND opss.end_time IS NOT NULL AND opss.end_time > opss.original_end_time)
OR (opss.status = 0 AND opss.original_end_time IS NOT NULL AND CURDATE() > DATE(opss.original_end_time))
)
) AS delayCount
FROM oa_project_schedule AS ops
LEFT JOIN sys_oa_project AS op
ON ops.project_id = op.project_id
LEFT JOIN oa_project_schedule_step AS opss
ON ops.schedule_id = opss.schedule_id
AND opss.step_order = ops.current_step
AND opss.use_flag = '1'
LEFT JOIN (SELECT schedule_id,
MAX(step_order) AS max_order
FROM oa_project_schedule_step
WHERE use_flag = '1'
GROUP BY schedule_id) AS maxs ON maxs.schedule_id = ops.schedule_id
${ew.getCustomSqlSegment}
</select>
</mapper>