309 lines
19 KiB
C#
309 lines
19 KiB
C#
|
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();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|