TaobaoController.cs 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775
  1. using molilian.core;
  2. using dodohold.core;
  3. using Microsoft.AspNetCore.Mvc;
  4. using System.Text.Json;
  5. using System.Net;
  6. using static QRCoder.PayloadGenerator;
  7. namespace molilian.api.Controllers
  8. {
  9. [ApiController]
  10. [MyAuthorize("admin")]
  11. [Route("api/[controller]/[action]")]
  12. public class TaobaoController : ControllerBase
  13. {
  14. readonly IAuthorizationProvider provider = new AdminProvider();
  15. protected IHttpContextAccessor _accessor;
  16. public TaobaoController(IHttpContextAccessor accessor)
  17. {
  18. _accessor = accessor;
  19. }
  20. [HttpPost]
  21. public async Task<ActionResult> updateCookies([FromBody] JsonElement form)
  22. {
  23. string cookie = form.Read<string>("cookie", string.Empty);
  24. string user_agent = _accessor.HttpContext.Request.UserAgent();
  25. var success = TkPoolCore.UpdateCookies(cookie, user_agent);
  26. return new APIResult(new
  27. {
  28. data = new { success, msg = success ? "更新成功" : "更新失败,请检查输入的cookie" },
  29. });
  30. }
  31. [HttpPost]
  32. public async Task<ActionResult> update([FromBody] JsonElement form)
  33. {
  34. int id = form.Read<int>("id", 0);
  35. string name = form.Read<string>("name", string.Empty);
  36. string val = form.Read<string>("val", string.Empty);
  37. if (id == 0)
  38. {
  39. return new APIResult(new { data = new { success = false, msg = "更新失败,请检查输入的cookie" } });
  40. }
  41. int result;
  42. switch (name)
  43. {
  44. case "enable_fake_click":
  45. case "enable_parse":
  46. case "enable_coupon":
  47. case "status":
  48. bool bVal = val.Equals("True");
  49. result = new DBContext.Table("tk_pool")
  50. .Add(name, bVal)
  51. .Add("last_time", DateTime.Now)
  52. .Where("id=@id", new { id })
  53. .Update();
  54. break;
  55. default:
  56. return new APIResult(new { data = new { success = false, msg = "更新失败,未授权操作" } });
  57. }
  58. bool success = result > 0;
  59. if (success) await EndPointCore.NotifyReload(true);
  60. return new APIResult(new
  61. {
  62. data = new { success, msg = success ? "更新成功" : "更新失败,请检查输入信息" },
  63. });
  64. }
  65. /// <summary>
  66. /// 账号列表
  67. /// </summary>
  68. /// <param name="form"></param>
  69. /// <returns></returns>
  70. [HttpPost]
  71. public ActionResult list([FromBody] JsonElement form)
  72. {
  73. var token = provider.Get(_accessor.HttpContext);
  74. int page = form.Read("current", 1);
  75. int size = form.Read("pageSize", 10);
  76. string keyword = form.Read("name", string.Empty);
  77. bool getTotal = form.Read("getTotal", true);
  78. string _status = form.Read("status", string.Empty);
  79. int status = _status switch
  80. {
  81. "online" => 1,
  82. "offline" => 0,
  83. _ => -1,
  84. };
  85. var lastTime = form.PathReadArray<string>("lastTime[]");
  86. string sort = form.Read<string>("sort");
  87. string order = form.Read<string>("order");
  88. string filter = string.Empty;
  89. if (!string.IsNullOrEmpty(keyword))
  90. {
  91. filter += $" AND (`name` LIKE @keyword OR `description` LIKE @keyword)";
  92. keyword = $"%{keyword}%";
  93. }
  94. DateTime stime = DateTime.MinValue, etime = DateTime.MinValue;
  95. if (lastTime.Count == 2)
  96. {
  97. if (DateTime.TryParse(lastTime[0], out stime) && DateTime.TryParse(lastTime[1], out etime))
  98. {
  99. etime = etime.AddDays(1).AddSeconds(-1);
  100. filter += $" AND last_time BETWEEN @stime AND @etime";
  101. }
  102. }
  103. if (status != -1)
  104. {
  105. filter += $" AND status=@status";
  106. }
  107. filter = filter.StringTrimStart(" AND ");
  108. //排序
  109. string orderBy = "id DESC";
  110. if (!string.IsNullOrEmpty(order))
  111. {
  112. order = "descending".Equals(order) ? "DESC" : "ASC";
  113. orderBy = sort switch
  114. {
  115. //"num" => $"num {order}",
  116. _ => $"{sort} {order}",
  117. };
  118. }
  119. using var conn = DBContext.GetOpenConnection();
  120. var result = new DBContext.Table(conn, "tk_pool")
  121. .Where(filter, new { keyword, status, stime, etime })
  122. .Page(size, page)
  123. .Order(orderBy)
  124. .PageList<TkPoolDTO>(getTotal);
  125. foreach (var item in result.List)
  126. {
  127. item.current_amt = Math.Round(TkPoolCore.GetIncomeAmt(item.name), 2);
  128. item.cookies = string.Empty;
  129. }
  130. return new APIResult(new { data = result });
  131. }
  132. [HttpPost]
  133. public ActionResult report_dailys([FromBody] JsonElement form)
  134. {
  135. int page = form.Read("current", 1);
  136. int size = form.Read("pageSize", 10);
  137. bool getTotal = form.Read("getTotal", true);
  138. string sort = form.Read<string>("sort");
  139. string order = form.Read<string>("order");
  140. var report_date = form.PathReadArray<string>("query_date[]");
  141. string dailys_accountName = "all";
  142. int dailys_accountId = 0;
  143. string filter = string.Empty;
  144. DateTime stime = DateTime.MinValue, etime = DateTime.MinValue;
  145. if (report_date.Count == 2)
  146. {
  147. if (DateTime.TryParse(report_date[0], out stime) && DateTime.TryParse(report_date[1], out etime))
  148. {
  149. etime = etime.AddDays(1).AddSeconds(-1);
  150. filter += $" AND A.report_date BETWEEN @stime AND @etime";
  151. }
  152. }
  153. filter = filter.StringTrimStart(" AND ");
  154. //排序
  155. string orderBy = "A.report_date DESC";
  156. if (!string.IsNullOrEmpty(order))
  157. {
  158. order = "descending".Equals(order) ? "DESC" : "ASC";
  159. orderBy = sort switch
  160. {
  161. _ => $"A.{sort} {order}",
  162. };
  163. }
  164. var result = new DBContext.Table("v_tk_report_dailys")
  165. .LeftJoin("daily_logs",
  166. "B.log_date = A.report_date AND B.channel=0 AND B.accountId=@dailys_accountId",
  167. "total_count, B.abandon_count, B.success_count, B.abandon_percentage, B.success_percentage," +
  168. "B.parse_total_count, B.parse_abandon_count, B.parse_success_count, B.parse_abandon_percentage, B.parse_success_percentage," +
  169. "B.coupon_total_count, B.coupon_abandon_count, B.coupon_success_count, B.coupon_abandon_percentage, B.coupon_success_percentage," +
  170. "B.tool_total_count, B.tool_abandon_count, B.tool_success_count, B.tool_abandon_percentage, B.tool_success_percentage")
  171. .Where(filter, new { dailys_accountId, dailys_accountName, stime, etime })
  172. .Page(size, page)
  173. .Order(orderBy)
  174. .PageList<TkReportDTO>(getTotal);
  175. foreach (var item in result.List)
  176. {
  177. if (item.report_date.Date < DateTime.Now.Date) continue;
  178. if (item.total_count == 0)
  179. {
  180. item.total_count = TkLogCore.GetTotal($":total:tb:{item.report_date:yyyyMMdd}");
  181. if (item.total_count == 0) continue;
  182. item.success_count = TkLogCore.GetTotal($":total:tb:success:{item.report_date:yyyyMMdd}");
  183. item.abandon_count = TkLogCore.GetTotal($":total:tb:放弃转链:{item.report_date:yyyyMMdd}");
  184. if (item.total_count > 0)
  185. {
  186. item.success_percentage = $"{item.success_count / (double)item.total_count * 100:f2}%";
  187. item.abandon_percentage = $"{item.abandon_count / (double)item.total_count * 100:f2}%";
  188. }
  189. }
  190. if (item.parse_total_count == 0)
  191. {
  192. item.parse_total_count = TkLogCore.GetTotal($":parse_total:tb:{item.report_date:yyyyMMdd}");
  193. if (item.parse_total_count == 0) continue;
  194. item.parse_success_count = TkLogCore.GetTotal($":parse_total:tb:success:{item.report_date:yyyyMMdd}");
  195. item.parse_abandon_count = TkLogCore.GetTotal($":parse_total:tb:放弃转链:{item.report_date:yyyyMMdd}");
  196. if (item.parse_total_count > 0)
  197. {
  198. item.parse_success_percentage = $"{item.parse_success_count / (double)item.parse_total_count * 100:f2}%";
  199. item.parse_abandon_percentage = $"{item.parse_abandon_count / (double)item.parse_total_count * 100:f2}%";
  200. }
  201. }
  202. if (item.coupon_total_count == 0)
  203. {
  204. item.coupon_total_count = TkLogCore.GetTotal($":coupon_total:tb:{item.report_date:yyyyMMdd}");
  205. if (item.coupon_total_count == 0) continue;
  206. item.coupon_success_count = TkLogCore.GetTotal($":coupon_total:tb:success:{item.report_date:yyyyMMdd}");
  207. item.coupon_abandon_count = TkLogCore.GetTotal($":coupon_total:tb:放弃转链:{item.report_date:yyyyMMdd}");
  208. if (item.coupon_total_count > 0)
  209. {
  210. item.coupon_success_percentage = $"{item.coupon_success_count / (double)item.coupon_total_count * 100:f2}%";
  211. item.coupon_abandon_percentage = $"{item.coupon_abandon_count / (double)item.coupon_total_count * 100:f2}%";
  212. }
  213. }
  214. if (item.tool_total_count == 0)
  215. {
  216. item.tool_total_count = TkLogCore.GetTotal($":parse_total:tool:{item.report_date:yyyyMMdd}");
  217. if (item.tool_total_count == 0) continue;
  218. item.tool_success_count = TkLogCore.GetTotal($":parse_total:tool:success:{item.report_date:yyyyMMdd}");
  219. item.tool_abandon_count = TkLogCore.GetTotal($":parse_total:tool:放弃转链:{item.report_date:yyyyMMdd}");
  220. if (item.tool_total_count > 0)
  221. {
  222. item.tool_success_percentage = $"{item.tool_success_count / (double)item.tool_total_count * 100:f2}%";
  223. item.tool_abandon_percentage = $"{item.tool_abandon_count / (double)item.tool_total_count * 100:f2}%";
  224. }
  225. }
  226. }
  227. return new APIResult(new { data = result });
  228. }
  229. [HttpPost]
  230. public ActionResult report_list([FromBody] JsonElement form)
  231. {
  232. int page = form.Read("current", 1);
  233. int size = form.Read("pageSize", 10);
  234. bool getTotal = form.Read("getTotal", true);
  235. string sort = form.Read<string>("sort");
  236. string order = form.Read<string>("order");
  237. var report_date = form.PathReadArray<string>("query_date[]");
  238. int accountId = form.Read("accountId", 0);
  239. string filter = string.Empty;
  240. if (accountId != 0)
  241. {
  242. filter += $" AND A.accountId=@accountId";
  243. }
  244. DateTime stime = DateTime.MinValue, etime = DateTime.MinValue;
  245. if (report_date.Count == 2)
  246. {
  247. if (DateTime.TryParse(report_date[0], out stime) && DateTime.TryParse(report_date[1], out etime))
  248. {
  249. etime = etime.AddDays(1).AddSeconds(-1);
  250. filter += $" AND A.report_date BETWEEN @stime AND @etime";
  251. }
  252. }
  253. filter = filter.StringTrimStart(" AND ");
  254. //排序
  255. string orderBy = "A.id DESC";
  256. if (!string.IsNullOrEmpty(order))
  257. {
  258. order = "descending".Equals(order) ? "DESC" : "ASC";
  259. orderBy = sort switch
  260. {
  261. _ => $"A.{sort} {order}",
  262. };
  263. }
  264. var result = new DBContext.Table("tk_report")
  265. .LeftJoin("daily_logs",
  266. "B.log_date = A.report_date AND B.channel=0 AND B.accountId=A.accountId",
  267. "total_count, B.abandon_count, B.success_count, B.abandon_percentage, B.success_percentage," +
  268. "B.parse_total_count, B.parse_abandon_count, B.parse_success_count, B.parse_abandon_percentage, B.parse_success_percentage," +
  269. "B.coupon_total_count, B.coupon_abandon_count, B.coupon_success_count, B.coupon_abandon_percentage, B.coupon_success_percentage," +
  270. "B.tool_total_count, B.tool_abandon_count, B.tool_success_count, B.tool_abandon_percentage, B.tool_success_percentage")
  271. .Where(filter, new { accountId, stime, etime })
  272. .Page(size, page)
  273. .Order(orderBy)
  274. .PageList<TkReportDTO>(getTotal);
  275. foreach (var item in result.List)
  276. {
  277. #if DEBUG
  278. #else
  279. if (item.report_date.Date < DateTime.Now.Date) continue;
  280. #endif
  281. //var tk = TkPoolCore.GetOne(item.accountId);
  282. //if (tk != null) item.accountName = tk.company;
  283. string accountName = $"{TkChannelEnum.tb}_{item.accountId}";
  284. if (item.total_count == 0)
  285. {
  286. item.total_count = TkLogCore.GetTotal($":total:{accountName}:{item.report_date:yyyyMMdd}");
  287. if (item.total_count == 0)
  288. {
  289. //todo 过度用, 0613 跑两天就可以删掉
  290. accountName = item.accountName;
  291. item.total_count = TkLogCore.GetTotal($":total:{accountName}:{item.report_date:yyyyMMdd}");
  292. }
  293. if (item.total_count == 0) continue;
  294. item.success_count = TkLogCore.GetTotal($":total:{accountName}:success:{item.report_date:yyyyMMdd}");
  295. item.abandon_count = TkLogCore.GetTotal($":total:{accountName}:放弃转链:{item.report_date:yyyyMMdd}");
  296. if (item.total_count > 0)
  297. {
  298. item.success_percentage = $"{item.success_count / (double)item.total_count * 100:f2}%";
  299. item.abandon_percentage = $"{item.abandon_count / (double)item.total_count * 100:f2}%";
  300. }
  301. }
  302. if (item.parse_total_count == 0)
  303. {
  304. item.parse_total_count = TkLogCore.GetTotal($":parse_total:{accountName}:{item.report_date:yyyyMMdd}");
  305. if (item.parse_total_count == 0) continue;
  306. item.parse_success_count = TkLogCore.GetTotal($":parse_total:{accountName}:success:{item.report_date:yyyyMMdd}");
  307. item.parse_abandon_count = TkLogCore.GetTotal($":parse_total:{accountName}:放弃转链:{item.report_date:yyyyMMdd}");
  308. if (item.parse_total_count > 0)
  309. {
  310. item.parse_success_percentage = $"{item.parse_success_count / (double)item.parse_total_count * 100:f2}%";
  311. item.parse_abandon_percentage = $"{item.parse_abandon_count / (double)item.parse_total_count * 100:f2}%";
  312. }
  313. }
  314. if (item.coupon_total_count == 0)
  315. {
  316. item.coupon_total_count = TkLogCore.GetTotal($":coupon_total:{accountName}:{item.report_date:yyyyMMdd}");
  317. if (item.coupon_total_count == 0) continue;
  318. item.coupon_success_count = TkLogCore.GetTotal($":coupon_total:{accountName}:success:{item.report_date:yyyyMMdd}");
  319. item.coupon_abandon_count = TkLogCore.GetTotal($":coupon_total:{accountName}:放弃转链:{item.report_date:yyyyMMdd}");
  320. if (item.coupon_total_count > 0)
  321. {
  322. item.coupon_success_percentage = $"{item.coupon_success_count / (double)item.coupon_total_count * 100:f2}%";
  323. item.coupon_abandon_percentage = $"{item.coupon_abandon_count / (double)item.coupon_total_count * 100:f2}%";
  324. }
  325. }
  326. if (item.tool_total_count == 0)
  327. {
  328. item.tool_total_count = TkLogCore.GetTotal($":parse_total:tool:{item.report_date:yyyyMMdd}");
  329. if (item.tool_total_count == 0) continue;
  330. item.tool_success_count = TkLogCore.GetTotal($":parse_total:tool:success:{item.report_date:yyyyMMdd}");
  331. item.tool_abandon_count = TkLogCore.GetTotal($":parse_total:tool:放弃转链:{item.report_date:yyyyMMdd}");
  332. if (item.tool_total_count > 0)
  333. {
  334. item.tool_success_percentage = $"{item.tool_success_count / (double)item.tool_total_count * 100:f2}%";
  335. item.tool_abandon_percentage = $"{item.tool_abandon_count / (double)item.tool_total_count * 100:f2}%";
  336. }
  337. }
  338. }
  339. return new APIResult(new { data = result });
  340. }
  341. [HttpPost]
  342. public ActionResult report_hourtrend([FromBody] JsonElement form)
  343. {
  344. int page = form.Read("current", 1);
  345. int size = form.Read("pageSize", 10);
  346. bool getTotal = form.Read("getTotal", true);
  347. string sort = form.Read<string>("sort");
  348. string order = form.Read<string>("order");
  349. var report_date = form.PathReadArray<string>("query_date[]");
  350. int accountId = form.Read("accountId", 0);
  351. string filter = string.Empty;
  352. if (accountId != 0)
  353. {
  354. filter += $" AND accountId=@accountId";
  355. }
  356. DateTime stime = DateTime.MinValue, etime = DateTime.MinValue;
  357. if (report_date.Count == 2)
  358. {
  359. if (DateTime.TryParse(report_date[0], out stime) && DateTime.TryParse(report_date[1], out etime))
  360. {
  361. etime = etime.AddDays(1).AddSeconds(-1);
  362. if (etime > DateTime.Now) etime = DateTime.Now;
  363. filter += $" AND report_date BETWEEN @stime AND @etime";
  364. }
  365. }
  366. filter = filter.StringTrimStart(" AND ");
  367. //排序
  368. string orderBy = "id ASC";
  369. if (!string.IsNullOrEmpty(order))
  370. {
  371. order = "descending".Equals(order) ? "DESC" : "ASC";
  372. orderBy = sort switch
  373. {
  374. _ => $"{sort} {order}",
  375. };
  376. }
  377. using var conn = DBContext.GetOpenConnection();
  378. var result = new DBContext.Table(conn, "tk_report_hourtrend")
  379. .Where(filter, new { accountId, stime, etime })
  380. .Page(size, page)
  381. .Order(orderBy)
  382. .PageList<TkReportDTO>(getTotal);
  383. foreach (var item in result.List)
  384. {
  385. #if DEBUG
  386. #else
  387. if (item.report_date.Date < DateTime.Now.Date) continue;
  388. #endif
  389. string accountName = $"{TkChannelEnum.tb}_{item.accountId}";
  390. if (item.total_count == 0)
  391. {
  392. item.total_count = TkLogCore.GetTotal($":total:{accountName}:{item.report_date:yyyyMMddHH}");
  393. if (item.total_count == 0)
  394. {
  395. //todo 过度用, 0613 跑两天就可以删掉
  396. accountName = item.accountName;
  397. item.total_count = TkLogCore.GetTotal($":total:{accountName}:{item.report_date:yyyyMMddHH}");
  398. }
  399. if (item.total_count == 0) continue;
  400. item.success_count = TkLogCore.GetTotal($":total:{item.accountName}:success:{item.report_date:yyyyMMddHH}");
  401. item.abandon_count = TkLogCore.GetTotal($":total:{item.accountName}:放弃转链:{item.report_date:yyyyMMddHH}");
  402. if (item.total_count > 0)
  403. {
  404. item.success_percentage = $"{item.success_count / (double)item.total_count * 100:f2}%";
  405. item.abandon_percentage = $"{item.abandon_count / (double)item.total_count * 100:f2}%";
  406. }
  407. }
  408. if (item.parse_total_count == 0)
  409. {
  410. item.parse_total_count = TkLogCore.GetTotal($":parse_total:{accountName}:{item.report_date:yyyyMMddHH}");
  411. if (item.parse_total_count == 0) continue;
  412. item.parse_success_count = TkLogCore.GetTotal($":parse_total:{item.accountName}:success:{item.report_date:yyyyMMddHH}");
  413. item.parse_abandon_count = TkLogCore.GetTotal($":parse_total:{item.accountName}:放弃转链:{item.report_date:yyyyMMddHH}");
  414. if (item.parse_total_count > 0)
  415. {
  416. item.parse_success_percentage = $"{item.parse_success_count / (double)item.parse_total_count * 100:f2}%";
  417. item.parse_abandon_percentage = $"{item.parse_abandon_count / (double)item.parse_total_count * 100:f2}%";
  418. }
  419. }
  420. if (item.coupon_total_count == 0)
  421. {
  422. item.coupon_total_count = TkLogCore.GetTotal($":coupon_total:{accountName}:{item.report_date:yyyyMMddHH}");
  423. if (item.coupon_total_count == 0) continue;
  424. item.coupon_success_count = TkLogCore.GetTotal($":coupon_total:{item.accountName}:success:{item.report_date:yyyyMMddHH}");
  425. item.coupon_abandon_count = TkLogCore.GetTotal($":coupon_total:{item.accountName}:放弃转链:{item.report_date:yyyyMMddHH}");
  426. if (item.coupon_total_count > 0)
  427. {
  428. item.coupon_success_percentage = $"{item.coupon_success_count / (double)item.coupon_total_count * 100:f2}%";
  429. item.coupon_abandon_percentage = $"{item.coupon_abandon_count / (double)item.coupon_total_count * 100:f2}%";
  430. }
  431. }
  432. if (item.tool_total_count == 0)
  433. {
  434. item.tool_total_count = TkLogCore.GetTotal($":tool_total:{accountName}:{item.report_date:yyyyMMddHH}");
  435. if (item.tool_total_count == 0) continue;
  436. item.tool_success_count = TkLogCore.GetTotal($":tool_total:{item.accountName}:success:{item.report_date:yyyyMMddHH}");
  437. item.tool_abandon_count = TkLogCore.GetTotal($":tool_total:{item.accountName}:放弃转链:{item.report_date:yyyyMMddHH}");
  438. if (item.tool_total_count > 0)
  439. {
  440. item.tool_success_percentage = $"{item.tool_success_count / (double)item.tool_total_count * 100:f2}%";
  441. item.tool_abandon_percentage = $"{item.tool_abandon_count / (double)item.tool_total_count * 100:f2}%";
  442. }
  443. }
  444. }
  445. return new APIResult(new { data = result });
  446. }
  447. [HttpPost]
  448. public ActionResult chartData([FromBody] JsonElement form)
  449. {
  450. var result = new List<dynamic>();
  451. var reason_result = new List<dynamic>();
  452. var report_date = form.PathReadArray<string>("query_date[]");
  453. var accountName = form.Read("accountName", string.Empty);
  454. var isHourtrend = form.Read<bool>("isLeaf", false);
  455. var total_key = form.Read("total_key", "total");
  456. DateTime stime = DateTime.MinValue;
  457. if (!DateTime.TryParse(report_date[0], out stime)) return new APIResult(new { data = result, data2 = reason_result });
  458. string _report_date = stime.ToString("yyyyMMdd");
  459. if (isHourtrend) _report_date = stime.ToString("yyyyMMddHH");
  460. if (string.IsNullOrEmpty(accountName)) accountName = "tb";
  461. if (total_key == "tool_total")
  462. {
  463. accountName = "tool";
  464. total_key = "parse_total";
  465. string cacheKey = $":{total_key}:{accountName}:{_report_date}";
  466. double total = TkLogCore.GetTotal(cacheKey);
  467. if (total > 0)
  468. {
  469. string[] keys = ["bdpan", "wemeet"];
  470. foreach (var keyname in keys)
  471. {
  472. // string[] keys = ["bdpan:success", "bdpan:fail", "wemeet:success", "wemeet:fail"];
  473. cacheKey = $":{total_key}:{keyname}:{_report_date}";
  474. total = TkLogCore.GetTotal(cacheKey);
  475. cacheKey = $":{total_key}:{keyname}:success:{_report_date}";
  476. int value = TkLogCore.GetTotal(cacheKey);
  477. if (value == 0) continue;
  478. result.Add(new { name = $"{keyname}-成功", value, increases = Math.Round(value / total * 100, 2) });
  479. cacheKey = $":{total_key}:{keyname}:fail:{_report_date}";
  480. value = TkLogCore.GetTotal(cacheKey);
  481. if (value == 0) continue;
  482. result.Add(new { name = $"{keyname}-失败", value, increases = Math.Round(value / total * 100, 2) });
  483. }
  484. cacheKey = $":{total_key}:{accountName}:reason:{_report_date}";
  485. string[] reason_keys = TkLogCore.GetTotalKeys(cacheKey);
  486. foreach (var keyname in reason_keys)
  487. {
  488. cacheKey = $":{total_key}:{accountName}:{keyname}:{_report_date}";
  489. int value = TkLogCore.GetTotal(cacheKey);
  490. if (value == 0) continue;
  491. reason_result.Add(new { name = keyname, value, increases = Math.Round(value / total * 100, 2) });
  492. }
  493. reason_result = reason_result.OrderByDescending(item => item.value).ToList();
  494. }
  495. return new APIResult(new { total, data = result, data2 = reason_result });
  496. }
  497. else
  498. {
  499. string cacheKey = $":{total_key}:{accountName}:{_report_date}";
  500. double total = TkLogCore.GetTotal(cacheKey);
  501. if (total > 0)
  502. {
  503. string[] keys = ["success"];
  504. cacheKey = $":{total_key}:{accountName}:message:{_report_date}";
  505. string[] message_keys = TkLogCore.GetTotalKeys(cacheKey);
  506. var combinedKeys = keys.Union(message_keys).ToList();
  507. combinedKeys.RemoveAll(item => item == "fail");
  508. foreach (var keyname in combinedKeys)
  509. {
  510. cacheKey = $":{total_key}:{accountName}:{keyname}:{_report_date}";
  511. int value = TkLogCore.GetTotal(cacheKey);
  512. if (value == 0) continue;
  513. result.Add(new { name = keyname, value, increases = Math.Round(value / total * 100, 2) });
  514. }
  515. result = result.OrderByDescending(item => item.value).ToList();
  516. cacheKey = $":{total_key}:{accountName}:reason:{_report_date}";
  517. string[] reason_keys = TkLogCore.GetTotalKeys(cacheKey);
  518. foreach (var keyname in reason_keys)
  519. {
  520. cacheKey = $":{total_key}:{accountName}:{keyname}:{_report_date}";
  521. int value = TkLogCore.GetTotal(cacheKey);
  522. if (value < 50) continue;
  523. reason_result.Add(new { name = keyname, value, increases = Math.Round(value / total * 100, 2) });
  524. }
  525. reason_result = reason_result.OrderByDescending(item => item.value).ToList();
  526. }
  527. return new APIResult(new { total, data = result, data2 = reason_result });
  528. }
  529. }
  530. [HttpPost]
  531. public ActionResult chartData2([FromBody] JsonElement form)
  532. {
  533. var result = new List<dynamic>();
  534. var reason_result = new List<dynamic>();
  535. var report_date = form.PathReadArray<string>("query_date[]");
  536. var accountName = form.Read("accountName", string.Empty);
  537. var isHourtrend = form.Read<bool>("isLeaf", false);
  538. var total_key = form.Read("total_key", "total");
  539. if (string.IsNullOrEmpty(accountName)) accountName = "tb";
  540. DateTime stime = DateTime.MinValue;
  541. if (!DateTime.TryParse(report_date[0], out stime)) return new APIResult(new { data = result, data2 = reason_result });
  542. string _report_date = stime.ToString("yyyyMMdd");
  543. if (isHourtrend) _report_date = stime.ToString("yyyyMMddHH");
  544. string cacheKey = $":{total_key}:{accountName}:{_report_date}";
  545. double total = TkLogCore.GetTotal(cacheKey);
  546. if (total > 0)
  547. {
  548. string[] keys = ["success"];
  549. cacheKey = $":{total_key}:{accountName}:message:{_report_date}";
  550. string[] message_keys = TkLogCore.GetTotalKeys(cacheKey);
  551. var combinedKeys = keys.Union(message_keys).ToList();
  552. combinedKeys.RemoveAll(item => item == "fail");
  553. foreach (var keyname in combinedKeys)
  554. {
  555. cacheKey = $":{total_key}:{accountName}:{keyname}:{_report_date}";
  556. int value = TkLogCore.GetTotal(cacheKey);
  557. if (value == 0) continue;
  558. result.Add(new { name = keyname, value, increases = Math.Round(value / total * 100, 2) });
  559. }
  560. result = result.OrderByDescending(item => item.value).ToList();
  561. cacheKey = $":{total_key}:{accountName}:reason:{_report_date}";
  562. string[] reason_keys = TkLogCore.GetTotalKeys(cacheKey);
  563. foreach (var keyname in reason_keys)
  564. {
  565. cacheKey = $":{total_key}:{accountName}:{keyname}:{_report_date}";
  566. int value = TkLogCore.GetTotal(cacheKey);
  567. if (value == 0) continue;
  568. reason_result.Add(new { name = keyname, value, increases = Math.Round(value / total * 100, 2) });
  569. }
  570. reason_result = reason_result.OrderByDescending(item => item.value).ToList();
  571. }
  572. return new APIResult(new { total, data = result, data2 = reason_result });
  573. }
  574. [HttpPost]
  575. public ActionResult settle_bills_total([FromBody] JsonElement form)
  576. {
  577. int page = form.Read("current", 1);
  578. int size = form.Read("pageSize", 10);
  579. bool getTotal = form.Read("getTotal", true);
  580. string sort = form.Read<string>("sort");
  581. string order = form.Read<string>("order");
  582. var belongTime = form.PathReadArray<string>("query_date[]");
  583. string filter = string.Empty;
  584. DateTime stime = DateTime.MinValue, etime = DateTime.MinValue;
  585. if (belongTime.Count == 2)
  586. {
  587. if (DateTime.TryParse(belongTime[0], out stime) && DateTime.TryParse(belongTime[1], out etime))
  588. {
  589. etime = etime.AddDays(1).AddSeconds(-1);
  590. filter += $" AND belongTime BETWEEN @stime AND @etime";
  591. }
  592. }
  593. filter = filter.StringTrimStart(" AND ");
  594. //排序
  595. string orderBy = "belongTime DESC";
  596. if (!string.IsNullOrEmpty(order))
  597. {
  598. order = "descending".Equals(order) ? "DESC" : "ASC";
  599. orderBy = sort switch
  600. {
  601. _ => $"{sort} {order}",
  602. };
  603. }
  604. var result = new DBContext.Table("v_tk_report_bills")
  605. .Where(filter, new { stime, etime })
  606. .Page(size, page)
  607. .Order(orderBy)
  608. .PageList<TkSettleBillDTO>(getTotal);
  609. return new APIResult(new { data = result });
  610. }
  611. [HttpPost]
  612. public ActionResult settle_bills([FromBody] JsonElement form)
  613. {
  614. int page = form.Read("current", 1);
  615. int size = form.Read("pageSize", 10);
  616. bool getTotal = form.Read("getTotal", true);
  617. string sort = form.Read<string>("sort");
  618. string order = form.Read<string>("order");
  619. string name = form.Read<string>("keyword");
  620. var belongTime = form.PathReadArray<string>("query_date[]");
  621. string filter = string.Empty;
  622. if (!string.IsNullOrEmpty(name))
  623. {
  624. filter += $" AND accountId IN (SELECT ID FROM tk_pool WHERE company=@name)";
  625. }
  626. DateTime stime = DateTime.MinValue, etime = DateTime.MinValue;
  627. if (belongTime.Count == 2)
  628. {
  629. if (DateTime.TryParse(belongTime[0], out stime) && DateTime.TryParse(belongTime[1], out etime))
  630. {
  631. etime = etime.AddDays(1).AddSeconds(-1);
  632. filter += $" AND belongTime BETWEEN @stime AND @etime";
  633. }
  634. }
  635. filter = filter.StringTrimStart(" AND ");
  636. //排序
  637. string orderBy = "belongTime DESC";
  638. if (!string.IsNullOrEmpty(order))
  639. {
  640. order = "descending".Equals(order) ? "DESC" : "ASC";
  641. orderBy = sort switch
  642. {
  643. _ => $"{sort} {order}",
  644. };
  645. }
  646. var result = new DBContext.Table("tk_settle_bill")
  647. .Where(filter, new { name, stime, etime })
  648. .Page(size, page)
  649. .Order(orderBy)
  650. .PageList<TkSettleBillDTO>(getTotal);
  651. //foreach (var item in result.List)
  652. //{
  653. // if (string.IsNullOrEmpty(name))
  654. // {
  655. // item.accountName = "-";
  656. // }
  657. //}
  658. return new APIResult(new { data = result });
  659. }
  660. }
  661. }