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

309 lines
19 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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();
}
}
}