powerfun-new-net/Hander/MapRecordRankingHander.cs

165 lines
6.1 KiB
C#
Raw Normal View History

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;
namespace OnlineUserPool.Hander
{
public class MapRecordRankingHander : IHandle
2020-09-17 10:23:26 +08:00
{
private static List<MapRecordRanking> mapRecordRankings = new List<MapRecordRanking>();
private static object locker = new object();//防止服务端响应慢,多次加载
2024-01-24 15:23:28 +08:00
private const int START = 120;
private const int SMALL = 100;
private const int MEDIUM = 150;
private const int LARGE = 180;
private const int OFFSET = 15;
const int offset = 1;
const int timeInterval = 15;
List<MsgModel> msgModels = new List<MsgModel>();
private DateTime UpdateVirtualTime { get; set; }
2020-09-17 10:23:26 +08:00
public MapRecordRankingHander()
{
Init();
}
private void Init()
2020-09-17 10:23:26 +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;
}
}
2024-02-01 10:09:34 +08:00
private Random rand = new Random();
2021-12-24 18:35:21 +08:00
//根据当前时段计算虚拟总人数
private int ComputeTop()
{
var hour = DateTime.Now.Hour;//当前点数
2024-02-01 10:09:34 +08:00
int top = 1;//少1 中3 多10
2021-12-24 18:35:21 +08:00
if (hour <= 6)
{
2024-02-01 10:09:34 +08:00
top = rand.Next((int)(0.8 * START), (int)(1.2 * START));
2021-12-24 18:35:21 +08:00
}
if (hour > 6 && hour <= 18)
{
2024-02-01 10:09:34 +08:00
top = rand.Next((int)(0.8 * OFFSET), (int)(1.2 * MEDIUM));
2021-12-24 18:35:21 +08:00
}
if (hour >= 18 && hour <= 22)
{
2024-02-01 10:09:34 +08:00
top = rand.Next((int)(0.8 * LARGE), (int)(1.2 * LARGE));
2021-12-24 18:35:21 +08:00
}
if (hour > 22 && hour <= 24)
{
2024-02-01 10:09:34 +08:00
top = rand.Next((int)(0.8 * SMALL), (int)(1.2 * SMALL));
2020-10-30 17:39:19 +08:00
}
2024-02-01 10:09:34 +08:00
return top;
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()
{
2024-01-24 15:23:28 +08:00
msgModels.Clear();
if (ConfigHelp.ShowVirtualUser == false)
2020-11-23 17:07:40 +08:00
{
return msgModels;
}
2024-01-24 15:23:28 +08:00
2024-02-01 16:49:22 +08:00
if (mapRecordRankings == null) return msgModels;
for (int i = 0; i < mapRecordRankings.Count; i++)
2020-09-17 10:23:26 +08:00
{
2024-02-01 16:49:22 +08:00
try
2020-09-17 10:23:26 +08:00
{
2024-02-01 16:49:22 +08:00
var item = mapRecordRankings[i];
item.CurrentIndex++;
var targetData = item.GetCurrentTargetData();
var weightKg = 0.0D;
if (targetData._Power >= 0)
2020-09-17 10:23:26 +08:00
{
2024-02-01 16:49:22 +08:00
weightKg = Math.Round(targetData._Power / item.Weight, 2);
}
2024-01-24 15:23:28 +08:00
2024-02-01 16:49:22 +08:00
if (item.CurrentIndex == 0)
{
//机器人上线
var loginInfo = new MsgModel()
2020-09-17 10:23:26 +08:00
{
2024-01-24 15:23:28 +08:00
Exit = item.End,
2020-09-17 10:23:26 +08:00
IsCompleted = item.End,
2024-01-24 15:23:28 +08:00
MemberId = item.UserId, //虚拟的人Id变为负数
2024-02-01 16:49:22 +08:00
Point = new double[] { -1d, -1d },
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),
2020-09-17 10:23:26 +08:00
CommandType = 1,
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()
};
2024-02-01 16:49:22 +08:00
msgModels.Add(loginInfo);
2022-05-18 10:39:35 +08:00
}
2024-02-01 16:49:22 +08:00
var info = new MsgModel()
2022-05-18 10:39:35 +08:00
{
2024-02-01 16:49:22 +08:00
Exit = item.End,
IsCompleted = item.End,
MemberId = item.UserId, //虚拟的人Id变为负数
Point = new double[] { Math.Round(targetData._Lat, 6), Math.Round(targetData._Lon, 6) },
RouteId = item.RouteId,
EndDistance = Math.Round(targetData._Distance, 6),
CommandType = 1,
Speed = targetData._Speed,
WeightKg = weightKg,
PreDistance = item.GetPreDistance()
};
msgModels.Add(info);
}
catch (Exception e)
{
Log.Error("加载虚拟人物错误:" + e.Message + "\r\n" + e.StackTrace);
2024-01-24 15:23:28 +08:00
}
2020-09-17 10:23:26 +08:00
}
2024-01-24 15:23:28 +08:00
2020-09-17 10:23:26 +08:00
return msgModels;
}
2024-01-24 15:23:28 +08:00
2020-09-17 10:23:26 +08:00
/// <summary>
/// 删除已经骑行完的人,添加新的人物进去
/// </summary>
public void RemoveEndAndAddNewVirtualUser(int customerCount)
2020-09-17 10:23:26 +08:00
{
lock (locker)
2020-09-17 10:23:26 +08:00
{
2021-12-24 18:35:21 +08:00
var top = ComputeTop();//理论上当前时间段虚拟用户的总数
mapRecordRankings.RemoveAll(n => n.End);//移除骑行结束的人
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-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
}
}
}
}
}