TaobaoController.cs 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683
  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($":tool_total:tb:{item.report_date:yyyyMMdd}");
  217. if (item.tool_total_count == 0) continue;
  218. item.tool_success_count = TkLogCore.GetTotal($":tool_total:tb:success:{item.report_date:yyyyMMdd}");
  219. item.tool_abandon_count = TkLogCore.GetTotal($":tool_total:tb:放弃转链:{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($":tool_total:{accountName}:{item.report_date:yyyyMMdd}");
  329. if (item.tool_total_count == 0) continue;
  330. item.tool_success_count = TkLogCore.GetTotal($":tool_total:{accountName}:success:{item.report_date:yyyyMMdd}");
  331. item.tool_abandon_count = TkLogCore.GetTotal($":tool_total:{accountName}:放弃转链:{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. if (string.IsNullOrEmpty(accountName)) accountName = "tb";
  457. //if (total_key == "tool_total")
  458. //{
  459. // accountName = "tool";
  460. // total_key = "parse_total";
  461. //}
  462. DateTime stime = DateTime.MinValue;
  463. if (!DateTime.TryParse(report_date[0], out stime)) return new APIResult(new { data = result, data2 = reason_result });
  464. string _report_date = stime.ToString("yyyyMMdd");
  465. if (isHourtrend) _report_date = stime.ToString("yyyyMMddHH");
  466. string cacheKey = $":{total_key}:{accountName}:{_report_date}";
  467. double total = TkLogCore.GetTotal(cacheKey);
  468. if (total > 0)
  469. {
  470. string[] keys = ["success"];
  471. //if (accountName == "tool")
  472. //{
  473. // keys = ["success", "bdpan", "wemeet"];
  474. //}
  475. cacheKey = $":{total_key}:{accountName}:message:{_report_date}";
  476. string[] message_keys = TkLogCore.GetTotalKeys(cacheKey);
  477. var combinedKeys = keys.Union(message_keys).ToList();
  478. combinedKeys.RemoveAll(item => item == "fail");
  479. foreach (var keyname in combinedKeys)
  480. {
  481. cacheKey = $":{total_key}:{accountName}:{keyname}:{_report_date}";
  482. //if (accountName == "tool")
  483. //{
  484. // cacheKey = $":{total_key}:{keyname}:{_report_date}";
  485. //}
  486. int value = TkLogCore.GetTotal(cacheKey);
  487. if (value == 0) continue;
  488. result.Add(new { name = keyname, value, increases = Math.Round(value / total * 100, 2) });
  489. }
  490. result = result.OrderByDescending(item => item.value).ToList();
  491. cacheKey = $":{total_key}:{accountName}:reason:{_report_date}";
  492. string[] reason_keys = TkLogCore.GetTotalKeys(cacheKey);
  493. foreach (var keyname in reason_keys)
  494. {
  495. cacheKey = $":{total_key}:{accountName}:{keyname}:{_report_date}";
  496. int value = TkLogCore.GetTotal(cacheKey);
  497. if (value == 0) continue;
  498. reason_result.Add(new { name = keyname, value, increases = Math.Round(value / total * 100, 2) });
  499. }
  500. reason_result = reason_result.OrderByDescending(item => item.value).ToList();
  501. }
  502. return new APIResult(new { total, data = result, data2 = reason_result });
  503. }
  504. [HttpPost]
  505. public ActionResult settle_bills_total([FromBody] JsonElement form)
  506. {
  507. int page = form.Read("current", 1);
  508. int size = form.Read("pageSize", 10);
  509. bool getTotal = form.Read("getTotal", true);
  510. string sort = form.Read<string>("sort");
  511. string order = form.Read<string>("order");
  512. var belongTime = form.PathReadArray<string>("query_date[]");
  513. string filter = string.Empty;
  514. DateTime stime = DateTime.MinValue, etime = DateTime.MinValue;
  515. if (belongTime.Count == 2)
  516. {
  517. if (DateTime.TryParse(belongTime[0], out stime) && DateTime.TryParse(belongTime[1], out etime))
  518. {
  519. etime = etime.AddDays(1).AddSeconds(-1);
  520. filter += $" AND belongTime BETWEEN @stime AND @etime";
  521. }
  522. }
  523. filter = filter.StringTrimStart(" AND ");
  524. //排序
  525. string orderBy = "belongTime DESC";
  526. if (!string.IsNullOrEmpty(order))
  527. {
  528. order = "descending".Equals(order) ? "DESC" : "ASC";
  529. orderBy = sort switch
  530. {
  531. _ => $"{sort} {order}",
  532. };
  533. }
  534. var result = new DBContext.Table("v_tk_report_bills")
  535. .Where(filter, new { stime, etime })
  536. .Page(size, page)
  537. .Order(orderBy)
  538. .PageList<TkSettleBillDTO>(getTotal);
  539. return new APIResult(new { data = result });
  540. }
  541. [HttpPost]
  542. public ActionResult settle_bills([FromBody] JsonElement form)
  543. {
  544. int page = form.Read("current", 1);
  545. int size = form.Read("pageSize", 10);
  546. bool getTotal = form.Read("getTotal", true);
  547. string sort = form.Read<string>("sort");
  548. string order = form.Read<string>("order");
  549. string name = form.Read<string>("keyword");
  550. var belongTime = form.PathReadArray<string>("query_date[]");
  551. string filter = string.Empty;
  552. if (!string.IsNullOrEmpty(name))
  553. {
  554. filter += $" AND accountId IN (SELECT ID FROM tk_pool WHERE company=@name)";
  555. }
  556. DateTime stime = DateTime.MinValue, etime = DateTime.MinValue;
  557. if (belongTime.Count == 2)
  558. {
  559. if (DateTime.TryParse(belongTime[0], out stime) && DateTime.TryParse(belongTime[1], out etime))
  560. {
  561. etime = etime.AddDays(1).AddSeconds(-1);
  562. filter += $" AND belongTime BETWEEN @stime AND @etime";
  563. }
  564. }
  565. filter = filter.StringTrimStart(" AND ");
  566. //排序
  567. string orderBy = "belongTime DESC";
  568. if (!string.IsNullOrEmpty(order))
  569. {
  570. order = "descending".Equals(order) ? "DESC" : "ASC";
  571. orderBy = sort switch
  572. {
  573. _ => $"{sort} {order}",
  574. };
  575. }
  576. var result = new DBContext.Table("tk_settle_bill")
  577. .Where(filter, new { name, stime, etime })
  578. .Page(size, page)
  579. .Order(orderBy)
  580. .PageList<TkSettleBillDTO>(getTotal);
  581. //foreach (var item in result.List)
  582. //{
  583. // if (string.IsNullOrEmpty(name))
  584. // {
  585. // item.accountName = "-";
  586. // }
  587. //}
  588. return new APIResult(new { data = result });
  589. }
  590. }
  591. }