crawler.cs 56 KB

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