feat(oa): 优化项目进度统计逻辑并完善VO字段
- 移除XML中冗余的关联查询与计算逻辑 - 新增三个统计字段:totalCount、unFinishCount、delayCount - 通过子查询方式实现更准确的进度统计 - 在Java实体类中添加对应的统计属性 - 修复OaProjectScheduleStepServiceImpl中的空指针判断逻辑
This commit is contained in:
@@ -95,4 +95,14 @@ public class OaProjectScheduleVo {
|
|||||||
|
|
||||||
//进度负责人
|
//进度负责人
|
||||||
private String steward;
|
private String steward;
|
||||||
|
|
||||||
|
|
||||||
|
//"总数量"
|
||||||
|
private Long totalCount;
|
||||||
|
|
||||||
|
//"未完成数量"
|
||||||
|
private Long unFinishCount;
|
||||||
|
|
||||||
|
//"延迟数量"
|
||||||
|
private Long delayCount;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ import com.ruoyi.oa.domain.vo.OaProjectScheduleVo;
|
|||||||
import com.ruoyi.common.core.mapper.BaseMapperPlus;
|
import com.ruoyi.common.core.mapper.BaseMapperPlus;
|
||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 项目进度Mapper接口
|
* 项目进度Mapper接口
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -191,7 +191,7 @@ public class OaProjectScheduleStepServiceImpl implements IOaProjectScheduleStepS
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 3. 处理结束时间逻辑(此时 original 一定非 null,可安全调用方法)
|
// 3. 处理结束时间逻辑(此时 original 一定非 null,可安全调用方法)
|
||||||
if (original.getEndTime() == null) {
|
if (original.getEndTime() == null && bo.getEndTime() != null) {
|
||||||
// 首次修改:设置结束时间和原始结束时间
|
// 首次修改:设置结束时间和原始结束时间
|
||||||
update.setEndTime(bo.getEndTime());
|
update.setEndTime(bo.getEndTime());
|
||||||
update.setOriginalEndTime(bo.getEndTime());
|
update.setOriginalEndTime(bo.getEndTime());
|
||||||
|
|||||||
@@ -27,13 +27,11 @@
|
|||||||
ops.project_id,
|
ops.project_id,
|
||||||
ops.template_id,
|
ops.template_id,
|
||||||
ops.current_step,
|
ops.current_step,
|
||||||
opss.step_name AS currentStepName,
|
|
||||||
ops.start_time,
|
ops.start_time,
|
||||||
ops.end_time,
|
ops.end_time,
|
||||||
ops.status,
|
ops.status,
|
||||||
ops.steward,
|
ops.steward,
|
||||||
ops.remark,
|
ops.remark,
|
||||||
|
|
||||||
/* ======================== 项目信息 ==================== */
|
/* ======================== 项目信息 ==================== */
|
||||||
op.project_id AS opProjectId,
|
op.project_id AS opProjectId,
|
||||||
op.project_name,
|
op.project_name,
|
||||||
@@ -51,31 +49,22 @@
|
|||||||
op.project_code,
|
op.project_code,
|
||||||
op.pre_pay,
|
op.pre_pay,
|
||||||
op.is_top AS isTop,
|
op.is_top AS isTop,
|
||||||
opss.plan_end,
|
(SELECT COUNT(*) FROM oa_project_schedule_step opss
|
||||||
opss.header,
|
WHERE opss.schedule_id = ops.schedule_id AND opss.del_flag = '0') AS totalCount,
|
||||||
DATEDIFF(DATE(opss.plan_end), CURDATE()) AS remainTime,
|
(SELECT COUNT(*) FROM oa_project_schedule_step opss
|
||||||
ROUND(
|
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
|
||||||
(ops.current_step - CASE WHEN opss.status = 0 THEN 1 ELSE 0 END)
|
WHERE opss.schedule_id = ops.schedule_id AND opss.del_flag = '0'
|
||||||
/ NULLIF(maxs.max_order, 0)
|
AND (
|
||||||
) * 100,
|
opss.use_flag = 0
|
||||||
2
|
OR (opss.original_end_time IS NOT NULL AND opss.end_time IS NOT NULL AND opss.end_time > opss.original_end_time)
|
||||||
) AS schedulePercentage
|
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
|
FROM oa_project_schedule AS ops
|
||||||
LEFT JOIN sys_oa_project AS op
|
LEFT JOIN sys_oa_project AS op
|
||||||
ON ops.project_id = op.project_id
|
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}
|
${ew.getCustomSqlSegment}
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
||||||
|
|||||||
Reference in New Issue
Block a user