CommonConfigManager.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  1. using Flyinsono.DBCopy.Tool.Entities.Config;
  2. using MongoDB.Bson.Serialization.Conventions;
  3. using Newtonsoft.Json;
  4. using Newtonsoft.Json.Linq;
  5. using NPOI.Util.Collections;
  6. using System;
  7. using System.Collections.Concurrent;
  8. using System.Collections.Generic;
  9. using System.IO;
  10. using System.Linq;
  11. using System.Net.Http.Json;
  12. using System.Net.Mail;
  13. using System.Text;
  14. using System.Threading.Tasks;
  15. using System.Windows;
  16. using WingServerCommon.Config;
  17. using WingServerCommon.Config.Parameters;
  18. namespace Flyinsono.DBCopy.Tool.Utilities
  19. {
  20. internal class CommonConfigManager
  21. {
  22. /// <summary>
  23. /// 初始化读取数据
  24. /// </summary>
  25. static CommonConfigManager()
  26. {
  27. //GetCountryData();
  28. //LoadExportToExcelData();
  29. var jsonContent = File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"Config", "Config.json"));
  30. var testConfig = JsonConvert.DeserializeObject<TestConfig>(jsonContent);
  31. if (testConfig != null)
  32. {
  33. if (testConfig.FilterUsers?.Count > 0)
  34. {
  35. FilterUsers = testConfig.FilterUsers;
  36. }
  37. if (testConfig.FilterTerminals?.Count > 0)
  38. {
  39. FilterTerminals = testConfig.FilterTerminals;
  40. }
  41. if (testConfig.FilterOrganizations?.Count > 0)
  42. {
  43. FilterOrganizations = testConfig.FilterOrganizations;
  44. }
  45. if (testConfig.FilterLectureContests?.Count > 0)
  46. {
  47. FilterLectureContests = testConfig.FilterLectureContests;
  48. }
  49. if (testConfig.FilterExaminationPaper?.Count > 0)
  50. {
  51. FilterExaminationPaper = testConfig.FilterExaminationPaper;
  52. }
  53. if (testConfig.FilterCourses?.Count > 0)
  54. {
  55. FilterCourses = testConfig.FilterCourses;
  56. }
  57. if (testConfig.FilterPatients?.Count > 0)
  58. {
  59. FilterPatients = testConfig.FilterPatients;
  60. }
  61. if (testConfig.FilterGeneral != null)
  62. {
  63. FilterGeneral = testConfig.FilterGeneral;
  64. }
  65. if (testConfig.FilterReportPosters?.Count > 0)
  66. {
  67. FilterReportPosters = testConfig.FilterReportPosters;
  68. }
  69. if (testConfig.FilterPatientType?.Count > 0)
  70. {
  71. FilterPatientType = testConfig.FilterPatientType;
  72. }
  73. if (testConfig.FilterAgent?.Count > 0)
  74. {
  75. FilterAgent = testConfig.FilterAgent;
  76. }
  77. if (testConfig.MedicalConsortiums?.Count > 0)
  78. {
  79. MedicalConsortiums = testConfig.MedicalConsortiums;
  80. }
  81. if (testConfig.CorrectOrganizations?.Count > 0)
  82. {
  83. CorrectOrganizations = testConfig.CorrectOrganizations;
  84. }
  85. if (!string.IsNullOrEmpty(testConfig.FilterOrgCode))
  86. {
  87. FilterOrgCode = testConfig.FilterOrgCode;
  88. }
  89. if (!string.IsNullOrEmpty(testConfig.FilterAdminCode))
  90. {
  91. FilterAdminCode = testConfig.FilterAdminCode;
  92. }
  93. if (testConfig.IsNeedSpeicalUser)
  94. {
  95. IsNeedSpeicalUser = testConfig.IsNeedSpeicalUser;
  96. }
  97. if (testConfig.SpecialOrgCodes?.Count > 0)
  98. {
  99. SpecialOrgCodes = testConfig.SpecialOrgCodes;
  100. }
  101. if (testConfig.DeviceShortCodes?.Count > 0)
  102. {
  103. DeviceShortCodes = testConfig.DeviceShortCodes;
  104. }
  105. if (testConfig.UserDataDiff?.Count > 0)
  106. {
  107. UserDataDiff = testConfig.UserDataDiff;
  108. }
  109. if (testConfig.SpecicalDeviceCodes?.Count > 0)
  110. {
  111. SpecicalDeviceCodes = testConfig.SpecicalDeviceCodes;
  112. }
  113. if (testConfig.SpecicalUserDeviceCodes?.Count > 0)
  114. {
  115. SpecicalUserDeviceCodes = testConfig.SpecicalUserDeviceCodes;
  116. }
  117. }
  118. var appSettingContent = File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"Config", "AppSetting.json"));
  119. var appConfig = JsonConvert.DeserializeObject<AppSetting>(appSettingContent);
  120. if (appConfig != null)
  121. {
  122. if (appConfig.Database != null)
  123. {
  124. DatabaseInfo = appConfig.Database;
  125. }
  126. if (appConfig.MigrateRule != null)
  127. {
  128. MigrateRuleInfo = appConfig.MigrateRule;
  129. }
  130. if (appConfig.DirectServer != null)
  131. {
  132. DirectServer = appConfig.DirectServer;
  133. }
  134. if (appConfig.TerminalRecordSync != null)
  135. {
  136. TerminalRecordSync = appConfig.TerminalRecordSync;
  137. }
  138. if (appConfig.SignStudentRecordSync != null)
  139. {
  140. SignStudentRecordSync = appConfig.SignStudentRecordSync;
  141. }
  142. if (appConfig.ThirdPartyServer != null)
  143. {
  144. ThirdPartyServer = appConfig.ThirdPartyServer;
  145. }
  146. }
  147. var cacheConfig = File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"Config", "cacheSyn.json"));
  148. var cacheConfigData = JsonConvert.DeserializeObject<CacheSynData>(cacheConfig);
  149. if (cacheConfigData != null)
  150. {
  151. CacheSynDataInfo = cacheConfigData;
  152. }
  153. RemoveExpireCacheConfig();
  154. }
  155. private static void GetCountryData()
  156. {
  157. string folderPath = "F:\\USA"; // 将此处替换为要查询的文件夹路径
  158. var provinceList = new List<string>();
  159. try
  160. {
  161. string[] fileNames = Directory.GetFiles(folderPath);
  162. foreach (string fileName in fileNames)
  163. {
  164. //F:\USA\Alabama.xlsx
  165. var name = Path.GetFileNameWithoutExtension(fileName).Trim();
  166. provinceList.Add(name);
  167. }
  168. var provinceInfos = new List<ProvinceInfo>();
  169. foreach (var item in provinceList)
  170. {
  171. var path = System.IO.Path.Combine(folderPath, (item + ".xlsx"));
  172. ExcelHelper excelHelper = new ExcelHelper(path);
  173. var dataList = excelHelper.ReadExcelToList<CountryInfo>("Sheet1", true);
  174. var m = new ProvinceInfo()
  175. {
  176. province = item,
  177. citys = dataList.Where(c => !string.IsNullOrEmpty(c.County.Trim())).Select(c => c.County.Trim()).Distinct().ToList()
  178. };
  179. provinceInfos.Add(m);
  180. }
  181. var regionTable = new RegionTable()
  182. {
  183. lang = "en-US",
  184. datas = new List<RegionInfo>()
  185. {
  186. new RegionInfo()
  187. {
  188. c = "4000000",
  189. g = "0",
  190. f = "0",
  191. n = "USA"
  192. }
  193. }
  194. };
  195. for (int i = 1; i <= provinceInfos.Count; i++)
  196. {
  197. var tempInfo = provinceInfos[(i - 1)];
  198. var provinceIndex = 4000000 + (i * 10000);
  199. var pInfo = new RegionInfo()
  200. {
  201. c = provinceIndex.ToString(),
  202. g = "1",
  203. f = "4000000",
  204. n = tempInfo.province
  205. };
  206. regionTable.datas.Add(pInfo);
  207. for (int j = 1; j <= tempInfo.citys.Count; j++)
  208. {
  209. var cityInfo = tempInfo.citys[(j - 1)];
  210. var cityIndex = provinceIndex + j;
  211. var cInfo = new RegionInfo()
  212. {
  213. c = cityIndex.ToString(),
  214. g = "2",
  215. f = pInfo.c,
  216. n = cityInfo
  217. };
  218. regionTable.datas.Add(cInfo);
  219. }
  220. }
  221. var jsonContent = Newtonsoft.Json.JsonConvert.SerializeObject(regionTable);
  222. var writePath = System.IO.Path.Combine(folderPath, "regionTable.json");
  223. using (StreamWriter streamWriter = new StreamWriter(writePath, true))
  224. {
  225. streamWriter.WriteLine(jsonContent);
  226. }
  227. }
  228. catch (Exception ex)
  229. {
  230. Console.WriteLine("发生错误:" + ex.Message);
  231. }
  232. }
  233. private static void LoadExportToExcelData()
  234. {
  235. var terminalRecordJson = File.ReadAllText("D:\\Project\\git\\wingsolutionMaster01\\WingCloudServer\\src\\bin\\Debug\\net6.0\\Resource\\Languge\\DefaultReportTemplateData.json", Encoding.UTF8);
  236. JObject json = JObject.Parse(terminalRecordJson);
  237. JArray array = (JArray)json["TermainalRecordInfos"];
  238. string aa = "";
  239. foreach (JToken jObject in array)
  240. {
  241. //赋值属性
  242. aa = jObject["_id"].ToString();//获取字符串中id值
  243. }
  244. var terminalRecordData = JsonConvert.DeserializeObject<TermainalRecordJson>(terminalRecordJson);
  245. foreach (var terminalRecord in terminalRecordData.TermainalRecordInfos)
  246. {
  247. if (terminalRecord.PatientInfo.Birthday != null)
  248. {
  249. var dateDiff = terminalRecord.CreateTime - terminalRecord.PatientInfo.Birthday.Value;
  250. terminalRecord.PatientInfo.Age = Convert.ToInt32(dateDiff.TotalDays / 365);
  251. }
  252. }
  253. var reportRecordJson = File.ReadAllText("F:\\360MoveData\\Users\\VINNO\\Desktop\\ReportRecord.json", Encoding.UTF8);
  254. var reportRecordData = JsonConvert.DeserializeObject<ReportRecordJson>(reportRecordJson);
  255. foreach (var reportRecordInfo in reportRecordData.ReportRecord)
  256. {
  257. reportRecordInfo.CreateTime = reportRecordInfo.CreateTime.AddHours(8);
  258. }
  259. List<ExportHNData> dataList = new List<ExportHNData>();
  260. foreach (var terminalRecord in terminalRecordData.TermainalRecordInfos)
  261. {
  262. var findReportInfo = reportRecordData.ReportRecord.FirstOrDefault(c => c.RecordId == terminalRecord._id) ?? new ReportRecordInfo();
  263. var checkTime = (findReportInfo.CreateTime > DateTime.MinValue) ? findReportInfo.CreateTime.ToString("yyyy-MM-dd HH:mm:ss") : "";
  264. var diffTimeStr = "";
  265. if (!string.IsNullOrEmpty(checkTime))
  266. {
  267. var diffTime = findReportInfo.CreateTime - terminalRecord.CreateTime;
  268. TimeSpan ts = new TimeSpan(0, 0, Convert.ToInt32(diffTime.TotalSeconds));
  269. int _hours = 0;
  270. if (ts.Days > 0)
  271. {
  272. _hours = ts.Days * 24;
  273. }
  274. if (ts.Hours > 0)
  275. {
  276. diffTimeStr = (ts.Hours + _hours).ToString() + ":" + ts.Minutes + ":" + ts.Seconds;
  277. }
  278. if (ts.Hours == 0 && ts.Minutes > 0)
  279. {
  280. diffTimeStr = "0:";
  281. if (_hours > 0)
  282. {
  283. diffTimeStr = (ts.Hours + _hours).ToString() + ":";
  284. }
  285. diffTimeStr += ts.Minutes + ":" + ts.Seconds;
  286. }
  287. if (ts.Hours == 0 && ts.Minutes == 0)
  288. {
  289. diffTimeStr = "0:";
  290. if (_hours > 0)
  291. {
  292. diffTimeStr = (ts.Hours + _hours).ToString() + ":";
  293. }
  294. diffTimeStr += "0:" + ts.Seconds;
  295. }
  296. }
  297. var model = new ExportHNData()
  298. {
  299. 申请机构 = terminalRecord.Organization.Name,
  300. 检查编号 = terminalRecord._id,
  301. 患者姓名 = (string.IsNullOrEmpty(terminalRecord.PatientInfo.LastName) ? terminalRecord.PatientInfo.FirstName : terminalRecord.PatientInfo.LastName) ?? string.Empty,
  302. 年龄 = terminalRecord.PatientInfo.Age > 0 ? terminalRecord.PatientInfo.Age.ToString() : "",
  303. 检查时间 = terminalRecord.CreateTime.ToString("yyyy-MM-dd HH:mm:ss"),
  304. 诊断时间 = checkTime,
  305. 时效性 = diffTimeStr,
  306. 诊断机构 = terminalRecord.Organization.Name
  307. };
  308. dataList.Add(model);
  309. }
  310. var headList = new List<string>() { "申请机构", "检查编号", "患者姓名", "年龄", "检查时间", "诊断时间", "时效性", "诊断机构" };
  311. var path = "F:\\360MoveData\\Users\\VINNO\\Desktop\\Statistic.xlsx";
  312. ExcelHelper excelHelper = new ExcelHelper(path);
  313. var count = excelHelper.ListToExcel<ExportHNData>(dataList, "超声", true);
  314. }
  315. /// <summary>
  316. /// 移除过期的缓存
  317. /// </summary>
  318. private static void RemoveExpireCacheConfig()
  319. {
  320. Task.Run(async () =>
  321. {
  322. while (true)
  323. {
  324. try
  325. {
  326. var curTime = DateTime.UtcNow;
  327. foreach (var key in CacheSynDataInfo.CacheDic.Keys) {
  328. if (CacheSynDataInfo.CacheDic[key]?.Count > 0)
  329. {
  330. //var expiredData = curData.Where(c => c.CacheTime > curTime)?.ToList() ?? new List<CacheBasicInfo>();
  331. var keys = new List<string>();
  332. foreach (var keyItem in CacheSynDataInfo.CacheDic[key].Keys)
  333. {
  334. CacheSynDataInfo.CacheDic[key].TryGetValue(keyItem, out DateTime val);
  335. if (val.AddMinutes(CommonConfigManager.MigrateRuleInfo.StartTimeDiffMintues) < curTime)
  336. {
  337. //待移除key
  338. keys.Add(keyItem);
  339. }
  340. }
  341. //CacheSynDataInfo.CacheDic[key] = newData;
  342. if (keys?.Count > 0)
  343. {
  344. foreach (var item in keys)
  345. {
  346. CacheSynDataInfo.CacheDic[key].TryRemove(item, out _);
  347. }
  348. }
  349. }
  350. }
  351. await Task.Delay(2000 * 60);
  352. }
  353. catch (Exception ex)
  354. {
  355. Logger.WriteLineError($"ListenStorageError:{ex}");
  356. }
  357. }
  358. });
  359. }
  360. /// <summary>
  361. /// 过滤用户
  362. /// </summary>
  363. public static IList<FilterUsersConfig> FilterUsers { get; set; }
  364. /// <summary>
  365. /// 过滤超声机
  366. /// </summary>
  367. public static IList<string> FilterTerminals { get; set; }
  368. /// <summary>
  369. /// 过滤机构
  370. /// </summary>
  371. public static IList<string> FilterOrganizations { get; set; }
  372. /// <summary>
  373. /// 过滤指定的测试讲课比赛
  374. /// </summary>
  375. public static IList<string> FilterLectureContests { get; set; }
  376. /// <summary>
  377. /// 过滤指定的测试考试
  378. /// </summary>
  379. public static IList<string> FilterExaminationPaper { get; set; }
  380. /// <summary>
  381. /// 过滤指定的测试课程
  382. /// </summary>
  383. public static IList<string> FilterCourses { get; set; }
  384. /// <summary>
  385. /// 过滤指定的测试病人
  386. /// </summary>
  387. public static IList<string> FilterPatients { get; set; }
  388. /// <summary>
  389. /// 清理工具基础配置
  390. /// </summary>
  391. public static FilterGeneralConfig FilterGeneral { get; set; }
  392. /// <summary>
  393. /// 过滤指定的测试推送报告
  394. /// </summary>
  395. public static IList<string> FilterReportPosters { get; set; }
  396. /// <summary>
  397. /// 过滤指定的病人类型
  398. /// </summary>
  399. public static IList<string> FilterPatientType { get; set; }
  400. /// <summary>
  401. /// 配置默认服务地址,本地
  402. /// </summary>
  403. public static bool IsLocalHost { get; set; } = true;
  404. /// <summary>
  405. /// 配置默认服务地址,本地
  406. /// </summary>
  407. public static MigrateRuleEntity MigrateRuleInfo { get; set; }
  408. /// <summary>
  409. /// 目标服务
  410. /// </summary>
  411. public static DirectServerEntity DirectServer { get; set; }
  412. /// <summary>
  413. /// 配置默认服务地址,本地
  414. /// </summary>
  415. public static DatabaseEntity DatabaseInfo { get; set; }
  416. /// <summary>
  417. /// 病例同步配置
  418. /// </summary>
  419. public static TerminalRecordSyncSetting TerminalRecordSync { get; set; }
  420. /// <summary>
  421. /// 病例同步配置
  422. /// </summary>
  423. public static TerminalRecordSyncSetting SignStudentRecordSync { get; set; }
  424. /// <summary>
  425. /// 过滤指定的代理商
  426. /// </summary>
  427. public static IList<string> FilterAgent { get; set; }
  428. /// <summary>
  429. /// 医联体关键字
  430. /// </summary>
  431. public static IList<MedicalConsortium> MedicalConsortiums { get; set; } = new List<MedicalConsortium>();
  432. /// <summary>
  433. /// 校准后医院
  434. /// </summary>
  435. public static IList<CorrectOrganization> CorrectOrganizations { get; set; } = new List<CorrectOrganization>();
  436. /// <summary>
  437. /// 过滤机构
  438. /// </summary>
  439. public static string FilterOrgCode { get; set; }
  440. /// <summary>
  441. /// 过滤Admin Code
  442. /// </summary>
  443. public static string FilterAdminCode { get; set; }
  444. /// <summary>
  445. /// 设备短码列表
  446. /// </summary>
  447. public static IList<string> DeviceShortCodes { get; set; } = new List<string>();
  448. /// <summary>
  449. /// 特殊处理机构
  450. /// </summary>
  451. public static IList<string> SpecialOrgCodes { get; set; }
  452. /// <summary>
  453. /// 是否特殊处理用户
  454. /// </summary>
  455. public static bool IsNeedSpeicalUser { get; set; }
  456. /// <summary>
  457. /// 第三方服务
  458. /// </summary>
  459. public static ThirdPartyServer ThirdPartyServer { get; set; }
  460. /// <summary>
  461. /// 差异用户数据
  462. /// </summary>
  463. public static IList<string> UserDataDiff { get; set; } = new List<string>();
  464. /// <summary>
  465. /// 缓存数据
  466. /// </summary>
  467. public static CacheSynData CacheSynDataInfo { get; set; } = new CacheSynData();
  468. /// <summary>
  469. /// 特殊就设备短码
  470. /// </summary>
  471. public static IList<string> SpecicalDeviceCodes { get; set; } = new List<string>();
  472. /// <summary>
  473. /// 特殊用户关联设备短码
  474. /// </summary>
  475. public static IList<string> SpecicalUserDeviceCodes { get; set; } = new List<string>();
  476. }
  477. }