SeibroSweptDate.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. using System.ComponentModel.DataAnnotations;
  2. namespace Domain.Entities.Stocks;
  3. /// <summary>
  4. /// SEIBro 날짜 스윕 수집의 "조회 완료(0행 포함)" 마커 (자연키 UNIQUE (JobKey, Date, Discriminator)) — SEIBro 통합 리뷰 결함 #1 해소용.
  5. /// existsForDate 판정을 "그 날짜에 데이터 행이 있으면 수집됨"으로 하면, 발행/이벤트가 없는 조용한 날(주말 포함 전 캘린더일 스윕이라 특히 많음)이
  6. /// 매 실행 재조회되어 quota 를 상시 낭비하고 백필이 수렴하지 않는다. 이 마커는 fetchAndUpsert 성공(0행 포함) 후 해당 (job, 날짜[, 축])을
  7. /// 기록하고, 스윕의 스킵 판정을 "데이터 존재 OR 마커 존재"로 바꾼다(기존 적재분 재조회도 회피).
  8. /// Discriminator = 스윕 축 구분(tpcd·kacd·nation·pay구분 등). 축이 없는 스윕은 빈 문자열("")로 저장한다 —
  9. /// nullable 컬럼을 UNIQUE 에 넣으면 SQL Server 필터드 인덱스 처리가 애매해지므로 non-null 로 강제한다.
  10. /// </summary>
  11. public class SeibroSweptDate
  12. {
  13. [Key]
  14. public int ID { get; private set; }
  15. /// <summary>수집 job 식별자 (예 "bond-issuance", "supply-lockup", "deriv-redemption")</summary>
  16. public string JobKey { get; private set; } = default!;
  17. /// <summary>스윕 대상 날짜 (발행일·결제일·지급일 등 요청 파라미터 날짜)</summary>
  18. public DateOnly Date { get; private set; }
  19. /// <summary>스윕 축 구분 (SECN_TPCD·SECN_KACD·NATION_CD·PAY_COST_TPCD 등). 축 없으면 빈 문자열.</summary>
  20. public string Discriminator { get; private set; } = string.Empty;
  21. /// <summary>조회 완료 시각 (UTC) — 0행 응답도 완료로 기록</summary>
  22. public DateTime SweptAt { get; private set; } = DateTime.UtcNow;
  23. private SeibroSweptDate() { }
  24. public static SeibroSweptDate Create(string jobKey, DateOnly date, string? discriminator)
  25. {
  26. if (string.IsNullOrWhiteSpace(jobKey))
  27. {
  28. throw new ArgumentException("jobKey required", nameof(jobKey));
  29. }
  30. return new SeibroSweptDate
  31. {
  32. JobKey = jobKey.Trim(),
  33. Date = date,
  34. Discriminator = string.IsNullOrWhiteSpace(discriminator) ? string.Empty : discriminator.Trim(),
  35. SweptAt = DateTime.UtcNow
  36. };
  37. }
  38. }