캠페인 일정 조회 API
GET /ai/campaign-schedules/{campaignNo} — 캠페인 전체 단계 일정 + 해피패스 5단계 요약
캠페인 일정 조회 API
캠페인 ID로 해당 캠페인의 전체 단계 일정과 광고주/어드민 화면용 해피패스 5단계 요약(happyPath)을 한 번에 조회합니다.
응답은 항상 12/10단계 전체 일정과 happyPath를 함께 포함합니다. 별도 쿼리 파라미터 없이 한 번 호출로 두 데이터를 모두 받을 수 있습니다.
HTTP 요청
GET /ai/campaign-schedules/{campaignNo}
Authorization: Bearer {access_token}Path Parameters
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
campaignNo | int | 예 | 캠페인 번호 |
응답
성공 응답 (200 OK) — 배송형/2회검수 (지연 발생 예시)
{
"status": 200,
"code": null,
"message": "캠페인 일정 조회가 성공하였습니다.",
"data": {
"schedules": [
{
"scheduleId": 1,
"phase": "RECRUITMENT",
"phaseDescription": "모집",
"startDate": "2026-04-20T00:00:00",
"endDate": "2026-04-24T00:00:00",
"originalEndDate": "2026-04-24T00:00:00",
"completedDate": "2026-04-24T18:00:00",
"isCompleted": true,
"isDelayed": false,
"memo": null,
"delayReasons": [],
"createdAt": "2026-04-20T00:00:00",
"updatedAt": "2026-04-24T18:00:00"
},
{
"scheduleId": 2,
"phase": "EXCLUSION_SELECTION",
"phaseDescription": "협업 제안",
"startDate": "2026-04-28T10:00:00",
"endDate": "2026-04-28T10:00:00",
"originalEndDate": "2026-04-26T00:00:00",
"completedDate": null,
"isCompleted": false,
"isDelayed": true,
"memo": null,
"delayReasons": [
{
"type": "SELECTION_DELAY",
"days": 2,
"text": "리스트 선정 지연(2026-04-28 선정완료)",
"occurredAt": "2026-04-28T10:00:00"
}
],
"createdAt": "2026-04-20T00:00:00",
"updatedAt": "2026-04-28T10:00:00"
}
],
"isDoubleReview": true,
"totalPhases": 12,
"guidelineCompletedAt": "2026-04-15T10:00:00",
"expectedCompletedAt": "2026-05-13T23:59:59",
"recruitmentDays": 4,
"happyPath": {
"isDoubleReview": true,
"isDelivery": true,
"guidanceText": "*기본 일정입니다. 검수 내용, 배송에 따라 일정 변경될 수 있어요.",
"groups": [
{
"order": 1,
"label": "모집",
"originalDeadline": "2026-04-24",
"currentDeadline": "2026-04-24",
"delayDays": 0,
"delays": []
},
{
"order": 2,
"label": "크리에이터 리스트 확인 후 선정",
"originalDeadline": "2026-04-26",
"currentDeadline": "2026-04-28",
"delayDays": 2,
"delays": [
{
"type": "SELECTION_DELAY",
"days": 2,
"text": "리스트 선정 지연(2026-04-28 선정완료)",
"occurredAt": "2026-04-28T10:00:00"
}
]
}
]
}
}
}비배송 캠페인은 happyPath.isDelivery=false 이고 groups 에서 ③ 매칭/배송 단계가 누락됩니다.
검수1회 캠페인은 happyPath.isDoubleReview=false 이고 ④ 스크립트 검수 단계가 누락됩니다.
Response 스키마 (ScheduleListResponse)
| 필드명 | 타입 | 설명 |
|---|---|---|
schedules | CampaignScheduleResponseDto[] | 일정 목록 |
isDoubleReview | boolean | 2회검수 캠페인 여부 (true: 12단계, false: 10단계) |
totalPhases | int | 총 단계 수 (10 또는 12) |
happyPath | CampaignScheduleHappyPathResponseDto | 광고주/어드민 화면용 해피패스 5단계 요약 (항상 포함) |
guidelineCompletedAt | datetime | [TASK-071] 가이드라인 완성일. 출처: MongoDB GuidelineDocument.completedAt → fallback Collab.recruitment_start_date (legacy). 가이드 미완성(DRAFT) 캠페인은 null. 운영자는 admin PUT 으로 정정 가능. |
expectedCompletedAt | datetime | [TASK-071 Jay 2026-05-26] 캠페인 예상 완료일 (백엔드 계산). 국내 캠페인만 산정 (해외 null). guidelineCompletedAt + (baseDays + (recruitmentDays - 4)) 영업일 — 영업일 = 월~금 (한국 공휴일 미고려). 가이드 미완성이면 null. |
recruitmentDays | integer | [TASK-071 Phase 3] 모집 영업일 (1-10, 기본 4). T0 트리거가 가이드 완성 + N영업일로 모집 종료일 산정. 관리자 게시물 수정 페이지에서 직접 변경 가능. |
guidelineCompletedAt 활용 (Lucy/Daniel 2026-05-21 합의)
- "모집 시작일 == 가이드라인 최초 완성본 작성 시점"으로 통일. T0 트리거가
wasAlreadyCompleted == false일 때만 호출되므로 최초 시점만 잡힘. - 이후 가이드 수정/재완성은 무시 (운영/영업이 필요 시 직접 수정).
- 광고주 화면의 캠페인 예상 완료일은 프론트가 계산:
guidelineCompletedAt + 캠페인 유형별 일수.
캠페인 유형별 예상 완료일 산정식 (Jay 2026-05-26 정정, 백엔드 자동 계산하여 expectedCompletedAt 응답)
- 국내(KR) 만 산정, 해외는
null(Jay 명세) - 영업일 기준 (
BusinessDayCalculator.addBusinessDays, 월~금, 한국 공휴일 미고려) - 산정:
guidelineCompletedAt + baseDays + (recruitmentDays - 4) 영업일 baseDays는recruitmentDays=4(기본 모집) 기준이며, 모집일수가 늘어난 만큼 추가 (Sam/Jay 합의)
| 유형 | baseDays (국내, recruitmentDays=4 기본) |
|---|---|
| 배송형 + 2회검수 | 28 영업일 |
| 비배송형 + 2회검수 | 21 영업일 |
| 배송형 + 1회검수 | 23 영업일 |
| 비배송형 + 1회검수 | 14 영업일 |
예시 (국내 배송2회): recruitmentDays=4 → 28영업일, recruitmentDays=10 → 34영업일.
지연 발생해도 guidelineCompletedAt / expectedCompletedAt 모두 변동 없음 (최초 완성 시점 기준 고정). 운영자가 recruitmentDays 를 admin PUT 으로 변경하면 expectedCompletedAt 자동 갱신.
화면 표시 정책 (피그마 29926:33536) — 화면에 데이터값이 들어가는 곳은 두 군데:
- 리스트 전달 (모집 완료) → 실제 날짜 (
Collab.recruitmentEndDate) - 캠페인 예상 완료일 → 백엔드 응답
expectedCompletedAt그대로 사용 - 스크립트/영상/업로드 제출 등 → 고정 안내 텍스트 (프론트 하드코딩, 예: "스크립트 검수 후 4일 이내")
CampaignScheduleResponseDto
| 필드명 | 타입 | 설명 |
|---|---|---|
scheduleId | long | 일정 ID |
phase | string | 캠페인 단계 enum |
phaseDescription | string | 단계 한글 설명 |
startDate | datetime | 단계 시작일 |
endDate | datetime | 단계 종료일 (트리거 발생 시 갱신) |
originalEndDate | datetime | 원본 단계 종료일 (가이드 완성 시 1회 세팅, 불변) |
completedDate | datetime | 실제 완료일 (미완료 시 null) |
isCompleted | boolean | 완료 여부 |
isDelayed | boolean | 지연 여부 |
memo | string | 메모 |
delayReasons | ScheduleDelayInfo[] | 지연 사유 누적 (JSON 배열). 자기-책임 지연 일수가 필요하면 항목별 days 합산. |
createdAt | datetime | 생성일 |
updatedAt | datetime | 수정일 |
ScheduleDelayInfo
| 필드명 | 타입 | 설명 |
|---|---|---|
type | string | SELECTION_DELAY · DELIVERY_DELAY · SCRIPT_REVIEW_DELAY · SCRIPT_RESUBMISSION_DELAY · VIDEO_REVIEW_DELAY |
days | int | 해당 사유로 추가된 지연 일수 |
text | string | 화면 노출용 동적 텍스트 (예: 리스트 선정 지연(2026-04-28 선정완료)) |
occurredAt | datetime | 지연 발생 시점 |
해피패스 5단계 요약 (happyPath 필드)
위 응답의 happyPath 필드. 광고주/어드민 화면이 한 호출로 전체 일정 + 5단계 요약을 받습니다.
각 그룹은 원본 마감일(originalDeadline) 과 현재 마감일(currentDeadline) 을 함께 노출합니다.
delayDays 는 캠페인 생성 기준 누적 합산입니다 (기획 결정).
그룹 N 의 delayDays = 그룹 1~N 의 자기-책임 지연 일수 합. 이전 단계가 지연되면 이후 단계에도 그대로 이월됩니다.
반면 delays 라인은 각 단계의 자기-책임 사유만 표기합니다.
happyPath 예시 — 배송형/2회검수 (그룹2: +2일, 그룹3: +4일, 그룹4: +5일, 그룹5: +2일 자기 지연 발생)
{
"happyPath": {
"isDoubleReview": true,
"isDelivery": true,
"guidanceText": "*기본 일정입니다. 검수 내용, 배송에 따라 일정 변경될 수 있어요.",
"groups": [
{
"order": 1,
"label": "모집",
"originalDeadline": "2026-04-24",
"currentDeadline": "2026-04-24",
"delayDays": 0,
"delays": []
},
{
"order": 2,
"label": "크리에이터 리스트 확인 후 선정",
"originalDeadline": "2026-04-26",
"currentDeadline": "2026-04-28",
"delayDays": 2,
"delays": [
{ "type": "SELECTION_DELAY", "days": 2, "text": "리스트 선정 지연(2026-04-28 선정완료)", "occurredAt": "2026-04-28T10:00:00" }
]
},
{
"order": 3,
"label": "매칭 인원에게 제품 배송 및 운송장번호 입력",
"originalDeadline": "2026-04-27",
"currentDeadline": "2026-05-01",
"delayDays": 6,
"delays": [
{ "type": "DELIVERY_DELAY", "days": 4, "text": "배송 지연", "occurredAt": "2026-05-01T15:00:00" }
]
},
{
"order": 4,
"label": "스크립트 검수 및 제작 허용",
"originalDeadline": "2026-05-06",
"currentDeadline": "2026-05-11",
"delayDays": 11,
"delays": [
{ "type": "SCRIPT_REVIEW_DELAY", "days": 2, "text": "검수 지연", "occurredAt": "2026-05-09T18:00:00" },
{ "type": "SCRIPT_RESUBMISSION_DELAY", "days": 3, "text": "스크립트 재제출로 인한 지연", "occurredAt": "2026-05-09T18:00:00" }
]
},
{
"order": 5,
"label": "제작물 검수 및 업로드 허용",
"originalDeadline": "2026-05-12",
"currentDeadline": "2026-05-14",
"delayDays": 13,
"delays": [
{ "type": "VIDEO_REVIEW_DELAY", "days": 2, "text": "검수 및 업로드 허용 지연", "occurredAt": "2026-05-14T11:00:00" }
]
}
]
}
}Response 스키마 (HappyPathResponse)
| 필드명 | 타입 | 설명 |
|---|---|---|
isDoubleReview | boolean | 검수 2회 여부 |
isDelivery | boolean | 배송형 여부 |
guidanceText | string | 화면 안내 문구 |
groups | HappyPathGroup[] | 3~5개 그룹 (비배송 시 그룹3 누락, 검수1회 시 그룹4 누락) |
HappyPathGroup
| 필드명 | 타입 | 설명 |
|---|---|---|
order | int | 그룹 순번 (1~5) |
label | string | 그룹 라벨 |
originalDeadline | date | 원본 마감일 (불변) |
currentDeadline | date | 현재 마감일 (재계산에 따라 갱신) |
delayDays | int | 캠페인 생성 기준 누적 지연 일수 (이전 단계까지 누적합 + 자기 단계 지연) |
delays | ScheduleDelayInfo[] | 자기 단계 책임 사유만 (누적합은 delayDays 로 노출) |
API 테스트
단계별 트리거 발화 흐름(T0~T4 + 재제출)은 트리거 기반 일정 재설계 페이지 참고. 크리에이터 개별 일정 조회는 크리에이터 개별 일정 API 페이지 참고.