HeadlessRunner.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Threading.Tasks;
  4. namespace DRG.DRGInterfaceClient
  5. {
  6. /// <summary>--sync 无头模式:供 Windows 任务计划程序调用,完成一次同步后退出。</summary>
  7. internal static class HeadlessRunner
  8. {
  9. public static async Task<int> RunOnceAsync()
  10. {
  11. try
  12. {
  13. var codes = Config.Current.ScheduledHospCodes;
  14. if (codes == null || codes.Count == 0)
  15. {
  16. Logger.Error("ScheduledHospCodes 为空,无法执行 --sync(请在 GUI 勾选机构并「设为定时机构」)");
  17. return 1;
  18. }
  19. if (string.IsNullOrWhiteSpace(Config.Current.Endpoint))
  20. {
  21. Logger.Error("接口地址(Endpoint)为空,无法执行 --sync");
  22. return 1;
  23. }
  24. var hospResp = await DrgApiClient.QueryHospitalInfoAsync("", "",
  25. SessionBuilder.BuildDefault(Config.Current.SessionDefaults));
  26. if (!DrgApiClient.IsOk(hospResp))
  27. {
  28. Logger.Error("加载机构失败: " + DrgApiClient.GetError(hospResp));
  29. return 1;
  30. }
  31. var all = new List<HospitalInfoItem>();
  32. var arr = DrgApiClient.GetResultArray(hospResp);
  33. if (arr != null)
  34. {
  35. foreach (var o in arr)
  36. {
  37. if (o is Dictionary<string, object> d)
  38. all.Add(DrgApiClient.ParseHospital(d));
  39. }
  40. }
  41. int ok = 0, fail = 0;
  42. foreach (var schedCode in codes)
  43. {
  44. var hosp = all.Find(h => string.Equals(h.code, schedCode, StringComparison.OrdinalIgnoreCase));
  45. if (hosp == null)
  46. {
  47. Logger.Error("按 code(医保编码) 匹配不到机构: " + schedCode);
  48. fail++;
  49. continue;
  50. }
  51. var session = SessionBuilder.Build(hosp, Config.Current.SessionDefaults);
  52. var cfgResp = await DrgApiClient.GetSyncConfigAsync(hosp.hospCode, session);
  53. if (!DrgApiClient.IsOk(cfgResp))
  54. {
  55. Logger.Error("机构 " + hosp.descripts + " 配置加载失败: " + DrgApiClient.GetError(cfgResp));
  56. fail++;
  57. continue;
  58. }
  59. var cfg = DrgApiClient.ParseSyncConfig(DrgApiClient.GetResult(cfgResp));
  60. var (st, ed) = DrgApiClient.ComputeDateRange(
  61. cfg.syncType, cfg.lookbackDays, Config.Current.FullSyncStartDays);
  62. var syncResp = await DrgApiClient.GetInpatientDataAsync(
  63. hosp.hospCode, st, ed, cfg.synFlag ?? "Y", session);
  64. if (!DrgApiClient.IsOk(syncResp))
  65. {
  66. Logger.Error("机构 " + hosp.descripts + " 同步失败: " + DrgApiClient.GetError(syncResp));
  67. fail++;
  68. continue;
  69. }
  70. Logger.Info("机构 " + hosp.descripts + " 同步成功");
  71. ok++;
  72. }
  73. Logger.Info(string.Format("sync 完成:成功 {0} 家,失败 {1} 家(共 {2} 家)", ok, fail, codes.Count));
  74. return fail > 0 ? 1 : 0;
  75. }
  76. catch (Exception ex)
  77. {
  78. Logger.Error("--sync 执行异常", ex);
  79. return 1;
  80. }
  81. }
  82. }
  83. }