2021-01-18 20:24:19 +08:00
|
|
|
|
using OnlineUserPool.Api;
|
|
|
|
|
|
using OnlineUserPool.Model;
|
2020-09-17 10:23:26 +08:00
|
|
|
|
using OnlineUserPool.Unility;
|
|
|
|
|
|
|
|
|
|
|
|
using Serilog;
|
|
|
|
|
|
|
|
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
using System.Text;
|
2021-12-24 18:35:21 +08:00
|
|
|
|
using System.Timers;
|
2020-09-17 10:23:26 +08:00
|
|
|
|
|
|
|
|
|
|
namespace OnlineUserPool.Hander
|
|
|
|
|
|
{
|
2021-01-18 20:24:19 +08:00
|
|
|
|
public class MapRecordRankingHander : IHandle
|
2020-09-17 10:23:26 +08:00
|
|
|
|
{
|
2021-01-18 20:24:19 +08:00
|
|
|
|
private static List<MapRecordRanking> mapRecordRankings = new List<MapRecordRanking>();
|
2020-09-22 15:59:41 +08:00
|
|
|
|
private static object locker = new object();//防止服务端响应慢,多次加载
|
2021-01-18 20:24:19 +08:00
|
|
|
|
//private int top = ConfigHelp.Top;
|
2020-09-17 10:23:26 +08:00
|
|
|
|
|
|
|
|
|
|
public MapRecordRankingHander()
|
2020-09-22 15:59:41 +08:00
|
|
|
|
{
|
|
|
|
|
|
Init();
|
2021-12-24 18:35:21 +08:00
|
|
|
|
//var timer = new Timer();
|
|
|
|
|
|
//timer
|
2020-09-22 15:59:41 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void Init()
|
2020-09-17 10:23:26 +08:00
|
|
|
|
{
|
2021-01-18 20:24:19 +08:00
|
|
|
|
if (ConfigHelp.Top > 0)
|
2020-10-30 17:39:19 +08:00
|
|
|
|
{
|
2021-12-24 18:35:21 +08:00
|
|
|
|
var records = WebService.GetMapRouteRandomRecord(START, null);
|
|
|
|
|
|
mapRecordRankings.AddRange(WebService.GetRecordFileFromServer(records.Select(n => n.Id).ToList()));
|
|
|
|
|
|
UpdateVirtualTime = DateTime.Now;
|
|
|
|
|
|
//var pageSize = 10;
|
|
|
|
|
|
//var pageCount = (int)Math.Ceiling(records.Count / (double)pageSize);
|
|
|
|
|
|
//for (int i = 0; i < pageCount; i++)
|
|
|
|
|
|
//{
|
|
|
|
|
|
// mapRecordRankings.AddRange(WebService.GetRecordFileFromServer(records.Skip(i * pageSize).Take(pageSize).Select(n => n.Id).ToList()));
|
|
|
|
|
|
//}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private const int START = 15;
|
|
|
|
|
|
private const int SMALL = 50;
|
|
|
|
|
|
private const int MEDIUM = 100;
|
|
|
|
|
|
private const int LARGE = 200;
|
|
|
|
|
|
private const int OFFSET = 15;
|
|
|
|
|
|
|
|
|
|
|
|
//根据当前时段计算虚拟总人数
|
|
|
|
|
|
private int ComputeTop()
|
|
|
|
|
|
{
|
|
|
|
|
|
var rand = new Random();
|
|
|
|
|
|
|
|
|
|
|
|
var hour = DateTime.Now.Hour;//当前点数
|
|
|
|
|
|
int offset = 1;//少:1 中:3 多:10
|
|
|
|
|
|
if (hour <= 6)
|
|
|
|
|
|
{
|
|
|
|
|
|
offset = rand.Next(START- OFFSET, START+ OFFSET);
|
|
|
|
|
|
}
|
|
|
|
|
|
if (hour > 6 && hour <= 18)
|
|
|
|
|
|
{
|
|
|
|
|
|
offset = rand.Next(MEDIUM - OFFSET, MEDIUM + OFFSET);
|
|
|
|
|
|
}
|
|
|
|
|
|
if (hour >= 18 && hour <= 22)
|
|
|
|
|
|
{
|
|
|
|
|
|
offset = rand.Next(LARGE - OFFSET, LARGE + OFFSET);
|
|
|
|
|
|
}
|
|
|
|
|
|
if (hour > 22 && hour <= 24)
|
|
|
|
|
|
{
|
|
|
|
|
|
offset = rand.Next(SMALL - OFFSET, SMALL + OFFSET);
|
2020-10-30 17:39:19 +08:00
|
|
|
|
}
|
2021-12-24 18:35:21 +08:00
|
|
|
|
return offset;
|
2020-09-17 10:23:26 +08:00
|
|
|
|
}
|
2020-10-30 17:39:19 +08:00
|
|
|
|
|
2020-09-17 10:23:26 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 获取虚拟人物数据
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
public List<MsgModel> GetVirtualUserData()
|
|
|
|
|
|
{
|
|
|
|
|
|
List<MsgModel> msgModels = new List<MsgModel>();
|
2020-11-23 17:07:40 +08:00
|
|
|
|
if(ConfigHelp.ShowVirtualUser == false)
|
|
|
|
|
|
{
|
|
|
|
|
|
return msgModels;
|
|
|
|
|
|
}
|
2020-10-27 10:20:47 +08:00
|
|
|
|
if (mapRecordRankings != null)
|
2020-09-17 10:23:26 +08:00
|
|
|
|
{
|
|
|
|
|
|
for (int i = 0; i < mapRecordRankings.Count; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
var item = mapRecordRankings[i];
|
2020-10-27 10:20:47 +08:00
|
|
|
|
item.CurrentIndex++;
|
2020-09-17 10:23:26 +08:00
|
|
|
|
TargetData targetData = item.GetCurrentTargetData();
|
2020-10-27 10:20:47 +08:00
|
|
|
|
//List<string> prop = new List<string>()
|
|
|
|
|
|
//{
|
|
|
|
|
|
// Math.Round(targetData._Speed, 2).ToString(),
|
|
|
|
|
|
// targetData._Power.ToString(),
|
|
|
|
|
|
// targetData._Cadence.ToString()
|
|
|
|
|
|
//};
|
2020-12-16 13:47:20 +08:00
|
|
|
|
var weightKg = 0.0D;
|
|
|
|
|
|
if(targetData._Power >= 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
weightKg = Math.Round(targetData._Power / item.Weight, 2);
|
|
|
|
|
|
}
|
2021-12-24 18:35:21 +08:00
|
|
|
|
|
|
|
|
|
|
if (item.CurrentIndex == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
//机器人上线
|
|
|
|
|
|
var loginInfo = new MsgModel()
|
|
|
|
|
|
{
|
|
|
|
|
|
exit = item.End,
|
|
|
|
|
|
IsCompleted = item.End,
|
|
|
|
|
|
MemberId = item.UserId,//虚拟的人Id变为负数
|
|
|
|
|
|
Point = new double[] { -1d, -1d },
|
|
|
|
|
|
//Prop = string.Join(',', prop),
|
|
|
|
|
|
RouteId = item.RouteId,
|
|
|
|
|
|
EndDistance = Math.Round(targetData._Distance, 6),
|
|
|
|
|
|
//ShowVirtual = true,
|
|
|
|
|
|
CommandType = 1,
|
|
|
|
|
|
//IsVirtual = true,
|
|
|
|
|
|
Speed = targetData._Speed,
|
|
|
|
|
|
WeightKg = weightKg,
|
|
|
|
|
|
PreDistance = item.GetPreDistance()
|
|
|
|
|
|
};
|
|
|
|
|
|
msgModels.Add(loginInfo);
|
|
|
|
|
|
}
|
2020-10-27 10:20:47 +08:00
|
|
|
|
var info = new MsgModel()
|
2020-09-17 10:23:26 +08:00
|
|
|
|
{
|
|
|
|
|
|
exit = item.End,
|
|
|
|
|
|
IsCompleted = item.End,
|
2020-10-27 10:20:47 +08:00
|
|
|
|
MemberId = item.UserId,//虚拟的人Id变为负数
|
2020-10-13 08:54:24 +08:00
|
|
|
|
Point = new double[] { Math.Round(targetData._Lat, 6), Math.Round(targetData._Lon, 6) },
|
2020-10-27 10:20:47 +08:00
|
|
|
|
//Prop = string.Join(',', prop),
|
2020-09-17 10:23:26 +08:00
|
|
|
|
RouteId = item.RouteId,
|
2020-10-27 10:20:47 +08:00
|
|
|
|
EndDistance = Math.Round(targetData._Distance, 6),
|
2021-01-18 20:24:19 +08:00
|
|
|
|
//ShowVirtual = true,
|
2020-09-17 10:23:26 +08:00
|
|
|
|
CommandType = 1,
|
2021-01-18 20:24:19 +08:00
|
|
|
|
//IsVirtual = true,
|
2020-10-27 10:20:47 +08:00
|
|
|
|
Speed = targetData._Speed,
|
2020-12-16 13:47:20 +08:00
|
|
|
|
WeightKg = weightKg,
|
2020-10-27 10:20:47 +08:00
|
|
|
|
PreDistance = item.GetPreDistance()
|
|
|
|
|
|
};
|
|
|
|
|
|
msgModels.Add(info);
|
|
|
|
|
|
}
|
2020-09-17 10:23:26 +08:00
|
|
|
|
catch (Exception e)
|
2020-10-27 10:20:47 +08:00
|
|
|
|
{
|
|
|
|
|
|
Log.Error("加载虚拟人物错误:" + e.Message + "\r\n" + e.StackTrace);
|
2020-09-17 10:23:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2020-10-27 10:20:47 +08:00
|
|
|
|
}
|
2020-09-17 10:23:26 +08:00
|
|
|
|
return msgModels;
|
|
|
|
|
|
}
|
2021-12-24 18:35:21 +08:00
|
|
|
|
const int offset = 1;
|
|
|
|
|
|
const int timeInterval = 15;
|
|
|
|
|
|
private DateTime UpdateVirtualTime { get; set; }
|
2020-09-17 10:23:26 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 删除已经骑行完的人,添加新的人物进去
|
|
|
|
|
|
/// </summary>
|
2021-01-18 20:24:19 +08:00
|
|
|
|
public void RemoveEndAndAddNewVirtualUser(int customerCount)
|
2020-09-17 10:23:26 +08:00
|
|
|
|
{
|
2020-09-22 15:59:41 +08:00
|
|
|
|
lock (locker)
|
2020-09-17 10:23:26 +08:00
|
|
|
|
{
|
2021-12-24 18:35:21 +08:00
|
|
|
|
//var offlineCount = mapRecordRankings.Where(c => c.End).Count();//下线人数
|
|
|
|
|
|
var top = ComputeTop();//理论上当前时间段虚拟用户的总数
|
|
|
|
|
|
mapRecordRankings.RemoveAll(n => n.End);//移除骑行结束的人
|
2021-01-18 20:24:19 +08:00
|
|
|
|
var routeIds = mapRecordRankings.Select(n => n.RouteId).Distinct().ToList();
|
|
|
|
|
|
|
2021-12-24 18:35:21 +08:00
|
|
|
|
var currentVirtualCount = mapRecordRankings.Count(d => d.UserId < 0);//实际虚拟用户数
|
|
|
|
|
|
if (top - currentVirtualCount > 0)
|
2021-01-18 20:24:19 +08:00
|
|
|
|
{
|
2021-12-24 18:35:21 +08:00
|
|
|
|
var interval = DateTime.Now - UpdateVirtualTime;
|
|
|
|
|
|
if (interval.TotalSeconds > timeInterval)
|
|
|
|
|
|
{
|
|
|
|
|
|
UpdateVirtualTime = DateTime.Now;
|
|
|
|
|
|
var needUpdateCount = offset;//这一秒需要上线的人数
|
|
|
|
|
|
var randomUser = WebService.GetMapRouteRandomRecord(needUpdateCount, routeIds);
|
|
|
|
|
|
var addRankings = WebService.GetRecordFileFromServer(randomUser.Select(n => n.Id).ToList());
|
|
|
|
|
|
mapRecordRankings.AddRange(addRankings);
|
|
|
|
|
|
}
|
2020-09-17 10:23:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|