crawler.cs 56 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120
  1. using dodohold.core;
  2. using Google.Protobuf.WellKnownTypes;
  3. using System.Text.Json;
  4. using TencentCloud.Cdn.V20180606.Models;
  5. using TencentCloud.Tse.V20201207.Models;
  6. using static molilian.core.ChartDataCore;
  7. namespace molilian.core
  8. {
  9. public partial class AlimamaPlus
  10. {
  11. /// <summary>
  12. /// 更新API调用日志(1天一次)
  13. /// </summary>
  14. /// <param name="intervalDay"></param>
  15. public static async Task DailyLogs_bak(int intervalDay, string prefix = "", string channel = "all")
  16. {
  17. int channelId = (int)TkChannelEnum.tb;
  18. var db_prefix = channel switch
  19. {
  20. "tool" => "tool_",
  21. "jd" => "jd_parse_",
  22. _ => prefix,
  23. };
  24. DateTime log_date = DateTime.Now.AddDays(-intervalDay).Date;
  25. var accounts = await TkPoolCore.ListAsync();
  26. using var conn = DBContext.GetOpenConnection();
  27. foreach (var account in accounts)
  28. {
  29. int accountId = account.id;
  30. string accountName = $"{TkChannelEnum.tb}_{account.id}";
  31. int total_count = await TkLogCore.GetTotalAsync($":{prefix}total:{accountName}:{log_date:yyyyMMdd}");
  32. if (total_count == 0) accountName = account.name;
  33. total_count = await TkLogCore.GetTotalAsync($":{prefix}total:{accountName}:{log_date:yyyyMMdd}");
  34. if (total_count == 0) continue;
  35. var success_count = await TkLogCore.GetTotalAsync($":{prefix}total:{accountName}:success:{log_date:yyyyMMdd}");
  36. var abandon_count = await TkLogCore.GetTotalAsync($":{prefix}total:{accountName}:放弃转链:{log_date:yyyyMMdd}");
  37. string success_percentage = string.Empty;
  38. string abandon_percentage = string.Empty;
  39. if (total_count > 0)
  40. {
  41. success_percentage = $"{success_count / (double)total_count * 100:f2}%";
  42. abandon_percentage = $"{abandon_count / (double)total_count * 100:f2}%";
  43. }
  44. var exist = new DBContext.Table("daily_logs")
  45. .Fields("id,log_date")
  46. .Get<dynamic>("log_date=@log_date AND channel=@channel AND accountId=@accountId", new { log_date, channel = channelId, accountId });
  47. var createArgs = new DBContext.Table(conn, "daily_logs")
  48. .Add($"{db_prefix}total_count", total_count)
  49. .Add($"{db_prefix}abandon_count", abandon_count)
  50. .Add($"{db_prefix}abandon_percentage", abandon_percentage)
  51. .Add($"{db_prefix}success_count", success_count)
  52. .Add($"{db_prefix}success_percentage", success_percentage)
  53. .Add("last_time", DateTime.Now);
  54. if (exist == null)
  55. {
  56. createArgs.Add("channel", channelId)
  57. .Add("accountId", accountId)
  58. .Add("accountName", account.company)
  59. .Add("log_date", log_date)
  60. .Add("create_time", DateTime.Now)
  61. .Create();
  62. }
  63. else
  64. {
  65. createArgs.Where("id=@id", new { exist.id }).Update();
  66. }
  67. }
  68. int all_total_count = await TkLogCore.GetTotalAsync($":{prefix}total:{channel}:{log_date:yyyyMMdd}");
  69. var all_success_count = await TkLogCore.GetTotalAsync($":{prefix}total:{channel}:success:{log_date:yyyyMMdd}");
  70. var all_abandon_count = await TkLogCore.GetTotalAsync($":{prefix}total:{channel}:放弃转链:{log_date:yyyyMMdd}");
  71. string all_success_percentage = string.Empty;
  72. string all_abandon_percentage = string.Empty;
  73. if (all_total_count > 0)
  74. {
  75. all_success_percentage = $"{all_success_count / (double)all_total_count * 100:f2}%";
  76. all_abandon_percentage = $"{all_abandon_count / (double)all_total_count * 100:f2}%";
  77. }
  78. var exist2 = new DBContext.Table(conn, "daily_logs")
  79. .Fields("id,log_date")
  80. .Get<dynamic>("log_date=@log_date AND channel=@channel AND accountId=@accountId",
  81. new { log_date, channel = channelId, accountId = 0 });
  82. var createArgs2 = new DBContext.Table(conn, "daily_logs")
  83. .Add($"{db_prefix}total_count", all_total_count)
  84. .Add($"{db_prefix}abandon_count", all_abandon_count)
  85. .Add($"{db_prefix}abandon_percentage", all_abandon_percentage)
  86. .Add($"{db_prefix}success_count", all_success_count)
  87. .Add($"{db_prefix}success_percentage", all_success_percentage)
  88. .Add("last_time", DateTime.Now);
  89. if (exist2 == null)
  90. {
  91. createArgs2.Add("channel", channelId)
  92. .Add("accountId", 0)
  93. .Add("accountName", "all")
  94. .Add("log_date", log_date)
  95. .Add("create_time", DateTime.Now)
  96. .Create();
  97. }
  98. else
  99. {
  100. createArgs2.Where("id=@id", new { exist2.id }).Update();
  101. }
  102. }
  103. public static async Task AllDailyLogsAsync(int intervalDay, string prefix = "", string channel = "all")
  104. {
  105. await DailyLogsAsync(true, intervalDay, prefix, channel);
  106. }
  107. public static async Task NodeDailyLogsAsync(int intervalDay, string prefix = "", string channel = "all")
  108. {
  109. await DailyLogsAsync(false, intervalDay, prefix, channel);
  110. }
  111. public static async Task DailyLogsAsync(bool all_node, int intervalDay, string prefix = "", string channel = "all")
  112. {
  113. int channelId = (int)TkChannelEnum.tb;
  114. var db_prefix = channel switch
  115. {
  116. "tool" => "tool_",
  117. "jd" => "jd_parse_",
  118. "ks" => "ks_parse_",
  119. "pdd" => "pdd_parse_",
  120. "dy" => "dy_parse_",
  121. _ => prefix,
  122. };
  123. DateTime log_date = DateTime.Now.AddDays(-intervalDay).Date;
  124. var accounts = await TkPoolCore.ListAsync();
  125. using var conn = all_node ? CenterHub.GetOpenConnection() : DBContext.GetOpenConnection();
  126. string tableName = all_node ? "center_daily_logs" : "daily_logs";
  127. string tableName2 = all_node ? "center_daily_chat_data" : "daily_chat_data";
  128. foreach (var account in accounts)
  129. {
  130. if (!account.enable_call_stats) continue;
  131. int accountId = account.id;
  132. string accountName = $"{TkChannelEnum.tb}_{account.id}";
  133. int total_count = await TkLogCore.GetTotalAsync($":{prefix}total:{accountName}:{log_date:yyyyMMdd}", all_node);
  134. if (total_count == 0) accountName = account.name;
  135. total_count = await TkLogCore.GetTotalAsync($":{prefix}total:{accountName}:{log_date:yyyyMMdd}", all_node);
  136. if (total_count == 0) continue;
  137. var success_count = await TkLogCore.GetTotalAsync($":{prefix}total:{accountName}:success:{log_date:yyyyMMdd}", all_node);
  138. var abandon_count = await TkLogCore.GetTotalAsync($":{prefix}total:{accountName}:放弃转链:{log_date:yyyyMMdd}", all_node);
  139. string success_percentage = string.Empty;
  140. string abandon_percentage = string.Empty;
  141. if (total_count > 0)
  142. {
  143. success_percentage = $"{success_count / (double)total_count * 100:f2}%";
  144. abandon_percentage = $"{abandon_count / (double)total_count * 100:f2}%";
  145. }
  146. var exist = new DBContext.Table(tableName)
  147. .Fields("id,log_date")
  148. .Get<dynamic>("log_date=@log_date AND channel=@channel AND accountId=@accountId", new { log_date, channel = channelId, accountId });
  149. var createArgs = new DBContext.Table(conn, tableName)
  150. .Add($"{db_prefix}total_count", total_count)
  151. .Add($"{db_prefix}abandon_count", abandon_count)
  152. .Add($"{db_prefix}abandon_percentage", abandon_percentage)
  153. .Add($"{db_prefix}success_count", success_count)
  154. .Add($"{db_prefix}success_percentage", success_percentage)
  155. .Add("last_time", DateTime.Now);
  156. if (exist == null)
  157. {
  158. createArgs.Add("channel", channelId)
  159. .Add("accountId", accountId)
  160. .Add("accountName", account.company)
  161. .Add("log_date", log_date)
  162. .Add("create_time", DateTime.Now)
  163. .Create();
  164. }
  165. else
  166. {
  167. createArgs.Where("id=@id", new { exist.id }).Update();
  168. }
  169. }
  170. int all_total_count = await TkLogCore.GetTotalAsync($":{prefix}total:{channel}:{log_date:yyyyMMdd}", all_node);
  171. var all_success_count = await TkLogCore.GetTotalAsync($":{prefix}total:{channel}:success:{log_date:yyyyMMdd}", all_node);
  172. var all_abandon_count = await TkLogCore.GetTotalAsync($":{prefix}total:{channel}:放弃转链:{log_date:yyyyMMdd}", all_node);
  173. string all_success_percentage = string.Empty;
  174. string all_abandon_percentage = string.Empty;
  175. if (all_total_count > 0)
  176. {
  177. all_success_percentage = $"{all_success_count / (double)all_total_count * 100:f2}%";
  178. all_abandon_percentage = $"{all_abandon_count / (double)all_total_count * 100:f2}%";
  179. }
  180. var exist2 = new DBContext.Table(conn, tableName)
  181. .Fields("id,log_date")
  182. .Get<dynamic>("log_date=@log_date AND accountId=@accountId",
  183. new { log_date, channel = channelId, accountId = 0 });
  184. var createArgs2 = new DBContext.Table(conn, tableName)
  185. .Add($"{db_prefix}total_count", all_total_count)
  186. .Add($"{db_prefix}abandon_count", all_abandon_count)
  187. .Add($"{db_prefix}abandon_percentage", all_abandon_percentage)
  188. .Add($"{db_prefix}success_count", all_success_count)
  189. .Add($"{db_prefix}success_percentage", all_success_percentage)
  190. .Add("last_time", DateTime.Now);
  191. if (exist2 == null)
  192. {
  193. createArgs2.Add("channel", 0)
  194. .Add("accountId", 0)
  195. .Add("accountName", "all")
  196. .Add("log_date", log_date)
  197. .Add("create_time", DateTime.Now)
  198. .Create();
  199. }
  200. else
  201. {
  202. createArgs2.Where("id=@id", new { exist2.id }).Update();
  203. }
  204. //jd_parse_total
  205. //tool_total
  206. //total
  207. //coupon_total
  208. //parse_total
  209. var chatData = await GetTaobaoDataAsync($"{prefix}total", "", $"{log_date:yyyyMMdd}");
  210. //tableName2
  211. }
  212. public static async Task<DBContext.Table> FillLinkTypeDataAsync(DBContext.Table update, int data_type, DateTime report_date, TkChannelEnum channel)
  213. {
  214. long req_other_aff_num = 0;//1
  215. long req_goods_num = 0;//2
  216. long req_live_num = 0;//3
  217. long req_video_num = 0;///4
  218. long req_shop_num = 0;//5
  219. long req_base_num = 0;//6
  220. long req_note_num = 0;//7
  221. int resp_deeplink_num = 0;
  222. try
  223. {
  224. switch (channel)
  225. {
  226. case TkChannelEnum.tb:
  227. string tableName = $"tk_parse_logs_{report_date:yyyyMMdd}";
  228. string exist_sql = @$"SELECT IF( EXISTS ( SELECT 1 FROM information_schema.tables WHERE table_name = '{tableName}'), 1, 0) AS table_exists;";
  229. int exist_table = DBContext.ExecuteScalar<int>(exist_sql);
  230. if (exist_table == 1)
  231. {
  232. var linkTypeTotal = new DBContext.Table(tableName)
  233. .Fields("linkType, count(*) AS total")
  234. .GroupBy("linkType")
  235. .Select<dynamic>();
  236. foreach (var t in linkTypeTotal)
  237. {
  238. int linkType = t.linkType;
  239. long total = t.total;
  240. switch (linkType)
  241. {
  242. case 1: req_other_aff_num = total; break;
  243. case 2: req_goods_num = total; break;
  244. case 3: req_live_num = total; break;
  245. case 4: req_video_num = total; break;
  246. case 5: req_shop_num = total; break;
  247. case 6: req_base_num = total; break;
  248. case 7: req_note_num = total; break;
  249. }
  250. }
  251. }
  252. string total_key = data_type switch
  253. {
  254. 1 => "parse_total",
  255. 2 or _ => "coupon_total",
  256. };
  257. string[] deeplink_keys = ["home", "success", "fail"];
  258. string accountName = "all";
  259. foreach (var keyname in deeplink_keys)
  260. {
  261. string cacheKey = $":{total_key}:dp_{keyname}:{accountName}:{report_date:yyyyMMdd}";
  262. int value = await TkLogCore.GetTotalAsync(cacheKey);
  263. if (value == 0) continue;
  264. resp_deeplink_num += value;
  265. }
  266. break;
  267. }
  268. }
  269. catch (Exception e)
  270. {
  271. }
  272. update.Add("req_other_aff_num", req_other_aff_num);
  273. update.Add("req_goods_num", req_goods_num);
  274. update.Add("req_live_num", req_live_num);
  275. update.Add("req_video_num", req_video_num);
  276. update.Add("req_shop_num", req_shop_num);
  277. update.Add("req_base_num", req_base_num);
  278. update.Add("req_note_num", req_note_num);
  279. update.Add("resp_deeplink_num", resp_deeplink_num);
  280. return update;
  281. }
  282. /// <summary>
  283. ///
  284. /// </summary>
  285. /// <param name="data_type">1转链 2优惠券 3dp</param>
  286. /// <param name="intervalDay"></param>
  287. /// <param name="channel"></param>
  288. public static async Task ApiCallStatisticsAsync(int data_type, int intervalDay, TkChannelEnum channel)
  289. {
  290. DateTime log_date = DateTime.Now.AddDays(-intervalDay).Date;
  291. var endpoint = data_type == 2 ? EndPointCore.GetCouponAdmin() : EndPointCore.GetParseAdmin();
  292. if (endpoint == null || string.IsNullOrEmpty(endpoint.db_server)) return;
  293. using var conn = EndPointCore.GetDbConnection(endpoint.db_server);
  294. using var center_conn = CenterHub.GetOpenConnection();
  295. //v_jd_spread_report
  296. var record = new DBContext.Table(center_conn, "api_call_report_dailys")
  297. .Fields("id, report_date, read_num")
  298. .Get<dynamic>("report_date=@log_date AND platform=@platform AND data_type=@data_type",
  299. new { log_date, platform = channel, data_type });
  300. var update = new DBContext.Table(center_conn, "api_call_report_dailys")
  301. .Add("data_type", data_type)
  302. .Add("platform", channel)
  303. .Add("is_show", 1)
  304. .Add("report_date", log_date)
  305. .Add("last_time", DateTime.Now);
  306. switch (channel)
  307. {
  308. case TkChannelEnum.tb:
  309. {
  310. string v_table = "v_tk_report_dailys_parse";
  311. if (data_type == 3) v_table = "v_tk_report_dailys_dp";
  312. var exist_report_dailys = new DBContext.Table(conn, v_table)
  313. .Get<dynamic>("report_date=@log_date", new { log_date });
  314. if (exist_report_dailys != null)
  315. {
  316. update.Add("uclk_uv", exist_report_dailys.uclk_uv_56)
  317. .Add("uclk_pv", exist_report_dailys.uclk_pv_56)
  318. .Add("pay_ord_num", exist_report_dailys.pay_ord_num_56)
  319. .Add("order_ord_num", exist_report_dailys.order_ord_num)
  320. .Add("pay_ord_amt", exist_report_dailys.pay_ord_amt_56)
  321. .Add("pay_tk_disp_tfee", exist_report_dailys.pay_tk_disp_tfee_56)
  322. .Add("pay_ord_uv", exist_report_dailys.pay_ord_uv_56)
  323. .Add("eff_ord_num", exist_report_dailys.eff_ord_num)
  324. .Add("eff_ord_amt", exist_report_dailys.eff_ord_amt)
  325. .Add("eff_tk_disp_tfee", exist_report_dailys.eff_tk_disp_tfee);
  326. }
  327. var exist = new DBContext.Table(center_conn, "center_daily_logs")
  328. .Get<dynamic>("log_date=@log_date AND accountId=@accountId",
  329. new { log_date, channel, accountId = 0 });
  330. if (exist != null)
  331. {
  332. if (data_type == 1 || data_type == 3)
  333. {
  334. update.Add("total_count", exist.parse_total_count)
  335. .Add("abandon_count", exist.parse_abandon_count)
  336. .Add("success_count", exist.parse_success_count);
  337. }
  338. if (data_type == 2)
  339. {
  340. update.Add("total_count", exist.coupon_total_count)
  341. .Add("abandon_count", exist.coupon_abandon_count)
  342. .Add("success_count", exist.coupon_success_count);
  343. }
  344. }
  345. break;
  346. }
  347. case TkChannelEnum.jd:
  348. {
  349. var exist_report_dailys = new DBContext.Table(conn, "v_jd_spread_report")
  350. .Get<dynamic>("report_date=@log_date", new { log_date });
  351. if (exist_report_dailys != null)
  352. {
  353. update.Add("uclk_uv", 0)
  354. .Add("pay_ord_uv", 0)//付款人数
  355. .Add("uclk_pv", exist_report_dailys.clickNum) //点击量 点击次数
  356. .Add("pay_tk_disp_tfee", exist_report_dailys.cosFee)//预估收入 付款预估收入
  357. .Add("pay_ord_amt", exist_report_dailys.cosPrice) //付款金额
  358. .Add("pay_ord_num", exist_report_dailys.orderNum)
  359. .Add("order_ord_num", 0)
  360. .Add("eff_ord_amt", exist_report_dailys.cosPrice) //有效订单金额 有效订单金额
  361. .Add("eff_ord_num", exist_report_dailys.orderNum) //有效付款笔数
  362. .Add("eff_tk_disp_tfee", exist_report_dailys.cosFee); //有效付款预估收入 预估收入
  363. }
  364. var exist = new DBContext.Table(center_conn, "center_daily_logs")
  365. .Get<dynamic>("log_date=@log_date AND accountId=@accountId",
  366. new { log_date, channel, accountId = 0 });
  367. if (exist != null)
  368. {
  369. update.Add("total_count", exist.jd_parse_total_count)
  370. .Add("abandon_count", exist.jd_parse_abandon_count)
  371. .Add("success_count", exist.jd_parse_success_count);
  372. }
  373. break;
  374. }
  375. case TkChannelEnum.pdd:
  376. {
  377. var exist_report_dailys = new DBContext.Table(conn, "v_pdd_estimate_revenue")
  378. .Get<dynamic>("report_date=@log_date", new { log_date });
  379. if (exist_report_dailys != null)
  380. {
  381. decimal feeAmount = Math.Round(0.01m * (decimal)exist_report_dailys.feeAmount, 2);
  382. decimal orderAmount = Math.Round(0.01m * (decimal)exist_report_dailys.orderAmount, 2);
  383. update.Add("uclk_uv", 0)
  384. .Add("pay_ord_uv", 0)//付款人数
  385. .Add("uclk_pv", 0) //点击量 点击次数
  386. .Add("pay_tk_disp_tfee", feeAmount)//预估收入 付款预估收入
  387. .Add("pay_ord_amt", orderAmount) //付款金额
  388. .Add("pay_ord_num", exist_report_dailys.orderNum)
  389. .Add("order_ord_num", 0)
  390. .Add("eff_ord_amt", orderAmount) //有效订单金额 有效订单金额
  391. .Add("eff_ord_num", exist_report_dailys.orderNum) //有效付款笔数
  392. .Add("eff_tk_disp_tfee", feeAmount); //有效付款预估收入 预估收入
  393. }
  394. var exist = new DBContext.Table(center_conn, "center_daily_logs")
  395. .Get<dynamic>("log_date=@log_date AND accountId=@accountId",
  396. new { log_date, channel, accountId = 0 });
  397. if (exist != null)
  398. {
  399. update.Add("total_count", exist.pdd_parse_total_count)
  400. .Add("abandon_count", exist.pdd_parse_abandon_count)
  401. .Add("success_count", exist.pdd_parse_success_count);
  402. }
  403. break;
  404. }
  405. }
  406. if (data_type == 1)
  407. {
  408. //todo 只有转链需要处理,优惠券和京东(未上线)暂不处理
  409. update = await FillLinkTypeDataAsync(update, data_type, log_date, channel);
  410. }
  411. if (record == null)
  412. {
  413. update.Add("read_num", 0).Add("create_time", DateTime.Now).Create();
  414. }
  415. else
  416. {
  417. update.Add("read_num", record.read_num).Where("id=@id", new { record.id }).Update();
  418. }
  419. }
  420. //public static void ApiCallStatistics(int intervalDay, TkChannelEnum channel, string prefix = "")
  421. //{
  422. // DateTime log_date = DateTime.Now.AddDays(-intervalDay).Date;
  423. // var accounts = TkPoolCore.List();
  424. // foreach (var account in accounts)
  425. // {
  426. // int accountId = account.id;
  427. // string accountName = $"{channel}_{account.id}";
  428. // int total_count = TkLogCore.GetTotal($":{prefix}total:{accountName}:{log_date:yyyyMMdd}");
  429. // if (total_count == 0) continue;
  430. // var success_count = TkLogCore.GetTotal($":{prefix}total:{accountName}:success:{log_date:yyyyMMdd}");
  431. // var abandon_count = TkLogCore.GetTotal($":{prefix}total:{accountName}:放弃转链:{log_date:yyyyMMdd}");
  432. // string success_percentage = string.Empty;
  433. // string abandon_percentage = string.Empty;
  434. // if (total_count > 0)
  435. // {
  436. // success_percentage = $"{success_count / (double)total_count * 100:f2}%";
  437. // abandon_percentage = $"{abandon_count / (double)total_count * 100:f2}%";
  438. // }
  439. // var exist = new DBContext.Table("api_call_statistics")
  440. // .Fields("id,log_date")
  441. // .Get<dynamic>("log_date=@log_date AND channel=@channel AND accountId=@accountId",
  442. // new { log_date, channel, accountId });
  443. // var createArgs = new DBContext.Table("api_call_statistics")
  444. // .Add($"{prefix}total_count", total_count)
  445. // .Add($"{prefix}abandon_count", abandon_count)
  446. // .Add($"{prefix}abandon_percentage", abandon_percentage)
  447. // .Add($"{prefix}success_count", success_count)
  448. // .Add($"{prefix}success_percentage", success_percentage)
  449. // .Add("last_time", DateTime.Now);
  450. // if (exist == null)
  451. // {
  452. // createArgs.Add("channel", channel)
  453. // .Add("accountId", accountId)
  454. // .Add("accountName", account.company)
  455. // .Add("log_date", log_date)
  456. // .Add("create_time", DateTime.Now)
  457. // .Create();
  458. // }
  459. // else
  460. // {
  461. // createArgs.Where("id=@id", new { exist.id }).Update();
  462. // }
  463. // }
  464. // int all_total_count = TkLogCore.GetTotal($":{prefix}total:{channel.ToString()}:{log_date:yyyyMMdd}");
  465. // var all_success_count = TkLogCore.GetTotal($":{prefix}total:{channel.ToString()}:success:{log_date:yyyyMMdd}");
  466. // var all_abandon_count = TkLogCore.GetTotal($":{prefix}total:{channel.ToString()}:放弃转链:{log_date:yyyyMMdd}");
  467. // string all_success_percentage = string.Empty;
  468. // string all_abandon_percentage = string.Empty;
  469. // if (all_total_count > 0)
  470. // {
  471. // all_success_percentage = $"{all_success_count / (double)all_total_count * 100:f2}%";
  472. // all_abandon_percentage = $"{all_abandon_count / (double)all_total_count * 100:f2}%";
  473. // }
  474. // var exist2 = new DBContext.Table("api_call_statistics")
  475. // .Fields("id,log_date")
  476. // .Get<dynamic>("log_date=@log_date AND channel=@channel AND accountId=@accountId",
  477. // new { log_date, channel, accountId = 0 });
  478. // var createArgs2 = new DBContext.Table("api_call_statistics")
  479. // .Add($"{prefix}total_count", all_total_count)
  480. // .Add($"{prefix}abandon_count", all_abandon_count)
  481. // .Add($"{prefix}abandon_percentage", all_abandon_percentage)
  482. // .Add($"{prefix}success_count", all_success_count)
  483. // .Add($"{prefix}success_percentage", all_success_percentage)
  484. // .Add("last_time", DateTime.Now);
  485. // if (exist2 == null)
  486. // {
  487. // createArgs2.Add("channel", channel)
  488. // .Add("accountId", 0)
  489. // .Add("accountName", "all")
  490. // .Add("log_date", log_date)
  491. // .Add("create_time", DateTime.Now)
  492. // .Create();
  493. // }
  494. // else
  495. // {
  496. // createArgs2.Where("id=@id", new { exist2.id }).Update();
  497. // }
  498. //}
  499. /// <summary>
  500. /// 事实动态接口(5分钟一次)
  501. /// </summary>
  502. /// <param name="date"></param>
  503. public async Task SaveReportOverview(int days = 0)
  504. {
  505. DateTime date = DateTime.Now;
  506. if (days > 0) date = date.AddDays(-days);
  507. TkReportDTO result = new TkReportDTO();
  508. try
  509. {
  510. string t = $"{date.Convert2UnixTimestamp(true)}";
  511. string dt = date.ToString("yyyy-MM-dd");
  512. string url = "https://pub.alimama.com/openapi/param2/1/gateway.unionpub/data.lens.report.overview.json?" +
  513. $"t={t}&_tb_token_={_tb_token}&ruleEnum=pub_overview&startDate={dt}&endDate={dt}&fixPeriod=1d";
  514. #if DEBUG
  515. //_cookies = "t_alimama=265947ef5452cb1dbc3a85423cb0b4ac; xlly_s=1; wk_cookie2=153667c5e7c346da3c64cc8be5db65b5; wk_unb=UUpjNmHYrAUDFe1XcQ%3D%3D; arms_uid=50fb4ec1-5342-4774-9b30-822cfb71ac29; cookie2_alimama=1939cd118da29bee099e20497d91d195; lid=tb464407448627; cookie3_bak=17c2085f3ca7b7e1d9932184a321265b; env_bak=FM%2BgwZ4N3DW5Nit1vtAN%2BnGo%2FlvOs%2BhcfJ4%2F0uUixKyv; cookie3_bak_exp=1753443569194; havana_lgc_exp=1786690298961; dnk=tb464407448627; tracknick=tb464407448627; lgc=; cookie2=17c2085f3ca7b7e1d9932184a321265b; cancelledSubSites=empty; t=b0f1900bb872fb73431103fd9fd685da; sn=; _tb_token_=e3be75e77317e; uc1=cookie14=UoYbzibV4BRygw%3D%3D&pas=0&cookie16=WqG3DMC9UpAPBHGz5QBErFxlCA%3D%3D&existShop=false&cookie15=WqG3DMC9VAQiUQ%3D%3D&cookie21=V32FPkk%2FhSt4; sgcookie=E100maFa2uGfFmlaN000MHH4oUxgMX%2Fe%2FWHW96Um0swftox2LuxNNHviK0VTqoHo%2F1NuX%2BYAGoSBwA8mzA3bTrtPkhdwXGBaIPytPt3iO9Ay%2Bh8%3D; csg=8a980a9f; login=; rurl=aHR0cHM6Ly9wdWIuYWxpbWFtYS5jb20vaW5kZXguaHRtP2ZvcndhcmQ9aHR0cHMlM0ElMkYlMkZwdWIuYWxpbWFtYS5jb20lMkZwb3J0YWwlMkZ2MiUyRmVmZmVjdCUyRm9yZGVyJTJGb3ZlcnZpZXdPcmRlciUyRnBhZ2UlMkZpbmRleC5odG0%3D; v_alimama=0; JSESSIONID=5529D2F4B4C1D00E84AEBD50280FB383; cna=BfkxIaeXgCYCAXs5yWAuAa9d; x5sec=7b22733b32223a2231323332306465383836393966346263222c2277616762726964676561643b32223a2262373162373332303165646366383332613431613832353966653761656462614349715476635547454c2f706a354c342f2f2f2f2f774561447a49794d6a41794e544d314d5445314e446b374e6a44662b63377042513d3d227d; tfstk=gmTZ8YfPzV3Zz8wI5pQ4Uawh0yQOjZkSnE6fiIAc1OXGl1s2YK9H1Gi91Z-enpI1IZ_1msvXKOqfmNAcuLvz5OctMoz2nQXi6AH93rveZO4f5t_qg9Am6dT2Mr5DiKhOhfnB6CQAoYMSV4O96v7UUiHCojAhlsuH-XOv6CQY9WwmVHATgvY6YsfcnX7hg_CcoOXgxX5OwZ4GmPq3K9CcoZXcjyVhN_5Gi1fiTBXdiZXDnZcF-9CcotvcofqwndUFLGcnq0Zj2WBNbTAGLzRJ81xQXCXUorYeYGWkP9z0oe5wg2dbkzofE3B1VO9nRP72tsJPadynO9xetFIW9c4CIHOMni-KUz1N5HSy7hhYKCv5Q3b9G7k6Tg-F26j3gkACS_IkVMF4SB7hwg8GYSrG53OWkgYi78BC2sJPadyN4PwAthCXkhy00GfdTTGETp4iolm_ZK9uDoIEv6WSwbEYDGxPTTGEToEAxaCFFbXG.";
  516. #endif
  517. var client = new WebClientUtility().SetContentType("application/x-www-form-urlencoded; charset=UTF-8")
  518. .AddHeaders("X-Requested-With", "XMLHttpRequest")
  519. .AddHeaders("Cookie", _cookies);
  520. client.Referer = "https://pub.alimama.com/portal/v2/pages/effect/account/total/page/index.htm";
  521. #if DEBUG
  522. client.Proxy = new System.Net.WebProxy("bjapi.molilian.com", 20087);
  523. #else
  524. client.Proxy = _proxy;
  525. #endif
  526. if (!string.IsNullOrEmpty(_user_agent)) client.UserAgent = _user_agent;
  527. var response = client.Request(url);
  528. var body = response.Body();
  529. JsonElement root = default;
  530. try
  531. {
  532. root = body.Convert2JsonElement();
  533. }
  534. catch (Exception)
  535. {
  536. _ = new LoggerLibrary("error", "SaveReportOverview").Info(url, body).SaveAsync();
  537. throw new Exception("SaveReportOverview body不是 json格式");
  538. }
  539. int resultCode = root.Read<int>("resultCode", 0);
  540. bool success = root.Read("success", false);
  541. if (!success)
  542. {
  543. _ = new LoggerLibrary("error", "SaveReportOverview")
  544. .Info(url, body)
  545. .SaveAsync();
  546. var bizErrorDesc = root.Read("bizErrorDesc", string.Empty);
  547. if (resultCode == 500 && bizErrorDesc.Contains("For input string"))
  548. {
  549. return;
  550. }
  551. //{"success":false,"resultCode":500,"bizErrorDesc":"For input string: \"null\"","bizErrorCode":400}
  552. throw new Exception(body);
  553. }
  554. var data = root.ElementRead("data").ElementRead("data");
  555. result.eff_ord_num = data.Read<int>("eff_ord_num", 0);
  556. result.eff_ord_amt = data.Read<decimal>("eff_ord_amt", 0);
  557. result.eff_tk_disp_tfee = data.Read<decimal>("eff_tk_disp_tfee", 0);
  558. result.uclk_uv_56 = data.Read<int>("uclk_uv_56", 0);
  559. result.uclk_pv_56 = data.Read<int>("uclk_pv_56", 0);
  560. result.uclt_uv_56 = data.Read<int>("uclt_uv_56", 0);
  561. result.ucart_uv_56 = data.Read<int>("ucart_uv_56", 0);
  562. result.dep_ord_num_56 = data.Read<int>("dep_ord_num_56", 0);
  563. result.dep_ord_dep_amt_56 = data.Read<decimal>("dep_ord_dep_amt_56", 0);
  564. result.pay_ord_num_56 = data.Read<int>("pay_ord_num_56", 0);
  565. result.pay_ord_amt_56 = data.Read<decimal>("pay_ord_amt_56", 0);
  566. result.pay_tk_disp_tfee_56 = data.Read<decimal>("pay_tk_disp_tfee_56", 0);
  567. result.pay_ord_uv_56 = data.Read<int>("pay_ord_uv_56", 0);
  568. result.sett_ord_num_56 = data.Read<int>("sett_ord_num_56", 0);
  569. result.sett_ord_amt_56 = data.Read<decimal>("sett_ord_amt_56", 0);
  570. result.sett_tk_disp_tfee_56 = data.Read<decimal>("sett_tk_disp_tfee_56", 0);
  571. DateTime report_date = date.Date;
  572. if (report_date == DateTime.Now.Date)
  573. {
  574. await RiskControlCore.SaveIncomeAmtAsync(TkChannelEnum.tb, $"{_accountId}", result.eff_tk_disp_tfee);
  575. if (_account.is_hide) return;
  576. await EachSaveReportOverviewAsync(report_date.AddHours(DateTime.Now.Hour), "tk_report_hourtrend", result);
  577. await EachSaveReportOverviewAsync(report_date, "tk_report", result);
  578. }
  579. else
  580. {
  581. await EachSaveReportOverviewAsync(report_date, "tk_report", result);
  582. }
  583. }
  584. catch (Exception ex)
  585. {
  586. string message = $"【报表接口异常】FastReport\n{ex.Message}\n{ex.StackTrace}";
  587. //NotifyCore.Notify(new NifyMessage
  588. //{
  589. // message = message,
  590. // priority = NifyMessagePriority.high,
  591. // tags = ["red_circle"]
  592. //});
  593. }
  594. }
  595. private async Task EachSaveReportOverviewAsync(DateTime report_date, string tableName, TkReportDTO data)
  596. {
  597. try
  598. {
  599. var exist = new DBContext.Table(tableName)
  600. .Fields("id, report_date")
  601. .Get<dynamic>("report_date=@report_date AND accountId=@accountId",
  602. new { report_date, accountId = _accountId });
  603. var createArgs = new DBContext.Table(tableName)
  604. .Add("uclk_uv_56", data.uclk_uv_56)
  605. .Add("uclk_pv_56", data.uclk_pv_56)
  606. .Add("uclt_uv_56", data.uclt_uv_56)
  607. .Add("ucart_uv_56", data.ucart_uv_56)
  608. .Add("dep_ord_num_56", data.dep_ord_num_56)
  609. .Add("dep_ord_dep_amt_56", data.dep_ord_dep_amt_56)
  610. .Add("pay_ord_num_56", data.pay_ord_num_56)
  611. .Add("pay_ord_amt_56", data.pay_ord_amt_56)
  612. .Add("pay_tk_disp_tfee_56", data.pay_tk_disp_tfee_56)
  613. .Add("pay_ord_uv_56", data.pay_ord_uv_56)
  614. .Add("sett_ord_num_56", data.sett_ord_num_56)
  615. .Add("sett_ord_amt_56", data.sett_ord_amt_56)
  616. .Add("sett_tk_disp_tfee_56", data.sett_tk_disp_tfee_56)
  617. .Add("eff_ord_num", data.eff_ord_num)
  618. .Add("eff_ord_amt", data.eff_ord_amt)
  619. .Add("eff_tk_disp_tfee", data.eff_tk_disp_tfee);
  620. string data_suffix = report_date.ToString("yyyyMMdd");
  621. if ("tk_report_hourtrend".Equals(tableName))
  622. {
  623. data_suffix = report_date.ToString("yyyyMMddHH");
  624. }
  625. string accountName = $"{TkChannelEnum.tb}_{_accountId}";
  626. int total_count = await TkLogCore.GetTotalAsync($":total:{accountName}:{data_suffix}");
  627. int success_count = 0, abandon_count = 0;
  628. string success_percentage = string.Empty, abandon_percentage = string.Empty;
  629. if (total_count > 0)
  630. {
  631. success_count = await TkLogCore.GetTotalAsync($":total:{accountName}:success:{data_suffix}");
  632. abandon_count = await TkLogCore.GetTotalAsync($":total:{accountName}:放弃转链:{data_suffix}");
  633. if (total_count > 0)
  634. {
  635. success_percentage = $"{success_count / (double)total_count * 100:f2}%";
  636. abandon_percentage = $"{abandon_count / (double)total_count * 100:f2}%";
  637. }
  638. }
  639. createArgs.Add("total_count", total_count);
  640. createArgs.Add("success_count", success_count);
  641. createArgs.Add("abandon_count", abandon_count);
  642. createArgs.Add("success_percentage", success_percentage);
  643. createArgs.Add("abandon_percentage", abandon_percentage);
  644. int parse_total_count = await TkLogCore.GetTotalAsync($":parse_total:{accountName}:{data_suffix}");
  645. int parse_success_count = 0, parse_abandon_count = 0;
  646. string parse_success_percentage = string.Empty, parse_abandon_percentage = string.Empty;
  647. if (parse_total_count > 0)
  648. {
  649. parse_success_count = await TkLogCore.GetTotalAsync($":parse_total:{accountName}:success:{data_suffix}");
  650. parse_abandon_count = await TkLogCore.GetTotalAsync($":parse_total:{accountName}:放弃转链:{data_suffix}");
  651. if (parse_total_count > 0)
  652. {
  653. parse_success_percentage = $"{parse_success_count / (double)parse_total_count * 100:f2}%";
  654. parse_abandon_percentage = $"{parse_abandon_count / (double)parse_total_count * 100:f2}%";
  655. }
  656. }
  657. createArgs.Add("parse_total_count", parse_total_count);
  658. createArgs.Add("parse_success_count", parse_success_count);
  659. createArgs.Add("parse_abandon_count", parse_abandon_count);
  660. createArgs.Add("parse_success_percentage", parse_success_percentage);
  661. createArgs.Add("parse_abandon_percentage", parse_abandon_percentage);
  662. int coupon_total_count = await TkLogCore.GetTotalAsync($":coupon_total:{accountName}:{data_suffix}", false);
  663. int coupon_success_count = 0, coupon_abandon_count = 0;
  664. string coupon_success_percentage = string.Empty, coupon_abandon_percentage = string.Empty;
  665. if (coupon_total_count > 0)
  666. {
  667. coupon_success_count = await TkLogCore.GetTotalAsync($":coupon_total:{accountName}:success:{data_suffix}", false);
  668. coupon_abandon_count = await TkLogCore.GetTotalAsync($":coupon_total:{accountName}:放弃转链:{data_suffix}", false);
  669. if (coupon_total_count > 0)
  670. {
  671. coupon_success_percentage = $"{coupon_success_count / (double)coupon_total_count * 100:f2}%";
  672. coupon_abandon_percentage = $"{coupon_abandon_count / (double)coupon_total_count * 100:f2}%";
  673. }
  674. }
  675. createArgs.Add("coupon_total_count", coupon_total_count);
  676. createArgs.Add("coupon_success_count", coupon_success_count);
  677. createArgs.Add("coupon_abandon_count", coupon_abandon_count);
  678. createArgs.Add("coupon_success_percentage", coupon_success_percentage);
  679. createArgs.Add("coupon_abandon_percentage", coupon_abandon_percentage);
  680. int tool_total_count = await TkLogCore.GetTotalAsync($":tool_total:{accountName}:{data_suffix}");
  681. int tool_success_count = 0, tool_abandon_count = 0;
  682. string tool_success_percentage = string.Empty, tool_abandon_percentage = string.Empty;
  683. if (tool_total_count > 0)
  684. {
  685. tool_success_count = await TkLogCore.GetTotalAsync($":tool_total:{accountName}:success:{data_suffix}");
  686. tool_abandon_count = await TkLogCore.GetTotalAsync($":tool_total:{accountName}:放弃转链:{data_suffix}");
  687. if (tool_total_count > 0)
  688. {
  689. tool_success_percentage = $"{tool_success_count / (double)tool_total_count * 100:f2}%";
  690. tool_abandon_percentage = $"{tool_abandon_count / (double)tool_total_count * 100:f2}%";
  691. }
  692. }
  693. createArgs.Add("tool_total_count", tool_total_count);
  694. createArgs.Add("tool_success_count", tool_success_count);
  695. createArgs.Add("tool_abandon_count", tool_abandon_count);
  696. createArgs.Add("tool_success_percentage", tool_success_percentage);
  697. createArgs.Add("tool_abandon_percentage", tool_abandon_percentage);
  698. if (exist == null)
  699. {
  700. createArgs.Add("accountId", _accountId)
  701. .Add("accountName", _company)
  702. .Add("report_date", report_date)
  703. .Add("create_time", DateTime.Now)
  704. .Add("last_time", DateTime.Now)
  705. .Create();
  706. }
  707. else
  708. {
  709. createArgs.Add("last_time", DateTime.Now)
  710. .Where("id=@id", new { exist.id })
  711. .Update();
  712. }
  713. }
  714. catch (Exception ex)
  715. {
  716. string msg = ex.Message;
  717. }
  718. }
  719. /// <summary>
  720. /// 修正点击数
  721. /// </summary>
  722. public async Task FixReport(DateTime date)
  723. {
  724. TkReportDTO result = new TkReportDTO();
  725. try
  726. {
  727. string t = $"{date.Convert2UnixTimestamp(true)}";
  728. string dt = date.ToString("yyyy-MM-dd");
  729. string url = "https://pub.alimama.com/openapi/param2/1/gateway.unionpub/data.lens.report.overview.json?" +
  730. $"t={t}&_tb_token_={_tb_token}&ruleEnum=pub_overview&startDate={dt}&endDate={dt}&fixPeriod=1d";
  731. var client = new WebClientUtility().SetContentType("application/json;charset=utf-8")
  732. .AddHeaders("X-Requested-With", "XMLHttpRequest")
  733. .AddHeaders("Cookie", _cookies);
  734. #if DEBUG
  735. #else
  736. client.Proxy = _proxy;
  737. #endif
  738. if (!string.IsNullOrEmpty(_user_agent)) client.UserAgent = _user_agent;
  739. var response = client.Request(url);
  740. var body = response.Body();
  741. var root = body.Convert2JsonElement();
  742. int resultCode = root.Read<int>("resultCode", 0);
  743. bool success = root.Read("success", false);
  744. if (!success)
  745. {
  746. var bizErrorDesc = root.Read("bizErrorDesc", string.Empty);
  747. if (resultCode == 500 && bizErrorDesc.Contains("For input string"))
  748. {
  749. return;
  750. }
  751. _ = new LoggerLibrary("report", "error")
  752. .Info(url, body)
  753. .SaveAsync();
  754. throw new Exception(body);
  755. }
  756. var data = root.ElementRead("data").ElementRead("data");
  757. result.eff_ord_num = data.Read<int>("eff_ord_num", 0);
  758. result.eff_ord_amt = data.Read<decimal>("eff_ord_amt", 0);
  759. result.eff_tk_disp_tfee = data.Read<decimal>("eff_tk_disp_tfee", 0);
  760. result.uclk_uv_56 = data.Read<int>("uclk_uv_56", 0);
  761. result.uclk_pv_56 = data.Read<int>("uclk_pv_56", 0);
  762. result.uclt_uv_56 = data.Read<int>("uclt_uv_56", 0);
  763. result.ucart_uv_56 = data.Read<int>("ucart_uv_56", 0);
  764. result.dep_ord_num_56 = data.Read<int>("dep_ord_num_56", 0);
  765. result.dep_ord_dep_amt_56 = data.Read<decimal>("dep_ord_dep_amt_56", 0);
  766. result.pay_ord_num_56 = data.Read<int>("pay_ord_num_56", 0);
  767. result.pay_ord_amt_56 = data.Read<decimal>("pay_ord_amt_56", 0);
  768. result.pay_tk_disp_tfee_56 = data.Read<decimal>("pay_tk_disp_tfee_56", 0);
  769. result.pay_ord_uv_56 = data.Read<int>("pay_ord_uv_56", 0);
  770. result.sett_ord_num_56 = data.Read<int>("sett_ord_num_56", 0);
  771. result.sett_ord_amt_56 = data.Read<decimal>("sett_ord_amt_56", 0);
  772. result.sett_tk_disp_tfee_56 = data.Read<decimal>("sett_tk_disp_tfee_56", 0);
  773. DateTime report_date = date.Date;
  774. if (_account.is_hide) return;
  775. await EachSaveReportOverviewAsync(report_date, "tk_report", result);
  776. //var exist = new DBContext.Table("tk_report")
  777. // .Fields("id,report_date")
  778. // .Get<dynamic>("report_date=@report_date AND accountId=@accountId",
  779. // new { report_date, accountId = _accountId });
  780. //var createArgs = new DBContext.Table("tk_report")
  781. // .Add("fix_uclk_pv_56", result.fix_uclk_pv_56);
  782. //if (exist == null)
  783. //{
  784. // createArgs.Add("accountId", _accountId)
  785. // .Add("accountName", _company)
  786. // .Add("report_date", report_date)
  787. // .Add("create_time", DateTime.Now)
  788. // .Add("last_time", DateTime.Now)
  789. // .Create();
  790. //}
  791. //else
  792. //{
  793. // createArgs.Add("last_time", DateTime.Now)
  794. // .Where("id=@id", new { exist.id })
  795. // .Update();
  796. //}
  797. }
  798. catch (Exception ex) { }
  799. }
  800. /// <summary>
  801. /// 1小时更新一次
  802. /// </summary>
  803. public void SaveReportHourtrend(DateTime date)
  804. {
  805. string t = $"{DateTime.Now.Convert2UnixTimestamp(true)}";
  806. string dt = date.ToString("yyyy-MM-dd");
  807. string url = "https://pub.alimama.com/openapi/param2/1/gateway.unionpub/data.lens.report.hourtrend.dod.json?" +
  808. $"t={t}&_tb_token_={_tb_token}&ruleEnum=pub_homepage&startDate={dt}&endDate={dt}&fixPeriod=realTime";
  809. var client = new WebClientUtility().SetContentType("application/json;charset=utf-8")
  810. .AddHeaders("X-Requested-With", "XMLHttpRequest")
  811. .AddHeaders("Cookie", _cookies);
  812. #if DEBUG
  813. #else
  814. client.Proxy = _proxy;
  815. #endif
  816. if (!string.IsNullOrEmpty(_user_agent)) client.UserAgent = _user_agent;
  817. var response = client.Request(url);
  818. var body = response.Body();
  819. var root = body.Convert2JsonElement();
  820. int resultCode = root.Read<int>("resultCode", 0);
  821. bool success = root.Read("success", false);
  822. if (!success)
  823. {
  824. _ = new LoggerLibrary("report", "error")
  825. .Info(url, body)
  826. .SaveAsync();
  827. var bizErrorDesc = root.Read("bizErrorDesc", string.Empty);
  828. if (resultCode == 500 && bizErrorDesc.Contains("For input string"))
  829. {
  830. return;
  831. }
  832. _ = new LoggerLibrary("report", "error")
  833. .Info(url, body)
  834. .SaveAsync();
  835. throw new Exception(body);
  836. }
  837. var data_list = root.ElementRead("data").ElementRead("data");
  838. foreach (var data in data_list.EnumerateArray())
  839. {
  840. string xAxis = data.Read<string>("xAxis");
  841. string _report_date = $"{dt} {xAxis}";
  842. EachSaveReport(_report_date, "tk_report_hourtrend", data);
  843. if ("23:00".Equals(xAxis))
  844. {
  845. EachSaveReport(dt, "tk_report", data);
  846. }
  847. }
  848. }
  849. private void EachSaveReport(string _report_date, string tableName, JsonElement data)
  850. {
  851. _ = DateTime.TryParse(_report_date, out DateTime report_date);
  852. var exist = new DBContext.Table(tableName)
  853. .Fields("id,report_date")
  854. .Get<dynamic>("report_date=@report_date AND accountId=@accountId",
  855. new { report_date, accountId = _accountId });
  856. if (exist == null)
  857. {
  858. new DBContext.Table(tableName)
  859. .Fill(data)
  860. .Loader<int>("uclk_uv_56", 0)
  861. .Loader<int>("uclk_pv_56", 0)
  862. .Loader<int>("uclt_uv_56", 0)
  863. .Loader<int>("ucart_uv_56", 0)
  864. .Loader<int>("dep_ord_num_56", 0)
  865. .Loader<decimal>("dep_ord_dep_amt_56", 0)
  866. .Loader<int>("pay_ord_num_56", 0)
  867. .Loader<decimal>("pay_ord_amt_56", 0)
  868. .Loader<decimal>("pay_tk_disp_tfee_56", 0)
  869. .Loader<int>("pay_ord_uv_56", 0)
  870. .Loader<int>("sett_ord_num_56", 0)
  871. .Loader<decimal>("sett_ord_amt_56", 0)
  872. .Loader<decimal>("sett_tk_disp_tfee_56", 0)
  873. .Add("accountId", _accountId)
  874. .Add("accountName", _company)
  875. .Add("report_date", report_date)
  876. .Add("create_time", DateTime.Now)
  877. .Add("last_time", DateTime.Now)
  878. .Create();
  879. }
  880. else
  881. {
  882. new DBContext.Table(tableName)
  883. .Fill(data)
  884. .Loader<int>("uclk_uv_56", 0)
  885. .Loader<int>("uclk_pv_56", 0)
  886. .Loader<int>("uclt_uv_56", 0)
  887. .Loader<int>("ucart_uv_56", 0)
  888. .Loader<int>("dep_ord_num_56", 0)
  889. .Loader<decimal>("dep_ord_dep_amt_56", 0)
  890. .Loader<int>("pay_ord_num_56", 0)
  891. .Loader<decimal>("pay_ord_amt_56", 0)
  892. .Loader<decimal>("pay_tk_disp_tfee_56", 0)
  893. .Loader<int>("pay_ord_uv_56", 0)
  894. .Loader<int>("sett_ord_num_56", 0)
  895. .Loader<decimal>("sett_ord_amt_56", 0)
  896. .Loader<decimal>("sett_tk_disp_tfee_56", 0)
  897. .Add("last_time", DateTime.Now)
  898. .Where("id=@id", new { exist.id })
  899. .Update();
  900. }
  901. }
  902. /// <summary>
  903. /// 警告消息
  904. /// </summary>
  905. public void GetViolationuWarning()
  906. {
  907. try
  908. {
  909. string url = "https://media.alimama.com/violationu2/warning_instance_page_v2.json?r=mx_208&toPage=1&pageSize=40&params=";
  910. var client = new WebClientUtility().SetContentType("application/json;charset=utf-8")
  911. .AddHeaders("X-Requested-With", "XMLHttpRequest")
  912. .AddHeaders("Cookie", _cookies);
  913. #if DEBUG
  914. #else
  915. client.Proxy = _proxy;
  916. #endif
  917. if (!string.IsNullOrEmpty(_user_agent)) client.UserAgent = _user_agent;
  918. var response = client.Request(url);
  919. var body = response.Body();
  920. var root = body.Convert2JsonElement();
  921. int resultCode = root.Read<int>("resultCode", 0);
  922. int totalCount = root.PathRead<int>("data.totalCount", 0);
  923. bool success = root.Read("success", false);
  924. if (!success)
  925. {
  926. _ = new LoggerLibrary("violationu", "warning_error")
  927. .Info(url, body)
  928. .SaveAsync();
  929. throw new Exception(body);
  930. }
  931. if (totalCount == 0) return;
  932. _ = new LoggerLibrary("violationu", "warning").Info(url, body).SaveAsync();
  933. var list = root.ElementRead("data").ElementRead("result").EnumerateArray();
  934. foreach (var data in list)
  935. {
  936. var violation_commission = data.PathRead<decimal>("mediaInfo.订单虚假交易违规佣金", 0);
  937. new DBContext.Table("alimama_warning")
  938. .Fill(data)
  939. .Loader<int>("filterRuleId", 0)
  940. .Loader<long>("gmtCreate", 0)
  941. .Loader<long>("id", 0, "ali_id")
  942. .Loader<string>("idStr", string.Empty)
  943. .Loader<int>("mediaDimension", 0)
  944. .Loader<long>("mediaId", 0)
  945. .Loader<int>("mediaInfo.abn_cnt", 0, "abn_cnt")
  946. .Add("violation_commission", violation_commission)
  947. .Loader<int>("mediaInfo.warning_cnt", 0, "warning_cnt")
  948. .Loader<string>("mediaName", string.Empty)
  949. .Loader<long>("memberId", 0)
  950. .Loader<string>("noticeCategory", string.Empty)
  951. .Loader<int>("noticeTemplateId", 0)
  952. .Loader<string>("noticeTemplateName", string.Empty)
  953. .Loader<string>("orderFile", string.Empty)
  954. .Loader<string>("pid", string.Empty)
  955. .Loader<int>("punishRuleId", 0)
  956. .Loader<string>("riskType", string.Empty)
  957. .Loader<string>("roleName", string.Empty)
  958. .Loader<string>("ruleLink", string.Empty)
  959. .Loader<bool>("showOrderDetail", false)
  960. .Loader<int>("status", 0, "ali_status")
  961. .Loader<string>("warningText", string.Empty)
  962. .Add("accountName", _company)
  963. .Add("status", true)
  964. .Add("create_time", DateTime.Now)
  965. .Add("last_time", DateTime.Now)
  966. .Create(DBContext.InsertType.REPLACE);
  967. }
  968. }
  969. catch (Exception ex) { }
  970. }
  971. }
  972. }