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

1006 lines
47 KiB
C#
Raw Permalink 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;
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
//session.Updateable<fl_member_info>(new { inviter_id = inviter.id }).Where(f => f.id == new_user.id).ExecuteCommand();
session.Updateable(new_user);
}
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}");
}
}
}
}