From 225590ac1949480a9df897be83ed0a2b85655a3e Mon Sep 17 00:00:00 2001 From: tian <11429339@qq.com> Date: Thu, 18 Jun 2026 19:42:48 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=A8=E6=89=80=E6=9C=89=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E7=9A=84=E5=AE=8C=E6=95=B4=20CRUD=20=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ModelService: +AddModel/UpdateModel - IScenarioService: +UpdateScenario +GetScene +Get/DeleteControlZone +Add/Update/Delete/GetScenarioDrones +Add/Update/Delete/GetDeploymentUnits +GetCloudDispersal +GetRoutes/DeleteRoute +GetWaypoints/GetWaypointsByWave/DeleteWaypoint - ScenarioManager 全面暴露新增接口 - 238 测试全过 --- .../Services/IModelService.cs | 2 + .../Services/IScenarioService.cs | 41 ++++++-- .../Services/ModelService.cs | 20 ++++ .../Services/ScenarioService.cs | 96 ++++++++++++++++++- .../Assets/Scripts/Managers/ModelManager.cs | 2 + .../Scripts/Managers/ScenarioManager.cs | 33 ++++++- 6 files changed, 185 insertions(+), 9 deletions(-) diff --git a/src/CounterDrone.Core/Services/IModelService.cs b/src/CounterDrone.Core/Services/IModelService.cs index 2f5d630..e43b44b 100644 --- a/src/CounterDrone.Core/Services/IModelService.cs +++ b/src/CounterDrone.Core/Services/IModelService.cs @@ -7,8 +7,10 @@ namespace CounterDrone.Core.Services public interface IModelService { ModelInfo ImportModel(string filePath, string name); + ModelInfo AddModel(ModelInfo model); void DeleteModel(string id); List GetAllModels(); ModelInfo GetModel(string id); + ModelInfo UpdateModel(ModelInfo model); } } diff --git a/src/CounterDrone.Core/Services/IScenarioService.cs b/src/CounterDrone.Core/Services/IScenarioService.cs index de605cd..702770d 100644 --- a/src/CounterDrone.Core/Services/IScenarioService.cs +++ b/src/CounterDrone.Core/Services/IScenarioService.cs @@ -6,25 +6,54 @@ namespace CounterDrone.Core.Services /// 想定管理服务 public interface IScenarioService { + // ═══ Scenario ═══ Scenario CreateScenario(string name, string scenarioNumber); void DeleteScenario(string id); + Scenario UpdateScenario(Scenario scenario); PagedResult SearchScenarios(string keyword, string? dateFrom, string? dateTo, int page, int pageSize); ScenarioConfig? GetScenarioDetail(string id); + // ═══ CombatScene ═══ void SaveScene(string scenarioId, CombatScene scene); - void SaveControlZones(string scenarioId, List zones); - void SaveScenarioDrone(string scenarioId, ScenarioDrone target); - void SaveDeployment(string scenarioId, List equips); + CombatScene GetScene(string scenarioId); - /// 添加单个探测设备(独立于 SaveDeployment,不覆盖火力单元) + // ═══ ControlZone ═══ + void SaveControlZones(string scenarioId, List zones); + List GetControlZones(string scenarioId); + void DeleteControlZone(string id); + + // ═══ ScenarioDrone ═══ + ScenarioDrone SaveScenarioDrone(string scenarioId, ScenarioDrone drone); + ScenarioDrone AddScenarioDrone(string scenarioId, ScenarioDrone drone); + void UpdateScenarioDrone(ScenarioDrone drone); + void DeleteScenarioDrone(string id); + List GetScenarioDrones(string scenarioId); + + // ═══ ScenarioUnit ═══ + void SaveDeployment(string scenarioId, List equips); + ScenarioUnit AddDeploymentUnit(string scenarioId, ScenarioUnit unit); + void UpdateDeploymentUnit(ScenarioUnit unit); + void DeleteDeploymentUnit(string id); + List GetDeploymentUnits(string scenarioId); + + // ═══ Detection ═══ void AddDetection(string scenarioId, ScenarioUnit detection); - /// 删除探测设备 void DeleteDetection(string detectionId); - /// 获取任务的所有探测设备(EquipmentRole.Detection) List GetDetections(string scenarioId); + // ═══ CloudDispersal ═══ void SaveCloudDispersal(string scenarioId, CloudDispersal cloud); + CloudDispersal GetCloudDispersal(string scenarioId); + + // ═══ Route & Waypoint ═══ void SaveRoute(string scenarioId, string waveId, RoutePlan route, List waypoints); + List GetRoutes(string scenarioId); + void DeleteRoute(string id); + List GetWaypoints(string scenarioId); + List GetWaypointsByWave(string scenarioId, string waveId); + void DeleteWaypoint(string id); + + // ═══ Misc ═══ void UpdateStep(string scenarioId, int step); } } diff --git a/src/CounterDrone.Core/Services/ModelService.cs b/src/CounterDrone.Core/Services/ModelService.cs index f1da5b4..af7aaa2 100644 --- a/src/CounterDrone.Core/Services/ModelService.cs +++ b/src/CounterDrone.Core/Services/ModelService.cs @@ -41,6 +41,17 @@ namespace CounterDrone.Core.Services return model; } + public ModelInfo AddModel(ModelInfo model) + { + if (string.IsNullOrWhiteSpace(model.Name)) + throw new ArgumentException("模型名称不能为空"); + if (string.IsNullOrEmpty(model.Id)) + model.Id = Guid.NewGuid().ToString(); + model.CreatedAt = DateTime.UtcNow.ToString("o"); + _repo.Insert(model); + return model; + } + public void DeleteModel(string id) { _repo.Delete(id); @@ -55,5 +66,14 @@ namespace CounterDrone.Core.Services { return _repo.GetById(id); } + + public ModelInfo UpdateModel(ModelInfo model) + { + var existing = _repo.GetById(model.Id); + if (existing == null) + throw new ArgumentException($"模型 {model.Id} 不存在"); + _repo.Update(model); + return model; + } } } diff --git a/src/CounterDrone.Core/Services/ScenarioService.cs b/src/CounterDrone.Core/Services/ScenarioService.cs index d04dea2..165a6a9 100644 --- a/src/CounterDrone.Core/Services/ScenarioService.cs +++ b/src/CounterDrone.Core/Services/ScenarioService.cs @@ -131,7 +131,7 @@ namespace CounterDrone.Core.Services TouchScenario(scenarioId); } - public void SaveScenarioDrone(string scenarioId, ScenarioDrone target) + public ScenarioDrone SaveScenarioDrone(string scenarioId, ScenarioDrone target) { target.ScenarioId = scenarioId; if (string.IsNullOrEmpty(target.Id)) @@ -143,6 +143,7 @@ namespace CounterDrone.Core.Services else _droneRepo.Insert(target); TouchScenario(scenarioId); + return target; } public void SaveDeployment(string scenarioId, List equips) @@ -229,6 +230,99 @@ namespace CounterDrone.Core.Services _scenarioRepo.Update(scenario); } + // ========== Scenario CRUD ========== + + public Scenario UpdateScenario(Scenario scenario) + { + var existing = _scenarioRepo.GetById(scenario.Id); + if (existing == null) + throw new ArgumentException($"想定 {scenario.Id} 不存在"); + scenario.UpdatedAt = DateTime.UtcNow.ToString("o"); + _scenarioRepo.Update(scenario); + return scenario; + } + + // ========== CombatScene ========== + + public CombatScene GetScene(string scenarioId) + { + return _sceneRepo.GetById(scenarioId) ?? new CombatScene { ScenarioId = scenarioId }; + } + + // ========== ControlZone ========== + + public List GetControlZones(string scenarioId) + => _zoneRepo.GetByScenarioId(scenarioId); + + public void DeleteControlZone(string id) + => _zoneRepo.Delete(id); + + // ========== ScenarioDrone ========== + + public ScenarioDrone AddScenarioDrone(string scenarioId, ScenarioDrone drone) + => SaveScenarioDrone(scenarioId, drone); + + public void UpdateScenarioDrone(ScenarioDrone drone) + { + _droneRepo.Update(drone); + TouchScenario(drone.ScenarioId); + } + + public void DeleteScenarioDrone(string id) + => _droneRepo.Delete(id); + + public List GetScenarioDrones(string scenarioId) + => _droneRepo.GetByScenarioId(scenarioId); + + // ========== ScenarioUnit ========== + + public ScenarioUnit AddDeploymentUnit(string scenarioId, ScenarioUnit unit) + { + unit.ScenarioId = scenarioId; + if (string.IsNullOrEmpty(unit.Id)) + unit.Id = Guid.NewGuid().ToString(); + _unitRepo.Insert(unit); + TouchScenario(scenarioId); + return unit; + } + + public void UpdateDeploymentUnit(ScenarioUnit unit) + => _unitRepo.Update(unit); + + public void DeleteDeploymentUnit(string id) + => _unitRepo.Delete(id); + + public List GetDeploymentUnits(string scenarioId) + => _unitRepo.GetByScenarioId(scenarioId); + + // ========== CloudDispersal ========== + + public CloudDispersal GetCloudDispersal(string scenarioId) + => _cloudRepo.GetById(scenarioId) ?? new CloudDispersal { ScenarioId = scenarioId }; + + // ========== Route & Waypoint ========== + + public List GetRoutes(string scenarioId) + => _routeRepo.GetByScenarioId(scenarioId); + + public void DeleteRoute(string id) + { + var r = _routeRepo.GetById(id); + if (r == null) return; + var wps = _waypointRepo.GetByScenarioAndWave(r.ScenarioId, r.WaveId); + foreach (var w in wps) _waypointRepo.Delete(w.Id); + _routeRepo.Delete(id); + } + + public List GetWaypoints(string scenarioId) + => _waypointRepo.GetByScenarioId(scenarioId); + + public List GetWaypointsByWave(string scenarioId, string waveId) + => _waypointRepo.GetByScenarioAndWave(scenarioId, waveId); + + public void DeleteWaypoint(string id) + => _waypointRepo.Delete(id); + // ========== Helpers ========== private void TouchScenario(string scenarioId) diff --git a/src/Unity/Assets/Scripts/Managers/ModelManager.cs b/src/Unity/Assets/Scripts/Managers/ModelManager.cs index de6078d..49fd7c4 100644 --- a/src/Unity/Assets/Scripts/Managers/ModelManager.cs +++ b/src/Unity/Assets/Scripts/Managers/ModelManager.cs @@ -28,9 +28,11 @@ namespace CounterDrone.Unity void OnDisable() { SqliteConnectionTracker.Untrack(_db); _db?.Dispose(); _db = null; } public ModelInfo Import(string filePath, string name) => _service.ImportModel(filePath, name); + public ModelInfo Add(ModelInfo model) => _service.AddModel(model); public void Delete(string id) => _service.DeleteModel(id); public List GetAll() => _service.GetAllModels(); public ModelInfo Get(string id) => _service.GetModel(id); + public ModelInfo Update(ModelInfo model) => _service.UpdateModel(model); [ContextMenu("Verify")] void Verify() diff --git a/src/Unity/Assets/Scripts/Managers/ScenarioManager.cs b/src/Unity/Assets/Scripts/Managers/ScenarioManager.cs index c19eeb4..fed939f 100644 --- a/src/Unity/Assets/Scripts/Managers/ScenarioManager.cs +++ b/src/Unity/Assets/Scripts/Managers/ScenarioManager.cs @@ -47,15 +47,44 @@ namespace CounterDrone.Unity public Scenario CreateScenario(string name, string number) => _service.CreateScenario(name, number); public void DeleteScenario(string id) => _service.DeleteScenario(id); + public Scenario UpdateScenario(Scenario s) => _service.UpdateScenario(s); public ScenarioConfig GetDetail(string id) => _service.GetScenarioDetail(id); - public PagedResult Search(string kw, string from, string to, int page, int size) + public PagedResult Search(string kw, string? from, string? to, int page, int size) => _service.SearchScenarios(kw, from, to, page, size); public void SaveScene(string scenarioId, CombatScene s) => _service.SaveScene(scenarioId, s); - public void SaveScenarioDrone(string scenarioId, ScenarioDrone t) => _service.SaveScenarioDrone(scenarioId, t); + public CombatScene GetScene(string scenarioId) => _service.GetScene(scenarioId); + + public void SaveControlZones(string scenarioId, List z) => _service.SaveControlZones(scenarioId, z); + public List GetControlZones(string scenarioId) => _service.GetControlZones(scenarioId); + public void DeleteControlZone(string id) => _service.DeleteControlZone(id); + + public ScenarioDrone SaveScenarioDrone(string scenarioId, ScenarioDrone d) => _service.SaveScenarioDrone(scenarioId, d); + public ScenarioDrone AddScenarioDrone(string scenarioId, ScenarioDrone d) => _service.AddScenarioDrone(scenarioId, d); + public void UpdateScenarioDrone(ScenarioDrone d) => _service.UpdateScenarioDrone(d); + public void DeleteScenarioDrone(string id) => _service.DeleteScenarioDrone(id); + public List GetScenarioDrones(string scenarioId) => _service.GetScenarioDrones(scenarioId); + public void SaveDeployment(string scenarioId, List e) => _service.SaveDeployment(scenarioId, e); + public ScenarioUnit AddDeploymentUnit(string scenarioId, ScenarioUnit u) => _service.AddDeploymentUnit(scenarioId, u); + public void UpdateDeploymentUnit(ScenarioUnit u) => _service.UpdateDeploymentUnit(u); + public void DeleteDeploymentUnit(string id) => _service.DeleteDeploymentUnit(id); + public List GetDeploymentUnits(string scenarioId) => _service.GetDeploymentUnits(scenarioId); + + public void AddDetection(string scenarioId, ScenarioUnit d) => _service.AddDetection(scenarioId, d); + public void DeleteDetection(string id) => _service.DeleteDetection(id); + public List GetDetections(string scenarioId) => _service.GetDetections(scenarioId); + public void SaveCloud(string scenarioId, CloudDispersal c) => _service.SaveCloudDispersal(scenarioId, c); + public CloudDispersal GetCloud(string scenarioId) => _service.GetCloudDispersal(scenarioId); + public void SaveRoute(string scenarioId, string waveId, RoutePlan r, List w) => _service.SaveRoute(scenarioId, waveId, r, w); + public List GetRoutes(string scenarioId) => _service.GetRoutes(scenarioId); + public void DeleteRoute(string id) => _service.DeleteRoute(id); + public List GetWaypoints(string scenarioId) => _service.GetWaypoints(scenarioId); + public List GetWaypointsByWave(string scenarioId, string waveId) => _service.GetWaypointsByWave(scenarioId, waveId); + public void DeleteWaypoint(string id) => _service.DeleteWaypoint(id); + public void UpdateStep(string scenarioId, int step) => _service.UpdateStep(scenarioId, step); [ContextMenu("Verify")]