feat: add ERP agent pet bridge and startup guide
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Lskj.CommandKernel;
|
||||
|
||||
namespace Lskj.AgentBridge
|
||||
{
|
||||
public sealed class InMemoryPlanStore : IServerPlanStore
|
||||
{
|
||||
public const int MaximumPlans = 128;
|
||||
private readonly object _syncRoot = new object();
|
||||
private readonly Dictionary<string, CommandPlan> _plans =
|
||||
new Dictionary<string, CommandPlan>(StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
public void Save(CommandPlan plan)
|
||||
{
|
||||
if (plan == null) throw new ArgumentNullException("plan");
|
||||
if (string.IsNullOrWhiteSpace(plan.PlanId))
|
||||
throw new ArgumentException("计划 ID 不能为空。", "plan");
|
||||
lock (_syncRoot)
|
||||
{
|
||||
if (!_plans.ContainsKey(plan.PlanId)
|
||||
&& _plans.Count >= MaximumPlans)
|
||||
throw new CommandKernelException(
|
||||
"plan_store_capacity_exceeded",
|
||||
"ERP 待执行计划已达到安全上限,请等待旧计划过期后重试。",
|
||||
6);
|
||||
_plans[plan.PlanId] = plan;
|
||||
}
|
||||
}
|
||||
|
||||
public bool TryGet(string planId, out CommandPlan plan)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(planId))
|
||||
{
|
||||
plan = null;
|
||||
return false;
|
||||
}
|
||||
lock (_syncRoot)
|
||||
{
|
||||
return _plans.TryGetValue(planId, out plan);
|
||||
}
|
||||
}
|
||||
|
||||
public void Remove(string planId)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(planId)) return;
|
||||
lock (_syncRoot)
|
||||
{
|
||||
_plans.Remove(planId);
|
||||
}
|
||||
}
|
||||
|
||||
public void PurgeExpired(DateTime utcNow)
|
||||
{
|
||||
lock (_syncRoot)
|
||||
{
|
||||
List<string> expired = new List<string>();
|
||||
foreach (KeyValuePair<string, CommandPlan> item in _plans)
|
||||
{
|
||||
if (item.Value == null || item.Value.ExpiresAtUtc < utcNow)
|
||||
expired.Add(item.Key);
|
||||
}
|
||||
foreach (string planId in expired) _plans.Remove(planId);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user