补全所有模型的完整 CRUD 接口

- ModelService: +AddModel/UpdateModel
- IScenarioService: +UpdateScenario +GetScene +Get/DeleteControlZone
  +Add/Update/Delete/GetScenarioDrones +Add/Update/Delete/GetDeploymentUnits
  +GetCloudDispersal +GetRoutes/DeleteRoute +GetWaypoints/GetWaypointsByWave/DeleteWaypoint
- ScenarioManager 全面暴露新增接口
- 238 测试全过
This commit is contained in:
tian 2026-06-18 19:42:48 +08:00
parent d73b586982
commit 225590ac19
6 changed files with 185 additions and 9 deletions

View File

@ -7,8 +7,10 @@ namespace CounterDrone.Core.Services
public interface IModelService public interface IModelService
{ {
ModelInfo ImportModel(string filePath, string name); ModelInfo ImportModel(string filePath, string name);
ModelInfo AddModel(ModelInfo model);
void DeleteModel(string id); void DeleteModel(string id);
List<ModelInfo> GetAllModels(); List<ModelInfo> GetAllModels();
ModelInfo GetModel(string id); ModelInfo GetModel(string id);
ModelInfo UpdateModel(ModelInfo model);
} }
} }

View File

@ -6,25 +6,54 @@ namespace CounterDrone.Core.Services
/// <summary>想定管理服务</summary> /// <summary>想定管理服务</summary>
public interface IScenarioService public interface IScenarioService
{ {
// ═══ Scenario ═══
Scenario CreateScenario(string name, string scenarioNumber); Scenario CreateScenario(string name, string scenarioNumber);
void DeleteScenario(string id); void DeleteScenario(string id);
Scenario UpdateScenario(Scenario scenario);
PagedResult<Scenario> SearchScenarios(string keyword, string? dateFrom, string? dateTo, int page, int pageSize); PagedResult<Scenario> SearchScenarios(string keyword, string? dateFrom, string? dateTo, int page, int pageSize);
ScenarioConfig? GetScenarioDetail(string id); ScenarioConfig? GetScenarioDetail(string id);
// ═══ CombatScene ═══
void SaveScene(string scenarioId, CombatScene scene); void SaveScene(string scenarioId, CombatScene scene);
void SaveControlZones(string scenarioId, List<ControlZone> zones); CombatScene GetScene(string scenarioId);
void SaveScenarioDrone(string scenarioId, ScenarioDrone target);
void SaveDeployment(string scenarioId, List<ScenarioUnit> equips);
/// <summary>添加单个探测设备(独立于 SaveDeployment不覆盖火力单元</summary> // ═══ ControlZone ═══
void SaveControlZones(string scenarioId, List<ControlZone> zones);
List<ControlZone> 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<ScenarioDrone> GetScenarioDrones(string scenarioId);
// ═══ ScenarioUnit ═══
void SaveDeployment(string scenarioId, List<ScenarioUnit> equips);
ScenarioUnit AddDeploymentUnit(string scenarioId, ScenarioUnit unit);
void UpdateDeploymentUnit(ScenarioUnit unit);
void DeleteDeploymentUnit(string id);
List<ScenarioUnit> GetDeploymentUnits(string scenarioId);
// ═══ Detection ═══
void AddDetection(string scenarioId, ScenarioUnit detection); void AddDetection(string scenarioId, ScenarioUnit detection);
/// <summary>删除探测设备</summary>
void DeleteDetection(string detectionId); void DeleteDetection(string detectionId);
/// <summary>获取任务的所有探测设备EquipmentRole.Detection</summary>
List<ScenarioUnit> GetDetections(string scenarioId); List<ScenarioUnit> GetDetections(string scenarioId);
// ═══ CloudDispersal ═══
void SaveCloudDispersal(string scenarioId, CloudDispersal cloud); void SaveCloudDispersal(string scenarioId, CloudDispersal cloud);
CloudDispersal GetCloudDispersal(string scenarioId);
// ═══ Route & Waypoint ═══
void SaveRoute(string scenarioId, string waveId, RoutePlan route, List<Waypoint> waypoints); void SaveRoute(string scenarioId, string waveId, RoutePlan route, List<Waypoint> waypoints);
List<RoutePlan> GetRoutes(string scenarioId);
void DeleteRoute(string id);
List<Waypoint> GetWaypoints(string scenarioId);
List<Waypoint> GetWaypointsByWave(string scenarioId, string waveId);
void DeleteWaypoint(string id);
// ═══ Misc ═══
void UpdateStep(string scenarioId, int step); void UpdateStep(string scenarioId, int step);
} }
} }

View File

@ -41,6 +41,17 @@ namespace CounterDrone.Core.Services
return model; 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) public void DeleteModel(string id)
{ {
_repo.Delete(id); _repo.Delete(id);
@ -55,5 +66,14 @@ namespace CounterDrone.Core.Services
{ {
return _repo.GetById(id); 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;
}
} }
} }

View File

@ -131,7 +131,7 @@ namespace CounterDrone.Core.Services
TouchScenario(scenarioId); TouchScenario(scenarioId);
} }
public void SaveScenarioDrone(string scenarioId, ScenarioDrone target) public ScenarioDrone SaveScenarioDrone(string scenarioId, ScenarioDrone target)
{ {
target.ScenarioId = scenarioId; target.ScenarioId = scenarioId;
if (string.IsNullOrEmpty(target.Id)) if (string.IsNullOrEmpty(target.Id))
@ -143,6 +143,7 @@ namespace CounterDrone.Core.Services
else else
_droneRepo.Insert(target); _droneRepo.Insert(target);
TouchScenario(scenarioId); TouchScenario(scenarioId);
return target;
} }
public void SaveDeployment(string scenarioId, List<ScenarioUnit> equips) public void SaveDeployment(string scenarioId, List<ScenarioUnit> equips)
@ -229,6 +230,99 @@ namespace CounterDrone.Core.Services
_scenarioRepo.Update(scenario); _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<ControlZone> 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<ScenarioDrone> 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<ScenarioUnit> GetDeploymentUnits(string scenarioId)
=> _unitRepo.GetByScenarioId(scenarioId);
// ========== CloudDispersal ==========
public CloudDispersal GetCloudDispersal(string scenarioId)
=> _cloudRepo.GetById(scenarioId) ?? new CloudDispersal { ScenarioId = scenarioId };
// ========== Route & Waypoint ==========
public List<RoutePlan> 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<Waypoint> GetWaypoints(string scenarioId)
=> _waypointRepo.GetByScenarioId(scenarioId);
public List<Waypoint> GetWaypointsByWave(string scenarioId, string waveId)
=> _waypointRepo.GetByScenarioAndWave(scenarioId, waveId);
public void DeleteWaypoint(string id)
=> _waypointRepo.Delete(id);
// ========== Helpers ========== // ========== Helpers ==========
private void TouchScenario(string scenarioId) private void TouchScenario(string scenarioId)

View File

@ -28,9 +28,11 @@ namespace CounterDrone.Unity
void OnDisable() { SqliteConnectionTracker.Untrack(_db); _db?.Dispose(); _db = null; } void OnDisable() { SqliteConnectionTracker.Untrack(_db); _db?.Dispose(); _db = null; }
public ModelInfo Import(string filePath, string name) => _service.ImportModel(filePath, name); 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 void Delete(string id) => _service.DeleteModel(id);
public List<ModelInfo> GetAll() => _service.GetAllModels(); public List<ModelInfo> GetAll() => _service.GetAllModels();
public ModelInfo Get(string id) => _service.GetModel(id); public ModelInfo Get(string id) => _service.GetModel(id);
public ModelInfo Update(ModelInfo model) => _service.UpdateModel(model);
[ContextMenu("Verify")] [ContextMenu("Verify")]
void Verify() void Verify()

View File

@ -47,15 +47,44 @@ namespace CounterDrone.Unity
public Scenario CreateScenario(string name, string number) => _service.CreateScenario(name, number); public Scenario CreateScenario(string name, string number) => _service.CreateScenario(name, number);
public void DeleteScenario(string id) => _service.DeleteScenario(id); 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 ScenarioConfig GetDetail(string id) => _service.GetScenarioDetail(id);
public PagedResult<Scenario> Search(string kw, string from, string to, int page, int size) public PagedResult<Scenario> Search(string kw, string? from, string? to, int page, int size)
=> _service.SearchScenarios(kw, from, to, page, size); => _service.SearchScenarios(kw, from, to, page, size);
public void SaveScene(string scenarioId, CombatScene s) => _service.SaveScene(scenarioId, s); 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<ControlZone> z) => _service.SaveControlZones(scenarioId, z);
public List<ControlZone> 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<ScenarioDrone> GetScenarioDrones(string scenarioId) => _service.GetScenarioDrones(scenarioId);
public void SaveDeployment(string scenarioId, List<ScenarioUnit> e) => _service.SaveDeployment(scenarioId, e); public void SaveDeployment(string scenarioId, List<ScenarioUnit> 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<ScenarioUnit> 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<ScenarioUnit> GetDetections(string scenarioId) => _service.GetDetections(scenarioId);
public void SaveCloud(string scenarioId, CloudDispersal c) => _service.SaveCloudDispersal(scenarioId, c); 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<Waypoint> w) => _service.SaveRoute(scenarioId, waveId, r, w); public void SaveRoute(string scenarioId, string waveId, RoutePlan r, List<Waypoint> w) => _service.SaveRoute(scenarioId, waveId, r, w);
public List<RoutePlan> GetRoutes(string scenarioId) => _service.GetRoutes(scenarioId);
public void DeleteRoute(string id) => _service.DeleteRoute(id);
public List<Waypoint> GetWaypoints(string scenarioId) => _service.GetWaypoints(scenarioId);
public List<Waypoint> 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); public void UpdateStep(string scenarioId, int step) => _service.UpdateStep(scenarioId, step);
[ContextMenu("Verify")] [ContextMenu("Verify")]