using Common.Models;
using Common.Models.UnqTables;
using Common.Utils;
using Microsoft.Owin.Hosting;
using Server.MyClass.Class;
using Server.Timers;
using Server.Winforms;
using SqlSugar;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Common.DbExtends;
using Common.Requests.Lianmengs;
using Common.DbExtends.Extends;
using System.Threading;
using Common.Models.PubClass;
using Common.Models.Enums;
using Server.MyClass.Caches;
using Server.Events;
using Server.Services.DataMigration;
namespace Server
{
internal class Client
{
public EventManager Events { get; private set; }
private static Client _client;
public static Client SingleClient { get { if (_client == null) _client = new Client(); return _client; } }
public string InternetIP { get; private set; }
public Config Config { get; private set; }
public OwinServer OwinServer { get; private set; }
public string Url { get; set; }
private SessionTimer DeviceSessionTimer = null;
private TbUpdateorderTimer TbUpdateorderTimer = null;
private TbSpecialTimer TbSpecialTimer = null;
private OldUserActivationTimer OldUserActivationTimer = null;
private FinishOrderTimer FinishOrderTimer = null;
private MtOrderTimer MtOrderTimer = null;
private JDOrderTimer JDOrderTimer = null;
private PDDOrderTimer PDDOrderTimer = null;
private TbUpdateRefundOrderTimer TbUpdateRefundOrderTimer = null;
private UpdateCookiesTimer UpdateCookiesTimer = null;
private WeiPinHuiTimer WeiPinHuiTimer = null;
private SystemTimer SystemTimer = null;
///
/// 收到的消息
///
public Dictionary ReplyMessages { get; set; }
private Client()
{
Config = new Config();
InternetIP = Util.QueryInternetIP();
}
public bool IsDebug { get; private set; }
public void InitSystem()
{
this.Db.SetDefaultConnection();
this.Db.InitTables();
this.Db.InitDefaultData();
this.Config.RuntimeCache = Db.GetMapValue("系统缓存", () => new RuntimeCache());
this.Events = new EventManager(this);
OwinServer = new OwinServer();
//MtOrderTimer = MyTimer.NewTimer(60);
JDOrderTimer = MyTimer.NewTimer(60);
//PDDOrderTimer = MyTimer.NewTimer(60);
//WeiPinHuiTimer = MyTimer.NewTimer(60);
//OldUserActivationTimer = MyTimer.NewTimer(60 * 60);
ReplyMessages = new Dictionary();
//UpdateCookiesTimer = MyTimer.NewTimer(60);
//TbUpdateRefundOrderTimer = MyTimer.NewTimer(60 * 60);
//MyTimer.NewTimer(1);
//MyTimer.NewTimer(60);
//同步黑名单
//MyTimer.NewTimer(1);
//同步商品黑名单
//MyTimer.NewTimer(1);
//同步商店黑名单
//MyTimer.NewTimer(60);
//同步抖音
//MyTimer.NewTimer(60);
string baseAddress = $"http://*:{Config.Port}/";
WebApp.Start(url: baseAddress);
var flag = false;
if (flag) //是否创建测试数据
{
Db.CreateTestData();
}
//var u = Db.GetUser(1);
//if (u == null) u = new User() { Username = "test", UserType = Common.Models.Enums.UserType.微信用户, Headurl = String.Empty };
//Db.Save(u);
EO.WebBrowser.Runtime.AddLicense(
"N4SOscufWbPw+g7kp+rp9um7aOPt9BDtrNzpz7iJWZeksefgpePzCOmMQ5ek" +
"scufWZekzQzjnZf4ChvkdpnJ4NnCoenz/hChWe3pAx7oqOXBs92wZ6emsdq9" +
"RoGkscufdabl/RfusLWRm8ufWZfAAB3jnunN/xHuWdvlBRC8W6i2wNywaKm0" +
"w9uhWer58/D3qeD29h7ArbSmwt2uaqizw9uxapmkBxDxrODz/+iha6emsdq9" +
"RoGkscufdert+Bngrez29unLn9D7BR7Wb8T66/nCm6y40hu2b8zFzui7aOrt" +
"+Bngrez29umMQ7Oz/RTinuX39umMQ3Xj7fQQ7azcwp61n1mXpM0X6Jzc8gQQ" +
"yJ21uur5sXGqusrz0XCwtMTis4+zs/0U4p7l9/b043c=");
this.Url = $"http://{InternetIP}";
#if DEBUG
IsDebug = true;
Url = $"http://127.0.0.1";
#endif
if (Config.Port != 80) Url += ":" + Config.Port;
Events.OrderChange += Events_OrderChange;
//new Thread(() =>
//{
// DataMigrationManageSerivce.Instance.Test();
//}).Start();
}
private void Events_OrderChange(object sender, OrderChangeEventArgs e)
{
if (e.UserId != 0)
{
try
{
var User = Db.GetUser(e.UserId);
if (User != null)
{
SendClientMsg(User.RobotId, DeviceMessageType.订单状态改变, e);
}
}
catch (Exception ex)
{
Db.OnLog("通知用户订单状态", ex);
}
}
}
public MainForm Form { get; set; }
public HttpRuntimeCache Cache { get; set; } = new HttpRuntimeCache();
public SqlSugarClient Db
{
get
{
var db = new SqlSugarClient(new ConnectionConfig()
{
ConnectionString = $"Data Source={Config.MysqlHost};Initial Catalog={Config.MysqlName};Persist Security Info=True;User ID={Config.MysqlUser};Password={Config.MysqlPass};Port={Config.MysqlPort};Min Pool Size = 3; Max Pool Size = 100;CharSet=utf8mb4;AllowLoadLocalInfile=true;Allow Zero Datetime=True;SslMode=none;Convert Zero Datetime=True;",//连接符字串
DbType = SqlSugar.DbType.MySql, //数据库类型
IsAutoCloseConnection = true,
MoreSettings = new ConnMoreSettings()
{
IsAutoRemoveDataCache = true,
DefaultCacheDurationInSeconds = 86400,
},
ConfigureExternalServices = new ConfigureExternalServices()
{
DataInfoCacheService = Cache, //配置我们创建的缓存类,
},
});
db.Aop.DataExecuting = (oldValue, entityInfo) =>
{
db.SetSplitTableService(entityInfo.EntityName);
};
db.Aop.OnError = (ex) =>
{
try
{
var temp = ex.Sql;
var time = db.Ado.SqlExecutionTime;
db.OnLog("SQL错误", $"{ex.Message},SQL => {ex.Sql}", Common.Models.Enums.LogType.错误);
}
catch (Exception)
{
}
};
db.Aop.OnLogExecuted = (sql, pars) =>
{
if (db.Ado.SqlExecutionTime.TotalSeconds > 60)
{
try
{
var temp = sql;
var time = db.Ado.SqlExecutionTime;
}
catch (Exception)
{
// ignored
}
}
else if (IsDebug)
{
var temp = sql;
foreach (var item in pars) temp = temp.Replace(item.ParameterName, $"'{item.Value}'");
var time = db.Ado.SqlExecutionTime;
//Console.WriteLine($"SQL耗时:{time.TotalSeconds}、SQL => {sql}"); }
//WWW Console.WriteLine(sql,pars);
}
};
return db;
}
}
public ConcurrentDictionary OnlineDevices { get { return Config.RuntimeCache.DeviceSessions; } }
public ConcurrentDictionary OnlineUsers { get { return Config.RuntimeCache.UserSessions; } }
public void SendAllClientMsg(DeviceMessageType Type, object Data)
{
var list = this.OnlineDevices.ToArray();
foreach (var item in list)
{
SendClientMsg(item.Key, Type, Data);
}
}
public DeviceMessage SendClientMsg(int RobotId, DeviceMessageType Type, Object Data = null)
{
var deviceId = OnlineDevices.FirstOrDefault(f => f.Value.RobotId == RobotId).Key;
if (!string.IsNullOrEmpty(deviceId))
{
return SendClientMsg(deviceId, Type, Data);
}
return null;
}
public DeviceMessage SendClientMsg(string DeviceId, DeviceMessageType Type, Object Data = null)
{
if (OnlineDevices.ContainsKey(DeviceId))
{
var msg = new DeviceMessage() { Type = Type, Content = Data, Time = Util.GetTimespan(DateTime.Now) };
OnlineDevices[DeviceId].Messages.Enqueue(msg);
return msg;
}
return null;
}
public Task GetClientMsg(string Msgid, int Timeout = 60)
{
return Task.Factory.StartNew(() =>
{
var ExpirationTime = DateTime.Now.AddSeconds(Timeout);
do
{
Thread.Sleep(1000);
if (ReplyMessages.ContainsKey(Msgid)) return ReplyMessages[Msgid];
} while (ExpirationTime > DateTime.Now);
return null;
});
}
}
}