old_flsystem/应用/BackupAndImport/ECO/Eco.cs

1006 lines
47 KiB
C#
Raw Normal View History

2022-09-29 10:35:00 +00:00
using Api.Framework;
using Api.Framework.Enums;
using Api.Framework.Model;
using Api.Framework.SDK;
using Api.Framework.Tools;
using BackupAndImport.ECO.Entitys;
using CsharpHttpHelper;
using CsharpHttpHelper.Enum;
using Eson.Utils.ExcelHelper;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using static BackupAndImport.ECO.EventLog;
namespace BackupAndImport.ECO
{
public class Eco
{
Random random = new Random();
public enum LoginType
{
= 0,
= 1
}
/// <summary>
/// 登录验证
/// </summary>
/// <param name="param1">账号/手机号</param>
/// <param name="param2">密码/验证码</param>
/// <param name="type">验证方式</param>
/// <returns>html响应json</returns>
public string ECOLogin(string param1, string param2, LoginType type)
{
try
{
switch (type)
{
case LoginType.:
{
HttpHelper http = new HttpHelper();
HttpItem item = new HttpItem()
{
URL = $"http://console.ecostudio.cn/back/user/loginuser?t=true&withCredentials=true&username={param1}&password={param2}&w=null&f=null",//URL 必需项
Method = "post",
Encoding = System.Text.Encoding.GetEncoding("utf-8"),
Timeout = 100000,
ReadWriteTimeout = 30000,
UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0",
ContentType = "application/x-www-form-urlencoded",
};
HttpResult result = http.GetHtml(item);
return result.Html;
}
case LoginType.:
{
HttpHelper http = new HttpHelper();
HttpItem item = new HttpItem()
{
URL = $"http://console.ecostudio.cn/back/user/phoneLogin?phone={param1}&smsCode={param2}&f=null&w=null",
Encoding = Encoding.GetEncoding("utf-8"),
Method = "post",
Referer = "http://www.ecostudio.cn/work/wechatlist",
UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
ContentType = "text/html"
};
HttpResult result = http.GetHtml(item);
string html = result.Html;
string cookie = result.Cookie;
return html;
}
}
}
catch (Exception ex)
{
throw ex;
}
return "登录失败";
}
/// <summary>
/// 获取验证码
/// </summary>
/// <param name="param1">手机号码</param>
/// <returns></returns>
public bool ECOFindCerificationCode(string param1)
{
try
{
HttpHelper http = new HttpHelper();
HttpItem item = new HttpItem()
{
URL = $"http://console.ecostudio.cn/back/user/sendsns?_allow_anonymous=true&phone={param1}",
Encoding = Encoding.GetEncoding("utf-8"),
Method = "post",
Referer = "http://www.ecostudio.cn/work/wechatlist",
UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
ContentType = "text/html"
};
HttpResult result = http.GetHtml(item);
string html = result.Html;
if (html.Contains("验证码发送成功"))
return true;
}
catch (Exception ex)
{
throw ex;
}
return false;
}
/// <summary>
/// 获取机器人列表
/// </summary>
/// <param name="page">第几页的数据</param>
/// <param name="loginValicateName">loginValicateName</param>
/// <param name="loginValicateSingle">loginValicateSingle</param>
public void ECOFindRobotList(string loginValicateName, string loginValicateSingle, string token, List<string> robotids, int page = 1)
{
try
{
HttpHelper http = new HttpHelper();
HttpItem item = new HttpItem()
{
URL = $"http://console.ecostudio.cn/back/device/list?keyword=&page={page}&status=&w={loginValicateName}&f={loginValicateSingle}",
Encoding = Encoding.GetEncoding("utf-8"),
Method = "get",
Referer = "http://www.ecostudio.cn/work/device",
UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
ContentType = "text/html"
};
item.Header["Authorization"] = token;
var html = string.Empty;
for (int i = 0; i < 5; i++)
{
HttpResult result = http.GetHtml(item);
html = result.Html;
if (!CheckHttpCallsFrequently(html)) break;
}
var dic = HttpExtend.JsonToDictionary(html);
if (dic == null) throw new Exception("数据异常,转换失败");
if (dic.ContainsKey("status"))
{
if (dic["status"].ToString() == "200")
{
if (dic.ContainsKey("data"))
{
var data = dic["data"] as Dictionary<string, object>;
if (data.ContainsKey("list"))
{
var list = data["list"] as ArrayList;
foreach (Dictionary<string, object> obj in list)
{
if (!obj.ContainsKey("device")) throw new Exception("数据异常,不包含device");
var device = obj["device"] as Dictionary<string, object>;
if (!device.ContainsKey("wxId")) throw new Exception("数据异常,不包含wxId");
robotids.Add(device["wxId"].ToString());
}
}
if (data.ContainsKey("currentPage") || data.ContainsKey("totalPage"))
{
var currentPage = int.Parse(data["currentPage"].ToString());
var totalPage = int.Parse(data["totalPage"].ToString());
if (totalPage > currentPage)
{
Thread.Sleep(500);
currentPage++;
ECOFindRobotList(loginValicateName, loginValicateSingle, token, robotids, currentPage);
}
}
}
}
else
{
OnEvent(this, $"获取机器人列表失败:" + html);
}
}
}
catch (Exception ex)
{
OnEvent(this, $"获取机器人列表异常:{ex.Message} - {ex.StackTrace} - {page}");
throw new Exception($"{ex.Message} - {ex.StackTrace} - {page}");
}
}
#region id下载用户excel
/// <summary>
/// 通过机器人id下载用户excel
/// </summary>
/// <param name="robotids"></param>
public void ECODownloadMemberExcel(List<string> robotids, string token, string savepath = "")
{
try
{
OnEvent(this, $"删除文件开始...");
Tools.DeleteDir(Util.MapPath(savepath));
OnEvent(this, $"删除文件完毕!");
//Parallel.ForEach(robotids, f =>
//{
// DownloadMemberExcel(f, token, savepath);
// Thread.Sleep(200 + random.Next(300));
//});
var t1 = Task.Run(() =>
{
foreach (var f in robotids)
{
OnEvent(this, $"正在下载:{f}账号的用户数据");
DownloadMemberExcel(f, token, savepath);
OnEvent(this, $"{f}账号的用户数据下载完成");
//Thread.Sleep(4000 + random.Next(300, 2000));
}
});
Task.WaitAll(t1);
}
catch (Exception ex)
{
OnEvent(this, $"获取用户数据失败-1{ex.Message} - {ex.StackTrace}");
throw ex;
}
}
/// <summary>
/// 下载excel
/// </summary>
/// <param name="robotid"></param>
/// <param name="token"></param>
private void DownloadMemberExcel(string robotid, string token, string savepath = "")
{
try
{
for (int i = 0; i < 5; i++)
{
HttpHelper http = new HttpHelper();
HttpItem item = new HttpItem()
{
URL = $"http://console.ecostudio.cn/back/agent/downAgentInfo?wxId={robotid}",
Encoding = Encoding.GetEncoding("utf-8"),
Method = "get",
Referer = "http://www.ecostudio.cn/work/wechatlist",
UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
ContentType = "application/vnd.ms-excel",
PostDataType = PostDataType.Byte
};
item.ResultType = ResultType.Byte;
item.Header["Authorization"] = token;
HttpResult result = http.GetHtml(item);
var file = result.ResultByte;
if (file.Length != 80)
{
WriteByteToFile(file, Util.MapFile(robotid + ".xlsx", savepath));
break;
}
Thread.Sleep(3000);
}
}
catch (Exception ex)
{
OnEvent(this, $"获取用户数据失败-2{ex.Message} - {ex.StackTrace}");
throw ex;
}
}
/// <summary>
/// 写byte[]到fileName
/// </summary>
/// <param name="pReadByte">byte[]</param>
/// <param name="fileName">保存至硬盘路径</param>
/// <returns></returns>
public static bool WriteByteToFile(byte[] pReadByte, string fileName)
{
FileStream pFileStream = null;
try
{
pFileStream = new FileStream(fileName, FileMode.OpenOrCreate);
pFileStream.Write(pReadByte, 0, pReadByte.Length);
}
catch
{
return false;
}
finally
{
if (pFileStream != null)
pFileStream.Close();
}
return true;
}
#endregion
#region id爬取用户数据
public List<ECOMemberInfo> ECOFindMembers(string token, List<string> _robotids)
{
List<ECOMemberInfo> members = new List<ECOMemberInfo>();
try
{
List<string> robotids = _robotids;
var t1 = Task.Run(() =>
{
foreach (var f in robotids)
{
OnEvent(this, $"正在下载:{f}账号的用户数据");
ECOFindMemberList(token, f, members);
OnEvent(this, $"{f}账号的用户数据下载完成");
//Thread.Sleep(4000 + random.Next(300, 2000));
}
});
Task.WaitAll(t1);
}
catch (Exception ex)
{
OnEvent(this, $"获取用户数据失败-1{ex.Message} - {ex.StackTrace}");
throw ex;
}
return members;
}
/// <summary>
/// 获取用户列表
/// </summary>
/// <param name="page">第几页的数据</param>
/// <param name="loginValicateName">loginValicateName</param>
/// <param name="loginValicateSingle">loginValicateSingle</param>
public void ECOFindMemberList(string token, string robotid, List<ECOMemberInfo> memberInfos, int page = 1)
{
try
{
if (!string.IsNullOrWhiteSpace(robotid))
OnEvent(this, $"正在获取{robotid}机器人第{page}页数据...");
else
OnEvent(this, $"正在采集用户列表第{page}页数据...");
HttpHelper http = new HttpHelper();
var PostData = "{'currentPage':" + page + ",'wechatSearchTimeBegin':null,'wechatSearchTimeEnd':null,'orderTimeBegin':null,'orderTimeEnd':null,'createTimeBegin':null,'createTimeEnd':null,'cashTimeBegin':null,'cashTimeEnd':null,'sort':'2'}";
if (!string.IsNullOrWhiteSpace(robotid))
PostData = "{'currentPage':" + page + ",'wechatSearchTimeBegin':null,'wechatSearchTimeEnd':null,'orderTimeBegin':null,'orderTimeEnd':null,'createTimeBegin':null,'createTimeEnd':null,'cashTimeBegin':null,'cashTimeEnd':null,'type':'2','keyValue':'" + robotid + "','sort':'2'}";
HttpItem item = new HttpItem()
{
URL = $"http://console.ecostudio.cn/back/agent/eslist?w=undefined&f=undefined&page={page}",
Encoding = Encoding.GetEncoding("utf-8"),
Method = "POST",
Referer = "http://www.ecostudio.cn/work/wechatlist",
UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
ContentType = "text/html",
Postdata = PostData
};
item.Header["Authorization"] = token;
var html = string.Empty;
for (int i = 0; i < 5; i++)
{
HttpResult result = http.GetHtml(item);
html = result.Html;
if (!CheckHttpCallsFrequently(html)) break;
}
var dic = HttpExtend.JsonToDictionary(html);
if (dic == null) throw new Exception("数据异常,转换失败");
if (dic.ContainsKey("status"))
{
if (dic["status"].ToString() == "200")
{
if (!string.IsNullOrWhiteSpace(robotid))
OnEvent(this, $"获取{robotid}机器人第{page}页数据成功,正在收集用户数据");
else
OnEvent(this, $"获取用户列表第{page}页数据成功,正在收集用户数据");
if (dic.ContainsKey("data"))
{
var data = dic["data"] as Dictionary<string, object>;
if (data.ContainsKey("list"))
{
var list = data["list"] as ArrayList;
foreach (Dictionary<string, object> obj in list)
{
//余额
decimal balance = 0m;
if (obj.ContainsKey("balance"))
balance = decimal.Parse(obj["balance"].ToString());
//设备id(机器人id)
var deviceWxid = robotid;
if (obj.ContainsKey("deviceWxid"))
deviceWxid = obj["deviceWxid"].ToString();
//微信id
if (!obj.ContainsKey("wxId")) throw new Exception("数据异常,不包含wxId");
var wxId = obj["wxId"].ToString();
//昵称
var wxName = string.Empty;
if (obj.ContainsKey("wxName"))
wxName = obj["wxName"].ToString();
//上级微信id
var parentWxid = string.Empty;
if (obj.ContainsKey("parentWxid"))
parentWxid = obj["parentWxid"].ToString();
var memberInfo = memberInfos.FirstOrDefault(f => f.username == wxId);
if (memberInfo == null)
memberInfos.Add(new ECOMemberInfo() { usernick = wxName, username = wxId, device_id = deviceWxid, cur_point = (double)balance, invite_username = parentWxid });
else if (!string.IsNullOrWhiteSpace(robotid))
memberInfo.cur_point = (double)((decimal)memberInfo.cur_point + balance);
}
}
if (data.ContainsKey("currentPage") || data.ContainsKey("totalPage"))
{
var currentPage = int.Parse(data["currentPage"].ToString());
var totalPage = int.Parse(data["totalPage"].ToString());
if (totalPage > currentPage)
{
Thread.Sleep(700);
currentPage++;
ECOFindMemberList(token, robotid, memberInfos, currentPage);
}
}
}
}
else
{
OnEvent(this, $"获取机器人列表失败:" + html);
}
}
}
catch (Exception ex)
{
OnEvent(this, $"获取用户列表异常:{ex.Message} - {ex.StackTrace} - {page} - {robotid}");
throw new Exception($"{ex.Message} - {ex.StackTrace} - {page} - {robotid}");
}
}
#endregion
/// <summary>
/// 读取excel中的用户信息
/// </summary>
/// <param name="savePath"></param>
/// <returns></returns>
public List<ECOMemberInfo> ECOReadExcel(string savePath)
{
var memberInfos = new List<ECOMemberInfo>();
try
{
var directory = Util.MapPath(savePath);
if (Directory.Exists(directory))
{
var files = Directory.GetFiles(directory);
var excelTool = new ExcelStreamExport();
foreach (var file in files)
{
var dataTable = excelTool.ConvertExcelToTable(file, 0);
foreach (DataRow item in dataTable.Rows)
{
var memberInfo = memberInfos.FirstOrDefault(f => f.username == item[1].ToString());
if (memberInfo == null)
memberInfos.Add(new ECOMemberInfo() { usernick = item[0].ToString(), username = item[1].ToString(), device_id = item[2].ToString(), cur_point = double.Parse(item[3].ToString()), invite_username = item[4].ToString() });
else
memberInfo.cur_point = (double)((decimal)memberInfo.cur_point + decimal.Parse(item[3].ToString()));
}
}
}
}
catch (Exception ex)
{
OnEvent(this, $"第二个阶段异常:{ex.Message} ~ {ex.StackTrace}");
throw new Exception($"{ex.Message} ~ {ex.StackTrace}");
}
return memberInfos;
}
/// <summary>
/// 插入用户数据到秒单客数据库(包括绑定上下级)
/// </summary>
/// <param name="ecoMemberInfos"></param>
public void ECOInsertMember(List<ECOMemberInfo> ecoMemberInfos)
{
var session = ApiClient.GetSession();
session.BeginTransaction();
try
{
var srcMemberInfo = session.Find<fl_member_info>("select * from fl_member_info");
List<fl_member_info> unMemberInfos = new List<fl_member_info>();//保存不存在的用户对象
List<fl_member_info> memberInfos = new List<fl_member_info>();//保存存在的用户对象
foreach (var member in ecoMemberInfos)
{
//TODO 这里就不判断企业微信了
var user = srcMemberInfo.FirstOrDefault(f => f.username == member.username && f.robot_type == ChatType.);
if (user == null)
{
user = new fl_member_info()
{
username = member.username,
robot_type = ChatType.,
usernick = member.usernick.Replace("'", "''"),
cur_point = member.cur_point,
sum_point = 0,
ext_point = 0,
finish_order = 0,
robot_name = member.device_id,
alipay_name = string.Empty,
alipay_num = string.Empty,
remark = string.Empty
};
var groups = session.FindGroups();
if (groups.Count != 0)
user.group_id = groups[0].id;
unMemberInfos.Add(user);
}
else
{
user.cur_point = (double)((decimal)user.cur_point + ((decimal)member.cur_point));
//user.finish_order = user.finish_order + (long)item.总成功订单;
if (string.IsNullOrWhiteSpace(user.robot_name))
{
user.robot_name = member.device_id;
user.robot_type = ChatType.;
}
memberInfos.Add(user);
}
}
OnEvent(this, $"执行用户导入操作...");
var _num1 = (int)Math.Ceiling((decimal)unMemberInfos.Count / 1000m);
for (int o = 1; o <= _num1; o++)
{
var _list = unMemberInfos.Skip((o - 1) * 1000).Take(1000).ToList();
session.Insertable(_list.ToArray()).ExecuteCommand();
}
var _num2 = (int)Math.Ceiling((decimal)memberInfos.Count / 1000m);
for (int o = 1; o <= _num2; o++)
{
var _list = memberInfos.Skip((o - 1) * 1000).Take(1000).ToList();
session.Updateable(_list.ToArray()).ExecuteCommand();
}
OnEvent(this, $"导入数据完成,正在绑定上下级...");
//将有上级的用户筛选出来
ecoMemberInfos = ecoMemberInfos.Where(f => !string.IsNullOrEmpty(f.invite_username)).ToList();
//绑定上下级
if (ecoMemberInfos != null && ecoMemberInfos.Count != 0)
{
var newDbs = session.Queryable<fl_member_info>().ToList();
foreach (var item in ecoMemberInfos)
{
var new_user = newDbs.FirstOrDefault(f => f.username == item.username);
if (new_user != null && new_user.inviter_id == 0)
{
var inviter = newDbs.FirstOrDefault(f => f.username == item.invite_username);//找出上级账号
if (inviter != null)
{
new_user.inviter_id = inviter.id;//填写上级ID
2022-10-10 07:15:51 +00:00
//session.Updateable<fl_member_info>(new { inviter_id = inviter.id }).Where(f => f.id == new_user.id).ExecuteCommand();
session.Updateable(new_user);
2022-09-29 10:35:00 +00:00
}
else
{
}
}
}
}
OnEvent(this, $"用户上下级关系绑定成功!");
session.Commit();
srcMemberInfo.Clear();
}
catch (Exception ex)
{
OnEvent(this, $"导入用户数据异常,开始回滚数据...");
session.Rollback();
OnEvent(this, $"导入用户数据异常,回滚执行成功! 异常:{ex.Message} ~ {ex.StackTrace}");
throw new Exception($"{ex.Message} ~ {ex.StackTrace}");
}
}
#region
public enum OrderType
{
= 1,
= 2,
= 3
}
/// <summary>
/// ECO的订单状态
/// </summary>
public enum OrderStateType
{
= 0,
= 3,
= 12,
= 13
}
/// <summary>
/// 获取订单信息
/// </summary>
public void ECOBindOrder(int page, OrderType order, OrderStateType orderState, List<ECOOrderInfo> bindOrderList, string token, string keyWord = "")
{
try
{
OnEvent(this, string.IsNullOrWhiteSpace(keyWord) ? $"收集ECO订单 【{order.ToString()} - {orderState.ToString()}】 第{page}页开始..." : $"收集ECO订单 【{order.ToString()} - {orderState.ToString()}】 条件{keyWord} 开始...");
Thread.Sleep(1200 + random.Next(400));
var payStatus = string.Empty;
if (orderState != OrderStateType.)
payStatus = ((int)orderState).ToString();
else
{
if (order == OrderType. && !string.IsNullOrWhiteSpace(keyWord))
{
if (keyWord.Contains("-"))
{
var strs = keyWord.Split(new string[] { "-" }, StringSplitOptions.RemoveEmptyEntries);
if (strs != null && strs.Length == 2)
keyWord = strs[1];
}
}
}
HttpHelper http = new HttpHelper();
HttpItem item = new HttpItem()
{
URL = $"http://console.ecostudio.cn/back/orderDetail/list?page={page}&keyWord={keyWord}&startTime=&endTime=&payStatus={payStatus}&platformId={(int)order}",
Encoding = Encoding.GetEncoding("utf-8"),
Method = "get",
Referer = "http://www.ecostudio.cn/work/order",
UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
ContentType = "text/html"
};
item.Header["Authorization"] = token;
var html = string.Empty;
int num = 0;
Next:
for (int i = 0; i < 5; i++)
{
HttpResult result = http.GetHtml(item);
html = result.Html;
if (!CheckHttpCallsFrequently(html)) break;
}
var dic = HttpExtend.JsonToDictionary(html);
if (dic == null) throw new Exception("数据异常,转换失败");
if (dic.ContainsKey("status"))
{
if (dic["status"].ToString() == "200")
{
if (dic.ContainsKey("data"))
{
var data = dic["data"] as Dictionary<string, object>;
if (data.ContainsKey("list"))
{
var list = data["list"] as ArrayList;
foreach (Dictionary<string, object> obj in list)
{
//if (!obj.ContainsKey("isBing")) continue;//订单没有绑定直接跳过
var eco_id = obj["id"].ToString();
//var ecoOrderInfo = new ECOOrderInfo() { eco_id = eco_id, isBing = obj["isBing"].ToString().ToLower() == "true" ? true : false, isComplete = obj["isComplete"].ToString().ToLower() == "true" ? true : false, orderId = obj["orderId"].ToString(), payStatus = (OrderStateType)int.Parse(obj["payStatus"].ToString()), platformId = (OrderType)int.Parse(obj["platformId"].ToString()) };
var ecoOrderInfo = new ECOOrderInfo() { eco_id = eco_id, isBing = false, orderId = obj["orderId"].ToString(), payStatus = (OrderStateType)int.Parse(obj["payStatus"].ToString()), platformId = (OrderType)int.Parse(obj["platformId"].ToString()) };
ECOQueryOrderBindInfo(eco_id, ecoOrderInfo, token);
if (ecoOrderInfo.isBing)
bindOrderList.Add(ecoOrderInfo);
}
}
if (data.ContainsKey("currentPage") || data.ContainsKey("totalPage"))
{
var currentPage = int.Parse(data["currentPage"].ToString());
var totalPage = int.Parse(data["totalPage"].ToString());
if (totalPage > currentPage)
{
//currentPage++;
ECOBindOrder(currentPage, order, orderState, bindOrderList, token, keyWord);
}
}
}
}
else
{
if (num < 5)
{
OnEvent(this, $"ECO订单请求异常html => {html}");
OnEvent(this, $"正在重新请求...");
num++;
Thread.Sleep(2000);
goto Next;
}
else
{
throw new Exception("多次请求无果,已经终止...");
}
}
}
OnEvent(this, string.IsNullOrWhiteSpace(keyWord) ? $"收集ECO订单第{page}页完毕!" : $"收集ECO订单条件 {keyWord} 完毕!");
}
catch (Exception ex)
{
OnEvent(this, $"{order} - ECO订单请求异常{ex.Message} ^ {ex.StackTrace} ^ {page}");
//throw new Exception($"{ex.Message} ^ {ex.StackTrace} ^ {page}");
}
}
/// <summary>
/// 查询订单绑定的用户信息
/// </summary>
/// <param name="eco_id">eco的查询id</param>
/// <param name="orderInfo">订单对象</param>
/// <param name="token"></param>
private void ECOQueryOrderBindInfo(string eco_id, ECOOrderInfo orderInfo, string token)
{
try
{
Thread.Sleep(1200 + random.Next(300));
HttpHelper http = new HttpHelper();
HttpItem item = new HttpItem()
{
URL = $"http://console.ecostudio.cn/back/orderDetail/detail?esId={eco_id}",
Encoding = Encoding.GetEncoding("utf-8"),
Method = "get",
Referer = "http://www.ecostudio.cn/work/order",
UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
ContentType = "text/html"
};
item.Header["Authorization"] = token;
var html = string.Empty;
int num = 0;
Next:
for (int i = 0; i < 5; i++)
{
HttpResult result = http.GetHtml(item);
html = result.Html;
if (!CheckHttpCallsFrequently(html)) break;
}
var dic = HttpExtend.JsonToDictionary(html);
if (dic == null) throw new Exception("数据异常,转换失败");
if (dic.ContainsKey("status"))
{
if (dic["status"].ToString() == "200")
{
if (dic.ContainsKey("data"))
{
var data = dic["data"] as Dictionary<string, object>;
if (data != null && data.ContainsKey("esPaymentDetail"))
{
var esPaymentDetail = data["esPaymentDetail"] as Dictionary<string, object>;
if (esPaymentDetail != null)
{
//orderInfo.isBing = obj["isBing"].ToString().ToLower() == "true" ? true : false
orderInfo.isBing = true;
//orderInfo.isComplete =,
if (esPaymentDetail.ContainsKey("deviceWxId"))
orderInfo.deviceWxId = esPaymentDetail["deviceWxId"].ToString();
else if (esPaymentDetail.ContainsKey("fromdevice"))
orderInfo.deviceWxId = esPaymentDetail["fromdevice"].ToString();
if (esPaymentDetail.ContainsKey("wxId"))
orderInfo.fromWxId = esPaymentDetail["wxId"].ToString();
else if (esPaymentDetail.ContainsKey("fromWxId"))
orderInfo.fromWxId = esPaymentDetail["fromWxId"].ToString();
if (esPaymentDetail.ContainsKey("itemId"))
orderInfo.itemId = esPaymentDetail["itemId"].ToString();
}
}
}
}
else
{
if (num < 5)
{
OnEvent(this, $"ECO订单请求异常html => {html}");
OnEvent(this, $"正在重新请求...");
num++;
Thread.Sleep(2000);
goto Next;
}
else
{
throw new Exception("多次请求无果,已经终止...");
}
}
}
}
catch (Exception ex)
{
throw new Exception($"{ex.Message} * {ex.StackTrace}");
}
}
#endregion
/// <summary>
/// 检测是否调用频繁
/// 调用频繁直接休眠2秒钟
/// </summary>
/// <param name="html"></param>
/// <returns>调用频繁返回true</returns>
public bool CheckHttpCallsFrequently(string html)
{
try
{
//{
// "msg":"调用频繁",
// "status":400,
// "success":false
//}
if (string.IsNullOrWhiteSpace(html)) throw new Exception("请重新登录!");
var dic = HttpExtend.JsonToDictionary(html);
if (dic == null) OnEvent(this, $"转换为空html = {html}");
if (dic != null && dic.ContainsKey("status") && dic.ContainsKey("msg"))
{
if (dic["status"].ToString() == "400" && dic["msg"].ToString() == "调用频繁")
{
OnEvent(this, $"调用频繁休眠2-3秒...");
Thread.Sleep(2000 + random.Next(1000));
return true;
}
}
else
{
if (html.Contains("请求被中止: 操作超时"))
{
OnEvent(this, $"调用频繁休眠2-3秒...");
Thread.Sleep(2000 + random.Next(1000));
return true;
}
}
//else if (dic.ContainsKey("status") && dic["status"].ToString() == "200")
//{
// var data = dic["data"] as Dictionary<string, object>;
// if (data.ContainsKey("list"))
// {
// var list = data["list"] as ArrayList;
// foreach (Dictionary<string, object> obj in list)
// {
// if (!obj.ContainsKey("isBing"))
// {
// Thread.Sleep(2000 + random.Next(1000));
// return true;//没有获取到绑定信息多获取一次
// }
// else
// { }
// }
// }
//}
}
catch (Exception ex)
{
throw ex;
}
return false;
}
internal void ECOOrderBind(CpsType cps, List<ECOOrderInfo> bindOrderList)
{
var session = ApiClient.GetSession();
session.BeginTransaction();
try
{
switch (cps)
{
case CpsType.:
{
OnEvent(this, $"阿里妈妈订单数量({bindOrderList.Count})绑定开始执行...");
var aliOrders = session.Find<fl_order_alimama>("select * from fl_order_alimama where db_userid = 0").ToList();
var memberinfos = session.Find<fl_member_info>("select * from fl_member_info").ToList();
if (aliOrders != null && bindOrderList != null)
{
OnEvent(this, $"ECO阿里妈妈订单量{bindOrderList.Count},需要绑定的订单量:{aliOrders.Count}");
foreach (var item in bindOrderList)
{
if (string.IsNullOrWhiteSpace(item.fromWxId)) continue;
var orders = aliOrders.Where(f => f.trade_parent_id == item.orderId && f.num_iid == item.itemId).ToList();
if (orders.Count != 0)
{
foreach (var order in orders)
{
var member = memberinfos.FirstOrDefault(f => f.username == item.fromWxId);
if (member != null)
order.db_userid = member.id;
if (item.payStatus == OrderStateType.)
{
order.db_status = SystemOrderStatus.;
order.db_endtime = DateTime.Now.AddHours(-2);
order.tk_status = 3;
}
if (string.IsNullOrWhiteSpace(order.db_robotname))
{
order.db_robottype = ChatType.;
order.db_robotname = item.deviceWxId;
}
session.SaveOrUpdate(order);
}
}
}
aliOrders.Clear();
memberinfos.Clear();
}
OnEvent(this, $"阿里妈妈订单绑定执行完成!");
}
break;
case CpsType.:
{
OnEvent(this, $"多多进宝订单绑定开始执行...");
var pddOrders = session.Find<fl_order_pinduoduo>("select * from fl_order_pinduoduo where db_userid = 0").ToList();
var memberinfos = session.Find<fl_member_info>("select * from fl_member_info").ToList();
if (pddOrders != null && bindOrderList != null)
{
OnEvent(this, $"ECO多多进宝订单量{bindOrderList.Count},需要绑定的订单量:{pddOrders.Count}");
foreach (var item in bindOrderList)
{
var order = pddOrders.FirstOrDefault(f => f.order_sn == item.orderId && f.goods_id == item.itemId);
if (order != null)
{
var member = memberinfos.FirstOrDefault(f => f.username == item.fromWxId);
if (member != null)
order.db_userid = member.id;
if (item.payStatus == OrderStateType.)
{
order.db_status = SystemOrderStatus.;
order.db_endtime = DateTime.Now.AddHours(-2);
order.order_status = 2;
}
if (string.IsNullOrWhiteSpace(order.db_robotname))
{
order.db_robottype = ChatType.;
order.db_robotname = item.deviceWxId;
}
session.SaveOrUpdate(order);
}
}
pddOrders.Clear();
memberinfos.Clear();
}
OnEvent(this, $"多多进宝订单绑定执行完成!");
}
break;
case CpsType.:
{
OnEvent(this, $"京东联盟订单绑定开始执行...");
var jdOrders = session.Find<fl_order_jingdong>("select * from fl_order_jingdong where db_userid = 0").ToList();
var memberinfos = session.Find<fl_member_info>("select * from fl_member_info").ToList();
if (jdOrders != null && bindOrderList != null)
{
OnEvent(this, $"ECO京东联盟订单量{bindOrderList.Count},需要绑定的订单量:{jdOrders.Count}");
foreach (var item in bindOrderList)
{
var order = jdOrders.FirstOrDefault(f => f.orderId.ToString() == item.orderId && f.skuId.ToString() == item.itemId);
if (order != null)
{
var member = memberinfos.FirstOrDefault(f => f.username == item.fromWxId);
if (member != null)
order.db_userid = member.id;
if (item.payStatus == OrderStateType.)
{
order.db_status = SystemOrderStatus.;
order.db_endtime = DateTime.Now.AddHours(-2);
order.validCode = 17;
}
if (string.IsNullOrWhiteSpace(order.db_robotname))
{
order.db_robottype = ChatType.;
order.db_robotname = item.deviceWxId;
}
session.SaveOrUpdate(order);
}
}
jdOrders.Clear();
memberinfos.Clear();
}
OnEvent(this, $"京东联盟订单绑定执行完成!");
}
break;
}
session.Commit();
}
catch (Exception ex)
{
OnEvent(this, $"订单绑定异常,开始回滚数据...");
session.Rollback();
OnEvent(this, $"订单绑定异常,回滚执行成功! 异常:{ex.Message} / {ex.StackTrace}");
throw new Exception($"{ex.Message} / {ex.StackTrace}");
}
}
}
}