using dodohold.core; using Spire.Pdf.Xmp; using System.Data; using System.Drawing.Printing; using System.Runtime.InteropServices; using System.Text.Json; using System.Text.RegularExpressions; namespace molilian.core { public partial class AlimamaPlus { private const string base_orders_url = "https://pub.alimama.com/openapi/param2/1/gateway.unionpub/report.getTbkOrderDetails.json"; public int GetHistoryOrders(int sleep) { DateTime endTime = DateTime.Now; DateTime startTime = endTime.AddDays(-90); ////找出数据库最新的一天 //var last = new DBContext.Table("tk_order_details") // .Order("modifiedTime DESC") // .Get("accountId=@accountId", new { accountId = _accountId }); //if (last != null) //{ // startTime = last.modifiedTime; //} //当日往前查询 (int total, _, _) = GetTkOrders(startTime, endTime, DateTime.MinValue, false, sleep); return total; } public int GetIncyOrders(int sleep) { string cacheKey = $":cache:GetIncyOrders:{_accountName}"; DateTime endTime = DateTime.Now; DateTime startTime = endTime.AddDays(-1); DateTime last_modifiedTime = RedisHelper.Get(cacheKey); ////找出数据库最新的一天 //var last = new DBContext.Table("tk_order_details") // .Order("modifiedTime DESC") // .Get("accountId=@accountId", new { accountId = _accountId }); if (last_modifiedTime != DateTime.MinValue) { startTime = last_modifiedTime; } else { last_modifiedTime = startTime; } //当日往前查询 (int total, DateTime max_modifiedTime, List orderTimes) = GetTkOrders(startTime, endTime, last_modifiedTime, true, sleep); if (max_modifiedTime != DateTime.MinValue) { RedisHelper.Set(cacheKey, max_modifiedTime); } //todo 根据orderTimes、settlementTimes 更新被影响的相关行 /* UPDATE tk_report tr JOIN ( SELECT accountId, DATE(tbPaidTime) AS date, SUM(alipayTotalPrice) AS order_ord_amt, SUM(pubShareFeeForCommission) AS order_ord_tfee FROM tk_order_details WHERE tkStatus=3 GROUP BY DATE(tbPaidTime), accountId ) AS sub ON tr.accountId = sub.accountId AND tr.report_date = sub.date SET tr.order_ord_amt = sub.order_ord_amt, tr.order_ord_tfee = sub.order_ord_tfee; */ string sql = @" UPDATE tk_report tr JOIN ( SELECT accountId, DATE(tbPaidTime) AS date, SUM(alipayTotalPrice) AS order_ord_amt, SUM(pubShareFeeForCommission) AS order_ord_tfee FROM tk_order_details WHERE DATE(tbPaidTime) IN @orderTimes AND tkStatus=3 GROUP BY DATE(tbPaidTime), accountId ) AS sub ON tr.accountId = sub.accountId AND tr.report_date = sub.date SET tr.order_ord_amt = sub.order_ord_amt, tr.order_ord_tfee = sub.order_ord_tfee;"; DBContext.Execute(sql, new { orderTimes }); sql = @" UPDATE tk_report tr JOIN ( SELECT accountId, DATE(tbPaidTime) AS date, SUM(alipayTotalPrice) AS order_ord_amt, SUM(pubSharePreFeeForCommission) AS order_ord_tfee FROM tk_order_details WHERE DATE(tbPaidTime) IN @orderTimes AND tkStatus=12 GROUP BY DATE(tbPaidTime), accountId ) AS sub ON tr.accountId = sub.accountId AND tr.report_date = sub.date SET tr.order_ord_amt_12 = sub.order_ord_amt, tr.order_ord_tfee_12 = sub.order_ord_tfee;"; DBContext.Execute(sql, new { orderTimes }); sql = @" UPDATE tk_report tr JOIN ( SELECT accountId, DATE(tbPaidTime) AS date, SUM(alipayTotalPrice) AS order_ord_amt, SUM(pubSharePreFeeForCommission) AS order_ord_tfee FROM tk_order_details WHERE DATE(tbPaidTime) IN @orderTimes AND tkStatus=13 GROUP BY DATE(tbPaidTime), accountId ) AS sub ON tr.accountId = sub.accountId AND tr.report_date = sub.date SET tr.order_ord_amt_13 = sub.order_ord_amt, tr.order_ord_tfee_13 = sub.order_ord_tfee;"; DBContext.Execute(sql, new { orderTimes }); sql = @" UPDATE tk_report tr JOIN ( SELECT accountId, DATE(tbPaidTime) AS date, SUM(alipayTotalPrice) AS order_ord_amt, SUM(pubSharePreFeeForCommission) AS order_ord_tfee FROM tk_order_details WHERE DATE(tbPaidTime) IN @orderTimes AND tkStatus=14 GROUP BY DATE(tbPaidTime), accountId ) AS sub ON tr.accountId = sub.accountId AND tr.report_date = sub.date SET tr.order_ord_amt_14 = sub.order_ord_amt, tr.order_ord_tfee_14 = sub.order_ord_tfee;"; DBContext.Execute(sql, new { orderTimes }); return total; } public (int, DateTime, List) GetTkOrders(DateTime startTime, DateTime endTime, DateTime last_modifiedTime, bool desc = true, int sleep = 100) { List orderTimes = []; // 确保 startTime 小于 endTime if (startTime > endTime) { (startTime, endTime) = (endTime, startTime); } DateTime max_modifiedTime = last_modifiedTime; int pageNo = 1; string positionIndex = string.Empty; int pageSize = 100; bool hasNext = true; int total = 0; while (hasNext) { var ts = DateTime.Now.Convert2UnixTimestamp(); //string jumpType = pageNo == 1 ? "0" : desc ? "1" : "-1"; string jumpType = desc ? pageNo == 1 ? "0" : "1" : "-1"; //string queryType = "1"; string queryType = "4"; string url = $"{base_orders_url}?t={ts}&_tb_token_={_tb_token}&pageNo={pageNo}&pageSize={pageSize}&startTime={startTime:yyyy-MM-dd}&endTime={endTime:yyyy-MM-dd}&payStatus=&queryType={queryType}&jumpType={jumpType}&tkTradeId=&positionIndex={positionIndex}"; var client = new WebClientUtility().SetContentType("application/json;charset=utf-8") .AddHeaders("X-Requested-With", "XMLHttpRequest") .AddHeaders("Cookie", _cookies); #if DEBUG #else client.Proxy = _proxy; #endif if (!string.IsNullOrEmpty(_user_agent)) client.UserAgent = _user_agent; var response = client.Request(url); if (response.ResponseException != null) { _ = new LoggerLibrary("api_error", "fail") .Info(response.ResponseException.Message, response.ResponseException.StackTrace) .SaveAsync(); throw response.ResponseException; } var body = response.Body(); JsonElement data; try { var root = body.Convert2JsonElement(); var success = root.Read("success"); data = root.ElementRead("data"); //{"code":601,"info":{"ok":false,"message":"nologin"}} if (!success && body.Contains("nologin")) { (success, string message) = RenewCookie(); if (!success) { TkPoolCore.Disabled(_accountName, $"{body}"); } return (0, DateTime.MinValue, new List()); } if (!success) { throw new APIException(body); } } catch (Exception ex) { throw new APIException(body); } using var conn = DBContext.GetOpenConnection(); conn.Open(); try { foreach (var order in data.ElementRead("result").EnumerateArray()) { TkOrderDetailDTO item = order.GetRawText().Convert2Object(); // 处理每个订单数据 item.accountId = _accountId; item.accountName = _company; if (item.modifiedTime > max_modifiedTime) max_modifiedTime = item.modifiedTime; if (last_modifiedTime != DateTime.MinValue && last_modifiedTime >= item.modifiedTime) { return (total, max_modifiedTime, orderTimes); } //进行订单和转链匹配 item.itemId = GetRawItemId(item.mktId); if (item.tkStatus == 3 && item.tbPaidTime != DateTime.MinValue) orderTimes.Add(item.tbPaidTime.Date); int? id = conn.Replace(item); if (id != null) { item.id = (int)id; TkOrderTrackingCore.MatchOrder(item, conn); } total++; } } catch (Exception ex) { throw; } finally { conn.Dispose(); } pageNo++; hasNext = data.Read("hasNext"); positionIndex = data.Read("positionIndex"); if (sleep > 0) Thread.Sleep(sleep); } return (total, max_modifiedTime, orderTimes); } string GetRawItemId(string mktId) { try { string cacheKey = $":cache:mkt2itemId:{mktId}"; string itemId = RedisHelper.Get(cacheKey); if (itemId != null) return itemId; var ts = DateTime.Now.Convert2UnixTimestamp(true); string url = "https://pub.alimama.com/openapi/param2/1/gateway.unionpub/union.moose.content.entry"; //string url = $"{base_orders_url}?t={ts}&_tb_token_={_tb_token}&pageNo={pageNo}&pageSize={pageSize}&startTime={startTime:yyyy-MM-dd}&endTime={endTime:yyyy-MM-dd}&payStatus=&queryType={queryType}&jumpType={jumpType}&tkTradeId=&positionIndex={positionIndex}"; var client = new WebClientUtility() .SetContentType("application/x-www-form-urlencoded") .AddHeaders("Cookie", _cookies) .AddHeaders("Origin", "https://pub.alimama.com") .Post("_tb_token_", _tb_token) .Post("t", ts.ToString()) .Post("bizType", "detailPage") .Post("bizParam", $"{{\"itemId\":\"{mktId}\"}}"); //_tb_token_=3b88755bbe3f7&t=1718896771391&bizType=detailPage&bizParam=%7B%22itemId%22%3A%22JbtMUqkGMQvagTNb2Fvta-9ag242pu7MOX5e0bsrY%22%7D //_tb_token_=361e383eb61e5&t=1718895935097&bizType=detailPage&bizParam=%7B%22itemId%22%3A%22JbtMUqkGMQvagTNb2Fvta-9ag242pu7MOX5e0bsrY%22%7D #if DEBUG #else client.Proxy = _proxy; #endif if (!string.IsNullOrEmpty(_user_agent)) client.UserAgent = _user_agent; var response = client.Request(url); if (!response.Successed) { throw response.ResponseException; } var body = response.Body(); var root = body.Convert2JsonElement(); itemId = root.PathRead("model.item.itemId"); if (!string.IsNullOrEmpty(itemId)) { RedisHelper.Set(cacheKey, itemId, 86400 * 7); } return itemId; } catch (Exception ex) { string message = $"【GetRawItemId】[{mktId}\n{ex.Message}\n{ex.StackTrace}"; NotifyCore.Notify(new NifyMessage { message = message, priority = NifyMessagePriority.high, tags = ["red_circle"] }); } return null; } public void GetTkOrders222() { try { string url = "https://media.alimama.com/violationu2/warning_instance_page_v2.json?r=mx_208&toPage=1&pageSize=40¶ms="; var client = new WebClientUtility().SetContentType("application/json;charset=utf-8") .AddHeaders("X-Requested-With", "XMLHttpRequest") .AddHeaders("Cookie", _cookies); client.Proxy = _proxy; if (!string.IsNullOrEmpty(_user_agent)) client.UserAgent = _user_agent; var response = client.Request(url); var body = response.Body(); var root = body.Convert2JsonElement(); int resultCode = root.Read("resultCode", 0); int totalCount = root.PathRead("data.totalCount", 0); bool success = root.Read("success", false); if (!success) { _ = new LoggerLibrary("violationu", "warning_error") .Info(url, body) .SaveAsync(); throw new Exception(body); } if (totalCount == 0) return; _ = new LoggerLibrary("violationu", "warning").Info(url, body).SaveAsync(); var list = root.ElementRead("data").ElementRead("result").EnumerateArray(); foreach (var data in list) { var violation_commission = data.PathRead("mediaInfo.订单虚假交易违规佣金", 0); new DBContext.Table("alimama_warning") .Fill(data) .Loader("filterRuleId", 0) .Loader("gmtCreate", 0) .Loader("id", 0, "ali_id") .Loader("idStr", string.Empty) .Loader("mediaDimension", 0) .Loader("mediaId", 0) .Loader("mediaInfo.abn_cnt", 0, "abn_cnt") .Add("violation_commission", violation_commission) .Loader("mediaInfo.warning_cnt", 0, "warning_cnt") .Loader("mediaName", string.Empty) .Loader("memberId", 0) .Loader("noticeCategory", string.Empty) .Loader("noticeTemplateId", 0) .Loader("noticeTemplateName", string.Empty) .Loader("orderFile", string.Empty) .Loader("pid", string.Empty) .Loader("punishRuleId", 0) .Loader("riskType", string.Empty) .Loader("roleName", string.Empty) .Loader("ruleLink", string.Empty) .Loader("showOrderDetail", false) .Loader("status", 0, "ali_status") .Loader("warningText", string.Empty) .Add("accountName", _accountName) .Add("status", true) .Add("create_time", DateTime.Now) .Add("last_time", DateTime.Now) .Create(DBContext.InsertType.REPLACE); } } catch (Exception ex) { } } } }