1006 lines
47 KiB
C#
1006 lines
47 KiB
C#
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}");
|
||
}
|
||
|
||
}
|
||
}
|
||
}
|