diff --git a/backend/src/modules/activity/entities/activity.entity.ts b/backend/src/modules/activity/entities/activity.entity.ts index 2a32fab..79653c3 100644 --- a/backend/src/modules/activity/entities/activity.entity.ts +++ b/backend/src/modules/activity/entities/activity.entity.ts @@ -28,6 +28,7 @@ export type ActivityType = | 'task.assignees_changed' | 'task.due_changed' | 'task.edited' + | 'task.checkpoint_reported' | 'task.file_removed' | 'task.removed'; diff --git a/backend/src/modules/task/task.service.ts b/backend/src/modules/task/task.service.ts index 0d25a19..3f76c3f 100644 --- a/backend/src/modules/task/task.service.ts +++ b/backend/src/modules/task/task.service.ts @@ -1420,6 +1420,15 @@ export class TaskService { }), ); + // 활동 적재 — 중간 점검 보고 + await this.activity.record({ + projectId: project.id, + actorId: actingUserId, + type: 'task.checkpoint_reported', + payload: { taskTitle: task.title }, + taskSeq: task.seq, + }); + // 지시자에게 알림(행위자=작업자는 자동 제외) await this.notification.notify({ recipientIds: task.issuer ? [task.issuer.id] : [], diff --git a/frontend/src/stores/activity.store.ts b/frontend/src/stores/activity.store.ts index fb1e8a3..6b0cf44 100644 --- a/frontend/src/stores/activity.store.ts +++ b/frontend/src/stores/activity.store.ts @@ -100,6 +100,8 @@ function toProjectActivityItem(api: ApiActivity): ProjectActivityItem { } case 'task.edited': return { ...base, tone: 'task', icon: 'pencil', html: `${actor}님이 ${title} 업무를 수정했습니다` } + case 'task.checkpoint_reported': + return { ...base, tone: 'task', icon: 'check', html: `${actor}님이 ${title} 업무의 중간 점검을 보고했습니다` } case 'task.file_removed': return { ...base, diff --git a/frontend/src/stores/task.store.ts b/frontend/src/stores/task.store.ts index 7545534..e1dd542 100644 --- a/frontend/src/stores/task.store.ts +++ b/frontend/src/stores/task.store.ts @@ -159,6 +159,8 @@ function toTaskActivityView(api: ApiActivity): ActivityView { } case 'task.edited': return { tone: '', icon: 'check', html: `${actor}님이 업무를 수정했습니다`, time } + case 'task.checkpoint_reported': + return { tone: 'blue', icon: 'check', html: `${actor}님이 중간 점검 상태를 보고했습니다`, time } case 'task.file_removed': return { tone: '', icon: 'paperclip', html: `${actor}님이 첨부 파일을 삭제했습니다`, time, file: pstr(p, 'fileName') } default: diff --git a/frontend/src/types/activity.ts b/frontend/src/types/activity.ts index d86aeb2..0a92829 100644 --- a/frontend/src/types/activity.ts +++ b/frontend/src/types/activity.ts @@ -16,6 +16,7 @@ export type ApiActivityType = | 'task.assignees_changed' | 'task.due_changed' | 'task.edited' + | 'task.checkpoint_reported' | 'task.file_removed' | 'task.removed'