package com.ruoyi.web.controller.device;
|
|
import org.springframework.core.io.ClassPathResource;
|
import org.springframework.core.io.Resource;
|
import org.springframework.http.HttpStatus;
|
import org.springframework.http.MediaType;
|
import org.springframework.web.bind.annotation.DeleteMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.PathVariable;
|
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PutMapping;
|
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.server.ResponseStatusException;
|
import com.ruoyi.common.annotation.Anonymous;
|
import com.ruoyi.device.bts.BtsDevelopmentSimulator;
|
import com.ruoyi.device.bts.BtsDevelopmentSimulator.StateSnapshot;
|
import com.ruoyi.device.model.DeviceWorkStatus;
|
|
/** 本机临时 BTS 模拟器控制 API。 */
|
@Anonymous
|
@RestController
|
public class BtsDevelopmentSimulatorController
|
{
|
private final BtsDevelopmentSimulator simulator;
|
|
public BtsDevelopmentSimulatorController(BtsDevelopmentSimulator simulator)
|
{
|
this.simulator = simulator;
|
}
|
|
/** 返回临时控制页;匿名放行后仍由本机拦截器限制来源。 */
|
@GetMapping(value = "/dev/bts-simulator.html", produces = MediaType.TEXT_HTML_VALUE)
|
public Resource page()
|
{
|
return new ClassPathResource("static/dev/bts-simulator.html");
|
}
|
|
/** 返回模拟器、虚拟设备、通道和最近请求的当前快照。 */
|
@GetMapping("/dev/bts-simulator/state")
|
public StateSnapshot state()
|
{
|
return simulator.snapshot();
|
}
|
|
/** 添加一台虚拟设备。 */
|
@PostMapping("/dev/bts-simulator/devices")
|
public StateSnapshot createDevice(@RequestBody CreateDeviceCommand command)
|
{
|
try
|
{
|
simulator.addDevice(command.ip(), command.channelCount());
|
return simulator.snapshot();
|
}
|
catch (IllegalArgumentException exception)
|
{
|
throw badRequest(exception);
|
}
|
}
|
|
/** 修改指定虚拟设备的地址、通道数和在线状态。 */
|
@PutMapping("/dev/bts-simulator/devices/{deviceId}")
|
public StateSnapshot updateDevice(@PathVariable int deviceId, @RequestBody DeviceStateCommand command)
|
{
|
try
|
{
|
simulator.updateDevice(deviceId, command.ip(), command.channelCount(), command.online());
|
return simulator.snapshot();
|
}
|
catch (IllegalArgumentException exception)
|
{
|
throw badRequest(exception);
|
}
|
}
|
|
/** 删除指定虚拟设备。 */
|
@DeleteMapping("/dev/bts-simulator/devices/{deviceId}")
|
public StateSnapshot deleteDevice(@PathVariable int deviceId)
|
{
|
try
|
{
|
simulator.deleteDevice(deviceId);
|
return simulator.snapshot();
|
}
|
catch (IllegalArgumentException exception)
|
{
|
throw badRequest(exception);
|
}
|
}
|
|
/** 修改指定虚拟设备通道的在线和工作状态。 */
|
@PutMapping("/dev/bts-simulator/devices/{deviceId}/channels/{channelId}")
|
public StateSnapshot updateChannel(@PathVariable int deviceId, @PathVariable int channelId,
|
@RequestBody ChannelStateCommand command)
|
{
|
try
|
{
|
simulator.updateChannel(deviceId, channelId, command.online(), command.workStatus());
|
return simulator.snapshot();
|
}
|
catch (IllegalArgumentException exception)
|
{
|
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, exception.getMessage(), exception);
|
}
|
}
|
|
private ResponseStatusException badRequest(IllegalArgumentException exception)
|
{
|
return new ResponseStatusException(HttpStatus.BAD_REQUEST, exception.getMessage(), exception);
|
}
|
|
public record CreateDeviceCommand(String ip, int channelCount) { }
|
|
public record DeviceStateCommand(String ip, int channelCount, boolean online) { }
|
|
public record ChannelStateCommand(boolean online, DeviceWorkStatus workStatus) { }
|
}
|