old_flsystem/类库/Api.Framework/Timers/Update_AlimamaOrders.cs

309 lines
19 KiB
C#
Raw Normal View History

2022-09-20 03:10:29 +00:00
using Api.Framework.Model;
using Cps.Framework;
using Cps.Framework.Tb;
using CsharpHttpHelper;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using CsharpHttpHelper;
using Easy4net.Context;
using System.Text.RegularExpressions;
using Api.Framework.Enums;
using Api.Framework.Tools;
using System.Data;
using Api.Framework.Events;
using Cps.Framework.Entitys;
using Api.Framework.Utils;
namespace Api.Framework.Threading
{
class Update_AlimamaOrders : IThread
{
public bool IsRunning { get; set; }
public RegisteredWaitHandle RegisterdHandler { get; set; }
public WaitHandle WaitHandler { get; set; }
public void Dispose()
{
}
public void Run(object time, bool timeout)
{
if (this.IsRunning) return;
}
private void UpdateOrder(fl_order_pinduoduo db_order, Session session, List<OrderNoticeEvent> notice)
{
this.IsRunning = true;
DateTime stt_time = DateTime.Now.AddDays(-30);
DateTime end_time = DateTime.Now;
var spa_time = end_time - stt_time;
int row_count = 20;
int count = (int)spa_time.TotalMinutes / row_count; if (spa_time.TotalMinutes % row_count != 0) count++;
int sum_order = 0;
TaskTool task = new TaskTool();
//var session = ApiClient.GetSession();//获得一个Session
int thread_count = 6000;
try
{
session.BeginTransaction();
List<OrderNoticeEvent> noticeEvents = new List<OrderNoticeEvent>();
foreach (var item in CPSClient.AlimamaUsers)
{
if (item.IsLoginApi)
{
bool is_run = true;
for (int i = 1; i <= count; i++)
{
//临时时间
var _time = end_time.AddMinutes(-(i * row_count));
task.AddTask(delegate
{
try
{
HttpHelper http = new HttpHelper();
int page = 1;
do
{
if (!is_run) return;
var url = item.GetAlimamaorderURL(_time, page, ApiDownorderType., ApiDownorderSort.);//获得下载URL
Dictionary<string, object> dic = null;
int number = 0;
Next:
try
{
number++;
var _item = http.GetItem(url);
var _html = http.GetHtml(_item).Html;
dic = HttpExtend.JsonToDictionary(_html);
if (dic == null) throw new Exception(_html);
if (dic.ContainsKey("error_response")) throw new Exception(_html);
dic = dic["tbk_sc_order_get_response"] as Dictionary<string, object>;
dic = dic["results"] as Dictionary<string, object>;
if (dic == null || dic.Count == 0) return;
}
catch (Exception ex)
{
if (number <= 20 && Regex.Match(ex.Message, @"(""error_response"":{""code"":15,""msg"":""Remote service error"",""sub_code"":""0"")|(无法连接)|(操作超时)|(基础连接已经关闭)|(远程服务调用超时)|(淘宝客API服务不可用)|(HSF执行错误)").Success)
{
Thread.Sleep(2000);
goto Next;
}
else
{
IsRunning = false;
Console.WriteLine("下载订单异常:" + ex.Message + ex.StackTrace);
throw ex;
}
}
var list = dic["n_tbk_order"] as ArrayList;
foreach (Dictionary<string, object> order in list)
{
try
{
var status = int.Parse(order["tk_status"].ToString());
var db_order = session.Find<fl_alimama_order>("trade_id=@trade_id and trade_parent_id=@trade_parent_id", new { trade_id = order["trade_id"].ToString(), trade_parent_id = order["trade_parent_id"].ToString() }).FirstOrDefault();
if (db_order != null) //跳过相同状态
{
if (db_order.IsFinish()) continue;//是否完成
if (db_order.db_status == status) continue;//跳过相同状态
}
//自动填充实例
if (db_order == null) db_order = order.ConvertToObj<fl_alimama_order>();
else
{
db_order.tk_status = status;
}
sum_order++;
//查询是否绑定
if (db_order.db_userid == 0)
{
var bind = session.FindBindCache(db_order.trade_parent_id);
if (bind != null)
{
db_order.db_userid = bind.db_userid;//根据绑定记录识别
db_order.msg_robotid = bind.db_robotid;
db_order.msg_groupid = bind.groupid;
}
}
//自动识别绑定
if (db_order.db_userid == 0)
{
var query = session.FindTable("select userid,count(*) count from fl_query_hist itemid=@itemid and crt_time>@time group userid ", new { itemid = db_order.item_num, time = DateTime.Now.AddMinutes(-24).ToString("yyyy-MM-dd HH:mm:ss") });
if (query.Rows.Count > 0)
{
if (query.Rows.Count == 1) db_order.db_userid = long.Parse(query.Rows[0]["userid"].ToString());//根据查询记录认领
else
{
var end_number = db_order.trade_parent_id.Substring(db_order.trade_parent_id.Length - 6);
var lasts = session.Find<fl_alimama_order_lastnum>("number=@number", new { number = end_number });
if (lasts.Count > 0)
{
//是否存在、尾号相同,并且查询过宝贝(优先识别)
Dictionary<long, fl_alimama_order_lastnum> last_num = new Dictionary<long, fl_alimama_order_lastnum>();
foreach (DataRow q in query.Rows)
{
var info = lasts.FirstOrDefault(f => f.userid == long.Parse(q["userid"].ToString()));
if (info != null) last_num[info.userid] = info;
}
if (last_num.Count == 1)
{
var last_item = last_num.FirstOrDefault().Value;
db_order.db_userid = last_item.userid;
var query_item = session.Find<fl_query_hist>("itemid=@itemid and userid=@userid", new { itemid = db_order.item_num, userid = db_order.db_userid }).FirstOrDefault();
if (query_item != null)
{
db_order.msg_robotid = query_item.robotid;
db_order.msg_groupid = query_item.groupid;
}
}
else
{
//尾号相同、并且均查询过该宝贝
}
}
else
{
//未找到尾号相同订单
}
}
}
}
var member = db_order.db_userid != 0 ? session.Find<fl_member_info>("id=@id", new { id = db_order.db_userid }).FirstOrDefault() : null;
if (string.IsNullOrEmpty(db_order.db_point))
{
var itempoint = session.FindItemPoint(member, db_order.total_commission_fee, CpsType.);
if (itempoint != null) db_order.db_point = HttpHelper.ObjectToJson(itempoint);
}
switch (status)
{
case (int)ApiDownorderType.:
{
db_order.db_status = (int)OrderStatus.;
if (!string.IsNullOrEmpty(db_order.db_point) && member != null)
{
var point = HttpHelper.JsonToObject<ItemPoint>(db_order.db_point) as ItemPoint;
if (point != null)
{
//用户自身加积分
session.ChangePoint(PointType., point.UserPoint, member.id, $"购买:{db_order.item_title}({db_order.trade_parent_id})");
noticeEvents.Add(new OrderNoticeEvent(CpsType., member, db_order));
//多级提成计算
if (point.AwardOne > 0 && member.inviter_id > 0)
{
var flag = session.ChangePoint(PointType., point.AwardOne, member.inviter_id, $"{member.nick_name},淘宝购物1级提成");
if (flag != null)
{
noticeEvents.Add(new OrderNoticeEvent(CpsType., flag, db_order));
if (point.AwardTwo > 0 && flag.inviter_id != 0)
{
flag = session.ChangePoint(PointType., point.AwardOne, flag.inviter_id, $"{member.nick_name},淘宝购物2级提成");
if (flag != null) noticeEvents.Add(new OrderNoticeEvent(CpsType., flag, db_order));
}
}
}
//创建人计算
if (point.AwardCreate > 0 && string.IsNullOrEmpty(db_order.msg_groupid) && db_order.db_robotid != 0)
{
var robot = session.FindRobotInfo(db_order.db_robotid);
if (robot != null)
{
var create = session.FindCreateInfo(db_order.msg_groupid, robot.GetRobotType());
if (create != null)
{
var flag = session.ChangePoint(PointType., create.userid, create.userid, $"{member.nick_name},维护提成!");
if (flag != null) noticeEvents.Add(new OrderNoticeEvent(CpsType., flag, db_order));
}
}
}
}
}
break;
}
case (int)ApiDownorderType.:
db_order.db_status = (int)OrderStatus.;
break;
case (int)ApiDownorderType.:
db_order.db_status = (int)OrderStatus.;
break;
case (int)ApiDownorderType.:
db_order.db_status = (int)OrderStatus.;
break;
}
if (db_order.id == 0) session.Insert(db_order);//订单逻辑处理
else session.Update(db_order);
if (member != null) ApiClient.GetThread<Update_NoticeQueue>().Add(new Events.OrderNoticeEvent(CpsType., member, db_order));
}
catch (Exception ex)
{
Console.WriteLine(string.Format("更新AlimamaOrder{0}{1}异常:{2}", order["trade_parent_id"].ToString(), order["trade_id"].ToString(), ex.Message));
}
}
if (list == null || list.Count < 100) break;
page++;
}
while (true);
}
catch (Exception ex)
{
Console.WriteLine("下载订单异常:" + ex.Message + ex.StackTrace);
}
});
}
}
}
task.Start(thread_count, null);
int s = (int)(DateTime.Now - end_time).TotalSeconds;
session.Commit();
if (noticeEvents.Count > 0) ApiClient.GetThread<Update_NoticeQueue>().Add(noticeEvents);
Console.WriteLine(string.Format("同步历史:{4}天、耗时:{0}秒、允许最大并行:{1}、任务总数:{2}、平均每秒更新:{3}/个订单", s, thread_count, task.Tasks.Count, sum_order / s, (int)spa_time.TotalDays));
}
catch (Exception)
{
session.Rollback();
}
Console.WriteLine();
}
}
}