Compare commits

..

5 Commits

Author SHA1 Message Date
efdd5ec94f 对接文档 V1.8:GetEnums API + Manager 完整方法列表 2026-06-18 19:46:53 +08:00
1fdffd2a41 GetEnums API:返回所有枚举定义供前端下拉框使用 2026-06-18 19:46:34 +08:00
178923c007 对接文档同步:完整 CRUD API 列表 2026-06-18 19:44:53 +08:00
5e7fd2fb16 IScenarioService +DeleteCloudDispersal 2026-06-18 19:44:29 +08:00
225590ac19 补全所有模型的完整 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 测试全过
2026-06-18 19:42:48 +08:00
7 changed files with 279 additions and 17 deletions

View File

@ -1,6 +1,6 @@
# 后端对接文档Unity 前端)
> **版本**V1.7
> **版本**V1.8
> **日期**2026-06-18
> **Unity 版本**2022.3.62f3c1
@ -146,15 +146,49 @@ for (int i = 0; i < replay.TotalFrames; i++) {
var mgr = GetComponent<ScenarioManager>();
// 基础数据 CRUD7 类)
mgr.DataService.GetAllAmmo() / SaveAmmo() / DeleteAmmo()
mgr.DataService.GetAllFireUnits() / GetAllDrones() / GetAllSensors()
mgr.DataService.GetAllEnvironments() / GetAllFormations() / GetAllRoutes()
mgr.DataService.GetAllAmmo() / SaveAmmo() / GetAmmo() / DeleteAmmo()
mgr.DataService.GetAllFireUnits() / SaveFireUnit() / GetFireUnit() / DeleteFireUnit()
mgr.DataService.GetAllDrones() / SaveDrone() / GetDrone() / DeleteDrone()
mgr.DataService.GetAllSensors() / SaveSensor() / GetSensor() / DeleteSensor()
mgr.DataService.GetAllEnvironments() / SaveEnvironment() / GetEnvironment() / DeleteEnvironment()
mgr.DataService.GetAllFormations() / SaveFormation() / GetFormation() / DeleteFormation()
mgr.DataService.GetAllRoutes() / SaveRoute() / GetRoute() / DeleteRoute()
// 想定 CRUD
mgr.CreateScenario(name, number) / mgr.DeleteScenario(id)
mgr.Search(kw, from, to, page, size)
mgr.SaveScene / SaveScenarioDrone / SaveDeployment / SaveCloud / SaveRoute / UpdateStep
mgr.GetDetail(id) → ScenarioConfig
mgr.CreateScenario(name, number) / mgr.UpdateScenario(s) / mgr.DeleteScenario(id)
mgr.Search(kw, from, to, page, size) / mgr.GetDetail(id) → ScenarioConfig
// CombatScene
mgr.SaveScene(id, s) / mgr.GetScene(id)
// ControlZone
mgr.SaveControlZones(id, zones) / mgr.GetControlZones(id) / mgr.DeleteControlZone(id)
// ScenarioDrone
mgr.SaveScenarioDrone(id, d) / mgr.AddScenarioDrone(id, d) / mgr.UpdateScenarioDrone(d)
mgr.DeleteScenarioDrone(id) / mgr.GetScenarioDrones(id)
// ScenarioUnit
mgr.SaveDeployment(id, units) / mgr.AddDeploymentUnit(id, u) / mgr.UpdateDeploymentUnit(u)
mgr.DeleteDeploymentUnit(id) / mgr.GetDeploymentUnits(id)
// Detection
mgr.AddDetection(id, d) / mgr.DeleteDetection(id) / mgr.GetDetections(id)
// CloudDispersal
mgr.SaveCloud(id, c) / mgr.GetCloud(id) / mgr.DeleteCloud(id)
// Route & Waypoint
mgr.SaveRoute(id, waveId, r, wps) / mgr.GetRoutes(id) / mgr.DeleteRoute(id)
mgr.GetWaypoints(id) / mgr.GetWaypointsByWave(id, waveId) / mgr.DeleteWaypoint(id)
// Misc
mgr.UpdateStep(id, step)
mgr.GetEnums() → EnumMetadata // 所有枚举定义(下拉框数据源)
// EnumMetadata: DroneType, PowerType, PlatformType, AerosolType,
// WeatherType, WindDirection, SceneType, FormationMode,
// TriggerMode, ReleaseMode, EquipmentRole
// 每个字段是 Dictionary<string,int> (名称→值)
```
### SimulationRunner — 仿真执行

View File

@ -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<ModelInfo> GetAllModels();
ModelInfo GetModel(string id);
ModelInfo UpdateModel(ModelInfo model);
}
}

View File

@ -6,25 +6,74 @@ namespace CounterDrone.Core.Services
/// <summary>想定管理服务</summary>
public interface IScenarioService
{
// ═══ Scenario ═══
Scenario CreateScenario(string name, string scenarioNumber);
void DeleteScenario(string id);
Scenario UpdateScenario(Scenario scenario);
PagedResult<Scenario> 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<ControlZone> zones);
void SaveScenarioDrone(string scenarioId, ScenarioDrone target);
void SaveDeployment(string scenarioId, List<ScenarioUnit> equips);
CombatScene GetScene(string scenarioId);
/// <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);
/// <summary>删除探测设备</summary>
void DeleteDetection(string detectionId);
/// <summary>获取任务的所有探测设备EquipmentRole.Detection</summary>
List<ScenarioUnit> GetDetections(string scenarioId);
// ═══ CloudDispersal ═══
void SaveCloudDispersal(string scenarioId, CloudDispersal cloud);
CloudDispersal GetCloudDispersal(string scenarioId);
void DeleteCloudDispersal(string scenarioId);
// ═══ Route & Waypoint ═══
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);
/// <summary>返回所有枚举定义(供前端下拉框使用)</summary>
EnumMetadata GetEnums();
}
/// <summary>枚举元数据</summary>
public class EnumMetadata
{
public Dictionary<string, int> DroneType { get; set; } = new();
public Dictionary<string, int> PowerType { get; set; } = new();
public Dictionary<string, int> PlatformType { get; set; } = new();
public Dictionary<string, int> AerosolType { get; set; } = new();
public Dictionary<string, int> WeatherType { get; set; } = new();
public Dictionary<string, int> WindDirection { get; set; } = new();
public Dictionary<string, int> SceneType { get; set; } = new();
public Dictionary<string, int> FormationMode { get; set; } = new();
public Dictionary<string, int> TriggerMode { get; set; } = new();
public Dictionary<string, int> ReleaseMode { get; set; } = new();
public Dictionary<string, int> EquipmentRole { get; set; } = new();
}
}

View File

@ -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;
}
}
}

View File

@ -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<ScenarioUnit> equips)
@ -229,6 +230,128 @@ namespace CounterDrone.Core.Services
_scenarioRepo.Update(scenario);
}
public EnumMetadata GetEnums()
{
return new EnumMetadata
{
DroneType = EnumToDict<Models.DroneType>(),
PowerType = EnumToDict<Models.PowerType>(),
PlatformType = EnumToDict<Models.PlatformType>(),
AerosolType = EnumToDict<Models.AerosolType>(),
WeatherType = EnumToDict<Models.WeatherType>(),
WindDirection = EnumToDict<Models.WindDirection>(),
SceneType = EnumToDict<Models.SceneType>(),
FormationMode = EnumToDict<Models.FormationMode>(),
TriggerMode = EnumToDict<Models.TriggerMode>(),
ReleaseMode = EnumToDict<Models.ReleaseMode>(),
EquipmentRole = EnumToDict<Models.EquipmentRole>(),
};
}
private static Dictionary<string, int> EnumToDict<T>() where T : Enum
{
var dict = new Dictionary<string, int>();
foreach (T v in Enum.GetValues(typeof(T)))
dict[v.ToString()] = Convert.ToInt32(v);
return dict;
}
// ========== 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 };
public void DeleteCloudDispersal(string scenarioId)
=> _cloudRepo.Delete(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 ==========
private void TouchScenario(string scenarioId)

View File

@ -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<ModelInfo> GetAll() => _service.GetAllModels();
public ModelInfo Get(string id) => _service.GetModel(id);
public ModelInfo Update(ModelInfo model) => _service.UpdateModel(model);
[ContextMenu("Verify")]
void Verify()

View File

@ -47,17 +47,49 @@ 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<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);
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 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 CloudDispersal GetCloud(string scenarioId) => _service.GetCloudDispersal(scenarioId);
public void DeleteCloud(string scenarioId) => _service.DeleteCloudDispersal(scenarioId);
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 EnumMetadata GetEnums() => _service.GetEnums();
[ContextMenu("Verify")]
void Verify()
{