TracksAdminController.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. using System.Text.Json;
  2. using System.Threading.Tasks;
  3. using CSRedis;
  4. using dodohold.core;
  5. using Microsoft.AspNetCore.Http;
  6. using Microsoft.AspNetCore.Mvc;
  7. using molilian.core;
  8. namespace molilian.api.Controllers
  9. {
  10. [ApiController]
  11. [MyAuthorize("admin")]
  12. [Route("api/[controller]/[action]")]
  13. public class TracksAdminController : ControllerBase
  14. {
  15. readonly IAuthorizationProvider provider = new AdminProvider();
  16. protected IHttpContextAccessor _accessor;
  17. public TracksAdminController(IHttpContextAccessor accessor)
  18. {
  19. _accessor = accessor;
  20. }
  21. [HttpPost]
  22. public ActionResult list([FromBody] JsonElement form)
  23. {
  24. var token = provider.Get(_accessor.HttpContext);
  25. int page = form.Read("current", 1);
  26. int size = form.Read("pageSize", 10);
  27. bool getTotal = form.Read("getTotal", true);
  28. string sort = form.Read("sort", "id");
  29. string order = form.Read("order", "DESC");
  30. string keyword = form.Read("keyword", string.Empty);
  31. string filter = string.Empty;
  32. if (!string.IsNullOrEmpty(keyword))
  33. {
  34. filter += " AND (event_type LIKE @keyword OR platform LIKE @keyword OR typename LIKE @keyword OR scene LIKE @keyword OR unique_id LIKE @keyword)";
  35. keyword = $"%{keyword}%";
  36. }
  37. filter = filter.StringTrimStart(" AND ");
  38. order = "descending".Equals(order, System.StringComparison.OrdinalIgnoreCase) ? "DESC" :
  39. "ascending".Equals(order, System.StringComparison.OrdinalIgnoreCase) ? "ASC" : order;
  40. string orderBy = string.IsNullOrEmpty(sort) ? "id DESC" : $"{sort} {order}";
  41. var result = new DBContext.Table("track_links")
  42. .Where(filter, new { keyword })
  43. .Page(size, page)
  44. .Order(orderBy)
  45. .PageList<dynamic>(getTotal);
  46. return new APIResult(new { data = result });
  47. }
  48. [HttpGet]
  49. public ActionResult info([FromQuery] int id)
  50. {
  51. var token = provider.Get(_accessor.HttpContext);
  52. var item = new DBContext.Table("track_links").Get<TrackLinkDTO>("id=@id", new { id });
  53. return new APIResult(new { data = item });
  54. }
  55. [HttpPost]
  56. public ActionResult report([FromBody] JsonElement form)
  57. {
  58. var token = provider.Get(_accessor.HttpContext);
  59. int page = form.Read("current", 1);
  60. int size = form.Read("pageSize", 10);
  61. bool getTotal = form.Read("getTotal", true);
  62. int linkId = form.Read("track_link_id", 0);
  63. string eventType = form.Read("event_type", string.Empty);
  64. string platform = form.Read("platform", string.Empty);
  65. string typename = form.Read("typename", string.Empty);
  66. string scene = form.Read("scene", string.Empty);
  67. string uniqueId = form.Read("unique_id", string.Empty);
  68. DateTime? start = form.Read<DateTime?>("start", null);
  69. DateTime? end = form.Read<DateTime?>("end", null);
  70. string filter = string.Empty;
  71. if (linkId > 0) filter += " AND track_link_id=@linkId";
  72. if (!string.IsNullOrWhiteSpace(eventType)) filter += " AND event_type=@eventType";
  73. if (!string.IsNullOrWhiteSpace(platform)) filter += " AND platform=@platform";
  74. if (!string.IsNullOrWhiteSpace(typename)) filter += " AND typename=@typename";
  75. if (!string.IsNullOrWhiteSpace(scene)) filter += " AND scene=@scene";
  76. if (!string.IsNullOrWhiteSpace(uniqueId)) filter += " AND unique_id=@uniqueId";
  77. if (start.HasValue) filter += " AND report_date>=@start";
  78. if (end.HasValue) filter += " AND report_date<=@end";
  79. filter = filter.StringTrimStart(" AND ");
  80. string orderBy = "report_date DESC";
  81. var result = new DBContext.Table("track_daily_report")
  82. .Where(filter, new { linkId, eventType, platform, typename, scene, uniqueId, start, end })
  83. .Page(size, page)
  84. .Order(orderBy)
  85. .PageList<TrackDailyReportDTO>(getTotal);
  86. return new APIResult(new { data = result });
  87. }
  88. [HttpPost]
  89. public async Task<ActionResult> hourly([FromBody] JsonElement form)
  90. {
  91. var token = provider.Get(_accessor.HttpContext);
  92. int linkId = form.Read("track_link_id", 0);
  93. string dateText = form.Read("date", string.Empty);
  94. string scene = form.Read("scene", string.Empty);
  95. DateTime date = DateTime.TryParse(dateText, out var parsed) ? parsed.Date : DateTime.Now.Date;
  96. var list = await TracksCore.GetHourlyReportAsync(linkId, date, scene);
  97. return new APIResult(new
  98. {
  99. data = new
  100. {
  101. list,
  102. count = list.Count
  103. }
  104. });
  105. }
  106. [HttpPost]
  107. public async Task<ActionResult> create([FromBody] TrackLinkDTO data)
  108. {
  109. var token = provider.Get(_accessor.HttpContext);
  110. if (string.IsNullOrWhiteSpace(data.typename)) data.typename = data.platform;
  111. if (string.IsNullOrWhiteSpace(data.platform)) data.platform = data.typename;
  112. var link = await TracksCore.CreateLinkAsync(data.event_type, data.platform, data.typename, data.scene, data.unique_id, data.description, true);
  113. bool success = link != null && link.id > 0;
  114. return new APIResult(new
  115. {
  116. data = link,
  117. success,
  118. msg = success ? "创建成功" : "创建失败"
  119. });
  120. }
  121. [HttpPost]
  122. public ActionResult delete([FromBody] JsonElement form)
  123. {
  124. var token = provider.Get(_accessor.HttpContext);
  125. int id = form.Read<int>("id");
  126. using var conn = DBContext.GetOpenConnection();
  127. var item = new DBContext.Table(conn, "track_links").Get<TrackLinkDTO>("id=@id", new { id });
  128. if (item == null) return new APIResult(new { data = new { success = false, msg = "记录不存在" } });
  129. var result = new DBContext.Table("track_links").Delete("id=@id", new { id });
  130. bool success = result > 0;
  131. if (success)
  132. {
  133. string eventType = (item.event_type ?? string.Empty).Trim().ToLowerInvariant();
  134. string platform = (item.platform ?? string.Empty).Trim();
  135. string typename = (item.typename ?? string.Empty).Trim();
  136. string scene = string.IsNullOrWhiteSpace(item.scene) ? string.Empty : item.scene.Trim();
  137. string uniqueId = string.IsNullOrWhiteSpace(item.unique_id) ? string.Empty : item.unique_id.Trim();
  138. string cacheKey = TracksCore.GetLinkCacheKey(eventType, platform, typename, scene, uniqueId);
  139. RedisHelper.Del(cacheKey);
  140. RedisHelper.Del(TracksCore.GetLinkIdCacheKey(item.id));
  141. }
  142. return new APIResult(new
  143. {
  144. data = new { success, msg = success ? "删除成功" : "删除失败" },
  145. });
  146. }
  147. }
  148. }