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

@@ -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) {