fix(日志管理): 修复日志管理的一些问题。

fix(项目任务): 任务完成后需要依然能够修改工作日志,但是只能修改工作内容和上传附件;任务完成后,协办人的工作日志不应该能删除、所有任务里的成员不能新增工作日志。
This commit is contained in:
dk
2026-06-25 21:17:57 +08:00
parent 6d7e011b49
commit 69e9ea6b9f
6 changed files with 67 additions and 34 deletions

View File

@@ -184,8 +184,10 @@ public interface ErrorCodeConstants {
ErrorCode PROJECT_TASK_WORKLOG_DELETE_FORBIDDEN = new ErrorCode(1_008_006_006, "仅记录填报人或任务负责人可删除该工时记录");
ErrorCode PROJECT_TASK_WORKLOG_DATE_RANGE_INVALID = new ErrorCode(1_008_006_007, "段起始日期不能晚于段结束日期");
ErrorCode PROJECT_TASK_WORKLOG_DATE_OVERLAP = new ErrorCode(1_008_006_008, "日期范围与该任务下您已有的工时记录重叠");
ErrorCode PROJECT_TASK_WORKLOG_DELETE_NOT_ALLOWED_BY_TASK_STATUS = new ErrorCode(1_008_006_009, "当前任务状态不允许删除工作日志");
ErrorCode PROJECT_TASK_WORKLOG_PROGRESS_NOT_MONOTONIC = new ErrorCode(1_008_006_010, "工时进度与日期顺序不一致:早段进度不得高于晚段、晚段进度不得低于早段");
ErrorCode PROJECT_TASK_WORKLOG_DIFFICULTY_INVALID = new ErrorCode(1_008_006_011, "完成难度不在字典范围内");
ErrorCode PROJECT_TASK_WORKLOG_CREATE_NOT_ALLOWED_BY_TASK_STATUS = new ErrorCode(1_008_006_012, "当前任务状态不允许新增工作日志");
// ========== 任务 / 工时附件 1_008_010_xxx原 1_008_007 与下方项目需求段撞号,迁至独立号段;新增错误码域请从 1_008_011 起) ==========
ErrorCode PROJECT_TASK_ATTACHMENT_TOO_MANY = new ErrorCode(1_008_010_001, "附件数量不能超过 {} 个");

View File

@@ -105,6 +105,7 @@ public class TaskWorklogServiceImpl implements TaskWorklogService {
permission = ProjectTaskConstants.PERMISSION_WORKLOG)
public Long createWorklog(Long projectId, Long executionId, Long taskId, TaskWorklogSaveReqVO reqVO) {
ProjectTaskDO task = validateEditableContext(projectId, executionId, taskId);
validateCreateAllowed(task);
validateLeafTask(taskId);
Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
validateFileWorklogPermission(taskId, task.getOwnerId(), loginUserId);
@@ -177,6 +178,7 @@ public class TaskWorklogServiceImpl implements TaskWorklogService {
permission = ProjectTaskConstants.PERMISSION_WORKLOG)
public void deleteWorklog(Long projectId, Long executionId, Long taskId, Long worklogId) {
ProjectTaskDO task = validateEditableContext(projectId, executionId, taskId);
validateDeleteAllowed(task);
TaskWorklogDO worklog = loadWorklog(worklogId, taskId);
Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
boolean isFiler = Objects.equals(worklog.getUserId(), loginUserId);
@@ -240,24 +242,30 @@ public class TaskWorklogServiceImpl implements TaskWorklogService {
ProjectExecutionDO execution = validateExecutionExists(projectId, executionId);
validateAllowEdit(ProjectExecutionConstants.OBJECT_TYPE, execution.getStatusCode());
ProjectTaskDO task = validateTaskExists(projectId, executionId, taskId);
// 任务层放宽:completed 状态下非 owner即协办人允许继续维护自己的工时§4.2.4 矩阵)
// 其他状态pending / active / paused / cancelled仍按 allow_edit 判定owner 在 completed 下被拦截,
// 避免与"完成时硬置进度 100%"冲突。
if (!isCompletedAssigneeWorklogContext(task)) {
// 工作日志维护在任务 completed 状态下统一放行;新增/删除是否允许由各自接口单独判定
if (!isCompletedWorklogContext(task)) {
validateAllowEdit(ProjectTaskConstants.OBJECT_TYPE, task.getStatusCode());
}
return task;
}
/**
* 是否处于"任务已完成、协办人维护工时"的放行场景。
* 是否处于任务已完成”的工作日志维护场景。
*/
private boolean isCompletedAssigneeWorklogContext(ProjectTaskDO task) {
if (!"completed".equals(task.getStatusCode())) {
return false;
private boolean isCompletedWorklogContext(ProjectTaskDO task) {
return "completed".equals(task.getStatusCode());
}
private void validateCreateAllowed(ProjectTaskDO task) {
if (isCompletedWorklogContext(task)) {
throw exception(ErrorCodeConstants.PROJECT_TASK_WORKLOG_CREATE_NOT_ALLOWED_BY_TASK_STATUS);
}
}
private void validateDeleteAllowed(ProjectTaskDO task) {
if (isCompletedWorklogContext(task)) {
throw exception(ErrorCodeConstants.PROJECT_TASK_WORKLOG_DELETE_NOT_ALLOWED_BY_TASK_STATUS);
}
Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
return loginUserId != null && !Objects.equals(loginUserId, task.getOwnerId());
}
private void validateExecutionAndTaskExists(Long projectId, Long executionId, Long taskId) {