using System.Text.Json; using System.Threading.Tasks; using CSRedis; using dodohold.core; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using molilian.core; namespace molilian.api.Controllers { [ApiController] [MyAuthorize("admin")] [Route("api/[controller]/[action]")] public class TracksAdminController : ControllerBase { readonly IAuthorizationProvider provider = new AdminProvider(); protected IHttpContextAccessor _accessor; public TracksAdminController(IHttpContextAccessor accessor) { _accessor = accessor; } [HttpPost] public ActionResult list([FromBody] JsonElement form) { var token = provider.Get(_accessor.HttpContext); int page = form.Read("current", 1); int size = form.Read("pageSize", 10); bool getTotal = form.Read("getTotal", true); string sort = form.Read("sort", "id"); string order = form.Read("order", "DESC"); string keyword = form.Read("keyword", string.Empty); string filter = string.Empty; if (!string.IsNullOrEmpty(keyword)) { filter += " AND (event_type LIKE @keyword OR platform LIKE @keyword OR typename LIKE @keyword OR scene LIKE @keyword OR unique_id LIKE @keyword)"; keyword = $"%{keyword}%"; } filter = filter.StringTrimStart(" AND "); order = "descending".Equals(order, System.StringComparison.OrdinalIgnoreCase) ? "DESC" : "ascending".Equals(order, System.StringComparison.OrdinalIgnoreCase) ? "ASC" : order; string orderBy = string.IsNullOrEmpty(sort) ? "id DESC" : $"{sort} {order}"; var result = new DBContext.Table("track_links") .Where(filter, new { keyword }) .Page(size, page) .Order(orderBy) .PageList(getTotal); return new APIResult(new { data = result }); } [HttpGet] public ActionResult info([FromQuery] int id) { var token = provider.Get(_accessor.HttpContext); var item = new DBContext.Table("track_links").Get("id=@id", new { id }); return new APIResult(new { data = item }); } [HttpPost] public ActionResult report([FromBody] JsonElement form) { var token = provider.Get(_accessor.HttpContext); int page = form.Read("current", 1); int size = form.Read("pageSize", 10); bool getTotal = form.Read("getTotal", true); int linkId = form.Read("track_link_id", 0); int accountId = form.Read("account_id", -1); bool includeAccountBreakdown = form.Read("include_account_breakdown", false); bool accountBreakdownOnly = form.Read("account_breakdown_only", false); string eventType = form.Read("event_type", string.Empty); string platform = form.Read("platform", string.Empty); string typename = form.Read("typename", string.Empty); string scene = form.Read("scene", string.Empty); string uniqueId = form.Read("unique_id", string.Empty); DateTime? start = form.Read("start", null); DateTime? end = form.Read("end", null); string filter = string.Empty; if (linkId > 0) filter += " AND track_link_id=@linkId"; if (accountBreakdownOnly) filter += " AND account_id>0"; else if (accountId >= 0) filter += " AND account_id=@accountId"; else if (!includeAccountBreakdown) filter += " AND account_id=0"; if (!string.IsNullOrWhiteSpace(eventType)) filter += " AND event_type=@eventType"; if (!string.IsNullOrWhiteSpace(platform)) filter += " AND platform=@platform"; if (!string.IsNullOrWhiteSpace(typename)) filter += " AND typename=@typename"; if (!string.IsNullOrWhiteSpace(scene)) filter += " AND scene=@scene"; if (!string.IsNullOrWhiteSpace(uniqueId)) filter += " AND unique_id=@uniqueId"; if (start.HasValue) filter += " AND report_date>=@start"; if (end.HasValue) filter += " AND report_date<=@end"; filter = filter.StringTrimStart(" AND "); string orderBy = "report_date DESC"; var result = new DBContext.Table("track_daily_report") .Where(filter, new { linkId, accountId, eventType, platform, typename, scene, uniqueId, start, end }) .Page(size, page) .Order(orderBy) .PageList(getTotal); return new APIResult(new { data = result }); } [HttpPost] public async Task hourly([FromBody] JsonElement form) { var token = provider.Get(_accessor.HttpContext); int linkId = form.Read("track_link_id", 0); int accountId = form.Read("account_id", 0); string dateText = form.Read("date", string.Empty); string scene = form.Read("scene", string.Empty); DateTime date = DateTime.TryParse(dateText, out var parsed) ? parsed.Date : DateTime.Now.Date; var list = await TracksCore.GetHourlyReportAsync(linkId, date, scene, accountId); return new APIResult(new { data = new { list, count = list.Count } }); } [HttpPost] public async Task create([FromBody] TrackLinkDTO data) { var token = provider.Get(_accessor.HttpContext); if (string.IsNullOrWhiteSpace(data.typename)) data.typename = data.platform; if (string.IsNullOrWhiteSpace(data.platform)) data.platform = data.typename; var link = await TracksCore.CreateLinkAsync(data.event_type, data.platform, data.typename, data.scene, data.unique_id, data.description, true); bool success = link != null && link.id > 0; return new APIResult(new { data = link, success, msg = success ? "创建成功" : "创建失败" }); } [HttpPost] public ActionResult delete([FromBody] JsonElement form) { var token = provider.Get(_accessor.HttpContext); int id = form.Read("id"); using var conn = DBContext.GetOpenConnection(); var item = new DBContext.Table(conn, "track_links").Get("id=@id", new { id }); if (item == null) return new APIResult(new { data = new { success = false, msg = "记录不存在" } }); var result = new DBContext.Table("track_links").Delete("id=@id", new { id }); bool success = result > 0; if (success) { string eventType = (item.event_type ?? string.Empty).Trim().ToLowerInvariant(); string platform = (item.platform ?? string.Empty).Trim(); string typename = (item.typename ?? string.Empty).Trim(); string scene = string.IsNullOrWhiteSpace(item.scene) ? string.Empty : item.scene.Trim(); string uniqueId = string.IsNullOrWhiteSpace(item.unique_id) ? string.Empty : item.unique_id.Trim(); string cacheKey = TracksCore.GetLinkCacheKey(eventType, platform, typename, scene, uniqueId); RedisHelper.Del(cacheKey); RedisHelper.Del(TracksCore.GetLinkIdCacheKey(item.id)); } return new APIResult(new { data = new { success, msg = success ? "删除成功" : "删除失败" }, }); } } }