2.0协议完善加简单交管配置
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
using SimpleCore;
|
||||
using SimpleCore.PropType;
|
||||
using SimpleLite.RCS.CarTypes;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace StandardScene.Magnetic.Tasking
|
||||
{
|
||||
/// <summary>
|
||||
/// 按 holdingLocks + 物理 siteID 统计管控站点列表上的他车占用。
|
||||
/// </summary>
|
||||
internal static class Fass2ControlAreaOccupancy
|
||||
{
|
||||
public static Fass2ControlReleaseCheck Check(Car self, int controlSiteId)
|
||||
{
|
||||
var site = SimpleLib.GetSite(controlSiteId);
|
||||
var area = Fass2ControlAreaGate.Resolve(Fass2SiteFieldReader.Read(site), controlSiteId);
|
||||
var occupancies = new List<Fass2ControlOccupancy>();
|
||||
|
||||
IEnumerable<AbstractCar> cars;
|
||||
try
|
||||
{
|
||||
cars = SimpleLib.GetAllCars();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return new Fass2ControlReleaseCheck
|
||||
{
|
||||
CanRelease = false,
|
||||
AreaId = area.AreaId,
|
||||
Capacity = area.Capacity,
|
||||
ReleaseStartStop = area.ReleaseStartStop,
|
||||
Reason = "car list unavailable: " + ex.Message
|
||||
};
|
||||
}
|
||||
|
||||
if (cars != null)
|
||||
{
|
||||
foreach (var other in cars.OfType<Car>())
|
||||
{
|
||||
if (other == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
occupancies.Add(new Fass2ControlOccupancy(other.id, CollectOccupiedSiteIds(other)));
|
||||
}
|
||||
}
|
||||
|
||||
return Fass2ControlAreaGate.Evaluate(self?.id ?? 0, area, occupancies);
|
||||
}
|
||||
|
||||
private static IReadOnlyList<int> CollectOccupiedSiteIds(Car car)
|
||||
{
|
||||
var ids = new List<int>();
|
||||
if (car.siteID > 0)
|
||||
{
|
||||
ids.Add(car.siteID);
|
||||
}
|
||||
|
||||
var holding = car.status?.holdingLocks;
|
||||
if (holding == null)
|
||||
{
|
||||
return ids;
|
||||
}
|
||||
|
||||
foreach (var lockId in holding)
|
||||
{
|
||||
if (lockId > 0 && !ids.Contains(lockId))
|
||||
{
|
||||
ids.Add(lockId);
|
||||
}
|
||||
}
|
||||
|
||||
return ids;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user