yz_server/Server/Client.cs

262 lines
10 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 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;
/// <summary>
/// 收到的消息
/// </summary>
public Dictionary<string, DeviceReplyMessage> 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<RuntimeCache>("系统缓存", () => new RuntimeCache());
this.Events = new EventManager(this);
OwinServer = new OwinServer();
//MtOrderTimer = MyTimer.NewTimer<MtOrderTimer>(60);
JDOrderTimer = MyTimer.NewTimer<JDOrderTimer>(60);
//PDDOrderTimer = MyTimer.NewTimer<PDDOrderTimer>(60);
//WeiPinHuiTimer = MyTimer.NewTimer<WeiPinHuiTimer>(60);
//OldUserActivationTimer = MyTimer.NewTimer<OldUserActivationTimer>(60 * 60);
ReplyMessages = new Dictionary<string, DeviceReplyMessage>();
//UpdateCookiesTimer = MyTimer.NewTimer<UpdateCookiesTimer>(60);
//TbUpdateRefundOrderTimer = MyTimer.NewTimer<TbUpdateRefundOrderTimer>(60 * 60);
//MyTimer.NewTimer<TbUpdateRefundOrderTimer>(1);
//MyTimer.NewTimer<SuningHuiTimer>(60);
//同步黑名单
//MyTimer.NewTimer<BlackTimer>(1);
//同步商品黑名单
//MyTimer.NewTimer<GoodsBlackTimer>(1);
//同步商店黑名单
//MyTimer.NewTimer<StoreBlackTimer>(60);
//同步抖音
//MyTimer.NewTimer<DyUpdateTimer>(60);
string baseAddress = $"http://*:{Config.Port}/";
WebApp.Start<OwinServer>(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<string, DeviceSession> OnlineDevices { get { return Config.RuntimeCache.DeviceSessions; } }
public ConcurrentDictionary<int, UserSession> 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<DeviceReplyMessage> GetClientMsg(string Msgid, int Timeout = 60)
{
return Task.Factory.StartNew<DeviceReplyMessage>(() =>
{
var ExpirationTime = DateTime.Now.AddSeconds(Timeout);
do
{
Thread.Sleep(1000);
if (ReplyMessages.ContainsKey(Msgid)) return ReplyMessages[Msgid];
} while (ExpirationTime > DateTime.Now);
return null;
});
}
}
}