去掉数据库冗余pathname字段,将“PathRouteId”更改为“RouteId”

This commit is contained in:
tian 2026-01-28 19:19:23 +08:00
parent 0869e32ccb
commit eeade5553f
10 changed files with 144 additions and 140 deletions

View File

@ -72,7 +72,7 @@ CREATE INDEX idx_batch_tasks_created ON BatchTasks(CreatedTime);
CREATE TABLE BatchTaskItems (
Id INTEGER PRIMARY KEY AUTOINCREMENT,
BatchTaskId INTEGER NOT NULL, -- 关联的批处理任务ID
PathRouteId TEXT NOT NULL, -- 关联的路径ID使用TEXT与PathRoutes.Id一致
RouteId TEXT NOT NULL, -- 关联的路径ID使用TEXT与PathRoutes.Id一致
PathRouteName TEXT NOT NULL, -- 路径名称(冗余,方便查询)
SequenceNumber INTEGER NOT NULL, -- 执行顺序
Status TEXT NOT NULL, -- 任务项状态Pending, Running, Completed, Failed, Skipped
@ -88,7 +88,7 @@ CREATE TABLE BatchTaskItems (
);
CREATE INDEX idx_batch_task_items_batch ON BatchTaskItems(BatchTaskId);
CREATE INDEX idx_batch_task_items_path ON BatchTaskItems(PathRouteId);
CREATE INDEX idx_batch_task_items_path ON BatchTaskItems(RouteId);
CREATE INDEX idx_batch_task_items_status ON BatchTaskItems(Status);
```
@ -169,7 +169,7 @@ public class BatchTaskItem
{
public int Id { get; set; }
public int BatchTaskId { get; set; }
public string PathRouteId { get; set; } // 使用TEXT与PathRoutes.Id一致
public string RouteId { get; set; } // 使用TEXT与PathRoutes.Id一致
public string PathRouteName { get; set; }
public int SequenceNumber { get; set; }
public BatchTaskItemStatus Status { get; set; }
@ -339,7 +339,7 @@ namespace NavisworksTransport.Core.Collision
}
catch (Exception ex)
{
LogManager.Error($"执行任务项失败 (PathRouteId: {item.PathRouteId}): {ex.Message}");
LogManager.Error($"执行任务项失败 (RouteId: {item.RouteId}): {ex.Message}");
item.Status = BatchTaskItemStatus.Failed;
item.ErrorMessage = ex.Message;
task.FailedItems++;
@ -385,10 +385,10 @@ namespace NavisworksTransport.Core.Collision
var config = task.DefaultConfig.MergeWith(item.ConfigOverride);
var pathRoute = await _database.GetPathRouteAsync(item.PathRouteId);
var pathRoute = await _database.GetPathRouteAsync(item.RouteId);
if (pathRoute == null)
{
throw new InvalidOperationException($"路径不存在 (Id: {item.PathRouteId})");
throw new InvalidOperationException($"路径不存在 (Id: {item.RouteId})");
}
// 获取运动物体
@ -476,7 +476,7 @@ namespace NavisworksTransport.Core.Collision
summaryReport.TotalCollisions += result.CollisionCount;
summaryReport.PathSummaries.Add(new PathCollisionSummary
{
PathRouteId = item.PathRouteId,
RouteId = item.RouteId,
PathRouteName = item.PathRouteName,
CollisionCount = result.CollisionCount,
TestName = result.TestName,
@ -585,7 +585,7 @@ namespace NavisworksTransport.Core
var item = new BatchTaskItem
{
BatchTaskId = taskId,
PathRouteId = itemConfig.PathRouteId,
RouteId = itemConfig.RouteId,
PathRouteName = itemConfig.PathRouteName,
SequenceNumber = sequence++,
Status = BatchTaskItemStatus.Pending,

View File

@ -42,7 +42,7 @@ namespace NavisworksTransport.Commands
/// <summary>
/// 路径ID用于视角调整
/// </summary>
public string PathRouteId { get; set; } = string.Empty;
public string RouteId { get; set; } = string.Empty;
/// <summary>
/// 碰撞结果是否已经被高亮过了(用于避免重复高亮)
@ -221,7 +221,7 @@ namespace NavisworksTransport.Commands
{
// 从所有路径中查找当前路径
var allRoutes = PathPlanningManager.Instance.GetAllRoutes();
var pathRoute = allRoutes.FirstOrDefault(r => r.Id == _parameters.PathRouteId);
var pathRoute = allRoutes.FirstOrDefault(r => r.Id == _parameters.RouteId);
ViewpointHelper.AdjustViewpointSmart(pathRoute, collisionData.AllCollisions);
@ -715,19 +715,19 @@ namespace NavisworksTransport.Commands
/// <summary>
/// 创建综合报告命令
/// </summary>
/// <param name="pathRouteId">路径ID用于视角调整如果为空则使用全局CurrentRoute</param>
/// <param name="routeId">路径ID用于视角调整如果为空则使用全局CurrentRoute</param>
/// <param name="hasHighlighted">碰撞结果是否已经被高亮</param>
public static GenerateCollisionReportCommand CreateComprehensive(string pathRouteId = null, bool hasHighlighted = false)
public static GenerateCollisionReportCommand CreateComprehensive(string routeId = null, bool hasHighlighted = false)
{
// 如果没有传入路径ID则从全局CurrentRoute获取
if (string.IsNullOrEmpty(pathRouteId))
if (string.IsNullOrEmpty(routeId))
{
try
{
var currentRoute = PathPlanningManager.Instance?.CurrentRoute;
if (currentRoute != null)
{
pathRouteId = currentRoute.Id;
routeId = currentRoute.Id;
}
}
catch (Exception ex)
@ -741,7 +741,7 @@ namespace NavisworksTransport.Commands
Type = CollisionReportParameters.ReportType.Comprehensive,
IncludeDetails = true,
HasHighlighted = hasHighlighted,
PathRouteId = pathRouteId
RouteId = routeId
});
}

View File

@ -1531,7 +1531,6 @@ namespace NavisworksTransport.Core.Animation
ClashDetectiveIntegration.Instance.CreateAllAnimationCollisionTests(
_allCollisionResults,
_detectionTolerance,
_pathName,
_currentRouteId,
_animatedObject,
_isVirtualVehicle,

View File

@ -258,10 +258,10 @@ namespace NavisworksTransport.Core
try
{
var pathRoute = await _database.GetPathRouteAsync(item.PathRouteId);
var pathRoute = await _database.GetPathRouteAsync(item.RouteId);
if (pathRoute == null)
{
throw new InvalidOperationException($"路径不存在 (Id: {item.PathRouteId})");
throw new InvalidOperationException($"路径不存在 (Id: {item.RouteId})");
}
// 获取运动物体
@ -448,7 +448,7 @@ namespace NavisworksTransport.Core
LogManager.Info($"[批处理队列] 已渲染路径可视化: {pathRoute.Name}");
var reportCommand = Commands.GenerateCollisionReportCommand.CreateComprehensive(
pathRouteId: item.PathRouteId, // 使用任务自己的路径ID
routeId: item.RouteId, // 使用任务自己的路径ID
hasHighlighted: false
);
reportCommand.SetTestName(testName);

View File

@ -92,7 +92,6 @@ namespace NavisworksTransport.Core.Collision
var testName = _clashIntegration.CreateAllAnimationCollisionTestsForBatch(
precomputedCollisions,
detectionGap,
pathName,
routeId,
animatedObject,
isVirtualVehicle,

View File

@ -147,7 +147,7 @@ namespace NavisworksTransport
/// <summary>
/// 保存ClashDetective结果到数据库
/// </summary>
private void SaveClashDetectiveResultToDatabase(string pathName, string routeId, List<CollisionResult> clashResults,
private void SaveClashDetectiveResultToDatabase(string routeId, List<CollisionResult> clashResults,
int frameRate, double duration, double detectionGap,
ModelItem animatedObject, bool isVirtualVehicle,
double virtualVehicleLength, double virtualVehicleWidth, double virtualVehicleHeight)
@ -181,7 +181,6 @@ namespace NavisworksTransport
var record = new ClashDetectiveResultRecord
{
TestName = _currentTestName,
PathName = pathName,
RouteId = routeId ?? "",
TestTime = DateTime.Now,
CollisionCount = clashResults.Count,
@ -229,7 +228,8 @@ namespace NavisworksTransport
LogManager.Info($"已保存 {collisionObjects.Count} 个被撞物体到数据库");
}
// 触发结果保存事件通知UI刷新列表
// 触发结果保存事件通知UI刷新列表从RouteId获取PathName
var pathName = GetPathNameByRouteId(routeId);
ClashDetectiveResultSaved?.Invoke(this, new ClashDetectiveResultSavedEventArgs(pathName, _currentTestName, clashResults.Count));
}
}
@ -240,6 +240,30 @@ namespace NavisworksTransport
}
}
/// <summary>
/// 根据RouteId获取路径名称
/// </summary>
private string GetPathNameByRouteId(string routeId)
{
if (string.IsNullOrEmpty(routeId))
return "未知路径";
try
{
var pathDatabase = PathPlanningManager.Instance?.GetPathDatabase();
if (pathDatabase != null)
{
var pathRoute = pathDatabase.GetPathRouteSync(routeId);
return pathRoute?.Name ?? "未知路径";
}
}
catch (Exception ex)
{
LogManager.Error($"获取路径名称失败: {ex.Message}");
}
return "未知路径";
}
/// <summary>
/// 从数据库加载ClashDetective碰撞结果
/// </summary>
@ -256,12 +280,13 @@ namespace NavisworksTransport
return null;
}
// 1. 从数据库读取测试信息
// 1. 从数据库读取测试信息添加JOIN获取PathName
var testInfoSql = @"
SELECT Id, PathName, RouteId, IsVirtualVehicle, VehicleModelIndex, VehiclePathId,
VirtualVehicleLength, VirtualVehicleWidth, VirtualVehicleHeight, ScreenshotPath
FROM ClashDetectiveResults
WHERE TestName = @testName
SELECT cdr.Id, pr.Name AS PathName, cdr.RouteId, cdr.IsVirtualVehicle, cdr.VehicleModelIndex, cdr.VehiclePathId,
cdr.VirtualVehicleLength, cdr.VirtualVehicleWidth, cdr.VirtualVehicleHeight, cdr.ScreenshotPath
FROM ClashDetectiveResults cdr
INNER JOIN PathRoutes pr ON cdr.RouteId = pr.Id
WHERE cdr.TestName = @testName
";
ClashDetectiveResultRecord testInfo = null;
@ -480,7 +505,6 @@ namespace NavisworksTransport
public (ClashResultGroup collisionGroup, ClashTest addedMainTest, int confirmedCount) RunClashDetectiveTestsAndSaveToDatabase(
List<CollisionResult> precomputedCollisions,
double detectionGap,
string pathName,
string routeId,
ModelItem animatedObject,
bool isVirtualVehicle,
@ -536,7 +560,6 @@ namespace NavisworksTransport
// 保存到数据库
SaveClashDetectiveResultToDatabase(
pathName,
routeId,
new List<CollisionResult>(),
frameRate,
@ -751,7 +774,7 @@ namespace NavisworksTransport
_clashDetectiveCollisionCount = clashResults.Count;
// 保存到数据库(使用去重后的结果)
SaveClashDetectiveResultToDatabase(pathName, routeId, finalClashResults, frameRate, duration, detectionGap, animatedObject, isVirtualVehicle,
SaveClashDetectiveResultToDatabase(routeId, finalClashResults, frameRate, duration, detectionGap, animatedObject, isVirtualVehicle,
virtualVehicleLength, virtualVehicleWidth, virtualVehicleHeight);
LogManager.Info($"[ClashDetective] 结果已保存到数据库");
@ -765,7 +788,6 @@ namespace NavisworksTransport
/// </summary>
/// <param name="precomputedCollisions">预计算碰撞结果</param>
/// <param name="detectionGap">检测间隙容差</param>
/// <param name="pathName">路径名称</param>
/// <param name="routeId">路由ID</param>
/// <param name="animatedObject">动画对象(如果是真实车辆)</param>
/// <param name="isVirtualVehicle">是否使用虚拟车辆</param>
@ -778,7 +800,6 @@ namespace NavisworksTransport
public void CreateAllAnimationCollisionTests(
List<CollisionResult> precomputedCollisions,
double detectionGap,
string pathName,
string routeId,
ModelItem animatedObject,
bool isVirtualVehicle,
@ -817,13 +838,12 @@ namespace NavisworksTransport
ClashTest addedMainTest = null;
ClashResultGroup collisionGroup = null;
int confirmedCount = 0;
try
{
var result = RunClashDetectiveTestsAndSaveToDatabase(
precomputedCollisions,
detectionGap,
pathName,
routeId,
animatedObject,
isVirtualVehicle,
@ -1524,7 +1544,6 @@ namespace NavisworksTransport
public string CreateAllAnimationCollisionTestsForBatch(
List<CollisionResult> precomputedCollisions,
double detectionGap,
string pathName,
string routeId,
ModelItem animatedObject,
bool isVirtualVehicle,
@ -1549,7 +1568,6 @@ namespace NavisworksTransport
var result = RunClashDetectiveTestsAndSaveToDatabase(
precomputedCollisions,
detectionGap,
pathName,
routeId,
animatedObject,
isVirtualVehicle,

View File

@ -9,8 +9,8 @@ namespace NavisworksTransport.Core.Models
public class BatchQueueItem
{
public int Id { get; set; }
public string PathRouteId { get; set; }
public string PathRouteName { get; set; }
public string RouteId { get; set; }
public string PathRouteName { get; set; } // 通过 JOIN PathRoutes 获取,用于显示
public BatchQueueStatus Status { get; set; }
public DateTime CreatedTime { get; set; }
public DateTime? StartTime { get; set; }

View File

@ -97,7 +97,6 @@ namespace NavisworksTransport
CREATE TABLE IF NOT EXISTS CollisionReports (
Id INTEGER PRIMARY KEY AUTOINCREMENT,
RouteId TEXT,
PathName TEXT,
AnimatedObjectName TEXT,
UniqueCollidedObjectsCount INTEGER,
FrameRate INTEGER,
@ -171,7 +170,6 @@ namespace NavisworksTransport
CREATE TABLE IF NOT EXISTS ClashDetectiveResults (
Id INTEGER PRIMARY KEY AUTOINCREMENT,
TestName TEXT NOT NULL UNIQUE,
PathName TEXT NOT NULL,
RouteId TEXT NOT NULL,
TestTime DATETIME NOT NULL,
CollisionCount INTEGER NOT NULL,
@ -208,7 +206,7 @@ namespace NavisworksTransport
ExecuteNonQuery("CREATE INDEX IF NOT EXISTS idx_reports_route ON CollisionReports(RouteId)");
ExecuteNonQuery("CREATE INDEX IF NOT EXISTS idx_pathpoints_route ON PathPoints(RouteId)");
ExecuteNonQuery("CREATE INDEX IF NOT EXISTS idx_pathedges_route ON PathEdges(RouteId)");
ExecuteNonQuery("CREATE INDEX IF NOT EXISTS idx_clash_path_name ON ClashDetectiveResults(PathName)");
ExecuteNonQuery("CREATE INDEX IF NOT EXISTS idx_clash_route_id ON ClashDetectiveResults(RouteId)");
ExecuteNonQuery("CREATE INDEX IF NOT EXISTS idx_clash_test_time ON ClashDetectiveResults(TestTime DESC)");
ExecuteNonQuery("CREATE INDEX IF NOT EXISTS idx_clash_objects_result ON ClashDetectiveCollisionObjects(ResultId)");
ExecuteNonQuery("CREATE INDEX IF NOT EXISTS idx_clash_objects_path ON ClashDetectiveCollisionObjects(PathId)");
@ -217,8 +215,7 @@ namespace NavisworksTransport
ExecuteNonQuery(@"
CREATE TABLE IF NOT EXISTS BatchQueueItems (
Id INTEGER PRIMARY KEY AUTOINCREMENT,
PathRouteId TEXT NOT NULL,
PathRouteName TEXT NOT NULL,
RouteId TEXT NOT NULL,
Status TEXT NOT NULL,
CreatedTime TEXT NOT NULL,
StartTime TEXT,
@ -241,7 +238,7 @@ namespace NavisworksTransport
// 批处理表索引
ExecuteNonQuery("CREATE INDEX IF NOT EXISTS idx_batch_queue_status ON BatchQueueItems(Status)");
ExecuteNonQuery("CREATE INDEX IF NOT EXISTS idx_batch_queue_created ON BatchQueueItems(CreatedTime)");
ExecuteNonQuery("CREATE INDEX IF NOT EXISTS idx_batch_queue_path ON BatchQueueItems(PathRouteId)");
ExecuteNonQuery("CREATE INDEX IF NOT EXISTS idx_batch_queue_route_id ON BatchQueueItems(RouteId)");
// 通用 ModelItem 引用表(用于存储运动物体、碰撞物体等)
ExecuteNonQuery(@"
@ -367,16 +364,15 @@ namespace NavisworksTransport
{
var sql = @"
INSERT INTO CollisionReports
(RouteId, PathName, AnimatedObjectName, UniqueCollidedObjectsCount, FrameRate, Duration,
(RouteId, AnimatedObjectName, UniqueCollidedObjectsCount, FrameRate, Duration,
DetectionGap, AnimationCollisionCount, ClashDetectiveCollisionCount, ReportTime)
VALUES (@routeId, @pathName, @animatedObjectName, @uniqueCollidedObjectsCount, @frameRate, @duration,
VALUES (@routeId, @animatedObjectName, @uniqueCollidedObjectsCount, @frameRate, @duration,
@detectionGap, @animationCount, @clashCount, @reportTime)
";
using (var cmd = new SQLiteCommand(sql, _connection))
{
cmd.Parameters.AddWithValue("@routeId", routeId ?? "");
cmd.Parameters.AddWithValue("@pathName", pathName ?? "未知路径");
cmd.Parameters.AddWithValue("@animatedObjectName", animatedObjectName ?? "未知对象");
cmd.Parameters.AddWithValue("@uniqueCollidedObjectsCount", uniqueCollidedObjectsCount);
cmd.Parameters.AddWithValue("@frameRate", frameRate);
@ -388,7 +384,7 @@ namespace NavisworksTransport
cmd.ExecuteNonQuery();
}
LogManager.Info($"碰撞报告已保存: 路径={pathName}, 碰撞构件={uniqueCollidedObjectsCount}, 动画碰撞={animationCollisionCount}, ClashDetective碰撞={clashDetectiveCollisionCount}");
LogManager.Info($"碰撞报告已保存: 路径ID={routeId}, 碰撞构件={uniqueCollidedObjectsCount}, 动画碰撞={animationCollisionCount}, ClashDetective碰撞={clashDetectiveCollisionCount}");
}
catch (Exception ex)
{
@ -499,10 +495,10 @@ namespace NavisworksTransport
var sql = @"
INSERT INTO ClashDetectiveResults
(TestName, PathName, RouteId, TestTime, CollisionCount, AnimationCollisionCount,
(TestName, RouteId, TestTime, CollisionCount, AnimationCollisionCount,
FrameRate, Duration, DetectionGap, AnimatedObjectName, IsVirtualVehicle, VehicleModelIndex, VehiclePathId,
VirtualVehicleLength, VirtualVehicleWidth, VirtualVehicleHeight, ScreenshotPath, CreatedAt)
VALUES (@testName, @pathName, @routeId, @testTime, @collisionCount, @animationCollisionCount,
VALUES (@testName, @routeId, @testTime, @collisionCount, @animationCollisionCount,
@frameRate, @duration, @detectionGap, @animatedObjectName, @isVirtualVehicle, @vehicleModelIndex, @vehiclePathId,
@virtualVehicleLength, @virtualVehicleWidth, @virtualVehicleHeight, @screenshotPath, @createdAt)
";
@ -511,7 +507,6 @@ namespace NavisworksTransport
using (var cmd = new SQLiteCommand(sql, _connection))
{
cmd.Parameters.AddWithValue("@testName", record.TestName);
cmd.Parameters.AddWithValue("@pathName", record.PathName);
cmd.Parameters.AddWithValue("@routeId", record.RouteId);
cmd.Parameters.AddWithValue("@testTime", record.TestTime);
cmd.Parameters.AddWithValue("@collisionCount", record.CollisionCount);
@ -552,11 +547,12 @@ namespace NavisworksTransport
try
{
var sql = @"
SELECT Id, TestName, PathName, RouteId, TestTime, CollisionCount, AnimationCollisionCount,
FrameRate, Duration, DetectionGap, AnimatedObjectName, CreatedAt
FROM ClashDetectiveResults
WHERE PathName = @pathName
ORDER BY TestTime DESC
SELECT cdr.Id, cdr.TestName, cdr.RouteId, pr.Name AS PathName, cdr.TestTime, cdr.CollisionCount, cdr.AnimationCollisionCount,
cdr.FrameRate, cdr.Duration, cdr.DetectionGap, cdr.AnimatedObjectName, cdr.CreatedAt
FROM ClashDetectiveResults cdr
INNER JOIN PathRoutes pr ON cdr.RouteId = pr.Id
WHERE pr.Name = @pathName
ORDER BY cdr.TestTime DESC
";
using (var cmd = new SQLiteCommand(sql, _connection))
@ -603,11 +599,12 @@ namespace NavisworksTransport
try
{
var sql = @"
SELECT Id, TestName, PathName, RouteId, TestTime, CollisionCount, AnimationCollisionCount,
FrameRate, Duration, DetectionGap, AnimatedObjectName, CreatedAt
FROM ClashDetectiveResults
WHERE PathName = @pathName
ORDER BY TestTime DESC
SELECT cdr.Id, cdr.TestName, cdr.RouteId, pr.Name AS PathName, cdr.TestTime, cdr.CollisionCount, cdr.AnimationCollisionCount,
cdr.FrameRate, cdr.Duration, cdr.DetectionGap, cdr.AnimatedObjectName, cdr.CreatedAt
FROM ClashDetectiveResults cdr
INNER JOIN PathRoutes pr ON cdr.RouteId = pr.Id
WHERE pr.Name = @pathName
ORDER BY cdr.TestTime DESC
LIMIT 1
";
@ -671,10 +668,11 @@ namespace NavisworksTransport
try
{
var sql = @"
SELECT Id, TestName, PathName, RouteId, TestTime, CollisionCount, AnimationCollisionCount,
FrameRate, Duration, DetectionGap, AnimatedObjectName, CreatedAt, ScreenshotPath
FROM ClashDetectiveResults
WHERE TestName = @testName
SELECT cdr.Id, cdr.TestName, cdr.RouteId, pr.Name AS PathName, cdr.TestTime, cdr.CollisionCount, cdr.AnimationCollisionCount,
cdr.FrameRate, cdr.Duration, cdr.DetectionGap, cdr.AnimatedObjectName, cdr.CreatedAt, cdr.ScreenshotPath
FROM ClashDetectiveResults cdr
INNER JOIN PathRoutes pr ON cdr.RouteId = pr.Id
WHERE cdr.TestName = @testName
";
using (var cmd = new SQLiteCommand(sql, _connection))
@ -1344,42 +1342,50 @@ namespace NavisworksTransport
}
/// <summary>
/// 根据路径ID获取路径
/// 异步获取路径信息
/// </summary>
public async Task<PathRoute> GetPathRouteAsync(string routeId)
{
return await Task.Run(() =>
{
using (var cmd = new SQLiteCommand(_connection))
return GetPathRouteSync(routeId);
});
}
/// <summary>
/// 同步获取路径信息(用于需要同步调用的场景)
/// </summary>
public PathRoute GetPathRouteSync(string routeId)
{
using (var cmd = new SQLiteCommand(_connection))
{
cmd.CommandText = @"
SELECT Id, Name, CreatedTime, LastModified, TotalLength
FROM PathRoutes
WHERE Id = @Id";
cmd.Parameters.AddWithValue("@Id", routeId);
using (var reader = cmd.ExecuteReader())
{
cmd.CommandText = @"
SELECT Id, Name, CreatedTime, LastModified, TotalLength
FROM PathRoutes
WHERE Id = @Id";
cmd.Parameters.AddWithValue("@Id", routeId);
using (var reader = cmd.ExecuteReader())
if (reader.Read())
{
if (reader.Read())
var route = new PathRoute(reader["Name"].ToString())
{
var route = new PathRoute(reader["Name"].ToString())
{
Id = reader["Id"].ToString(),
CreatedTime = DateTime.Parse(reader["CreatedTime"].ToString()),
LastModified = DateTime.Parse(reader["LastModified"].ToString()),
TotalLength = Convert.ToDouble(reader["TotalLength"])
};
// 加载路径点和路径边
LoadPathPoints(route);
LoadPathEdges(route);
return route;
}
return null;
Id = reader["Id"].ToString(),
CreatedTime = DateTime.Parse(reader["CreatedTime"].ToString()),
LastModified = DateTime.Parse(reader["LastModified"].ToString()),
TotalLength = Convert.ToDouble(reader["TotalLength"])
};
// 加载路径点和路径边
LoadPathPoints(route);
LoadPathEdges(route);
return route;
}
}
});
}
return null;
}
#endregion
@ -1397,14 +1403,14 @@ namespace NavisworksTransport
{
cmd.CommandText = @"
INSERT INTO BatchQueueItems (
PathRouteId, PathRouteName, Status, CreatedTime, StartTime, EndTime, ErrorMessage,
RouteId, Status, CreatedTime, StartTime, EndTime, ErrorMessage,
FrameRate, DurationSeconds, DetectionToleranceMeters,
IsVirtualVehicle, VirtualVehicleLength, VirtualVehicleWidth, VirtualVehicleHeight,
DetectAllObjects,
ClashDetectiveTestName, CollisionCount, ObjectRotationCorrection
)
VALUES (
@PathRouteId, @PathRouteName, @Status, @CreatedTime, @StartTime, @EndTime, @ErrorMessage,
@RouteId, @Status, @CreatedTime, @StartTime, @EndTime, @ErrorMessage,
@FrameRate, @DurationSeconds, @DetectionToleranceMeters,
@IsVirtualVehicle, @VirtualVehicleLength, @VirtualVehicleWidth, @VirtualVehicleHeight,
@DetectAllObjects,
@ -1412,8 +1418,7 @@ namespace NavisworksTransport
);
SELECT last_insert_rowid();";
cmd.Parameters.AddWithValue("@PathRouteId", item.PathRouteId);
cmd.Parameters.AddWithValue("@PathRouteName", item.PathRouteName ?? "");
cmd.Parameters.AddWithValue("@RouteId", item.RouteId);
cmd.Parameters.AddWithValue("@Status", item.Status.ToString());
cmd.Parameters.AddWithValue("@CreatedTime", item.CreatedTime.ToString("o"));
cmd.Parameters.AddWithValue("@StartTime", item.StartTime?.ToString("o") ?? "");
@ -1454,7 +1459,7 @@ namespace NavisworksTransport
var item = new BatchQueueItem
{
Id = itemId,
PathRouteId = reader["PathRouteId"].ToString(),
RouteId = reader["RouteId"].ToString(),
PathRouteName = reader["PathRouteName"].ToString(),
Status = (BatchQueueStatus)Enum.Parse(typeof(BatchQueueStatus), reader["Status"].ToString()),
CreatedTime = DateTime.Parse(reader["CreatedTime"].ToString()),
@ -1500,18 +1505,19 @@ namespace NavisworksTransport
using (var cmd = new SQLiteCommand(_connection))
{
var sql = @"
SELECT Id, PathRouteId, PathRouteName, Status, CreatedTime, StartTime, EndTime, ErrorMessage,
FrameRate, DurationSeconds, DetectionToleranceMeters,
IsVirtualVehicle, VirtualVehicleLength, VirtualVehicleWidth, VirtualVehicleHeight,
DetectAllObjects,
ClashDetectiveTestName, CollisionCount, ObjectRotationCorrection
FROM BatchQueueItems";
SELECT bqi.Id, bqi.RouteId, pr.Name AS PathRouteName, bqi.Status, bqi.CreatedTime, bqi.StartTime, bqi.EndTime, bqi.ErrorMessage,
bqi.FrameRate, bqi.DurationSeconds, bqi.DetectionToleranceMeters,
bqi.IsVirtualVehicle, bqi.VirtualVehicleLength, bqi.VirtualVehicleWidth, bqi.VirtualVehicleHeight,
bqi.DetectAllObjects,
bqi.ClashDetectiveTestName, bqi.CollisionCount, bqi.ObjectRotationCorrection
FROM BatchQueueItems bqi
INNER JOIN PathRoutes pr ON bqi.RouteId = pr.Id";
var conditions = new List<string>();
// 只有当 statusFilter 不是 All 时才添加筛选条件
if (statusFilter != BatchQueueStatus.All)
{
conditions.Add("Status = @Status");
conditions.Add("bqi.Status = @Status");
cmd.Parameters.AddWithValue("@Status", statusFilter.ToString());
}
@ -1520,7 +1526,7 @@ namespace NavisworksTransport
sql += " WHERE " + string.Join(" AND ", conditions);
}
sql += " ORDER BY CreatedTime DESC";
sql += " ORDER BY bqi.CreatedTime DESC";
if (limit > 0)
{
@ -1558,13 +1564,14 @@ namespace NavisworksTransport
using (var cmd = new SQLiteCommand(_connection))
{
cmd.CommandText = @"
SELECT Id, PathRouteId, PathRouteName, Status, CreatedTime, StartTime, EndTime, ErrorMessage,
FrameRate, DurationSeconds, DetectionToleranceMeters,
IsVirtualVehicle, VirtualVehicleLength, VirtualVehicleWidth, VirtualVehicleHeight,
DetectAllObjects,
ClashDetectiveTestName, CollisionCount, ObjectRotationCorrection
FROM BatchQueueItems
WHERE Id = @Id";
SELECT bqi.Id, bqi.RouteId, pr.Name AS PathRouteName, bqi.Status, bqi.CreatedTime, bqi.StartTime, bqi.EndTime, bqi.ErrorMessage,
bqi.FrameRate, bqi.DurationSeconds, bqi.DetectionToleranceMeters,
bqi.IsVirtualVehicle, bqi.VirtualVehicleLength, bqi.VirtualVehicleWidth, bqi.VirtualVehicleHeight,
bqi.DetectAllObjects,
bqi.ClashDetectiveTestName, bqi.CollisionCount, bqi.ObjectRotationCorrection
FROM BatchQueueItems bqi
INNER JOIN PathRoutes pr ON bqi.RouteId = pr.Id
WHERE bqi.Id = @Id";
cmd.Parameters.AddWithValue("@Id", itemId);

View File

@ -3530,8 +3530,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels
// 创建批处理队列项
var queueItem = new BatchQueueItem
{
PathRouteId = CurrentPathRoute.Id,
PathRouteName = CurrentPathRoute.Name,
RouteId = CurrentPathRoute.Id,
Status = BatchQueueStatus.Pending,
CreatedTime = DateTime.Now,
@ -3627,18 +3626,18 @@ namespace NavisworksTransport.UI.WPF.ViewModels
}
}
LogManager.Info($"[批处理] 已创建队列项: {queueItem.PathRouteName}, " +
LogManager.Info($"[批处理] 已创建队列项: {CurrentPathRoute.Name}, " +
$"虚拟车辆: {queueItem.IsVirtualVehicle}, " +
$"帧率: {queueItem.FrameRate}, " +
$"时长: {queueItem.DurationSeconds:F2}秒, " +
$"角度修正: {queueItem.ObjectRotationCorrection:F1}°, " +
$"ID: {itemId}");
UpdateMainStatus($"已添加到批处理队列: {queueItem.PathRouteName}");
UpdateMainStatus($"已添加到批处理队列: {CurrentPathRoute.Name}");
// 显示成功提示
System.Windows.MessageBox.Show(
$"已成功添加到批处理队列:{queueItem.PathRouteName}\n" +
$"已成功添加到批处理队列:{CurrentPathRoute.Name}\n" +
$"队列项ID: {itemId}",
"添加成功",
System.Windows.MessageBoxButton.OK,

View File

@ -255,13 +255,6 @@ NavisworksTransport 路径编辑页签视图 - 采用与动画控制和分层管
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
<!-- 当前路径信息 -->
<TextBlock Text="{Binding SelectedPathRoute.Name, StringFormat='当前选择: {0}', TargetNullValue='当前选择: 无'}"
Style="{StaticResource StatusTextStyle}"
FontWeight="SemiBold"
Foreground="#FF2B579A"
Margin="0,5,0,0"/>
</StackPanel>
</Border>
@ -293,22 +286,11 @@ NavisworksTransport 路径编辑页签视图 - 采用与动画控制和分层管
</StackPanel>
<!-- 当前路径信息 -->
<Grid Margin="0,5,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Content="编辑路径:" Style="{StaticResource ParameterLabelStyle}"/>
<TextBlock Grid.Column="1"
Text="{Binding SelectedPathRoute.Name, TargetNullValue='未选择路径'}"
VerticalAlignment="Center"
FontWeight="SemiBold"
Foreground="{Binding SelectedPathRoute, Converter={x:Null}, TargetNullValue='#FF999999'}"
Background="#FFF5F5F5"
Padding="5,3"
Margin="0,5,0,0"/>
</Grid>
<TextBlock Text="{Binding SelectedPathRoute.Name, StringFormat='当前路径: {0}', TargetNullValue='编辑路径: 未选择路径'}"
Style="{StaticResource StatusTextStyle}"
FontWeight="SemiBold"
Foreground="#FF2B579A"
Margin="0,5,0,0"/>
<!-- 路径点列表 -->
<ListView ItemsSource="{Binding SelectedPathRoute.Points}"