MacroIndicator.cs 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. using System.ComponentModel.DataAnnotations;
  2. namespace Domain.Entities.Stocks;
  3. /// <summary>
  4. /// 거시경제지표 시계열 (KOSIS 국가통계포털 OpenAPI 수집) — (Code, Period) UNIQUE. 개미투자 거시 대시보드용.
  5. /// 여러 지표(고용률/실업률/취업자수/CPI/환율/수출액/수입액 등)를 한 테이블에 담고 Code(내부 지표코드)로 구분한다.
  6. /// KOSIS statisticsData.do 응답 필드 매핑:
  7. /// - PRD_DE(수록시점) → Period. 주기(Cycle)에 따라 형식이 다르다: 월=YYYYMM(202401), 분기=YYYYQ(20241), 연=YYYY(2024).
  8. /// - DT(수치) → Value. 빈값("")·"-" 등은 수집 시 skip (미고시 시점은 적재하지 않음).
  9. /// - UNIT_NM(단위) → Unit. 지표별 config Name 은 Code 와 함께 표시용으로 별도 보관한다.
  10. /// KOSIS 통계표는 하나의 tblId 안에 여러 분류(C1 시도별/지수별 등)가 섞여 오므로, 수집 배치가 config 의 분류 필터(C1)로
  11. /// 원하는 한 계열(예: CPI 전국 총지수, 실업률 전국(계), 수출액 국가 총계)만 골라 upsert 한다.
  12. /// </summary>
  13. public class MacroIndicator
  14. {
  15. [Key]
  16. public long ID { get; private set; }
  17. /// <summary>지표 내부코드 (config Code) — 예: EMPLOYMENT_RATE, UNEMPLOYMENT_RATE, EMPLOYED_PERSONS, CPI, FX_USD, EXPORT_AMT, IMPORT_AMT</summary>
  18. public string Code { get; private set; } = default!;
  19. /// <summary>지표 표시명 (config Name) — 예: 소비자물가지수</summary>
  20. public string Name { get; private set; } = default!;
  21. /// <summary>수록 시점 (PRD_DE) — 월=YYYYMM, 분기=YYYYQ(예 20241), 연=YYYY</summary>
  22. public string Period { get; private set; } = default!;
  23. /// <summary>수치 (DT)</summary>
  24. public decimal Value { get; private set; }
  25. /// <summary>단위 (UNIT_NM) — 예: "2020=100", "%", "천명". 미제공 시 null</summary>
  26. public string? Unit { get; private set; }
  27. public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow;
  28. public DateTime CreatedAt { get; private set; } = DateTime.UtcNow;
  29. private MacroIndicator() { }
  30. public static MacroIndicator Create(string code, string name, string period, decimal value, string? unit)
  31. {
  32. if (string.IsNullOrWhiteSpace(code))
  33. {
  34. throw new ArgumentException("code required", nameof(code));
  35. }
  36. if (string.IsNullOrWhiteSpace(period))
  37. {
  38. throw new ArgumentException("period required", nameof(period));
  39. }
  40. return new MacroIndicator
  41. {
  42. Code = code.Trim(),
  43. Name = (name ?? string.Empty).Trim(),
  44. Period = period.Trim(),
  45. Value = value,
  46. Unit = string.IsNullOrWhiteSpace(unit) ? null : unit.Trim()
  47. };
  48. }
  49. /// <summary>동일 (Code, Period) 재수집 시 값·단위·표시명 갱신 (upsert)</summary>
  50. public void Update(string name, decimal value, string? unit)
  51. {
  52. Name = (name ?? string.Empty).Trim();
  53. Value = value;
  54. Unit = string.IsNullOrWhiteSpace(unit) ? null : unit.Trim();
  55. UpdatedAt = DateTime.UtcNow;
  56. }
  57. }