CREATE TABLE charge_event_job ( id BIGINT NOT NULL AUTO_INCREMENT COMMENT 'PK', source_charge_id BIGINT NOT NULL COMMENT '이벤트 보너스 지급의 기준이 되는 원본 충전 ID(charge.id)', result_charge_id BIGINT NULL COMMENT '이벤트 보너스로 생성된 Charge ID(charge.id)', member_id BIGINT NOT NULL COMMENT '이벤트 보너스를 지급받을 회원 ID(member.id)', charge_event_id BIGINT NULL COMMENT '적용된 충전 이벤트 ID(charge_event.id), 첫 충전 이벤트처럼 별도 이벤트 row가 없으면 NULL', job_type VARCHAR(30) NOT NULL COMMENT '작업 유형(FIRST_CHARGE, ACTIVE_CHARGE_EVENT)', idempotency_key VARCHAR(100) NOT NULL COMMENT '중복 작업 방지 키(예: charge-event:{sourceChargeId}:{jobType}:{chargeEventId 또는 none})', additional_can INT NOT NULL COMMENT '추가 지급할 보너스 캔 수', payment_gateway VARCHAR(30) NOT NULL COMMENT '원본 충전의 결제 게이트웨이(PG, PAYVERSE, GOOGLE_IAP, APPLE_IAP 등)', container VARCHAR(10) NOT NULL COMMENT '회원 캔 잔액 반영 대상(pg, aos, ios)', method_snapshot VARCHAR(100) NOT NULL COMMENT '이벤트 보너스 Charge.payment.method에 기록할 지급 사유 스냅샷', status VARCHAR(20) NOT NULL DEFAULT 'PENDING' COMMENT '작업 상태(PENDING, PROCESSING, DONE, FAILED)', retry_count INT NOT NULL DEFAULT 0 COMMENT '재시도 횟수', next_retry_at TIMESTAMP NULL COMMENT '다음 재시도 가능 시각', processing_started_at TIMESTAMP NULL COMMENT 'PROCESSING 상태로 선점한 시각', processed_at TIMESTAMP NULL COMMENT '지급 성공 처리 시각', last_error TEXT NULL COMMENT '마지막 실패 사유', created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성 시각', updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정 시각', PRIMARY KEY (id), UNIQUE KEY uk_charge_event_job_idempotency_key (idempotency_key), KEY idx_charge_event_job_status_next_retry_at (status, next_retry_at), KEY idx_charge_event_job_source_charge_id (source_charge_id), KEY idx_charge_event_job_result_charge_id (result_charge_id), KEY idx_charge_event_job_member_id (member_id), KEY idx_charge_event_job_charge_event_id (charge_event_id), CONSTRAINT fk_charge_event_job_source_charge_id FOREIGN KEY (source_charge_id) REFERENCES charge (id), CONSTRAINT fk_charge_event_job_result_charge_id FOREIGN KEY (result_charge_id) REFERENCES charge (id), CONSTRAINT fk_charge_event_job_member_id FOREIGN KEY (member_id) REFERENCES member (id), CONSTRAINT fk_charge_event_job_charge_event_id FOREIGN KEY (charge_event_id) REFERENCES charge_event (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='충전 이벤트 보너스 지급 작업';