ResultController.cs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data.Entity;
  4. using System.Linq;
  5. using System.Net.Http;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using System.Web.Http;
  9. using Serilog;
  10. using XdCxRhDW.Dto;
  11. using XdCxRhDW.Repostory;
  12. using System.IO;
  13. using XdCxRhDW.Entity;
  14. using XdCxRhDW.Api;
  15. using XdCxRhDW.WebApi;
  16. using DPP_YH_Core.Extensions;
  17. using XdCxRhDW.App.Model;
  18. using System.Diagnostics;
  19. using System.Configuration;
  20. namespace XdCxRhDW.App.Controllers
  21. {
  22. /// <summary>
  23. /// 结果查询相关接口
  24. /// </summary>
  25. public class ResultController : BaseController
  26. {
  27. /// <summary>
  28. /// 根据时间范围查询参估结果
  29. /// </summary>
  30. /// <param name="dto"><see cref="CgResQueryDto"/>查询参数</param>
  31. /// <returns></returns>
  32. /// <exception cref="Exception"></exception>
  33. [HttpPost]
  34. public async Task<AjaxResult<List<CgResDto>>> GetCgResByTimeRange(CgResQueryDto dto)
  35. {
  36. List<CgResDto> cgList = new List<CgResDto>();
  37. try
  38. {
  39. DateTime start = dto.BeginTime;
  40. DateTime end = dto.EndTime;
  41. var dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DbPart");
  42. if (!Directory.Exists(dir)) return Success(cgList);
  43. List<string> list = new List<string>();
  44. DateTime tempStart = new DateTime(start.Year, start.Month, start.Day);
  45. while (end >= tempStart)
  46. {
  47. list.Add(end.ToString("yyyy") + "\\" + end.ToString("MMdd") + ".db");
  48. end = end.AddDays(-1);
  49. }
  50. end = dto.EndTime;
  51. foreach (var item in list)
  52. {
  53. var dayFile = Path.Combine(dir, item);
  54. using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile))
  55. {
  56. if (db == null) continue;
  57. var query = db.PosRes.Where(p => p.SigTime >= start && p.SigTime <= end && p.TaskInfoID == dto.TaskInfoID);
  58. if (!dto.IncludeInvalidate)
  59. query = query.Where(p => p.PosLon != 999);
  60. if (dto.TarFrequpHz != null && dto.TarFrequpHz > 0)
  61. query = query.Where(p => p.FreqUpHz == dto.TarFrequpHz.Value);
  62. var cgRes = await query.Include(p => p.CgRes).Select(t => t.CgRes).Include(t => t.StationRes).OrderByDescending(p => p.SigTime).ToListAsync();
  63. var listDto = MapCgDto(cgRes);
  64. cgList.AddRange(listDto);
  65. }
  66. }
  67. return Success(cgList);
  68. }
  69. catch (TaskCanceledException)
  70. {
  71. string msg = $"参估结果时间范围查询超时.任务ID={dto.TaskInfoID},{dto.BeginTime:yyyyMMddHHmmss}-{dto.EndTime:yyyyMMddHHmmss}";
  72. Serilog.Log.Error(msg);
  73. return Error<List<CgResDto>>("参估结果时间范围查询超时");
  74. }
  75. catch (Exception ex)
  76. {
  77. string msg = $"参估结果时间范围查询异常.任务ID={dto.TaskInfoID},{dto.BeginTime:yyyyMMddHHmmss}-{dto.EndTime:yyyyMMddHHmmss}";
  78. Serilog.Log.Error(ex, msg);
  79. return Error<List<CgResDto>>("参估结果时间范围查询异常");
  80. }
  81. }
  82. #region 定位结果查询接口
  83. /// <summary>
  84. /// 根据时间范围查询定位结果
  85. /// </summary>
  86. /// <param name="dto"><see cref="PosRequestByTimeRangeDto"/>查询参数</param>
  87. /// <returns></returns>
  88. /// <exception cref="Exception"></exception>
  89. [HttpPost]
  90. public async Task<AjaxResult<List<PosResDto>>> GetPosResByTimeRange(PosRequestByTimeRangeDto dto)
  91. {
  92. var response = (await GetPosResByTimeRangeObsolete(dto));
  93. if (response.code == 200)
  94. {
  95. var listDto = response.data?.Select(p => MapDto(p)).ToList();
  96. return Success(listDto);
  97. }
  98. else
  99. {
  100. return Error<List<PosResDto>>(response.msg);
  101. }
  102. }
  103. /// <summary>
  104. /// 查询最后X小时的的定位结果
  105. /// </summary>
  106. /// <param name="dto"><see cref="PosRequestByLastRangeDto"/>查询参数</param>
  107. /// <returns></returns>
  108. /// <exception cref="Exception"></exception>
  109. [HttpPost]
  110. public async Task<AjaxResult<List<PosResDto>>> GetPosResByLastHours(PosRequestByLastRangeDto dto)
  111. {
  112. var response = (await GetPosResByLastHoursObsolete(dto));
  113. if (response.code == 200)
  114. {
  115. var listDto = response.data?.Select(p => MapDto(p)).ToList();
  116. return Success(listDto);
  117. }
  118. else
  119. {
  120. return Error<List<PosResDto>>(response.msg);
  121. }
  122. }
  123. /// <summary>
  124. /// 根据定位结果加载查询条件频点
  125. /// </summary>
  126. /// <param name="dto">任务ID</param>
  127. /// <returns></returns>
  128. /// <exception cref="Exception"></exception>
  129. [HttpPost]
  130. public async Task<AjaxResult<List<PosFreq>>> GetFreqByTaskInfoID(PosFreqByTaskInfoIdDto dto)
  131. {
  132. var response = (await GetFreqByTaskIdObsolete(dto));
  133. if (response.code == 200)
  134. {
  135. var listDto = response.data?.ToList();
  136. return Success(listDto);
  137. }
  138. else
  139. {
  140. return Error<List<PosFreq>>(response.msg);
  141. }
  142. }
  143. /// <summary>
  144. /// 根据时间范围查询定位结果(此方法内部调用)
  145. /// </summary>
  146. /// <param name="dto"><see cref="PosRequestByTimeRangeDto"/>查询参数</param>
  147. /// <returns></returns>
  148. /// <exception cref="Exception"></exception>
  149. [HttpPost]
  150. [Obsolete]
  151. public async Task<AjaxResult<List<PosRes>>> GetPosResByTimeRangeObsolete(PosRequestByTimeRangeDto dto)
  152. {
  153. List<PosRes> posList = new List<PosRes>();
  154. try
  155. {
  156. DateTime start = dto.BeginTime;
  157. DateTime end = dto.EndTime;
  158. var dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DbPart");
  159. if (!Directory.Exists(dir)) return Success(posList);
  160. List<string> list = new List<string>();
  161. DateTime tempStart = new DateTime(start.Year, start.Month, start.Day);
  162. while (end >= tempStart)
  163. {
  164. list.Add(end.ToString("yyyy") + "\\" + end.ToString("MMdd") + ".db");
  165. end = end.AddDays(-1);
  166. }
  167. end = dto.EndTime;
  168. List<TargetInfo> targets;
  169. using (RHDWContext dbBasic = new RHDWContext())
  170. {
  171. targets = await dbBasic.TargetInfos.ToListAsync();
  172. }
  173. foreach (var item in list)
  174. {
  175. var dayFile = Path.Combine(dir, item);
  176. using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile))
  177. {
  178. if (db == null) continue;
  179. var query = db.PosRes.Where(p => p.SigTime >= start && p.SigTime <= end && p.TaskInfoID == dto.TaskInfoID);
  180. if (!dto.IncludeInvalidate)
  181. query = query.Where(p => p.PosLon != 999);
  182. if (dto.TarFrequpHz != null && dto.TarFrequpHz > 0)
  183. query = query.Where(p => p.FreqUpHz == dto.TarFrequpHz.Value);
  184. var posRes = await query.Include(p => p.CheckRes).OrderByDescending(p => p.SigTime).ToListAsync();
  185. foreach (var itemPos in posRes)
  186. {
  187. if (itemPos.TargetInfoID > 0)
  188. {
  189. itemPos.TargetInfo = targets.FirstOrDefault(p => p.ID == itemPos.TargetInfoID);
  190. if (itemPos.TargetInfo != null && !string.IsNullOrWhiteSpace(itemPos.TargetInfo.TargeColor))
  191. itemPos.ColorKey = itemPos.TargetInfo.TargeColor;
  192. }
  193. }
  194. posList.AddRange(posRes);
  195. }
  196. }
  197. return Success(posList);
  198. }
  199. catch (Exception ex)
  200. {
  201. string msg = $"定位结果时间范围查询异常.任务ID={dto.TaskInfoID},{dto.BeginTime:yyyyMMddHHmmss}-{dto.EndTime:yyyyMMddHHmmss}";
  202. Serilog.Log.Error(ex, msg);
  203. return Error<List<PosRes>>("定位结果时间范围查询异常");
  204. }
  205. }
  206. /// <summary>
  207. /// 根据时间范围查询定位结果(此方法内部调用)
  208. /// </summary>
  209. /// <param name="dto"><see cref="PosRequestByTimeRangeDto"/>查询参数</param>
  210. /// <returns></returns>
  211. /// <exception cref="Exception"></exception>
  212. [HttpPost]
  213. [Obsolete]
  214. public async Task<AjaxResult<List<RePosRes>>> GetPosCgResByTimeRangeObsolete(PosRequestByTimeRangeDto dto)
  215. {
  216. List<RePosRes> posList = new List<RePosRes>();
  217. try
  218. {
  219. DateTime start = dto.BeginTime;
  220. DateTime end = dto.EndTime;
  221. var dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DbPart");
  222. if (!Directory.Exists(dir)) return Success(posList);
  223. List<string> list = new List<string>();
  224. DateTime tempStart = new DateTime(start.Year, start.Month, start.Day);
  225. while (end >= tempStart)
  226. {
  227. list.Add(end.ToString("yyyy") + "\\" + end.ToString("MMdd") + ".db");
  228. end = end.AddDays(-1);
  229. }
  230. end = dto.EndTime;
  231. List<TargetInfo> targets;
  232. using (RHDWContext dbBasic = new RHDWContext())
  233. {
  234. targets = await dbBasic.TargetInfos.ToListAsync();
  235. }
  236. foreach (var item in list)
  237. {
  238. var dayFile = Path.Combine(dir, item);
  239. using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile))
  240. {
  241. if (db == null) continue;
  242. var query = db.PosRes.Where(p => p.SigTime >= start && p.SigTime <= end && p.TaskInfoID == dto.TaskInfoID);
  243. if (!dto.IncludeInvalidate)
  244. query = query.Where(p => p.PosLon != 999);
  245. if (dto.TarFrequpHz != null && dto.TarFrequpHz > 0)
  246. query = query.Where(p => p.FreqUpHz == dto.TarFrequpHz.Value);
  247. var posRes = await query.OrderByDescending(p => p.SigTime).ToListAsync();
  248. foreach (var itemPos in posRes)
  249. {
  250. var repos = new RePosRes();
  251. repos.ID = itemPos.ID;
  252. repos.SigTime = itemPos.SigTime;
  253. repos.PosLon = itemPos.PosLon;
  254. repos.PosLat = itemPos.PosLat;
  255. repos.MirrLon = itemPos.MirrLon;
  256. repos.MirrLat = itemPos.MirrLat;
  257. repos.TaskInfoID = itemPos.TaskInfoID;
  258. repos.FreqUpHz = itemPos.FreqUpHz;
  259. repos.StationResID = itemPos.StationResID;
  260. repos.CxResID = itemPos.CxResID;
  261. repos.CgResID = itemPos.CgResID;
  262. repos.CheckResID = itemPos.CheckResID;
  263. repos.PosResType = itemPos.PosResType;
  264. repos.TargetState = itemPos.TargetState;
  265. repos.TargetInfo = targets?.FirstOrDefault(p => p.ID == itemPos.TargetInfoID);
  266. if (itemPos.TargetInfo != null && !string.IsNullOrWhiteSpace(itemPos.TargetInfo.TargeColor))
  267. {
  268. repos.ColorKey = itemPos.TargetInfo.TargeColor;
  269. }
  270. repos.BaseTargetName = itemPos.TargetInfo?.TargetName;
  271. repos.CheckRes = await db.CheckRes.FirstOrDefaultAsync(p => p.ID == itemPos.CheckResID);
  272. repos.BaseCheckType = itemPos.CheckRes?.PosCheckType?.GetEnumDisplayName();
  273. repos.CgRes = await db.CgRes.FirstOrDefaultAsync(p => p.ID == itemPos.CgResID);
  274. repos.CxRes = await db.CxRes.FirstOrDefaultAsync(p => p.ID == itemPos.CxResID);
  275. repos.StationRes = await db.StationRes.FirstOrDefaultAsync(p => p.ID == itemPos.StationResID);
  276. posList.Add(repos);
  277. }
  278. }
  279. }
  280. return Success(posList);
  281. }
  282. catch (Exception ex)
  283. {
  284. string msg = $"定位结果时间范围查询异常.任务ID={dto.TaskInfoID},{dto.BeginTime:yyyyMMddHHmmss}-{dto.EndTime:yyyyMMddHHmmss}";
  285. Serilog.Log.Error(ex, msg);
  286. return Error<List<RePosRes>>("定位结果时间范围查询异常");
  287. }
  288. }
  289. /// <summary>
  290. /// 查询最后X小时的的定位结果(此方法内部调用)
  291. /// </summary>
  292. /// <param name="dto"><see cref="PosRequestByLastRangeDto"/>查询参数</param>
  293. /// <returns></returns>
  294. /// <exception cref="Exception"></exception>
  295. [HttpPost]
  296. [Obsolete]
  297. public async Task<AjaxResult<List<PosRes>>> GetPosResByLastHoursObsolete(PosRequestByLastRangeDto dto)
  298. {
  299. List<PosRes> posList = new List<PosRes>();
  300. try
  301. {
  302. var dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DbPart");
  303. if (!Directory.Exists(dir)) return Success(posList);
  304. var yearDirs = Directory.EnumerateDirectories(dir).OrderByDescending(p => Convert.ToInt32(new DirectoryInfo(p).Name));//年目录,倒叙排列
  305. DateTime max = DateTime.MinValue;
  306. foreach (var yearDir in yearDirs)
  307. {
  308. if (max != DateTime.MinValue) break;
  309. //每一天的db文件,倒序排列
  310. var dayFiles = Directory.EnumerateFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, yearDir), "*.db").OrderByDescending(p => Convert.ToInt32(new DirectoryInfo(p).Name.Substring(0, 4)));
  311. foreach (var dayFile in dayFiles)
  312. {
  313. using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile))
  314. {
  315. if (db == null) continue;
  316. var query = db.PosRes.Where(p => p.TaskInfoID == dto.TaskInfoID);
  317. if (!dto.IncludeInvalidate)
  318. {
  319. query = query.Where(p => p.PosLon != 999);
  320. }
  321. if (dto.TarFrequpHz != null && dto.TarFrequpHz > 0)
  322. {
  323. query = query.Where(p => p.FreqUpHz == dto.TarFrequpHz);
  324. }
  325. bool any = await query.AnyAsync();
  326. if (any)
  327. max = await query.MaxAsync(p => p.SigTime);
  328. }
  329. if (max != DateTime.MinValue)
  330. {
  331. break;
  332. }
  333. }
  334. }
  335. if (max == DateTime.MinValue) return Success(posList);
  336. DateTime min = max.AddHours(-dto.Hours);
  337. var res = await GetPosResByTimeRangeObsolete(new PosRequestByTimeRangeDto()
  338. {
  339. TaskInfoID = dto.TaskInfoID,
  340. BeginTime = min,
  341. EndTime = max,
  342. IncludeInvalidate = dto.IncludeInvalidate,
  343. TarFrequpHz = dto.TarFrequpHz,
  344. });
  345. return res;
  346. }
  347. catch (Exception ex)
  348. {
  349. string msg = $"定位结果查询最新数据异常-任务编号:{dto.TaskInfoID},Hours:{dto.Hours}";
  350. Serilog.Log.Error(ex, msg);
  351. return Error<List<PosRes>>("定位结果查询最新数据异常");
  352. }
  353. }
  354. /// <summary>
  355. /// 根据任务ID查询定位结果(此方法内部调用)
  356. /// </summary>
  357. /// <param name="dto">任务ID</param>
  358. /// <returns></returns>
  359. /// <exception cref="Exception"></exception>
  360. [HttpPost]
  361. [Obsolete]
  362. public async Task<AjaxResult<List<PosFreq>>> GetFreqByTaskIdObsolete(PosFreqByTaskInfoIdDto dto)
  363. {
  364. var posList = new List<PosFreq>();
  365. try
  366. {
  367. var dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DbPart");
  368. if (!Directory.Exists(dir)) return Success(posList);
  369. var yearDirs = Directory.EnumerateDirectories(dir).OrderByDescending(p => Convert.ToInt32(new DirectoryInfo(p).Name));//年目录,倒叙排列
  370. DateTime max = DateTime.MinValue;
  371. foreach (var yearDir in yearDirs)
  372. {
  373. if (max != DateTime.MinValue) break;
  374. //每一天的db文件,倒序排列
  375. var dayFiles = Directory.EnumerateFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, yearDir), "*.db").OrderByDescending(p => Convert.ToInt32(new DirectoryInfo(p).Name.Substring(0, 4)));
  376. foreach (var dayFile in dayFiles)
  377. {
  378. using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile))
  379. {
  380. if (db == null) continue;
  381. var query= await db.PosRes.Where(p => p.TaskInfoID == dto.TaskInfoID).Select(s => new PosFreq() { FreqUpHz = s.FreqUpHz }).Distinct().ToListAsync();
  382. //var noRepesat = query.Intersect(posList);
  383. //var noRepeat= query.Except(posList);
  384. posList.AddRange(query);
  385. }
  386. }
  387. }
  388. var res = posList.Distinct().ToList();
  389. return Success(res);
  390. }
  391. catch (Exception ex)
  392. {
  393. string msg = $"定位结果查询异常-任务编号:{dto.TaskInfoID}";
  394. Serilog.Log.Error(ex, msg);
  395. return Error<List<PosFreq>>("定位结果查询异常");
  396. }
  397. }
  398. #endregion
  399. private PosResDto MapDto(PosRes res)
  400. {
  401. return new PosResDto()
  402. {
  403. ID = res.ID,
  404. FreqUpHz = res.FreqUpHz,
  405. SigTime = res.SigTime,
  406. TaskInfoID = res.TaskInfoID,
  407. TarName = res.TargetInfo?.TargetName,
  408. PosLon = res.PosLon,
  409. PosLat = res.PosLat,
  410. MirrLon = res.MirrLon,
  411. MirrLat = res.MirrLat,
  412. CheckType = res.CheckRes?.PosCheckType == null ? "" : res.CheckRes?.PosCheckType?.GetEnumDisplayName(),
  413. TargetState = (EnumTargetStateDto)res.TargetState,
  414. PosResType = (EnumPosResTypeDto)res.PosResType,
  415. Confidence = res.Confidence,
  416. CreateTime = res.CreateTime,
  417. };
  418. }
  419. private List<CgResDto> MapCgDto(List<CgRes> listCg)
  420. {
  421. List<CgResDto> list = new List<CgResDto>();
  422. foreach (CgRes cgRes in listCg)
  423. {
  424. var dto = new CgResDto()
  425. {
  426. ID = cgRes.ID,
  427. TaskID = cgRes.TaskID,
  428. FreqUpHz = cgRes.TarFreqUp == null ? 0 : (long)(cgRes.TarFreqUp.Value),
  429. SigTime = cgRes.SigTime,
  430. Dto1 = cgRes.Dto1,
  431. Dfo1 = cgRes.Dfo1,
  432. Snr1 = cgRes.Snr1,
  433. Dto2 = cgRes.Dto2,
  434. Dfo2 = cgRes.Dfo2,
  435. Snr2 = cgRes.Snr2,
  436. DtoCdb = cgRes.DtoCdb,
  437. DfoCdb = cgRes.DfoCdb,
  438. SnrCdb = cgRes.SnrCdb,
  439. YbMainDto = cgRes.YbMainDto,
  440. YbMainDfo = cgRes.YbMainDfo,
  441. YbMainSnr = cgRes.YbMainSnr,
  442. YbAdja1Dto = cgRes.YbAdja1Dto,
  443. YbAdja1Dfo = cgRes.YbAdja1Dfo,
  444. YbAdja1Snr = cgRes.YbAdja1Snr,
  445. YbAdja2Dfo = cgRes.YbAdja2Dfo,
  446. YbAdja2Dto = cgRes.YbAdja2Dto,
  447. YbAdja2Snr = cgRes.YbAdja2Snr,
  448. TarFreqUp = cgRes.TarFreqUp,
  449. TarFreqDown = cgRes.TarFreqDown,
  450. RefFreqUp = cgRes.RefFreqUp,
  451. RefFreqDown = cgRes.RefFreqDown,
  452. MainCode = cgRes.MainCode,
  453. Adja1Code = cgRes.Adja1Code,
  454. Adja2Code = cgRes.Adja2Code,
  455. MainXlTime = cgRes.MainXlTime,
  456. Adja1XlTime = cgRes.Adja1XlTime,
  457. Adja2XlTime = cgRes.Adja2XlTime,
  458. MainX = cgRes.MainX,
  459. MainY = cgRes.MainY,
  460. MainZ = cgRes.MainZ,
  461. MainVx = cgRes.MainVx,
  462. MainVy = cgRes.MainVy,
  463. MainVz = cgRes.MainVz,
  464. Adja1X = cgRes.Adja1X,
  465. Adja1Y = cgRes.Adja1Y,
  466. Adja1Z = cgRes.Adja1Z,
  467. Adja1Vx = cgRes.Adja1Vx,
  468. Adja1Vy = cgRes.Adja1Vy,
  469. Adja1Vz = cgRes.Adja1Vz,
  470. Adja2X = cgRes.Adja2X,
  471. Adja2Y = cgRes.Adja2Y,
  472. Adja2Z = cgRes.Adja2Z,
  473. Adja2Vx = cgRes.Adja2Vx,
  474. Adja2Vy = cgRes.Adja2Vy,
  475. Adja2Vz = cgRes.Adja2Vz,
  476. SatTxLon = cgRes.StationRes.SatTxLon,
  477. SatTxLat = cgRes.StationRes.SatTxLat,
  478. CdbTxLon = cgRes.StationRes.CdbTxLon,
  479. CdbTxLat = cgRes.StationRes.CdbTxLat,
  480. CxLon = cgRes.StationRes.CxLon,
  481. CxLat = cgRes.StationRes.CxLat,
  482. RefLon = cgRes.StationRes.RefLon,
  483. RefLat = cgRes.StationRes.RefLat,
  484. CreateTime = cgRes.CreateTime,
  485. };
  486. list.Add(dto);
  487. }
  488. return list;
  489. }
  490. }
  491. }