package com.ard.qs.controller; import com.ard.common.core.web.controller.BaseController; import com.ard.common.core.web.domain.AjaxResult; import com.ard.common.core.web.page.TableDataInfo; import com.ard.common.log.annotation.Log; import com.ard.common.log.enums.BusinessType; import com.ard.common.security.annotation.RequiresPermissions; import com.ard.common.security.utils.SecurityUtils; import com.ard.qs.api.domain.QsDevice; import com.ard.qs.domain.*; import com.ard.qs.service.IQsDeviceService; import com.ard.qs.utils.VideoSnapshotUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.*; import java.util.List; /** * 视频监控设备Controller * * @author fengcheng * @date 2026-03-27 */ @Slf4j @Tag(name = "视频监控设备") @RestController @RequestMapping("/device") public class QsDeviceController extends BaseController { @Autowired private IQsDeviceService qsDeviceService; /** * 查询视频监控设备列表 */ @Operation(summary = "查询视频监控设备列表") @GetMapping("/list") public TableDataInfo list(QsDevice qsDevice) { startPage(); List list = qsDeviceService.selectQsDeviceList(qsDevice); return getDataTable(list); } /** * 根据行政区域获取视频监控设备列表 */ @Operation(summary = "根据行政区域获取视频监控设备列表") @GetMapping("/queryListByCivilCode") public TableDataInfo queryListByCivilCode(QsDevice qsDevice) { startPage(); List list = qsDeviceService.queryListByCivilCode(qsDevice); return getDataTable(list); } /** * 获取视频监控设备详细信息 */ @Operation(summary = "获取视频监控设备详细信息") @GetMapping(value = "/{id}") public AjaxResult getInfo(@PathVariable("id") Long id) { return success(qsDeviceService.selectQsDeviceById(id)); } /** * 新增视频监控设备 */ @Operation(summary = "新增视频监控设备") @Log(title = "视频监控设备", businessType = BusinessType.INSERT) @PostMapping public AjaxResult add(@RequestBody QsDevice qsDevice) { return toAjax(qsDeviceService.insertQsDevice(qsDevice)); } /** * 修改视频监控设备 */ @Operation(summary = "修改视频监控设备") @Log(title = "视频监控设备", businessType = BusinessType.UPDATE) @PutMapping public AjaxResult edit(@RequestBody QsDevice qsDevice) { return toAjax(qsDeviceService.updateQsDevice(qsDevice)); } /** * 删除视频监控设备 */ @Operation(summary = "删除视频监控设备") @Log(title = "视频监控设备", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public AjaxResult remove(@PathVariable Long[] ids) { return toAjax(qsDeviceService.deleteQsDeviceByIds(ids)); } /** * 状态修改 */ @Operation(summary = "状态修改") @Log(title = "视频监控设备", businessType = BusinessType.UPDATE) @PutMapping("/changeStatus") public AjaxResult changeStatus(@RequestBody QsDevice qsDevice) { qsDevice.setUpdateBy(SecurityUtils.getUsername()); return toAjax(qsDeviceService.updateQsDeviceStatus(qsDevice)); } /** * 获取计划记录对应的视频监控设备 */ @GetMapping("/listPlanRecord") public TableDataInfo listPlanRecordQsDevice(QsDevice qsDevice) { startPage(); List list = qsDeviceService.listPlanRecordQsDevice(qsDevice); return getDataTable(list); } /** * 设备关联录制计划 * * @param param * @return */ @PostMapping("/link") public AjaxResult link(@RequestBody RecordPlanParam param) { if (param.getAllLink() != null) { if (param.getAllLink()) { qsDeviceService.linkAll(param.getPlanId()); } else { qsDeviceService.cleanAll(param.getPlanId()); } return success(); } if (param.getDeviceIds() == null) { throw new RuntimeException("设备ID不可都为NULL"); } qsDeviceService.link(param.getDeviceIds(), param.getPlanId()); return success(); } /** * 设备设置行政区划 * * @param param */ @Operation(summary = "设备设置行政区划") @PostMapping("/region/add") public AjaxResult addChannelToRegion(@RequestBody DeviceToRegionParam param) { Assert.notEmpty(param.getDeviceIds(), "设备ID不可为空"); Assert.hasLength(param.getCivilCode(), "未添加行政区划"); qsDeviceService.addDeviceToRegion(param.getCivilCode(), param.getDeviceIds()); return success(); } /** * 设备删除行政区划 * * @param param */ @Operation(summary = "设备删除行政区划") @PostMapping("/region/delete") public AjaxResult deleteDeviceToRegion(@RequestBody DeviceToRegionParam param) { Assert.isTrue(!param.getDeviceIds().isEmpty() || !ObjectUtils.isEmpty(param.getCivilCode()), "参数异常"); qsDeviceService.deleteDeviceToRegion(param.getCivilCode(), param.getDeviceIds()); return success(); } /** * 存在行政区划但无法挂载的设备列表 */ @Operation(summary = "存在行政区划但无法挂载的设备列表") @GetMapping("/civilCode/unusual/list") public TableDataInfo queryListByCivilCodeForUnusual(QsDevice qsDevice) { startPage(); List list = qsDeviceService.queryListByCivilCodeForUnusual(qsDevice); return getDataTable(list); } /** * 清除存在行政区划但无法挂载的设备列表 * * @param param */ @Operation(summary = "清除存在行政区划但无法挂载的设备列表") @PostMapping("/civilCode/unusual/clear") public AjaxResult clearDeviceCivilCode(@RequestBody DeviceToRegionParam param) { qsDeviceService.clearDeviceCivilCode(param.getAll(), param.getDeviceIds()); return success(); } /** * 获取编码列表 * * @return */ @Operation(summary = "获取编码列表") @GetMapping("/network/identification/list") public AjaxResult getNetworkIdentificationTypeList() { List list = qsDeviceService.getNetworkIdentificationTypeList(); return success(list); } /** * 获取编码列表 * * @return */ @Operation(summary = "获取编码列表") @GetMapping("/type/list") public AjaxResult getDeviceTypeList() { List list = qsDeviceService.getDeviceTypeList(); return success(list); } /** * 获取行业编码列表 * * @return */ @GetMapping("/industry/list") public AjaxResult getIndustryCodeList() { List list = qsDeviceService.getIndustryCodeList(); return success(list); } /** * 获取关联业务分组设备列表 */ @GetMapping("/parent/list") public TableDataInfo queryListByParentId(QsDevice qsDevice) { startPage(); List list = qsDeviceService.queryListByParentId(qsDevice); return getDataTable(list); } /** * 设备设置业务分组 * * @param param */ @PostMapping("/group/add") public AjaxResult addChannelToGroup(@RequestBody DeviceToGroupParam param) { Assert.notEmpty(param.getDeviceIds(), "设备ID不可为空"); Assert.hasLength(param.getParentId(), "未添加上级分组编号"); Assert.hasLength(param.getBusinessGroup(), "未添加业务分组"); qsDeviceService.addChannelToGroup(param.getParentId(), param.getBusinessGroup(), param.getDeviceIds()); return success(); } /** * 删除业务分组设备 * * @param param */ @PostMapping("/group/delete") public AjaxResult deleteDeviceToGroup(@RequestBody DeviceToGroupParam param) { Assert.isTrue(!param.getDeviceIds().isEmpty() || (!ObjectUtils.isEmpty(param.getParentId()) && !ObjectUtils.isEmpty(param.getBusinessGroup())), "参数异常"); qsDeviceService.deleteDeviceToGroup(param.getParentId(), param.getBusinessGroup(), param.getDeviceIds()); return success(); } /** * 存在父节点编号但无法挂载的设备列表 */ @GetMapping("/parent/unusual/list") public TableDataInfo queryListByParentForUnusual(QsDevice qsDevice) { startPage(); List list = qsDeviceService.queryListByParentForUnusual(qsDevice); return getDataTable(list); } /** * 清除存在分组节点但无法挂载的设备列表 * * @param param */ @PostMapping("/parent/unusual/clear") public AjaxResult clearDeviceParent(@RequestBody DeviceToGroupParam param) { qsDeviceService.clearDeviceParent(param.getAll(), param.getDeviceIds()); return success(); } /** * 获取本地mp4截图 */ @RequiresPermissions("qs:device:edit") @Log(title = "视频监控设备", businessType = BusinessType.UPDATE) @PutMapping("/getVideoSnapshot/{id}") public AjaxResult getVideoSnapshot(@PathVariable("id") Long id) { return success(); } /** * 开始云台控制 * * @param id 设备id * @param direction 方向 * @param controlSpeed 控制速度 * @return 结果 */ @Log(title = "云台控制", businessType = BusinessType.OTHER) @GetMapping("/startPtz/{id}") public AjaxResult startPtz(@PathVariable Long id, @RequestParam String direction, @RequestParam Integer controlSpeed) { qsDeviceService.startPtz(id, direction, controlSpeed); return AjaxResult.success(); } /** * 结束云台控制 * * @param id 设备id * @param direction 方向 * @param controlSpeed 控制速度 * @return 结果 */ @Log(title = "云台控制", businessType = BusinessType.OTHER) @GetMapping("/endPtz/{id}") public AjaxResult endPtz(@PathVariable Long id, @RequestParam String direction, @RequestParam Integer controlSpeed) { qsDeviceService.endPtz(id, direction, controlSpeed); return AjaxResult.success(); } /** * 获取预置点列表 * * @param id 设备id * @param channelId 通道id * @return 预置点列表 */ @Log(title = "预置点控制", businessType = BusinessType.OTHER) @GetMapping("/preset/list/{id}") public AjaxResult getPresetList(@PathVariable Long id, @RequestParam(required = false) Integer channelId) { List presetList = qsDeviceService.getPresetList(id, channelId); return AjaxResult.success(presetList); } /** * 设置预置点 * * @param id 设备id * @param channelId 通道id * @param presetIndex 预置点索引 * @param presetName 预置点名称 * @return 结果 */ @Log(title = "预置点控制", businessType = BusinessType.OTHER) @GetMapping("/preset/set/{id}") public AjaxResult setPreset(@PathVariable Long id, @RequestParam(required = false) Integer channelId, @RequestParam Integer presetIndex, @RequestParam(required = false) String presetName) { qsDeviceService.setPreset(id, channelId, presetIndex, presetName); return AjaxResult.success(); } /** * 调用预置点 * * @param id 设备id * @param channelId 通道id * @param presetIndex 预置点索引 * @param speed 速度 * @return 结果 */ @Log(title = "预置点控制", businessType = BusinessType.OTHER) @GetMapping("/preset/goto/{id}") public AjaxResult gotoPreset(@PathVariable Long id, @RequestParam(required = false) Integer channelId, @RequestParam Integer presetIndex, @RequestParam(required = false) Integer speed) { qsDeviceService.gotoPreset(id, channelId, presetIndex, speed); return AjaxResult.success(); } /** * 删除预置点 * * @param id 设备id * @param channelId 通道id * @param presetIndex 预置点索引 * @return 结果 */ @Log(title = "预置点控制", businessType = BusinessType.OTHER) @GetMapping("/preset/delete/{id}") public AjaxResult deletePreset(@PathVariable Long id, @RequestParam(required = false) Integer channelId, @RequestParam Integer presetIndex) { qsDeviceService.deletePreset(id, channelId, presetIndex); return AjaxResult.success(); } }