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) { } }