crawler.cs 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972
  1. using dodohold.core;
  2. using System.Text.Json;
  3. using TencentCloud.Cdn.V20180606.Models;
  4. using TencentCloud.Tse.V20201207.Models;
  5. using static molilian.core.ChartDataCore;
  6. namespace molilian.core
  7. {
  8. public partial class AlimamaPlus
  9. {
  10. /// <summary>
  11. /// 更新API调用日志(1天一次)
  12. /// </summary>
  13. /// <param name="intervalDay"></param>
  14. public static void DailyLogs_bak(int intervalDay, string prefix = "", string channel = "all")
  15. {
  16. int channelId = (int)TkChannelEnum.tb;
  17. var db_prefix = channel switch
  18. {
  19. "tool" => "tool_",
  20. "jd" => "jd_parse_",
  21. _ => prefix,
  22. };
  23. DateTime log_date = DateTime.Now.AddDays(-intervalDay).Date;
  24. var accounts = TkPoolCore.List();
  25. using var conn = DBContext.GetOpenConnection();
  26. foreach (var account in accounts)
  27. {
  28. int accountId = account.id;
  29. string accountName = $"{TkChannelEnum.tb}_{account.id}";
  30. int total_count = TkLogCore.GetTotal($":{prefix}total:{accountName}:{log_date:yyyyMMdd}");
  31. if (total_count == 0) accountName = account.name;
  32. total_count = TkLogCore.GetTotal($":{prefix}total:{accountName}:{log_date:yyyyMMdd}");
  33. if (total_count == 0) continue;
  34. var success_count = TkLogCore.GetTotal($":{prefix}total:{accountName}:success:{log_date:yyyyMMdd}");
  35. var abandon_count = TkLogCore.GetTotal($":{prefix}total:{accountName}:放弃转链:{log_date:yyyyMMdd}");
  36. string success_percentage = string.Empty;
  37. string abandon_percentage = string.Empty;
  38. if (total_count > 0)
  39. {
  40. success_percentage = $"{success_count / (double)total_count * 100:f2}%";
  41. abandon_percentage = $"{abandon_count / (double)total_count * 100:f2}%";
  42. }
  43. var exist = new DBContext.Table("daily_logs")
  44. .Fields("id,log_date")
  45. .Get<dynamic>("log_date=@log_date AND channel=@channel AND accountId=@accountId", new { log_date, channel = channelId, accountId });
  46. var createArgs = new DBContext.Table(conn, "daily_logs")
  47. .Add($"{db_prefix}total_count", total_count)
  48. .Add($"{db_prefix}abandon_count", abandon_count)
  49. .Add($"{db_prefix}abandon_percentage", abandon_percentage)
  50. .Add($"{db_prefix}success_count", success_count)
  51. .Add($"{db_prefix}success_percentage", success_percentage)
  52. .Add("last_time", DateTime.Now);
  53. if (exist == null)
  54. {
  55. createArgs.Add("channel", channelId)
  56. .Add("accountId", accountId)
  57. .Add("accountName", account.company)
  58. .Add("log_date", log_date)
  59. .Add("create_time", DateTime.Now)
  60. .Create();
  61. }
  62. else
  63. {
  64. createArgs.Where("id=@id", new { exist.id }).Update();
  65. }
  66. }
  67. int all_total_count = TkLogCore.GetTotal($":{prefix}total:{channel}:{log_date:yyyyMMdd}");
  68. var all_success_count = TkLogCore.GetTotal($":{prefix}total:{channel}:success:{log_date:yyyyMMdd}");
  69. var all_abandon_count = TkLogCore.GetTotal($":{prefix}total:{channel}:放弃转链:{log_date:yyyyMMdd}");
  70. string all_success_percentage = string.Empty;
  71. string all_abandon_percentage = string.Empty;
  72. if (all_total_count > 0)
  73. {
  74. all_success_percentage = $"{all_success_count / (double)all_total_count * 100:f2}%";
  75. all_abandon_percentage = $"{all_abandon_count / (double)all_total_count * 100:f2}%";
  76. }
  77. var exist2 = new DBContext.Table(conn, "daily_logs")
  78. .Fields("id,log_date")
  79. .Get<dynamic>("log_date=@log_date AND channel=@channel AND accountId=@accountId",
  80. new { log_date, channel = channelId, accountId = 0 });
  81. var createArgs2 = new DBContext.Table(conn, "daily_logs")
  82. .Add($"{db_prefix}total_count", all_total_count)
  83. .Add($"{db_prefix}abandon_count", all_abandon_count)
  84. .Add($"{db_prefix}abandon_percentage", all_abandon_percentage)
  85. .Add($"{db_prefix}success_count", all_success_count)
  86. .Add($"{db_prefix}success_percentage", all_success_percentage)
  87. .Add("last_time", DateTime.Now);
  88. if (exist2 == null)
  89. {
  90. createArgs2.Add("channel", channelId)
  91. .Add("accountId", 0)
  92. .Add("accountName", "all")
  93. .Add("log_date", log_date)
  94. .Add("create_time", DateTime.Now)
  95. .Create();
  96. }
  97. else
  98. {
  99. createArgs2.Where("id=@id", new { exist2.id }).Update();
  100. }
  101. }
  102. public static void AllDailyLogs(int intervalDay, string prefix = "", string channel = "all")
  103. {
  104. DailyLogs(true, intervalDay, prefix, channel);
  105. }
  106. public static void NodeDailyLogs(int intervalDay, string prefix = "", string channel = "all")
  107. {
  108. DailyLogs(false, intervalDay, prefix, channel);
  109. }
  110. public static void DailyLogs(bool all_node, int intervalDay, string prefix = "", string channel = "all")
  111. {
  112. int channelId = (int)TkChannelEnum.tb;
  113. var db_prefix = channel switch
  114. {
  115. "tool" => "tool_",
  116. "jd" => "jd_parse_",
  117. "ks" => "ks_parse_",
  118. "pdd" => "pdd_parse_",
  119. "dy" => "dy_parse_",
  120. _ => prefix,
  121. };
  122. DateTime log_date = DateTime.Now.AddDays(-intervalDay).Date;
  123. var accounts = TkPoolCore.List();
  124. using var conn = all_node ? CenterHub.GetOpenConnection() : DBContext.GetOpenConnection();
  125. string tableName = all_node ? "center_daily_logs" : "daily_logs";
  126. string tableName2 = all_node ? "center_daily_chat_data" : "daily_chat_data";
  127. foreach (var account in accounts)
  128. {
  129. int accountId = account.id;
  130. string accountName = $"{TkChannelEnum.tb}_{account.id}";
  131. int total_count = TkLogCore.GetTotal($":{prefix}total:{accountName}:{log_date:yyyyMMdd}", all_node);
  132. if (total_count == 0) accountName = account.name;
  133. total_count = TkLogCore.GetTotal($":{prefix}total:{accountName}:{log_date:yyyyMMdd}", all_node);
  134. if (total_count == 0) continue;
  135. var success_count = TkLogCore.GetTotal($":{prefix}total:{accountName}:success:{log_date:yyyyMMdd}", all_node);
  136. var abandon_count = TkLogCore.GetTotal($":{prefix}total:{accountName}:放弃转链:{log_date:yyyyMMdd}", all_node);
  137. string success_percentage = string.Empty;
  138. string abandon_percentage = string.Empty;
  139. if (total_count > 0)
  140. {
  141. success_percentage = $"{success_count / (double)total_count * 100:f2}%";
  142. abandon_percentage = $"{abandon_count / (double)total_count * 100:f2}%";
  143. }
  144. var exist = new DBContext.Table(tableName)
  145. .Fields("id,log_date")
  146. .Get<dynamic>("log_date=@log_date AND channel=@channel AND accountId=@accountId", new { log_date, channel = channelId, accountId });
  147. var createArgs = new DBContext.Table(conn, tableName)
  148. .Add($"{db_prefix}total_count", total_count)
  149. .Add($"{db_prefix}abandon_count", abandon_count)
  150. .Add($"{db_prefix}abandon_percentage", abandon_percentage)
  151. .Add($"{db_prefix}success_count", success_count)
  152. .Add($"{db_prefix}success_percentage", success_percentage)
  153. .Add("last_time", DateTime.Now);
  154. if (exist == null)
  155. {
  156. createArgs.Add("channel", channelId)
  157. .Add("accountId", accountId)
  158. .Add("accountName", account.company)
  159. .Add("log_date", log_date)
  160. .Add("create_time", DateTime.Now)
  161. .Create();
  162. }
  163. else
  164. {
  165. createArgs.Where("id=@id", new { exist.id }).Update();
  166. }
  167. }
  168. int all_total_count = TkLogCore.GetTotal($":{prefix}total:{channel}:{log_date:yyyyMMdd}", all_node);
  169. var all_success_count = TkLogCore.GetTotal($":{prefix}total:{channel}:success:{log_date:yyyyMMdd}", all_node);
  170. var all_abandon_count = TkLogCore.GetTotal($":{prefix}total:{channel}:放弃转链:{log_date:yyyyMMdd}", all_node);
  171. string all_success_percentage = string.Empty;
  172. string all_abandon_percentage = string.Empty;
  173. if (all_total_count > 0)
  174. {
  175. all_success_percentage = $"{all_success_count / (double)all_total_count * 100:f2}%";
  176. all_abandon_percentage = $"{all_abandon_count / (double)all_total_count * 100:f2}%";
  177. }
  178. var exist2 = new DBContext.Table(conn, tableName)
  179. .Fields("id,log_date")
  180. .Get<dynamic>("log_date=@log_date AND accountId=@accountId",
  181. new { log_date, channel = channelId, accountId = 0 });
  182. var createArgs2 = new DBContext.Table(conn, tableName)
  183. .Add($"{db_prefix}total_count", all_total_count)
  184. .Add($"{db_prefix}abandon_count", all_abandon_count)
  185. .Add($"{db_prefix}abandon_percentage", all_abandon_percentage)
  186. .Add($"{db_prefix}success_count", all_success_count)
  187. .Add($"{db_prefix}success_percentage", all_success_percentage)
  188. .Add("last_time", DateTime.Now);
  189. if (exist2 == null)
  190. {
  191. createArgs2.Add("channel", 0)
  192. .Add("accountId", 0)
  193. .Add("accountName", "all")
  194. .Add("log_date", log_date)
  195. .Add("create_time", DateTime.Now)
  196. .Create();
  197. }
  198. else
  199. {
  200. createArgs2.Where("id=@id", new { exist2.id }).Update();
  201. }
  202. //jd_parse_total
  203. //tool_total
  204. //total
  205. //coupon_total
  206. //parse_total
  207. var chatData = ChartDataCore.GetTaobaoData($"{prefix}total", "", $"{log_date:yyyyMMdd}");
  208. //tableName2
  209. }
  210. public static DBContext.Table FillLinkTypeData(DBContext.Table update, int data_type, DateTime report_date)
  211. {
  212. long req_other_aff_num = 0;//1
  213. long req_goods_num = 0;//2
  214. long req_live_num = 0;//3
  215. long req_video_num = 0;///4
  216. long req_shop_num = 0;//5
  217. long req_base_num = 0;//6
  218. long req_note_num = 0;//7
  219. int resp_deeplink_num = 0;
  220. try
  221. {
  222. string tableName = $"tk_parse_logs_{report_date:yyyyMMdd}";
  223. string exist_sql = @$"SELECT IF( EXISTS ( SELECT 1 FROM information_schema.tables WHERE table_name = '{tableName}'), 1, 0) AS table_exists;";
  224. int exist_table = DBContext.ExecuteScalar<int>(exist_sql);
  225. if (exist_table == 1)
  226. {
  227. var linkTypeTotal = new DBContext.Table(tableName)
  228. .Fields("linkType, count(*) AS total")
  229. .GroupBy("linkType")
  230. .Select<dynamic>();
  231. foreach (var t in linkTypeTotal)
  232. {
  233. int linkType = t.linkType;
  234. long total = t.total;
  235. switch (linkType)
  236. {
  237. case 1: req_other_aff_num = total; break;
  238. case 2: req_goods_num = total; break;
  239. case 3: req_live_num = total; break;
  240. case 4: req_video_num = total; break;
  241. case 5: req_shop_num = total; break;
  242. case 6: req_base_num = total; break;
  243. case 7: req_note_num = total; break;
  244. }
  245. }
  246. }
  247. string total_key = data_type switch
  248. {
  249. 1 => "parse_total",
  250. 2 or _ => "coupon_total",
  251. };
  252. string[] deeplink_keys = ["home", "success", "fail"];
  253. string accountName = "all";
  254. foreach (var keyname in deeplink_keys)
  255. {
  256. string cacheKey = $":{total_key}:dp_{keyname}:{accountName}:{report_date:yyyyMMdd}";
  257. int value = TkLogCore.GetTotal(cacheKey);
  258. if (value == 0) continue;
  259. resp_deeplink_num += value;
  260. }
  261. }
  262. catch (Exception e)
  263. {
  264. }
  265. update.Add("req_other_aff_num", req_other_aff_num);
  266. update.Add("req_goods_num", req_goods_num);
  267. update.Add("req_live_num", req_live_num);
  268. update.Add("req_video_num", req_video_num);
  269. update.Add("req_shop_num", req_shop_num);
  270. update.Add("req_base_num", req_base_num);
  271. update.Add("req_note_num", req_note_num);
  272. update.Add("resp_deeplink_num", resp_deeplink_num);
  273. return update;
  274. }
  275. /// <summary>
  276. ///
  277. /// </summary>
  278. /// <param name="data_type">1转链 2优惠券</param>
  279. /// <param name="intervalDay"></param>
  280. /// <param name="channel"></param>
  281. public static void ApiCallStatistics(int data_type, int intervalDay, TkChannelEnum channel)
  282. {
  283. DateTime log_date = DateTime.Now.AddDays(-intervalDay).Date;
  284. var endpoint = data_type == 1 ? EndPointCore.GetParseAdmin() : EndPointCore.GetCouponAdmin();
  285. if (endpoint == null || string.IsNullOrEmpty(endpoint.db_server)) return;
  286. using var conn = EndPointCore.GetDbConnection(endpoint.db_server);
  287. using var center_conn = CenterHub.GetOpenConnection();
  288. var exist_report_dailys = new DBContext.Table(conn, "v_tk_report_dailys")
  289. .Get<dynamic>("report_date=@log_date", new { log_date });
  290. var record = new DBContext.Table(center_conn, "api_call_report_dailys")
  291. .Fields("id, report_date, read_num")
  292. .Get<dynamic>("report_date=@log_date AND data_type=@data_type", new { log_date, data_type });
  293. var update = new DBContext.Table(center_conn, "api_call_report_dailys")
  294. .Add("data_type", data_type)
  295. .Add("is_show", 0)
  296. .Add("report_date", log_date)
  297. .Add("last_time", DateTime.Now);
  298. if (exist_report_dailys != null)
  299. {
  300. update.Add("uclk_uv", exist_report_dailys.uclk_uv_56)
  301. .Add("uclk_pv", exist_report_dailys.uclk_pv_56)
  302. .Add("pay_ord_num", exist_report_dailys.pay_ord_num_56)
  303. .Add("order_ord_num", exist_report_dailys.order_ord_num)
  304. .Add("pay_ord_amt", exist_report_dailys.pay_ord_amt_56)
  305. .Add("pay_tk_disp_tfee", exist_report_dailys.pay_tk_disp_tfee_56)
  306. .Add("pay_ord_uv", exist_report_dailys.pay_ord_uv_56)
  307. .Add("eff_ord_num", exist_report_dailys.eff_ord_num)
  308. .Add("eff_ord_amt", exist_report_dailys.eff_ord_amt)
  309. .Add("eff_tk_disp_tfee", exist_report_dailys.eff_tk_disp_tfee);
  310. }
  311. var exist = new DBContext.Table(center_conn, "center_daily_logs")
  312. .Get<dynamic>("log_date=@log_date AND accountId=@accountId",
  313. new { log_date, channel, accountId = 0 });
  314. if (exist != null)
  315. {
  316. if (data_type == 1)
  317. {
  318. update.Add("total_count", exist.parse_total_count)
  319. .Add("abandon_count", exist.parse_abandon_count)
  320. .Add("success_count", exist.parse_success_count);
  321. }
  322. if (data_type == 2)
  323. {
  324. update.Add("total_count", exist.coupon_total_count)
  325. .Add("abandon_count", exist.coupon_abandon_count)
  326. .Add("success_count", exist.coupon_success_count);
  327. }
  328. }
  329. if (data_type == 1)
  330. {
  331. //todo 只有转链需要处理,优惠券和京东(未上线)暂不处理
  332. update = FillLinkTypeData(update, data_type, log_date);
  333. }
  334. if (record == null)
  335. {
  336. update.Add("read_num", 0).Add("create_time", DateTime.Now).Create();
  337. }
  338. else
  339. {
  340. update.Add("read_num", record.read_num).Where("id=@id", new { record.id }).Update();
  341. }
  342. }
  343. //public static void ApiCallStatistics(int intervalDay, TkChannelEnum channel, string prefix = "")
  344. //{
  345. // DateTime log_date = DateTime.Now.AddDays(-intervalDay).Date;
  346. // var accounts = TkPoolCore.List();
  347. // foreach (var account in accounts)
  348. // {
  349. // int accountId = account.id;
  350. // string accountName = $"{channel}_{account.id}";
  351. // int total_count = TkLogCore.GetTotal($":{prefix}total:{accountName}:{log_date:yyyyMMdd}");
  352. // if (total_count == 0) continue;
  353. // var success_count = TkLogCore.GetTotal($":{prefix}total:{accountName}:success:{log_date:yyyyMMdd}");
  354. // var abandon_count = TkLogCore.GetTotal($":{prefix}total:{accountName}:放弃转链:{log_date:yyyyMMdd}");
  355. // string success_percentage = string.Empty;
  356. // string abandon_percentage = string.Empty;
  357. // if (total_count > 0)
  358. // {
  359. // success_percentage = $"{success_count / (double)total_count * 100:f2}%";
  360. // abandon_percentage = $"{abandon_count / (double)total_count * 100:f2}%";
  361. // }
  362. // var exist = new DBContext.Table("api_call_statistics")
  363. // .Fields("id,log_date")
  364. // .Get<dynamic>("log_date=@log_date AND channel=@channel AND accountId=@accountId",
  365. // new { log_date, channel, accountId });
  366. // var createArgs = new DBContext.Table("api_call_statistics")
  367. // .Add($"{prefix}total_count", total_count)
  368. // .Add($"{prefix}abandon_count", abandon_count)
  369. // .Add($"{prefix}abandon_percentage", abandon_percentage)
  370. // .Add($"{prefix}success_count", success_count)
  371. // .Add($"{prefix}success_percentage", success_percentage)
  372. // .Add("last_time", DateTime.Now);
  373. // if (exist == null)
  374. // {
  375. // createArgs.Add("channel", channel)
  376. // .Add("accountId", accountId)
  377. // .Add("accountName", account.company)
  378. // .Add("log_date", log_date)
  379. // .Add("create_time", DateTime.Now)
  380. // .Create();
  381. // }
  382. // else
  383. // {
  384. // createArgs.Where("id=@id", new { exist.id }).Update();
  385. // }
  386. // }
  387. // int all_total_count = TkLogCore.GetTotal($":{prefix}total:{channel.ToString()}:{log_date:yyyyMMdd}");
  388. // var all_success_count = TkLogCore.GetTotal($":{prefix}total:{channel.ToString()}:success:{log_date:yyyyMMdd}");
  389. // var all_abandon_count = TkLogCore.GetTotal($":{prefix}total:{channel.ToString()}:放弃转链:{log_date:yyyyMMdd}");
  390. // string all_success_percentage = string.Empty;
  391. // string all_abandon_percentage = string.Empty;
  392. // if (all_total_count > 0)
  393. // {
  394. // all_success_percentage = $"{all_success_count / (double)all_total_count * 100:f2}%";
  395. // all_abandon_percentage = $"{all_abandon_count / (double)all_total_count * 100:f2}%";
  396. // }
  397. // var exist2 = new DBContext.Table("api_call_statistics")
  398. // .Fields("id,log_date")
  399. // .Get<dynamic>("log_date=@log_date AND channel=@channel AND accountId=@accountId",
  400. // new { log_date, channel, accountId = 0 });
  401. // var createArgs2 = new DBContext.Table("api_call_statistics")
  402. // .Add($"{prefix}total_count", all_total_count)
  403. // .Add($"{prefix}abandon_count", all_abandon_count)
  404. // .Add($"{prefix}abandon_percentage", all_abandon_percentage)
  405. // .Add($"{prefix}success_count", all_success_count)
  406. // .Add($"{prefix}success_percentage", all_success_percentage)
  407. // .Add("last_time", DateTime.Now);
  408. // if (exist2 == null)
  409. // {
  410. // createArgs2.Add("channel", channel)
  411. // .Add("accountId", 0)
  412. // .Add("accountName", "all")
  413. // .Add("log_date", log_date)
  414. // .Add("create_time", DateTime.Now)
  415. // .Create();
  416. // }
  417. // else
  418. // {
  419. // createArgs2.Where("id=@id", new { exist2.id }).Update();
  420. // }
  421. //}
  422. /// <summary>
  423. /// 事实动态接口(5分钟一次)
  424. /// </summary>
  425. /// <param name="date"></param>
  426. public void SaveReportOverview()
  427. {
  428. DateTime date = DateTime.Now;
  429. TkReportDTO result = new TkReportDTO();
  430. try
  431. {
  432. string t = $"{date.Convert2UnixTimestamp(true)}";
  433. string dt = date.ToString("yyyy-MM-dd");
  434. string url = "https://pub.alimama.com/openapi/param2/1/gateway.unionpub/data.lens.report.overview.json?" +
  435. $"t={t}&_tb_token_={_tb_token}&ruleEnum=pub_overview&startDate={dt}&endDate={dt}&fixPeriod=1d";
  436. var client = new WebClientUtility().SetContentType("application/json;charset=utf-8")
  437. .AddHeaders("X-Requested-With", "XMLHttpRequest")
  438. .AddHeaders("Cookie", _cookies);
  439. #if DEBUG
  440. #else
  441. client.Proxy = _proxy;
  442. #endif
  443. if (!string.IsNullOrEmpty(_user_agent)) client.UserAgent = _user_agent;
  444. var response = client.Request(url);
  445. var body = response.Body();
  446. var root = body.Convert2JsonElement();
  447. int resultCode = root.Read<int>("resultCode", 0);
  448. bool success = root.Read("success", false);
  449. if (!success)
  450. {
  451. _ = new LoggerLibrary("report", "error")
  452. .Info(url, body)
  453. .SaveAsync();
  454. throw new Exception(body);
  455. }
  456. var data = root.ElementRead("data").ElementRead("data");
  457. result.eff_ord_num = data.Read<int>("eff_ord_num", 0);
  458. result.eff_ord_amt = data.Read<decimal>("eff_ord_amt", 0);
  459. result.eff_tk_disp_tfee = data.Read<decimal>("eff_tk_disp_tfee", 0);
  460. result.uclk_uv_56 = data.Read<int>("uclk_uv_56", 0);
  461. result.uclk_pv_56 = data.Read<int>("uclk_pv_56", 0);
  462. result.uclt_uv_56 = data.Read<int>("uclt_uv_56", 0);
  463. result.ucart_uv_56 = data.Read<int>("ucart_uv_56", 0);
  464. result.dep_ord_num_56 = data.Read<int>("dep_ord_num_56", 0);
  465. result.dep_ord_dep_amt_56 = data.Read<decimal>("dep_ord_dep_amt_56", 0);
  466. result.pay_ord_num_56 = data.Read<int>("pay_ord_num_56", 0);
  467. result.pay_ord_amt_56 = data.Read<decimal>("pay_ord_amt_56", 0);
  468. result.pay_tk_disp_tfee_56 = data.Read<decimal>("pay_tk_disp_tfee_56", 0);
  469. result.pay_ord_uv_56 = data.Read<int>("pay_ord_uv_56", 0);
  470. result.sett_ord_num_56 = data.Read<int>("sett_ord_num_56", 0);
  471. result.sett_ord_amt_56 = data.Read<decimal>("sett_ord_amt_56", 0);
  472. result.sett_tk_disp_tfee_56 = data.Read<decimal>("sett_tk_disp_tfee_56", 0);
  473. DateTime report_date = date.Date;
  474. if (report_date == DateTime.Now.Date)
  475. {
  476. RiskControlCore.SaveIncomeAmt(TkChannelEnum.tb, $"{_accountId}", result.eff_tk_disp_tfee);
  477. //TkPoolCore.SaveIncomeAmt(_accountName, result.eff_tk_disp_tfee);
  478. EachSaveReportOverview(report_date.AddHours(DateTime.Now.Hour), "tk_report_hourtrend", result);
  479. EachSaveReportOverview(report_date, "tk_report", result);
  480. }
  481. }
  482. catch (Exception ex) { throw; }
  483. }
  484. private void EachSaveReportOverview(DateTime report_date, string tableName, TkReportDTO data)
  485. {
  486. var exist = new DBContext.Table(tableName)
  487. .Fields("id,report_date")
  488. .Get<dynamic>("report_date=@report_date AND accountId=@accountId",
  489. new { report_date, accountId = _accountId });
  490. var createArgs = new DBContext.Table(tableName)
  491. .Add("uclk_uv_56", data.uclk_uv_56)
  492. .Add("uclk_pv_56", data.uclk_pv_56)
  493. .Add("uclt_uv_56", data.uclt_uv_56)
  494. .Add("ucart_uv_56", data.ucart_uv_56)
  495. .Add("dep_ord_num_56", data.dep_ord_num_56)
  496. .Add("dep_ord_dep_amt_56", data.dep_ord_dep_amt_56)
  497. .Add("pay_ord_num_56", data.pay_ord_num_56)
  498. .Add("pay_ord_amt_56", data.pay_ord_amt_56)
  499. .Add("pay_tk_disp_tfee_56", data.pay_tk_disp_tfee_56)
  500. .Add("pay_ord_uv_56", data.pay_ord_uv_56)
  501. .Add("sett_ord_num_56", data.sett_ord_num_56)
  502. .Add("sett_ord_amt_56", data.sett_ord_amt_56)
  503. .Add("sett_tk_disp_tfee_56", data.sett_tk_disp_tfee_56)
  504. .Add("eff_ord_num", data.eff_ord_num)
  505. .Add("eff_ord_amt", data.eff_ord_amt)
  506. .Add("eff_tk_disp_tfee", data.eff_tk_disp_tfee);
  507. string data_suffix = report_date.ToString("yyyyMMdd");
  508. if ("tk_report_hourtrend".Equals(tableName))
  509. {
  510. data_suffix = report_date.ToString("yyyyMMddHH");
  511. }
  512. string accountName = $"{TkChannelEnum.tb}_{_accountId}";
  513. int total_count = TkLogCore.GetTotal($":total:{accountName}:{data_suffix}");
  514. int success_count = 0, abandon_count = 0;
  515. string success_percentage = string.Empty, abandon_percentage = string.Empty;
  516. if (total_count > 0)
  517. {
  518. success_count = TkLogCore.GetTotal($":total:{accountName}:success:{data_suffix}");
  519. abandon_count = TkLogCore.GetTotal($":total:{accountName}:放弃转链:{data_suffix}");
  520. if (total_count > 0)
  521. {
  522. success_percentage = $"{success_count / (double)total_count * 100:f2}%";
  523. abandon_percentage = $"{abandon_count / (double)total_count * 100:f2}%";
  524. }
  525. }
  526. createArgs.Add("total_count", total_count);
  527. createArgs.Add("success_count", success_count);
  528. createArgs.Add("abandon_count", abandon_count);
  529. createArgs.Add("success_percentage", success_percentage);
  530. createArgs.Add("abandon_percentage", abandon_percentage);
  531. int parse_total_count = TkLogCore.GetTotal($":parse_total:{accountName}:{data_suffix}");
  532. int parse_success_count = 0, parse_abandon_count = 0;
  533. string parse_success_percentage = string.Empty, parse_abandon_percentage = string.Empty;
  534. if (parse_total_count > 0)
  535. {
  536. parse_success_count = TkLogCore.GetTotal($":parse_total:{accountName}:success:{data_suffix}");
  537. parse_abandon_count = TkLogCore.GetTotal($":parse_total:{accountName}:放弃转链:{data_suffix}");
  538. if (parse_total_count > 0)
  539. {
  540. parse_success_percentage = $"{parse_success_count / (double)parse_total_count * 100:f2}%";
  541. parse_abandon_percentage = $"{parse_abandon_count / (double)parse_total_count * 100:f2}%";
  542. }
  543. }
  544. createArgs.Add("parse_total_count", parse_total_count);
  545. createArgs.Add("parse_success_count", parse_success_count);
  546. createArgs.Add("parse_abandon_count", parse_abandon_count);
  547. createArgs.Add("parse_success_percentage", parse_success_percentage);
  548. createArgs.Add("parse_abandon_percentage", parse_abandon_percentage);
  549. int coupon_total_count = TkLogCore.GetTotal($":coupon_total:{accountName}:{data_suffix}", false);
  550. int coupon_success_count = 0, coupon_abandon_count = 0;
  551. string coupon_success_percentage = string.Empty, coupon_abandon_percentage = string.Empty;
  552. if (coupon_total_count > 0)
  553. {
  554. coupon_success_count = TkLogCore.GetTotal($":coupon_total:{accountName}:success:{data_suffix}", false);
  555. coupon_abandon_count = TkLogCore.GetTotal($":coupon_total:{accountName}:放弃转链:{data_suffix}", false);
  556. if (coupon_total_count > 0)
  557. {
  558. coupon_success_percentage = $"{coupon_success_count / (double)coupon_total_count * 100:f2}%";
  559. coupon_abandon_percentage = $"{coupon_abandon_count / (double)coupon_total_count * 100:f2}%";
  560. }
  561. }
  562. createArgs.Add("coupon_total_count", coupon_total_count);
  563. createArgs.Add("coupon_success_count", coupon_success_count);
  564. createArgs.Add("coupon_abandon_count", coupon_abandon_count);
  565. createArgs.Add("coupon_success_percentage", coupon_success_percentage);
  566. createArgs.Add("coupon_abandon_percentage", coupon_abandon_percentage);
  567. int tool_total_count = TkLogCore.GetTotal($":tool_total:{accountName}:{data_suffix}");
  568. int tool_success_count = 0, tool_abandon_count = 0;
  569. string tool_success_percentage = string.Empty, tool_abandon_percentage = string.Empty;
  570. if (tool_total_count > 0)
  571. {
  572. tool_success_count = TkLogCore.GetTotal($":tool_total:{accountName}:success:{data_suffix}");
  573. tool_abandon_count = TkLogCore.GetTotal($":tool_total:{accountName}:放弃转链:{data_suffix}");
  574. if (tool_total_count > 0)
  575. {
  576. tool_success_percentage = $"{tool_success_count / (double)tool_total_count * 100:f2}%";
  577. tool_abandon_percentage = $"{tool_abandon_count / (double)tool_total_count * 100:f2}%";
  578. }
  579. }
  580. createArgs.Add("tool_total_count", tool_total_count);
  581. createArgs.Add("tool_success_count", tool_success_count);
  582. createArgs.Add("tool_abandon_count", tool_abandon_count);
  583. createArgs.Add("tool_success_percentage", tool_success_percentage);
  584. createArgs.Add("tool_abandon_percentage", tool_abandon_percentage);
  585. if (exist == null)
  586. {
  587. createArgs.Add("accountId", _accountId)
  588. .Add("accountName", _company)
  589. .Add("report_date", report_date)
  590. .Add("create_time", DateTime.Now)
  591. .Add("last_time", DateTime.Now)
  592. .Create();
  593. }
  594. else
  595. {
  596. createArgs.Add("last_time", DateTime.Now)
  597. .Where("id=@id", new { exist.id })
  598. .Update();
  599. }
  600. }
  601. /// <summary>
  602. /// 修正点击数
  603. /// </summary>
  604. public void FixReport(DateTime date)
  605. {
  606. TkReportDTO result = new TkReportDTO();
  607. try
  608. {
  609. string t = $"{date.Convert2UnixTimestamp(true)}";
  610. string dt = date.ToString("yyyy-MM-dd");
  611. string url = "https://pub.alimama.com/openapi/param2/1/gateway.unionpub/data.lens.report.overview.json?" +
  612. $"t={t}&_tb_token_={_tb_token}&ruleEnum=pub_overview&startDate={dt}&endDate={dt}&fixPeriod=1d";
  613. var client = new WebClientUtility().SetContentType("application/json;charset=utf-8")
  614. .AddHeaders("X-Requested-With", "XMLHttpRequest")
  615. .AddHeaders("Cookie", _cookies);
  616. #if DEBUG
  617. #else
  618. client.Proxy = _proxy;
  619. #endif
  620. if (!string.IsNullOrEmpty(_user_agent)) client.UserAgent = _user_agent;
  621. var response = client.Request(url);
  622. var body = response.Body();
  623. var root = body.Convert2JsonElement();
  624. int resultCode = root.Read<int>("resultCode", 0);
  625. bool success = root.Read("success", false);
  626. if (!success)
  627. {
  628. _ = new LoggerLibrary("report", "error")
  629. .Info(url, body)
  630. .SaveAsync();
  631. throw new Exception(body);
  632. }
  633. var data = root.ElementRead("data").ElementRead("data");
  634. result.eff_ord_num = data.Read<int>("eff_ord_num", 0);
  635. result.eff_ord_amt = data.Read<decimal>("eff_ord_amt", 0);
  636. result.eff_tk_disp_tfee = data.Read<decimal>("eff_tk_disp_tfee", 0);
  637. result.uclk_uv_56 = data.Read<int>("uclk_uv_56", 0);
  638. result.uclk_pv_56 = data.Read<int>("uclk_pv_56", 0);
  639. result.uclt_uv_56 = data.Read<int>("uclt_uv_56", 0);
  640. result.ucart_uv_56 = data.Read<int>("ucart_uv_56", 0);
  641. result.dep_ord_num_56 = data.Read<int>("dep_ord_num_56", 0);
  642. result.dep_ord_dep_amt_56 = data.Read<decimal>("dep_ord_dep_amt_56", 0);
  643. result.pay_ord_num_56 = data.Read<int>("pay_ord_num_56", 0);
  644. result.pay_ord_amt_56 = data.Read<decimal>("pay_ord_amt_56", 0);
  645. result.pay_tk_disp_tfee_56 = data.Read<decimal>("pay_tk_disp_tfee_56", 0);
  646. result.pay_ord_uv_56 = data.Read<int>("pay_ord_uv_56", 0);
  647. result.sett_ord_num_56 = data.Read<int>("sett_ord_num_56", 0);
  648. result.sett_ord_amt_56 = data.Read<decimal>("sett_ord_amt_56", 0);
  649. result.sett_tk_disp_tfee_56 = data.Read<decimal>("sett_tk_disp_tfee_56", 0);
  650. DateTime report_date = date.Date;
  651. EachSaveReportOverview(report_date, "tk_report", result);
  652. //var exist = new DBContext.Table("tk_report")
  653. // .Fields("id,report_date")
  654. // .Get<dynamic>("report_date=@report_date AND accountId=@accountId",
  655. // new { report_date, accountId = _accountId });
  656. //var createArgs = new DBContext.Table("tk_report")
  657. // .Add("fix_uclk_pv_56", result.fix_uclk_pv_56);
  658. //if (exist == null)
  659. //{
  660. // createArgs.Add("accountId", _accountId)
  661. // .Add("accountName", _company)
  662. // .Add("report_date", report_date)
  663. // .Add("create_time", DateTime.Now)
  664. // .Add("last_time", DateTime.Now)
  665. // .Create();
  666. //}
  667. //else
  668. //{
  669. // createArgs.Add("last_time", DateTime.Now)
  670. // .Where("id=@id", new { exist.id })
  671. // .Update();
  672. //}
  673. }
  674. catch (Exception ex) { }
  675. }
  676. /// <summary>
  677. /// 1小时更新一次
  678. /// </summary>
  679. public void SaveReportHourtrend(DateTime date)
  680. {
  681. string t = $"{DateTime.Now.Convert2UnixTimestamp(true)}";
  682. string dt = date.ToString("yyyy-MM-dd");
  683. string url = "https://pub.alimama.com/openapi/param2/1/gateway.unionpub/data.lens.report.hourtrend.dod.json?" +
  684. $"t={t}&_tb_token_={_tb_token}&ruleEnum=pub_homepage&startDate={dt}&endDate={dt}&fixPeriod=realTime";
  685. var client = new WebClientUtility().SetContentType("application/json;charset=utf-8")
  686. .AddHeaders("X-Requested-With", "XMLHttpRequest")
  687. .AddHeaders("Cookie", _cookies);
  688. #if DEBUG
  689. #else
  690. client.Proxy = _proxy;
  691. #endif
  692. if (!string.IsNullOrEmpty(_user_agent)) client.UserAgent = _user_agent;
  693. var response = client.Request(url);
  694. var body = response.Body();
  695. var root = body.Convert2JsonElement();
  696. int resultCode = root.Read<int>("resultCode", 0);
  697. bool success = root.Read("success", false);
  698. if (!success)
  699. {
  700. _ = new LoggerLibrary("report", "error")
  701. .Info(url, body)
  702. .SaveAsync();
  703. throw new Exception(body);
  704. }
  705. var data_list = root.ElementRead("data").ElementRead("data");
  706. foreach (var data in data_list.EnumerateArray())
  707. {
  708. string xAxis = data.Read<string>("xAxis");
  709. string _report_date = $"{dt} {xAxis}";
  710. EachSaveReport(_report_date, "tk_report_hourtrend", data);
  711. if ("23:00".Equals(xAxis))
  712. {
  713. EachSaveReport(dt, "tk_report", data);
  714. }
  715. }
  716. }
  717. private void EachSaveReport(string _report_date, string tableName, JsonElement data)
  718. {
  719. _ = DateTime.TryParse(_report_date, out DateTime report_date);
  720. var exist = new DBContext.Table(tableName)
  721. .Fields("id,report_date")
  722. .Get<dynamic>("report_date=@report_date AND accountId=@accountId",
  723. new { report_date, accountId = _accountId });
  724. if (exist == null)
  725. {
  726. new DBContext.Table(tableName)
  727. .Fill(data)
  728. .Loader<int>("uclk_uv_56", 0)
  729. .Loader<int>("uclk_pv_56", 0)
  730. .Loader<int>("uclt_uv_56", 0)
  731. .Loader<int>("ucart_uv_56", 0)
  732. .Loader<int>("dep_ord_num_56", 0)
  733. .Loader<decimal>("dep_ord_dep_amt_56", 0)
  734. .Loader<int>("pay_ord_num_56", 0)
  735. .Loader<decimal>("pay_ord_amt_56", 0)
  736. .Loader<decimal>("pay_tk_disp_tfee_56", 0)
  737. .Loader<int>("pay_ord_uv_56", 0)
  738. .Loader<int>("sett_ord_num_56", 0)
  739. .Loader<decimal>("sett_ord_amt_56", 0)
  740. .Loader<decimal>("sett_tk_disp_tfee_56", 0)
  741. .Add("accountId", _accountId)
  742. .Add("accountName", _company)
  743. .Add("report_date", report_date)
  744. .Add("create_time", DateTime.Now)
  745. .Add("last_time", DateTime.Now)
  746. .Create();
  747. }
  748. else
  749. {
  750. new DBContext.Table(tableName)
  751. .Fill(data)
  752. .Loader<int>("uclk_uv_56", 0)
  753. .Loader<int>("uclk_pv_56", 0)
  754. .Loader<int>("uclt_uv_56", 0)
  755. .Loader<int>("ucart_uv_56", 0)
  756. .Loader<int>("dep_ord_num_56", 0)
  757. .Loader<decimal>("dep_ord_dep_amt_56", 0)
  758. .Loader<int>("pay_ord_num_56", 0)
  759. .Loader<decimal>("pay_ord_amt_56", 0)
  760. .Loader<decimal>("pay_tk_disp_tfee_56", 0)
  761. .Loader<int>("pay_ord_uv_56", 0)
  762. .Loader<int>("sett_ord_num_56", 0)
  763. .Loader<decimal>("sett_ord_amt_56", 0)
  764. .Loader<decimal>("sett_tk_disp_tfee_56", 0)
  765. .Add("last_time", DateTime.Now)
  766. .Where("id=@id", new { exist.id })
  767. .Update();
  768. }
  769. }
  770. /// <summary>
  771. /// 警告消息
  772. /// </summary>
  773. public void GetViolationuWarning()
  774. {
  775. try
  776. {
  777. string url = "https://media.alimama.com/violationu2/warning_instance_page_v2.json?r=mx_208&toPage=1&pageSize=40&params=";
  778. var client = new WebClientUtility().SetContentType("application/json;charset=utf-8")
  779. .AddHeaders("X-Requested-With", "XMLHttpRequest")
  780. .AddHeaders("Cookie", _cookies);
  781. #if DEBUG
  782. #else
  783. client.Proxy = _proxy;
  784. #endif
  785. if (!string.IsNullOrEmpty(_user_agent)) client.UserAgent = _user_agent;
  786. var response = client.Request(url);
  787. var body = response.Body();
  788. var root = body.Convert2JsonElement();
  789. int resultCode = root.Read<int>("resultCode", 0);
  790. int totalCount = root.PathRead<int>("data.totalCount", 0);
  791. bool success = root.Read("success", false);
  792. if (!success)
  793. {
  794. _ = new LoggerLibrary("violationu", "warning_error")
  795. .Info(url, body)
  796. .SaveAsync();
  797. throw new Exception(body);
  798. }
  799. if (totalCount == 0) return;
  800. _ = new LoggerLibrary("violationu", "warning").Info(url, body).SaveAsync();
  801. var list = root.ElementRead("data").ElementRead("result").EnumerateArray();
  802. foreach (var data in list)
  803. {
  804. var violation_commission = data.PathRead<decimal>("mediaInfo.订单虚假交易违规佣金", 0);
  805. new DBContext.Table("alimama_warning")
  806. .Fill(data)
  807. .Loader<int>("filterRuleId", 0)
  808. .Loader<long>("gmtCreate", 0)
  809. .Loader<long>("id", 0, "ali_id")
  810. .Loader<string>("idStr", string.Empty)
  811. .Loader<int>("mediaDimension", 0)
  812. .Loader<long>("mediaId", 0)
  813. .Loader<int>("mediaInfo.abn_cnt", 0, "abn_cnt")
  814. .Add("violation_commission", violation_commission)
  815. .Loader<int>("mediaInfo.warning_cnt", 0, "warning_cnt")
  816. .Loader<string>("mediaName", string.Empty)
  817. .Loader<long>("memberId", 0)
  818. .Loader<string>("noticeCategory", string.Empty)
  819. .Loader<int>("noticeTemplateId", 0)
  820. .Loader<string>("noticeTemplateName", string.Empty)
  821. .Loader<string>("orderFile", string.Empty)
  822. .Loader<string>("pid", string.Empty)
  823. .Loader<int>("punishRuleId", 0)
  824. .Loader<string>("riskType", string.Empty)
  825. .Loader<string>("roleName", string.Empty)
  826. .Loader<string>("ruleLink", string.Empty)
  827. .Loader<bool>("showOrderDetail", false)
  828. .Loader<int>("status", 0, "ali_status")
  829. .Loader<string>("warningText", string.Empty)
  830. .Add("accountName", _company)
  831. .Add("status", true)
  832. .Add("create_time", DateTime.Now)
  833. .Add("last_time", DateTime.Now)
  834. .Create(DBContext.InsertType.REPLACE);
  835. }
  836. }
  837. catch (Exception ex) { }
  838. }
  839. }
  840. }