Compare commits
5 Commits
d73b586982
...
efdd5ec94f
| Author | SHA1 | Date | |
|---|---|---|---|
| efdd5ec94f | |||
| 1fdffd2a41 | |||
| 178923c007 | |||
| 5e7fd2fb16 | |||
| 225590ac19 |
@ -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>();
|
||||
|
||||
// 基础数据 CRUD(7 类)
|
||||
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 — 仿真执行
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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()
|
||||
{
|
||||
|
||||
Loading…
Reference in New Issue
Block a user