新增车辆表及OTA权限与逻辑优化
新增车辆任务与报警表,完善实体与DbContext配置。细化OTA权限校验,增强回传会话IP安全。优化OTA上传与设置面板,调度器支持重启恢复。报警采集逻辑支持历史分段。
This commit is contained in:
@@ -48,7 +48,10 @@ public class OtaController : ControllerBase
|
||||
if (string.Equals(Scope, "Platform", StringComparison.OrdinalIgnoreCase)) return true;
|
||||
var ops = User.FindFirst("ops")?.Value ?? "";
|
||||
var set = ops.Split(' ', StringSplitOptions.RemoveEmptyEntries);
|
||||
return set.Contains("*") || set.Any(o => o.StartsWith("ops.ota", StringComparison.OrdinalIgnoreCase));
|
||||
return set.Contains("*")
|
||||
|| set.Contains("ops.ota")
|
||||
|| set.Contains("ops.ota.write")
|
||||
|| set.Any(o => o.StartsWith("ops.ota.", StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
|
||||
private bool DenyWrite(out ActionResult denied)
|
||||
@@ -147,12 +150,32 @@ public class OtaController : ControllerBase
|
||||
var receiveBase = $"{baseUrl.TrimEnd('/')}/api/ota/receive";
|
||||
var time = DateTime.Now.ToString("yyyyMMddHHmmss");
|
||||
await _wd.TriggerPullAsync(car.Ip, receiveBase, time, ct);
|
||||
// 等待文件落盘
|
||||
// 等待文件落盘:绝对超时 + 收到文件后的空闲窗口,避免首个组件到达就清会话导致半包
|
||||
await Task.Delay(1500, ct);
|
||||
for (var i = 0; i < 40; i++)
|
||||
var deadline = DateTime.UtcNow.AddSeconds(90);
|
||||
var idleAfterReceive = TimeSpan.FromSeconds(8);
|
||||
var lastCount = 0;
|
||||
DateTime? lastProgressAt = null;
|
||||
while (DateTime.UtcNow < deadline)
|
||||
{
|
||||
ct.ThrowIfCancellationRequested();
|
||||
var info = _store.ScanPackage(pkgId);
|
||||
if (info.Components.Count > 0) break;
|
||||
if (info.Components.Count > lastCount)
|
||||
{
|
||||
lastCount = info.Components.Count;
|
||||
lastProgressAt = DateTime.UtcNow;
|
||||
}
|
||||
else if (_store.TryGetLastReceiveAt(car.Ip, out var recvAt) &&
|
||||
(lastProgressAt == null || recvAt > lastProgressAt.Value))
|
||||
{
|
||||
lastProgressAt = recvAt;
|
||||
}
|
||||
|
||||
if (lastCount > 0 &&
|
||||
lastProgressAt != null &&
|
||||
DateTime.UtcNow - lastProgressAt.Value >= idleAfterReceive)
|
||||
break;
|
||||
|
||||
await Task.Delay(500, ct);
|
||||
}
|
||||
_store.ClearActivePull(car.Ip);
|
||||
|
||||
Reference in New Issue
Block a user