SACenter/SA.AppDomain/SHCheck/SHCheckOrder.cs

556 lines
25 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SA.Entity.Request;
using SA.Core.Util;
using SA.Entity.zxdcrm_audit_Models;
using SA.Core.Init;
using System.Text.Json;
namespace SA.AppDomain.SHCheck
{
public class SHCheckOrder
{
private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
private static Dictionary<int, string> midproductnames = new Dictionary<int, string>();
private static Dictionary<int, string> shproductnames = new Dictionary<int, string>();
private static Dictionary<string, int> courseModuleids = new Dictionary<string, int>();
public enum CheckType { CheckIgnore, CheckExpire, CheckFail, CheckTest , CheckSuccess,CheckMissing}
public void InitSH()
{
var begintime= InitDB.auditDb.Queryable<sh_order>().Max(s => s.trade_time);
var begintimstr = "";
if (begintime.HasValue)
{
begintimstr= begintime.Value.Date.ToString("yyyy-MM-dd");
}
else
{
begintimstr = "2022-01-01";
}
SHRequest.shQueryList shQueryList = new SHRequest.shQueryList()
{
pageSize = 500,
pageCurrent = 0,
beginPayTime = begintimstr,
endPayTime=DateTime.Now.Date.ToString("yyyy-MM-dd")
};
logger.Debug(JsonSerializer.Serialize(shQueryList));
while (true)
{
var html = GetListHtml(shQueryList);
logger.Debug(html);
var shlistNum = GetShListNum(html);
if (shlistNum.total == 0)
{
logger.Debug("查询数量为0");
break;
}
var shorders = GetSh_Orders(html);
var i = InitDB.auditDb.Storageable(shorders).SplitIgnore(d => d.Any()).WhereColumns(d => d.gg_orderno)
.SplitInsert(d => d.NotAny()).ExecuteCommand();
Thread.Sleep(10000);
shQueryList.pageCurrent= shlistNum.pageCurrent+1;
if (shlistNum.pageCurrent * shQueryList.pageSize > shlistNum.total) break;
}
}
public void CheckSHFromSH()
{
var endDateTime = InitDB.auditDb.Queryable<xinmeiti3>().Max(d => d.otime);
//var endDateTime = DateTime.Parse("2022-07-01");
var shlist = InitDB.auditDb.Queryable<sh_order>().Where(d => d.endtime >= DateTime.Parse("2022-01-01"))
.Where(d => d.trade_time < endDateTime.Value.AddDays(1))
.OrderByDescending(d => d.trade_time).ToList();
long[] otderstatus = new long[] { 220, 200, 205, 90 };
var xinmeiti3list = InitDB.auditDb.Queryable<xinmeiti3>().Where(d => otderstatus.Contains(d.orderstatus.Value))
.Where(d => d.endtime3 >= DateTime.Parse("2022-01-01"))
.ToList();
var resList = InitDB.auditDb.Queryable<res_customer>().Where(d => d.customerfrom.Equals("27100")).ToList();
var reslistKeyFromResid = resList.ToDictionary(d => d.resid, d => d.lastnum3);
var reslistKeyFromMbile = resList.GroupBy(d => d.lastnum3).ToDictionary(d => d.Key, d => d.ToList());
logger.Debug(string.Format("查询sh_order数据{0}条,xinmeiti3数据{1}条,开始比对", shlist.Count, xinmeiti3list.Count));
var shNoresultList = new List<sh_order>();
Dictionary<string, sh_ordercheck> checkRight = new Dictionary<string, sh_ordercheck>();
List<sh_ordercheck> shCheckResultList = new List<sh_ordercheck>();
List<sh_ordercheck> shCheckIgnoreList = new List<sh_ordercheck>();
List<sh_ordercheck> sh_Orderchecks = new List<sh_ordercheck>();
//产品名称缓存
var wx_Szzysubproducts = InitDB.auditDb.Queryable<wx_szzysubproduct>().ToList();
foreach (var item in wx_Szzysubproducts)
{
midproductnames.TryAdd(item.mid.Value, item.subproductname);
}
var shproducts = InitDB.auditDb.Queryable<sh_product>().ToList();
foreach (var item in shproducts)
{
shproductnames.TryAdd(item.module_id.Value, item.course);
courseModuleids.TryAdd(item.course, item.module_id.Value);
}
//
var courses = shlist.Select(d => d.course).Distinct();
var shproduct_courses = shproducts.Select(d => d.course).Distinct();
//筛选人员
//测试人员
Dictionary<string, string> TestUsers = new Dictionary<string, string>();
//暂停人员
Dictionary<string, string> TimeoutUsers = new Dictionary<string, string>();
//4.1前赠送投资时钟网络课人员
Dictionary<string, string> TzszUsers = new Dictionary<string, string>();
//var timeoutlist=shlist.Where(d => d.remark.Contains("暂停"));
foreach (var user in shlist)
{
if (user.remark.Contains("暂停"))
TimeoutUsers.TryAdd(user.userno, user.user);
if (user.trade_time < DateTime.Parse("2022-04-01") && user.course.Equals("投资时钟网络课"))
TzszUsers.TryAdd(user.userno, user.user);
if (user.remark.Contains("测试")|| user.remark.Contains("合规"))
TestUsers.TryAdd(user.userno, user.user);
}
foreach (var item in shlist)
{
if (item.gg_orderno.Equals("20220630135231367"))
{
var begincheck = "";
}
var shCheckResult = new sh_ordercheck()
{
sh_orderno = item.gg_orderno,
sh_orderid=item.orderid.ToString(),
course=item.course,
userno=item.userno,
user=item.user,
username= Getusername(item.remark),
endtime =item.endtime.Value,
sh_opendays=item.opendays.Value,
diffdays=6666,
checktime=DateTime.Now
};
//检查orderid
if (item.orderid.HasValue && item.orderid > 0)
{
var xinmeiti3 = xinmeiti3list.Where(d => d.orderid.Equals(item.orderid.ToString())).ToList();
if (xinmeiti3.Count >0)
{
//填写订单号
CheckXinmeiti3List(xinmeiti3, shCheckResult, ref checkRight);
}
}
if (!checkRight.ContainsKey(item.gg_orderno))
{
var xinmeiti3 = xinmeiti3list.Where(d => d.bussiness_order_id.Equals(item.orderid.ToString())).ToList();
if (xinmeiti3.Count > 0)
{
//填写订单号
CheckXinmeiti3List(xinmeiti3, shCheckResult, ref checkRight);
}
}
if (shCheckResult.diffdays > 10 || shCheckResult.diffdays < -10)
{
//未填写订单号
if (!checkRight.ContainsKey(item.gg_orderno))
{
//找相同用户手机号
var residList = new List<res_customer>();
var lastnum3 = item.user.Trim().Insert(4, "*").Remove(8, 1);
if (reslistKeyFromMbile.TryGetValue(lastnum3, out residList))
{
foreach (var res in residList)
{
var resxinmeiti3s = xinmeiti3list.Where(d => d.resid.Equals(res.resid)).ToList();
if (resxinmeiti3s.Count == 0) continue;
if (shCheckResult.checktype.Equals(CheckType.CheckSuccess.ToString())) continue;
CheckXinmeiti3List(resxinmeiti3s, shCheckResult, ref checkRight);
}
}
}
if (!checkRight.ContainsKey(item.gg_orderno))
{
//通过用户名查找
if (!string.IsNullOrEmpty(shCheckResult.username))
{
var resxinmeiti3s = xinmeiti3list.Where(d => d.cname.Equals(shCheckResult.username)).ToList();
CheckXinmeiti3List(resxinmeiti3s, shCheckResult, ref checkRight);
}
}
}
if (!checkRight.ContainsKey(item.gg_orderno))
{
///忽略,忽略同用户的同课程成功
var userchecks = checkRight.Values.Where(d => d.userno == item.userno).ToList();
bool ignore = false;
foreach (var usercheck in userchecks)
{
if (!ignore&&usercheck.course.Equals(item.course))
{
shCheckResult.checktype =CheckType.CheckIgnore.ToString();
sh_Orderchecks.Add(shCheckResult);
logger.Debug($"【{shCheckResult.checktype}】:{SerializeHelper.ToJson(shCheckResult)}");
ignore = true;
}
}
//忽略同订单成功
var orderSuccess = checkRight.Values.Where(d => d.orderid == item.orderid.ToString()).ToList();
if (!ignore&&orderSuccess.Count > 0)
{
shCheckResult.checktype = CheckType.CheckIgnore.ToString();
sh_Orderchecks.Add(shCheckResult);
shCheckResult.checkinfo = "同订单号成功了";
logger.Debug($"【{shCheckResult.checktype}】同订单号:{SerializeHelper.ToJson(shCheckResult)}");
ignore = true;
}
if (!ignore)
{
if (item.remark.Contains("测试") || TestUsers.ContainsKey(item.userno))
{
shCheckResult.checktype = CheckType.CheckTest.ToString();
shCheckResult.checkinfo = item.remark;
}
else if (shCheckResult.endtime < endDateTime && (!shCheckResult.endtime3.HasValue || shCheckResult.endtime3 < endDateTime))
{
shCheckResult.checktype = CheckType.CheckExpire.ToString();
}
else if (item.remark.Contains("暂停") || item.remark.Contains("换") || TimeoutUsers.ContainsKey(item.userno))
{
shCheckResult.checktype = CheckType.CheckFail.ToString();
shCheckResult.checkinfo = $"TimeoutUsers:{item.remark}";
}
else if (TzszUsers.ContainsKey(item.userno))
{
shCheckResult.checktype = CheckType.CheckFail.ToString();
shCheckResult.checkinfo = $"4.1日前赠送过投资时钟网络课:{item.remark}";
}
else
{
shCheckResult.checktype = CheckType.CheckFail.ToString();
//shCheckResult.checkinfo = $"remark:{item.remark}";
}
sh_Orderchecks.Add(shCheckResult);
logger.Debug($"【{shCheckResult.checktype}】:{SerializeHelper.ToJson(shCheckResult)}");
}
}
}
var noresult= getxinmeiti3CheckResult(checkRight.Values.ToList(), xinmeiti3list, sh_Orderchecks);
sh_Orderchecks.AddRange(noresult);
foreach (var item in checkRight.Values)
{
item.checktype = CheckType.CheckSuccess.ToString();
sh_Orderchecks.Add(item);
}
var i = InitDB.auditDb.Storageable(sh_Orderchecks).SplitUpdate(d => d.Any()).WhereColumns(d => d.sh_orderno)
.SplitInsert(d => d.NotAny()).ExecuteCommand();
}
public List<sh_ordercheck> getxinmeiti3CheckResult(List<sh_ordercheck> sh_OrderchecksRight, List<xinmeiti3> xinmeiti3list, List<sh_ordercheck> sh_OrderchecksAll)
{
List<sh_ordercheck> sh_OrderchecksNoCheck = new List<sh_ordercheck>();
var successresult = new Dictionary<string, string>();
var result = new Dictionary<string, string>();
foreach (var item in sh_OrderchecksRight)
{
successresult.TryAdd($"{item.resid}:{item.course}", item.course);
}
foreach (var item in sh_OrderchecksAll)
{
result.TryAdd($"{item.orderid}", item.orderid);
}
foreach (var item in xinmeiti3list)
{
var xincourse = "";
shproductnames.TryGetValue(item.module_id.Value, out xincourse);
if (successresult.ContainsKey($"{item.resid}:{xincourse}")) continue;
if (result.ContainsKey($"{item.orderid}")) continue;
var day = DiffDay(item.endtime3, item.endtime_xinmeiti3);
if (day <= 1 && day >= -1) continue;
sh_ordercheck sh_OrdercheckNo = new sh_ordercheck();
sh_OrdercheckNo.orderid = item.orderid;
sh_OrdercheckNo.resid = item.resid;
sh_OrdercheckNo.cname = item.cname;
sh_OrdercheckNo.subproductname = item.subproductname;
sh_OrdercheckNo.otime = item.otime.Value;
sh_OrdercheckNo.opendays = Int32.Parse(item.opendays);
sh_OrdercheckNo.endtime3 = item.endtime3.Value;
sh_OrdercheckNo.checktype = CheckType.CheckMissing.ToString();
sh_OrdercheckNo.diffdays = day;
sh_OrderchecksNoCheck.Add(sh_OrdercheckNo);
}
return sh_OrderchecksNoCheck;
}
public void CheckXinmeiti3List(List<xinmeiti3> xinmeiti3s , sh_ordercheck sh_CheckOrder,ref Dictionary<string, sh_ordercheck> checkRight)
{
foreach (var x3item in xinmeiti3s.OrderBy(d=>d.endtime3))
{
if (checkSHProductName(x3item, sh_CheckOrder.course))
{
sh_CheckOrder.orderid = x3item.orderid;
sh_CheckOrder.resid = x3item.resid;
sh_CheckOrder.cname = x3item.cname;
sh_CheckOrder.subproductname = x3item.subproductname;
sh_CheckOrder.otime = x3item.otime.Value;
sh_CheckOrder.opendays = Int32.Parse(x3item.opendays);
sh_CheckOrder.endtime3 = x3item.endtime3.Value;
var day = DiffDay(x3item.endtime3, sh_CheckOrder.endtime);
sh_CheckOrder.diffdays = day;
if (day <= 1 && day >= -1)
{
sh_CheckOrder.checktype = CheckType.CheckSuccess.ToString();
checkRight.TryAdd(sh_CheckOrder.sh_orderno, sh_CheckOrder);
logger.Debug($"CheckRight{SerializeHelper.ToJson(sh_CheckOrder)}");
break;
}
else
{
logger.Debug($"【Checking】{SerializeHelper.ToJson(sh_CheckOrder)}");
}
}
else
{
logger.Debug($"【CheckingcourseF】sh_orderno:{sh_CheckOrder.sh_orderno},course:{sh_CheckOrder.course},x3itemorderid:{x3item.orderid},moduileid:{x3item.module_id},subproductname:{x3item.subproductname}");
}
}
}
public string Getusername(string remark)
{
if (remark.Contains("测试") || remark.Contains("合规")) return "";
if (string.IsNullOrEmpty(remark)) return "";
if (remark.Length < 4) return remark;
if (remark.Contains(','))
{
return remark.Substring(0, remark.IndexOf(','));
}
if (remark.Contains(''))
{
return remark.Substring(0, remark.IndexOf(''));
}
if (remark.Contains(' '))
{
return remark.Substring(0, remark.IndexOf(' '));
}
if (remark.Contains('临'))
{
return remark.Substring(0, remark.IndexOf('临'));
}
return "";
}
public int DiffDay(DateTime? xin3endtime,DateTime? endTime)
{
if (!xin3endtime.HasValue) return 1000;
if (!endTime.HasValue) return -1000;
TimeSpan timeSpan = xin3endtime.Value - endTime.Value;
var day= Convert.ToInt32(timeSpan.TotalDays);
return day;
}
public bool checkSHProductName(xinmeiti3 xinmeiti3,string course)
{
var xincourse = "";
if(shproductnames.TryGetValue(xinmeiti3.module_id!.Value, out xincourse))
{
if(xincourse.Equals(course))return true;
}
var moudleid = 0;
if(courseModuleids.TryGetValue(course,out moudleid))
{
if(xinmeiti3.module_id== moudleid) return true;
}
var xinproductName = "";
if (!midproductnames.TryGetValue(xinmeiti3.module_id.Value, out xinproductName))
{
xinproductName = xinmeiti3.productname;
}
if (course.Equals(xinproductName))return true;
if(xinproductName.Contains(course.Replace("课",""))) return true;
if (xinproductName.Contains(course.Replace("投资时钟网络课", "《8888夏令营》网络课"))) return true;
if (xinproductName.Contains(course.Replace("投资时钟", "《8888夏令营》网络课"))) return true;
return false;
}
public List<sh_order> GetSh_Orders(string html)
{
List<sh_order> sh_orders = new List<sh_order>();
HtmlAgilityPack.HtmlDocument htmlDocument = new HtmlAgilityPack.HtmlDocument();
htmlDocument.LoadHtml(html);
HtmlAgilityPack.HtmlNodeCollection list = htmlDocument.DocumentNode.SelectNodes("//tbody//tr");
foreach (var node in list)
{
var nodehtml = node.InnerHtml;
HtmlAgilityPack.HtmlDocument nodehtmlDocument = new HtmlAgilityPack.HtmlDocument();
nodehtmlDocument.LoadHtml(nodehtml);
var href = nodehtmlDocument.DocumentNode.SelectSingleNode("//td[2]/a").Attributes["href"].Value;
sh_order sh_Order= new sh_order();
sh_Order.gg_orderid = href.Substring(href.IndexOf('=') + 1, href.Length - href.IndexOf('=') - 1);
sh_Order.gg_orderno = nodehtmlDocument.DocumentNode.SelectSingleNode("//td[2]/a").InnerText;
var td1 = nodehtmlDocument.DocumentNode.SelectSingleNode("//td[2]").InnerText.Trim();
sh_Order.gg_ordertype= td1.Substring(td1.IndexOf('\t'), td1.Length - td1.IndexOf('\t')).Trim();
int orderid = 0;
Int32.TryParse(nodehtmlDocument.DocumentNode.SelectSingleNode("//td[3]").InnerText.Trim(),out orderid);
sh_Order.orderid = orderid;
sh_Order.course = nodehtmlDocument.DocumentNode.SelectSingleNode("//td[4]").InnerText.Trim().Split('\t')[0].Trim();
sh_Order.refno = nodehtmlDocument.DocumentNode.SelectSingleNode("//td[4]/a").Attributes["href"].Value.Trim().Split('&')[0].Split('=')[1].Trim();
sh_Order.lectureruser = nodehtmlDocument.DocumentNode.SelectSingleNode("//td[5]/a").InnerText.Trim();
sh_Order.lectureruserno = nodehtmlDocument.DocumentNode.SelectSingleNode("//td[5]/a").Attributes["href"].Value.Trim().Split('=')[1].Trim();
sh_Order.userno = nodehtmlDocument.DocumentNode.SelectSingleNode("//td[6]/a").Attributes["href"].Value.Trim().Split('=')[1].Trim();
sh_Order.user = nodehtmlDocument.DocumentNode.SelectSingleNode("//td[6]/a").InnerText.Trim();
sh_Order.paytype = nodehtmlDocument.DocumentNode.SelectSingleNode("//td[7]").InnerText.Trim().Split('【')[0].Trim();
sh_Order.payprice = decimal.Parse(nodehtmlDocument.DocumentNode.SelectSingleNode("//td[7]").InnerText.Trim().Split('¥')[1].TrimEnd('】'));
sh_Order.trade_channel = nodehtmlDocument.DocumentNode.SelectSingleNode("//td[8]").InnerText.Trim();
sh_Order.order_status = nodehtmlDocument.DocumentNode.SelectSingleNode("//td[9]").InnerText.Trim();
sh_Order.trade_status = nodehtmlDocument.DocumentNode.SelectSingleNode("//td[10]").InnerText.Trim();
var endtime = new DateTime();
DateTime.TryParse(nodehtmlDocument.DocumentNode.SelectSingleNode("//td[11]").InnerText.Trim(),out endtime);
sh_Order.endtime = endtime;
int opendays = 0;
Int32.TryParse(nodehtmlDocument.DocumentNode.SelectSingleNode("//td[12]").InnerText.Trim(),out opendays);
sh_Order.opendays = opendays;
sh_Order.remark = nodehtmlDocument.DocumentNode.SelectSingleNode("//td[13]").InnerText.Trim();
sh_Order.trade_time =DateTime.Parse(nodehtmlDocument.DocumentNode.SelectSingleNode("//td[14]").InnerText.Trim());
sh_orders.Add(sh_Order);
}
return sh_orders;
}
public SHRequest.shListNum GetShListNum(string html)
{
SHRequest.shListNum sh_listNum = new SHRequest.shListNum();
HtmlAgilityPack.HtmlDocument htmlDocument = new HtmlAgilityPack.HtmlDocument();
htmlDocument.LoadHtml(html);
HtmlAgilityPack.HtmlNodeCollection list = htmlDocument.DocumentNode.SelectNodes("//div[@class='pagination-box']");
var total = 0;
Int32.TryParse(htmlDocument.DocumentNode.SelectSingleNode("//div[@class='pagination-box']").Attributes["data-total"].Value.Trim(),out total);
sh_listNum.total = total;
if ( total == 0)
{
return sh_listNum;
}
sh_listNum.pageSize = Int32.Parse(htmlDocument.DocumentNode.SelectSingleNode("//div[@class='pagination-box']").Attributes["data-page-size"].Value.Trim());
sh_listNum.pageCurrent = Int32.Parse(htmlDocument.DocumentNode.SelectSingleNode("//div[@class='pagination-box']").Attributes["data-page-current"].Value.Trim());
return sh_listNum;
}
public string GetListHtml(SHRequest.shQueryList shQuery)
{
var kvs=DictionaryHelper.GetKeyValues(shQuery);
var kvstr = DictionaryHelper.GetkvString(kvs);
HttpContent httpContent = new StringContent(kvstr);
httpContent.Headers.Add("Cookie", "bjui_theme=blue; SESSION=N2E3M2NiOGUtNGZiOC00MTNlLWJhMWEtNTc3YmQ2MGRjN2Jj");
var url = "https://sboss.tvlicai.com/course/orderInfo/list";
var result = HttpHelper.HttpPost(url, httpContent, "application/x-www-form-urlencoded");
return result;
}
public string get()
{
var url = "http://192.168.11.141:24434/v1/api/open/data/sync/organization?appid=crm_tg_dng8&update_time=";
HttpRequestMessage httpRequestMessage = new HttpRequestMessage();
httpRequestMessage.RequestUri= new Uri(url);
httpRequestMessage.Method = HttpMethod.Get;
httpRequestMessage.Headers.TryAddWithoutValidation("authorization", "crm_tg_dng8:b461e65d3a707c2f79cf1d7892a4cb95");
httpRequestMessage.Headers.TryAddWithoutValidation("timestamps", "1656532966");
HttpContent httpContent = new StringContent("");
httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
// httpContent.Headers.Add("authorization", "crm_tg_dng8:1ba9915985bdead397849b8dffa48f5e");
httpRequestMessage.Content = httpContent;
var result = HttpHelper.Send(httpRequestMessage);
return result;
}
}
}