diff --git a/casic_video_283_server/pom.xml b/casic_video_283_server/pom.xml index 353504b..7edf41f 100644 --- a/casic_video_283_server/pom.xml +++ b/casic_video_283_server/pom.xml @@ -63,6 +63,10 @@ knife4j-spring-boot-starter ${knife4j.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic_video_283_server/pom.xml b/casic_video_283_server/pom.xml index 353504b..7edf41f 100644 --- a/casic_video_283_server/pom.xml +++ b/casic_video_283_server/pom.xml @@ -63,6 +63,10 @@ knife4j-spring-boot-starter ${knife4j.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java index 1795cf1..fa6b41e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java @@ -1,9 +1,24 @@ package com.casic.missiles.modular.system.controller; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IAlarmService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ResponseBody; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; /** *

@@ -13,8 +28,42 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "报警管理接口") @Controller -@RequestMapping("/system/alarm") -public class AlarmController { +@RequestMapping("/alarm") +@RequiredArgsConstructor +public class AlarmController extends BaseController { + private final IAlarmService alarmService; + + @ApiOperation("报警分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "alarmLocation", value = "报警位置",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmType", value = "报警类型",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmStartTime", value = "报警开始时间",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmEndTime", value = "报警结束时间",dataType = "String", paramType = "query") + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String alarmLocation,String alarmType,String alarmStartTime,String alarmEndTime){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(alarmLocation)){ + queryWrapper.like("alarm.ALARM_LOCATION",alarmLocation); + } + if(StrUtil.isNotEmpty(alarmType)){ + queryWrapper.eq("alarm.ALARM_TYPE",alarmType); + } + if(StrUtil.isNotEmpty(alarmStartTime)){ + queryWrapper.ge("alarm.ALARM_TIME",alarmStartTime); + } + if(StrUtil.isNotEmpty(alarmEndTime)){ + queryWrapper.le("alarm.ALARM_TIME",alarmEndTime); + } + page = alarmService.listPage(page,queryWrapper); + return ResponseData.success(super.packForBT(page)); + } } diff --git a/casic_video_283_server/pom.xml b/casic_video_283_server/pom.xml index 353504b..7edf41f 100644 --- a/casic_video_283_server/pom.xml +++ b/casic_video_283_server/pom.xml @@ -63,6 +63,10 @@ knife4j-spring-boot-starter ${knife4j.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java index 1795cf1..fa6b41e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java @@ -1,9 +1,24 @@ package com.casic.missiles.modular.system.controller; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IAlarmService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ResponseBody; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; /** *

@@ -13,8 +28,42 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "报警管理接口") @Controller -@RequestMapping("/system/alarm") -public class AlarmController { +@RequestMapping("/alarm") +@RequiredArgsConstructor +public class AlarmController extends BaseController { + private final IAlarmService alarmService; + + @ApiOperation("报警分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "alarmLocation", value = "报警位置",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmType", value = "报警类型",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmStartTime", value = "报警开始时间",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmEndTime", value = "报警结束时间",dataType = "String", paramType = "query") + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String alarmLocation,String alarmType,String alarmStartTime,String alarmEndTime){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(alarmLocation)){ + queryWrapper.like("alarm.ALARM_LOCATION",alarmLocation); + } + if(StrUtil.isNotEmpty(alarmType)){ + queryWrapper.eq("alarm.ALARM_TYPE",alarmType); + } + if(StrUtil.isNotEmpty(alarmStartTime)){ + queryWrapper.ge("alarm.ALARM_TIME",alarmStartTime); + } + if(StrUtil.isNotEmpty(alarmEndTime)){ + queryWrapper.le("alarm.ALARM_TIME",alarmEndTime); + } + page = alarmService.listPage(page,queryWrapper); + return ResponseData.success(super.packForBT(page)); + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java index aa50d78..4a9243e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java @@ -1,10 +1,25 @@ package com.casic.missiles.modular.system.controller; -import org.springframework.web.bind.annotation.RequestMapping; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IDeviceService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; import org.springframework.stereotype.Controller; +import java.util.List; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; + /** *

* 设备记录表 前端控制器 @@ -13,8 +28,92 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "设备管理接口") @Controller -@RequestMapping("/system/device") -public class DeviceController { +@RequestMapping("/device") +@RequiredArgsConstructor +public class DeviceController extends BaseController { + + private final IDeviceService deviceService; + private final AbstractDictService dictService; + + @ApiOperation("新增设备") + @PostMapping("add") + @ResponseBody + public Object add(@RequestBody Device device){ + deviceService.save(device); + return ResponseData.success(); + } + + @ApiOperation("编辑设备") + @PostMapping("update") + @ResponseBody + public Object update(@RequestBody Device device){ + deviceService.updateById(device); + return ResponseData.success(); + } + + @ApiOperation("删除设备") + @PostMapping("delete") + @ResponseBody + public Object delete(@ApiParam(value = "设备id",example = "0")@RequestParam Long deviceId){ + deviceService.removeById(deviceId); + return ResponseData.success(); + } + + + @ApiOperation("设备分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String deviceName){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + page = deviceService.page(page,queryWrapper); + wrapperDevice(page.getRecords()); + return ResponseData.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "location", value = "设备位置",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("list") + @ResponseBody + public Object list(String deviceName,String location){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + if(StrUtil.isNotEmpty(location)){ + queryWrapper.like("LOCATION",location); + } + List deviceList = deviceService.list(queryWrapper); + wrapperDevice(deviceList); + return ResponseData.success(deviceList); + } + + private void wrapperDevice(List page) { + for (Device device : page) { + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setStatusName(dictService.getDictNameByCode("deviceStatus", device.getStatus())); + } + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setConnectTypeName(dictService.getDictNameByCode("connectType", device.getConnectType())); + } + } + } } diff --git a/casic_video_283_server/pom.xml b/casic_video_283_server/pom.xml index 353504b..7edf41f 100644 --- a/casic_video_283_server/pom.xml +++ b/casic_video_283_server/pom.xml @@ -63,6 +63,10 @@ knife4j-spring-boot-starter ${knife4j.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java index 1795cf1..fa6b41e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java @@ -1,9 +1,24 @@ package com.casic.missiles.modular.system.controller; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IAlarmService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ResponseBody; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; /** *

@@ -13,8 +28,42 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "报警管理接口") @Controller -@RequestMapping("/system/alarm") -public class AlarmController { +@RequestMapping("/alarm") +@RequiredArgsConstructor +public class AlarmController extends BaseController { + private final IAlarmService alarmService; + + @ApiOperation("报警分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "alarmLocation", value = "报警位置",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmType", value = "报警类型",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmStartTime", value = "报警开始时间",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmEndTime", value = "报警结束时间",dataType = "String", paramType = "query") + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String alarmLocation,String alarmType,String alarmStartTime,String alarmEndTime){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(alarmLocation)){ + queryWrapper.like("alarm.ALARM_LOCATION",alarmLocation); + } + if(StrUtil.isNotEmpty(alarmType)){ + queryWrapper.eq("alarm.ALARM_TYPE",alarmType); + } + if(StrUtil.isNotEmpty(alarmStartTime)){ + queryWrapper.ge("alarm.ALARM_TIME",alarmStartTime); + } + if(StrUtil.isNotEmpty(alarmEndTime)){ + queryWrapper.le("alarm.ALARM_TIME",alarmEndTime); + } + page = alarmService.listPage(page,queryWrapper); + return ResponseData.success(super.packForBT(page)); + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java index aa50d78..4a9243e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java @@ -1,10 +1,25 @@ package com.casic.missiles.modular.system.controller; -import org.springframework.web.bind.annotation.RequestMapping; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IDeviceService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; import org.springframework.stereotype.Controller; +import java.util.List; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; + /** *

* 设备记录表 前端控制器 @@ -13,8 +28,92 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "设备管理接口") @Controller -@RequestMapping("/system/device") -public class DeviceController { +@RequestMapping("/device") +@RequiredArgsConstructor +public class DeviceController extends BaseController { + + private final IDeviceService deviceService; + private final AbstractDictService dictService; + + @ApiOperation("新增设备") + @PostMapping("add") + @ResponseBody + public Object add(@RequestBody Device device){ + deviceService.save(device); + return ResponseData.success(); + } + + @ApiOperation("编辑设备") + @PostMapping("update") + @ResponseBody + public Object update(@RequestBody Device device){ + deviceService.updateById(device); + return ResponseData.success(); + } + + @ApiOperation("删除设备") + @PostMapping("delete") + @ResponseBody + public Object delete(@ApiParam(value = "设备id",example = "0")@RequestParam Long deviceId){ + deviceService.removeById(deviceId); + return ResponseData.success(); + } + + + @ApiOperation("设备分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String deviceName){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + page = deviceService.page(page,queryWrapper); + wrapperDevice(page.getRecords()); + return ResponseData.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "location", value = "设备位置",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("list") + @ResponseBody + public Object list(String deviceName,String location){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + if(StrUtil.isNotEmpty(location)){ + queryWrapper.like("LOCATION",location); + } + List deviceList = deviceService.list(queryWrapper); + wrapperDevice(deviceList); + return ResponseData.success(deviceList); + } + + private void wrapperDevice(List page) { + for (Device device : page) { + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setStatusName(dictService.getDictNameByCode("deviceStatus", device.getStatus())); + } + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setConnectTypeName(dictService.getDictNameByCode("connectType", device.getConnectType())); + } + } + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java new file mode 100644 index 0000000..f2fc224 --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.controller; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.dto.AlarmUpload; +import com.casic.missiles.modular.system.dto.PeopleUpload; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.service.IAlarmService; +import com.casic.missiles.modular.system.websocket.WebSocket; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.Date; + +@Api(tags = "数据上报接口") +@Controller +@RequestMapping("/upload") +@RequiredArgsConstructor +public class UploadController { + + private final IAlarmService alarmService; + private final WebSocket webSocket; + + @ApiOperation("报警上报") + @PostMapping("alarm") + @ResponseBody + public Object alarmUpload(@RequestBody AlarmUpload alarmUpload){ + if(StrUtil.isEmpty(alarmUpload.getAlarmTime())){ + alarmUpload.setAlarmTime(DateUtil.formatDateTime(new Date())); + } + Alarm alarm = alarmService.alarmUpload(alarmUpload); + webSocket.sendAllMessage(JSONObject.toJSONString(alarmUpload)); + return ResponseData.success(); + } + + @ApiOperation("工作台人数上报") + @PostMapping("people") + @ResponseBody + public Object peopleUpload(@RequestBody PeopleUpload peopleUpload){ + webSocket.sendAllMessage(JSONObject.toJSONString(peopleUpload)); + return ResponseData.success(); + } +} diff --git a/casic_video_283_server/pom.xml b/casic_video_283_server/pom.xml index 353504b..7edf41f 100644 --- a/casic_video_283_server/pom.xml +++ b/casic_video_283_server/pom.xml @@ -63,6 +63,10 @@ knife4j-spring-boot-starter ${knife4j.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java index 1795cf1..fa6b41e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java @@ -1,9 +1,24 @@ package com.casic.missiles.modular.system.controller; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IAlarmService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ResponseBody; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; /** *

@@ -13,8 +28,42 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "报警管理接口") @Controller -@RequestMapping("/system/alarm") -public class AlarmController { +@RequestMapping("/alarm") +@RequiredArgsConstructor +public class AlarmController extends BaseController { + private final IAlarmService alarmService; + + @ApiOperation("报警分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "alarmLocation", value = "报警位置",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmType", value = "报警类型",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmStartTime", value = "报警开始时间",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmEndTime", value = "报警结束时间",dataType = "String", paramType = "query") + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String alarmLocation,String alarmType,String alarmStartTime,String alarmEndTime){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(alarmLocation)){ + queryWrapper.like("alarm.ALARM_LOCATION",alarmLocation); + } + if(StrUtil.isNotEmpty(alarmType)){ + queryWrapper.eq("alarm.ALARM_TYPE",alarmType); + } + if(StrUtil.isNotEmpty(alarmStartTime)){ + queryWrapper.ge("alarm.ALARM_TIME",alarmStartTime); + } + if(StrUtil.isNotEmpty(alarmEndTime)){ + queryWrapper.le("alarm.ALARM_TIME",alarmEndTime); + } + page = alarmService.listPage(page,queryWrapper); + return ResponseData.success(super.packForBT(page)); + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java index aa50d78..4a9243e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java @@ -1,10 +1,25 @@ package com.casic.missiles.modular.system.controller; -import org.springframework.web.bind.annotation.RequestMapping; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IDeviceService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; import org.springframework.stereotype.Controller; +import java.util.List; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; + /** *

* 设备记录表 前端控制器 @@ -13,8 +28,92 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "设备管理接口") @Controller -@RequestMapping("/system/device") -public class DeviceController { +@RequestMapping("/device") +@RequiredArgsConstructor +public class DeviceController extends BaseController { + + private final IDeviceService deviceService; + private final AbstractDictService dictService; + + @ApiOperation("新增设备") + @PostMapping("add") + @ResponseBody + public Object add(@RequestBody Device device){ + deviceService.save(device); + return ResponseData.success(); + } + + @ApiOperation("编辑设备") + @PostMapping("update") + @ResponseBody + public Object update(@RequestBody Device device){ + deviceService.updateById(device); + return ResponseData.success(); + } + + @ApiOperation("删除设备") + @PostMapping("delete") + @ResponseBody + public Object delete(@ApiParam(value = "设备id",example = "0")@RequestParam Long deviceId){ + deviceService.removeById(deviceId); + return ResponseData.success(); + } + + + @ApiOperation("设备分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String deviceName){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + page = deviceService.page(page,queryWrapper); + wrapperDevice(page.getRecords()); + return ResponseData.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "location", value = "设备位置",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("list") + @ResponseBody + public Object list(String deviceName,String location){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + if(StrUtil.isNotEmpty(location)){ + queryWrapper.like("LOCATION",location); + } + List deviceList = deviceService.list(queryWrapper); + wrapperDevice(deviceList); + return ResponseData.success(deviceList); + } + + private void wrapperDevice(List page) { + for (Device device : page) { + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setStatusName(dictService.getDictNameByCode("deviceStatus", device.getStatus())); + } + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setConnectTypeName(dictService.getDictNameByCode("connectType", device.getConnectType())); + } + } + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java new file mode 100644 index 0000000..f2fc224 --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.controller; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.dto.AlarmUpload; +import com.casic.missiles.modular.system.dto.PeopleUpload; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.service.IAlarmService; +import com.casic.missiles.modular.system.websocket.WebSocket; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.Date; + +@Api(tags = "数据上报接口") +@Controller +@RequestMapping("/upload") +@RequiredArgsConstructor +public class UploadController { + + private final IAlarmService alarmService; + private final WebSocket webSocket; + + @ApiOperation("报警上报") + @PostMapping("alarm") + @ResponseBody + public Object alarmUpload(@RequestBody AlarmUpload alarmUpload){ + if(StrUtil.isEmpty(alarmUpload.getAlarmTime())){ + alarmUpload.setAlarmTime(DateUtil.formatDateTime(new Date())); + } + Alarm alarm = alarmService.alarmUpload(alarmUpload); + webSocket.sendAllMessage(JSONObject.toJSONString(alarmUpload)); + return ResponseData.success(); + } + + @ApiOperation("工作台人数上报") + @PostMapping("people") + @ResponseBody + public Object peopleUpload(@RequestBody PeopleUpload peopleUpload){ + webSocket.sendAllMessage(JSONObject.toJSONString(peopleUpload)); + return ResponseData.success(); + } +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java new file mode 100644 index 0000000..3cb6e6e --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.system.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "AlarmUpload",description = "报警上报") +public class AlarmUpload { + + @ApiModelProperty(value = "IP",required = true) + private String ip; + + @ApiModelProperty(value = "端口号",required = true) + private String port; + + @ApiModelProperty(value = "通道号") + private Integer channelNo; + + @ApiModelProperty(value = "报警类型",required = true) + private String alarmType; + + @ApiModelProperty(value = "报警图片(base64,不包含头)") + private String alarmImage; + + @ApiModelProperty(value = "报警时间(可以不传,默认为上传时间)") + private String alarmTime; + + @ApiModelProperty(value = "报警内容") + private String alarmContent; + + @ApiModelProperty(value = "报警人数") + private Integer peopleCount; +} diff --git a/casic_video_283_server/pom.xml b/casic_video_283_server/pom.xml index 353504b..7edf41f 100644 --- a/casic_video_283_server/pom.xml +++ b/casic_video_283_server/pom.xml @@ -63,6 +63,10 @@ knife4j-spring-boot-starter ${knife4j.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java index 1795cf1..fa6b41e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java @@ -1,9 +1,24 @@ package com.casic.missiles.modular.system.controller; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IAlarmService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ResponseBody; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; /** *

@@ -13,8 +28,42 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "报警管理接口") @Controller -@RequestMapping("/system/alarm") -public class AlarmController { +@RequestMapping("/alarm") +@RequiredArgsConstructor +public class AlarmController extends BaseController { + private final IAlarmService alarmService; + + @ApiOperation("报警分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "alarmLocation", value = "报警位置",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmType", value = "报警类型",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmStartTime", value = "报警开始时间",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmEndTime", value = "报警结束时间",dataType = "String", paramType = "query") + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String alarmLocation,String alarmType,String alarmStartTime,String alarmEndTime){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(alarmLocation)){ + queryWrapper.like("alarm.ALARM_LOCATION",alarmLocation); + } + if(StrUtil.isNotEmpty(alarmType)){ + queryWrapper.eq("alarm.ALARM_TYPE",alarmType); + } + if(StrUtil.isNotEmpty(alarmStartTime)){ + queryWrapper.ge("alarm.ALARM_TIME",alarmStartTime); + } + if(StrUtil.isNotEmpty(alarmEndTime)){ + queryWrapper.le("alarm.ALARM_TIME",alarmEndTime); + } + page = alarmService.listPage(page,queryWrapper); + return ResponseData.success(super.packForBT(page)); + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java index aa50d78..4a9243e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java @@ -1,10 +1,25 @@ package com.casic.missiles.modular.system.controller; -import org.springframework.web.bind.annotation.RequestMapping; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IDeviceService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; import org.springframework.stereotype.Controller; +import java.util.List; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; + /** *

* 设备记录表 前端控制器 @@ -13,8 +28,92 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "设备管理接口") @Controller -@RequestMapping("/system/device") -public class DeviceController { +@RequestMapping("/device") +@RequiredArgsConstructor +public class DeviceController extends BaseController { + + private final IDeviceService deviceService; + private final AbstractDictService dictService; + + @ApiOperation("新增设备") + @PostMapping("add") + @ResponseBody + public Object add(@RequestBody Device device){ + deviceService.save(device); + return ResponseData.success(); + } + + @ApiOperation("编辑设备") + @PostMapping("update") + @ResponseBody + public Object update(@RequestBody Device device){ + deviceService.updateById(device); + return ResponseData.success(); + } + + @ApiOperation("删除设备") + @PostMapping("delete") + @ResponseBody + public Object delete(@ApiParam(value = "设备id",example = "0")@RequestParam Long deviceId){ + deviceService.removeById(deviceId); + return ResponseData.success(); + } + + + @ApiOperation("设备分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String deviceName){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + page = deviceService.page(page,queryWrapper); + wrapperDevice(page.getRecords()); + return ResponseData.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "location", value = "设备位置",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("list") + @ResponseBody + public Object list(String deviceName,String location){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + if(StrUtil.isNotEmpty(location)){ + queryWrapper.like("LOCATION",location); + } + List deviceList = deviceService.list(queryWrapper); + wrapperDevice(deviceList); + return ResponseData.success(deviceList); + } + + private void wrapperDevice(List page) { + for (Device device : page) { + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setStatusName(dictService.getDictNameByCode("deviceStatus", device.getStatus())); + } + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setConnectTypeName(dictService.getDictNameByCode("connectType", device.getConnectType())); + } + } + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java new file mode 100644 index 0000000..f2fc224 --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.controller; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.dto.AlarmUpload; +import com.casic.missiles.modular.system.dto.PeopleUpload; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.service.IAlarmService; +import com.casic.missiles.modular.system.websocket.WebSocket; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.Date; + +@Api(tags = "数据上报接口") +@Controller +@RequestMapping("/upload") +@RequiredArgsConstructor +public class UploadController { + + private final IAlarmService alarmService; + private final WebSocket webSocket; + + @ApiOperation("报警上报") + @PostMapping("alarm") + @ResponseBody + public Object alarmUpload(@RequestBody AlarmUpload alarmUpload){ + if(StrUtil.isEmpty(alarmUpload.getAlarmTime())){ + alarmUpload.setAlarmTime(DateUtil.formatDateTime(new Date())); + } + Alarm alarm = alarmService.alarmUpload(alarmUpload); + webSocket.sendAllMessage(JSONObject.toJSONString(alarmUpload)); + return ResponseData.success(); + } + + @ApiOperation("工作台人数上报") + @PostMapping("people") + @ResponseBody + public Object peopleUpload(@RequestBody PeopleUpload peopleUpload){ + webSocket.sendAllMessage(JSONObject.toJSONString(peopleUpload)); + return ResponseData.success(); + } +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java new file mode 100644 index 0000000..3cb6e6e --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.system.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "AlarmUpload",description = "报警上报") +public class AlarmUpload { + + @ApiModelProperty(value = "IP",required = true) + private String ip; + + @ApiModelProperty(value = "端口号",required = true) + private String port; + + @ApiModelProperty(value = "通道号") + private Integer channelNo; + + @ApiModelProperty(value = "报警类型",required = true) + private String alarmType; + + @ApiModelProperty(value = "报警图片(base64,不包含头)") + private String alarmImage; + + @ApiModelProperty(value = "报警时间(可以不传,默认为上传时间)") + private String alarmTime; + + @ApiModelProperty(value = "报警内容") + private String alarmContent; + + @ApiModelProperty(value = "报警人数") + private Integer peopleCount; +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java new file mode 100644 index 0000000..d7cb90e --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.system.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "PeopleUpload",description = "监测人数上报") +public class PeopleUpload { + + @ApiModelProperty(value = "IP",required = true) + private String ip; + + @ApiModelProperty(value = "端口号",required = true) + private String port; + + @ApiModelProperty(value = "通道号") + private Integer channelNo; + + @ApiModelProperty(value = "监测人数") + private Integer peopleCount; +} diff --git a/casic_video_283_server/pom.xml b/casic_video_283_server/pom.xml index 353504b..7edf41f 100644 --- a/casic_video_283_server/pom.xml +++ b/casic_video_283_server/pom.xml @@ -63,6 +63,10 @@ knife4j-spring-boot-starter ${knife4j.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java index 1795cf1..fa6b41e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java @@ -1,9 +1,24 @@ package com.casic.missiles.modular.system.controller; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IAlarmService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ResponseBody; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; /** *

@@ -13,8 +28,42 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "报警管理接口") @Controller -@RequestMapping("/system/alarm") -public class AlarmController { +@RequestMapping("/alarm") +@RequiredArgsConstructor +public class AlarmController extends BaseController { + private final IAlarmService alarmService; + + @ApiOperation("报警分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "alarmLocation", value = "报警位置",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmType", value = "报警类型",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmStartTime", value = "报警开始时间",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmEndTime", value = "报警结束时间",dataType = "String", paramType = "query") + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String alarmLocation,String alarmType,String alarmStartTime,String alarmEndTime){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(alarmLocation)){ + queryWrapper.like("alarm.ALARM_LOCATION",alarmLocation); + } + if(StrUtil.isNotEmpty(alarmType)){ + queryWrapper.eq("alarm.ALARM_TYPE",alarmType); + } + if(StrUtil.isNotEmpty(alarmStartTime)){ + queryWrapper.ge("alarm.ALARM_TIME",alarmStartTime); + } + if(StrUtil.isNotEmpty(alarmEndTime)){ + queryWrapper.le("alarm.ALARM_TIME",alarmEndTime); + } + page = alarmService.listPage(page,queryWrapper); + return ResponseData.success(super.packForBT(page)); + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java index aa50d78..4a9243e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java @@ -1,10 +1,25 @@ package com.casic.missiles.modular.system.controller; -import org.springframework.web.bind.annotation.RequestMapping; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IDeviceService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; import org.springframework.stereotype.Controller; +import java.util.List; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; + /** *

* 设备记录表 前端控制器 @@ -13,8 +28,92 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "设备管理接口") @Controller -@RequestMapping("/system/device") -public class DeviceController { +@RequestMapping("/device") +@RequiredArgsConstructor +public class DeviceController extends BaseController { + + private final IDeviceService deviceService; + private final AbstractDictService dictService; + + @ApiOperation("新增设备") + @PostMapping("add") + @ResponseBody + public Object add(@RequestBody Device device){ + deviceService.save(device); + return ResponseData.success(); + } + + @ApiOperation("编辑设备") + @PostMapping("update") + @ResponseBody + public Object update(@RequestBody Device device){ + deviceService.updateById(device); + return ResponseData.success(); + } + + @ApiOperation("删除设备") + @PostMapping("delete") + @ResponseBody + public Object delete(@ApiParam(value = "设备id",example = "0")@RequestParam Long deviceId){ + deviceService.removeById(deviceId); + return ResponseData.success(); + } + + + @ApiOperation("设备分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String deviceName){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + page = deviceService.page(page,queryWrapper); + wrapperDevice(page.getRecords()); + return ResponseData.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "location", value = "设备位置",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("list") + @ResponseBody + public Object list(String deviceName,String location){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + if(StrUtil.isNotEmpty(location)){ + queryWrapper.like("LOCATION",location); + } + List deviceList = deviceService.list(queryWrapper); + wrapperDevice(deviceList); + return ResponseData.success(deviceList); + } + + private void wrapperDevice(List page) { + for (Device device : page) { + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setStatusName(dictService.getDictNameByCode("deviceStatus", device.getStatus())); + } + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setConnectTypeName(dictService.getDictNameByCode("connectType", device.getConnectType())); + } + } + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java new file mode 100644 index 0000000..f2fc224 --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.controller; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.dto.AlarmUpload; +import com.casic.missiles.modular.system.dto.PeopleUpload; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.service.IAlarmService; +import com.casic.missiles.modular.system.websocket.WebSocket; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.Date; + +@Api(tags = "数据上报接口") +@Controller +@RequestMapping("/upload") +@RequiredArgsConstructor +public class UploadController { + + private final IAlarmService alarmService; + private final WebSocket webSocket; + + @ApiOperation("报警上报") + @PostMapping("alarm") + @ResponseBody + public Object alarmUpload(@RequestBody AlarmUpload alarmUpload){ + if(StrUtil.isEmpty(alarmUpload.getAlarmTime())){ + alarmUpload.setAlarmTime(DateUtil.formatDateTime(new Date())); + } + Alarm alarm = alarmService.alarmUpload(alarmUpload); + webSocket.sendAllMessage(JSONObject.toJSONString(alarmUpload)); + return ResponseData.success(); + } + + @ApiOperation("工作台人数上报") + @PostMapping("people") + @ResponseBody + public Object peopleUpload(@RequestBody PeopleUpload peopleUpload){ + webSocket.sendAllMessage(JSONObject.toJSONString(peopleUpload)); + return ResponseData.success(); + } +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java new file mode 100644 index 0000000..3cb6e6e --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.system.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "AlarmUpload",description = "报警上报") +public class AlarmUpload { + + @ApiModelProperty(value = "IP",required = true) + private String ip; + + @ApiModelProperty(value = "端口号",required = true) + private String port; + + @ApiModelProperty(value = "通道号") + private Integer channelNo; + + @ApiModelProperty(value = "报警类型",required = true) + private String alarmType; + + @ApiModelProperty(value = "报警图片(base64,不包含头)") + private String alarmImage; + + @ApiModelProperty(value = "报警时间(可以不传,默认为上传时间)") + private String alarmTime; + + @ApiModelProperty(value = "报警内容") + private String alarmContent; + + @ApiModelProperty(value = "报警人数") + private Integer peopleCount; +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java new file mode 100644 index 0000000..d7cb90e --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.system.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "PeopleUpload",description = "监测人数上报") +public class PeopleUpload { + + @ApiModelProperty(value = "IP",required = true) + private String ip; + + @ApiModelProperty(value = "端口号",required = true) + private String port; + + @ApiModelProperty(value = "通道号") + private Integer channelNo; + + @ApiModelProperty(value = "监测人数") + private Integer peopleCount; +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java index 4d2b7ef..c7db111 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java @@ -1,13 +1,15 @@ package com.casic.missiles.modular.system.entity; +import com.alibaba.fastjson.annotation.JSONField; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; -import java.time.LocalDateTime; import java.util.Date; /** @@ -18,6 +20,7 @@ * @author zyj * @since 2023-05-25 */ +@ApiModel("Alarm") @Data @TableName("bus_alarm") public class Alarm implements Serializable { @@ -33,58 +36,87 @@ /** * 设备ID */ + @ApiModelProperty(value = "设备ID",example = "0") @TableField("DEVICE_ID") private Long deviceId; /** * 报警类型 */ + @ApiModelProperty(value = "报警类型(字典值)") @TableField("ALARM_TYPE") private String alarmType; /** * 报警时间 */ + @ApiModelProperty(value = "报警时间") @TableField("ALARM_TIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date alarmTime; /** * 报警状态 */ + @ApiModelProperty(value = "报警状态(字典值)") @TableField("ALARM_STATUS") private String alarmStatus; /** * 报警位置 */ + @ApiModelProperty(value = "报警位置") @TableField("ALARM_LOCATION") private String alarmLocation; /** * 报警图片 */ + @ApiModelProperty(value = "报警图片(url)") @TableField("ALARM_IMAGE") private String alarmImage; /** * 视频通道号 */ + @ApiModelProperty(value = "视频通道号(预留)") @TableField("CHANNEL_NO") private Integer channelNo; /** * 报警内容 */ + @ApiModelProperty(value = "报警内容(预留)") @TableField("ALARM_CONTENT") private String alarmContent; /** * 消警时间 */ + @ApiModelProperty(value = "消警时间") @TableField("CANCEL_TIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date cancelTime; + /** + * 消警时间 + */ + @ApiModelProperty(value = "报警人数") + @TableField("PEOPLE_COUNT") + private Integer peopleCount; + + + @ApiModelProperty(value = "报警设备名称") + @TableField(exist = false) + private String deviceName; + @ApiModelProperty(value = "报警类型名称") + @TableField(exist = false) + private String alarmTypeName; + @ApiModelProperty(value = "报警状态名称") + @TableField(exist = false) + private String alarmStatusName; + @Override public String toString() { return "Alarm{" + diff --git a/casic_video_283_server/pom.xml b/casic_video_283_server/pom.xml index 353504b..7edf41f 100644 --- a/casic_video_283_server/pom.xml +++ b/casic_video_283_server/pom.xml @@ -63,6 +63,10 @@ knife4j-spring-boot-starter ${knife4j.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java index 1795cf1..fa6b41e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java @@ -1,9 +1,24 @@ package com.casic.missiles.modular.system.controller; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IAlarmService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ResponseBody; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; /** *

@@ -13,8 +28,42 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "报警管理接口") @Controller -@RequestMapping("/system/alarm") -public class AlarmController { +@RequestMapping("/alarm") +@RequiredArgsConstructor +public class AlarmController extends BaseController { + private final IAlarmService alarmService; + + @ApiOperation("报警分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "alarmLocation", value = "报警位置",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmType", value = "报警类型",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmStartTime", value = "报警开始时间",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmEndTime", value = "报警结束时间",dataType = "String", paramType = "query") + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String alarmLocation,String alarmType,String alarmStartTime,String alarmEndTime){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(alarmLocation)){ + queryWrapper.like("alarm.ALARM_LOCATION",alarmLocation); + } + if(StrUtil.isNotEmpty(alarmType)){ + queryWrapper.eq("alarm.ALARM_TYPE",alarmType); + } + if(StrUtil.isNotEmpty(alarmStartTime)){ + queryWrapper.ge("alarm.ALARM_TIME",alarmStartTime); + } + if(StrUtil.isNotEmpty(alarmEndTime)){ + queryWrapper.le("alarm.ALARM_TIME",alarmEndTime); + } + page = alarmService.listPage(page,queryWrapper); + return ResponseData.success(super.packForBT(page)); + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java index aa50d78..4a9243e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java @@ -1,10 +1,25 @@ package com.casic.missiles.modular.system.controller; -import org.springframework.web.bind.annotation.RequestMapping; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IDeviceService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; import org.springframework.stereotype.Controller; +import java.util.List; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; + /** *

* 设备记录表 前端控制器 @@ -13,8 +28,92 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "设备管理接口") @Controller -@RequestMapping("/system/device") -public class DeviceController { +@RequestMapping("/device") +@RequiredArgsConstructor +public class DeviceController extends BaseController { + + private final IDeviceService deviceService; + private final AbstractDictService dictService; + + @ApiOperation("新增设备") + @PostMapping("add") + @ResponseBody + public Object add(@RequestBody Device device){ + deviceService.save(device); + return ResponseData.success(); + } + + @ApiOperation("编辑设备") + @PostMapping("update") + @ResponseBody + public Object update(@RequestBody Device device){ + deviceService.updateById(device); + return ResponseData.success(); + } + + @ApiOperation("删除设备") + @PostMapping("delete") + @ResponseBody + public Object delete(@ApiParam(value = "设备id",example = "0")@RequestParam Long deviceId){ + deviceService.removeById(deviceId); + return ResponseData.success(); + } + + + @ApiOperation("设备分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String deviceName){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + page = deviceService.page(page,queryWrapper); + wrapperDevice(page.getRecords()); + return ResponseData.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "location", value = "设备位置",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("list") + @ResponseBody + public Object list(String deviceName,String location){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + if(StrUtil.isNotEmpty(location)){ + queryWrapper.like("LOCATION",location); + } + List deviceList = deviceService.list(queryWrapper); + wrapperDevice(deviceList); + return ResponseData.success(deviceList); + } + + private void wrapperDevice(List page) { + for (Device device : page) { + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setStatusName(dictService.getDictNameByCode("deviceStatus", device.getStatus())); + } + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setConnectTypeName(dictService.getDictNameByCode("connectType", device.getConnectType())); + } + } + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java new file mode 100644 index 0000000..f2fc224 --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.controller; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.dto.AlarmUpload; +import com.casic.missiles.modular.system.dto.PeopleUpload; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.service.IAlarmService; +import com.casic.missiles.modular.system.websocket.WebSocket; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.Date; + +@Api(tags = "数据上报接口") +@Controller +@RequestMapping("/upload") +@RequiredArgsConstructor +public class UploadController { + + private final IAlarmService alarmService; + private final WebSocket webSocket; + + @ApiOperation("报警上报") + @PostMapping("alarm") + @ResponseBody + public Object alarmUpload(@RequestBody AlarmUpload alarmUpload){ + if(StrUtil.isEmpty(alarmUpload.getAlarmTime())){ + alarmUpload.setAlarmTime(DateUtil.formatDateTime(new Date())); + } + Alarm alarm = alarmService.alarmUpload(alarmUpload); + webSocket.sendAllMessage(JSONObject.toJSONString(alarmUpload)); + return ResponseData.success(); + } + + @ApiOperation("工作台人数上报") + @PostMapping("people") + @ResponseBody + public Object peopleUpload(@RequestBody PeopleUpload peopleUpload){ + webSocket.sendAllMessage(JSONObject.toJSONString(peopleUpload)); + return ResponseData.success(); + } +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java new file mode 100644 index 0000000..3cb6e6e --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.system.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "AlarmUpload",description = "报警上报") +public class AlarmUpload { + + @ApiModelProperty(value = "IP",required = true) + private String ip; + + @ApiModelProperty(value = "端口号",required = true) + private String port; + + @ApiModelProperty(value = "通道号") + private Integer channelNo; + + @ApiModelProperty(value = "报警类型",required = true) + private String alarmType; + + @ApiModelProperty(value = "报警图片(base64,不包含头)") + private String alarmImage; + + @ApiModelProperty(value = "报警时间(可以不传,默认为上传时间)") + private String alarmTime; + + @ApiModelProperty(value = "报警内容") + private String alarmContent; + + @ApiModelProperty(value = "报警人数") + private Integer peopleCount; +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java new file mode 100644 index 0000000..d7cb90e --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.system.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "PeopleUpload",description = "监测人数上报") +public class PeopleUpload { + + @ApiModelProperty(value = "IP",required = true) + private String ip; + + @ApiModelProperty(value = "端口号",required = true) + private String port; + + @ApiModelProperty(value = "通道号") + private Integer channelNo; + + @ApiModelProperty(value = "监测人数") + private Integer peopleCount; +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java index 4d2b7ef..c7db111 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java @@ -1,13 +1,15 @@ package com.casic.missiles.modular.system.entity; +import com.alibaba.fastjson.annotation.JSONField; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; -import java.time.LocalDateTime; import java.util.Date; /** @@ -18,6 +20,7 @@ * @author zyj * @since 2023-05-25 */ +@ApiModel("Alarm") @Data @TableName("bus_alarm") public class Alarm implements Serializable { @@ -33,58 +36,87 @@ /** * 设备ID */ + @ApiModelProperty(value = "设备ID",example = "0") @TableField("DEVICE_ID") private Long deviceId; /** * 报警类型 */ + @ApiModelProperty(value = "报警类型(字典值)") @TableField("ALARM_TYPE") private String alarmType; /** * 报警时间 */ + @ApiModelProperty(value = "报警时间") @TableField("ALARM_TIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date alarmTime; /** * 报警状态 */ + @ApiModelProperty(value = "报警状态(字典值)") @TableField("ALARM_STATUS") private String alarmStatus; /** * 报警位置 */ + @ApiModelProperty(value = "报警位置") @TableField("ALARM_LOCATION") private String alarmLocation; /** * 报警图片 */ + @ApiModelProperty(value = "报警图片(url)") @TableField("ALARM_IMAGE") private String alarmImage; /** * 视频通道号 */ + @ApiModelProperty(value = "视频通道号(预留)") @TableField("CHANNEL_NO") private Integer channelNo; /** * 报警内容 */ + @ApiModelProperty(value = "报警内容(预留)") @TableField("ALARM_CONTENT") private String alarmContent; /** * 消警时间 */ + @ApiModelProperty(value = "消警时间") @TableField("CANCEL_TIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date cancelTime; + /** + * 消警时间 + */ + @ApiModelProperty(value = "报警人数") + @TableField("PEOPLE_COUNT") + private Integer peopleCount; + + + @ApiModelProperty(value = "报警设备名称") + @TableField(exist = false) + private String deviceName; + @ApiModelProperty(value = "报警类型名称") + @TableField(exist = false) + private String alarmTypeName; + @ApiModelProperty(value = "报警状态名称") + @TableField(exist = false) + private String alarmStatusName; + @Override public String toString() { return "Alarm{" + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java index ea7db5f..0f8ba79 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; @@ -16,6 +18,7 @@ * @author zyj * @since 2023-05-25 */ +@ApiModel("Device") @Data @TableName("bus_device") public class Device implements Serializable { @@ -31,66 +34,82 @@ /** * 设备名称 */ + @ApiModelProperty(value = "设备名称") @TableField("DEVICE_NAME") private String deviceName; /** * IP */ + @ApiModelProperty(value = "IP") @TableField("IP") private String ip; /** * 端口 */ + @ApiModelProperty(value = "端口") @TableField("PORT") private String port; /** * 用户名 */ + @ApiModelProperty(value = "用户名") @TableField("USER_NAME") private String userName; /** * 密码 */ + @ApiModelProperty(value = "密码") @TableField("PASSWORD") private String password; /** * 连接类型 */ + @ApiModelProperty(value = "连接类型(字典值)") @TableField("CONNECT_TYPE") private String connectType; /** * 位置 */ + @ApiModelProperty(value = "位置") @TableField("LOCATION") - private String location; /** * 设备状态 */ + @ApiModelProperty(value = "设备状态(字典值)") @TableField("STATUS") - private String status; /** * 报警分组 */ + @ApiModelProperty(value = "报警分组",example = "0") @TableField("ALARM_GROUP") - private Long alarmGroup; /** * 视频通道数(预留) */ + @ApiModelProperty(value = "视频通道数(预留)") @TableField("CHANNEL_NUM") private Integer channelNum; + + @ApiModelProperty(value = "连接类型名称") + @TableField(exist = false) + private String connectTypeName; + + @ApiModelProperty(value = "设备状态名称") + @TableField(exist = false) + private String statusName; + @Override public String toString() { return "Device{" + diff --git a/casic_video_283_server/pom.xml b/casic_video_283_server/pom.xml index 353504b..7edf41f 100644 --- a/casic_video_283_server/pom.xml +++ b/casic_video_283_server/pom.xml @@ -63,6 +63,10 @@ knife4j-spring-boot-starter ${knife4j.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java index 1795cf1..fa6b41e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java @@ -1,9 +1,24 @@ package com.casic.missiles.modular.system.controller; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IAlarmService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ResponseBody; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; /** *

@@ -13,8 +28,42 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "报警管理接口") @Controller -@RequestMapping("/system/alarm") -public class AlarmController { +@RequestMapping("/alarm") +@RequiredArgsConstructor +public class AlarmController extends BaseController { + private final IAlarmService alarmService; + + @ApiOperation("报警分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "alarmLocation", value = "报警位置",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmType", value = "报警类型",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmStartTime", value = "报警开始时间",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmEndTime", value = "报警结束时间",dataType = "String", paramType = "query") + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String alarmLocation,String alarmType,String alarmStartTime,String alarmEndTime){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(alarmLocation)){ + queryWrapper.like("alarm.ALARM_LOCATION",alarmLocation); + } + if(StrUtil.isNotEmpty(alarmType)){ + queryWrapper.eq("alarm.ALARM_TYPE",alarmType); + } + if(StrUtil.isNotEmpty(alarmStartTime)){ + queryWrapper.ge("alarm.ALARM_TIME",alarmStartTime); + } + if(StrUtil.isNotEmpty(alarmEndTime)){ + queryWrapper.le("alarm.ALARM_TIME",alarmEndTime); + } + page = alarmService.listPage(page,queryWrapper); + return ResponseData.success(super.packForBT(page)); + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java index aa50d78..4a9243e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java @@ -1,10 +1,25 @@ package com.casic.missiles.modular.system.controller; -import org.springframework.web.bind.annotation.RequestMapping; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IDeviceService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; import org.springframework.stereotype.Controller; +import java.util.List; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; + /** *

* 设备记录表 前端控制器 @@ -13,8 +28,92 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "设备管理接口") @Controller -@RequestMapping("/system/device") -public class DeviceController { +@RequestMapping("/device") +@RequiredArgsConstructor +public class DeviceController extends BaseController { + + private final IDeviceService deviceService; + private final AbstractDictService dictService; + + @ApiOperation("新增设备") + @PostMapping("add") + @ResponseBody + public Object add(@RequestBody Device device){ + deviceService.save(device); + return ResponseData.success(); + } + + @ApiOperation("编辑设备") + @PostMapping("update") + @ResponseBody + public Object update(@RequestBody Device device){ + deviceService.updateById(device); + return ResponseData.success(); + } + + @ApiOperation("删除设备") + @PostMapping("delete") + @ResponseBody + public Object delete(@ApiParam(value = "设备id",example = "0")@RequestParam Long deviceId){ + deviceService.removeById(deviceId); + return ResponseData.success(); + } + + + @ApiOperation("设备分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String deviceName){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + page = deviceService.page(page,queryWrapper); + wrapperDevice(page.getRecords()); + return ResponseData.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "location", value = "设备位置",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("list") + @ResponseBody + public Object list(String deviceName,String location){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + if(StrUtil.isNotEmpty(location)){ + queryWrapper.like("LOCATION",location); + } + List deviceList = deviceService.list(queryWrapper); + wrapperDevice(deviceList); + return ResponseData.success(deviceList); + } + + private void wrapperDevice(List page) { + for (Device device : page) { + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setStatusName(dictService.getDictNameByCode("deviceStatus", device.getStatus())); + } + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setConnectTypeName(dictService.getDictNameByCode("connectType", device.getConnectType())); + } + } + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java new file mode 100644 index 0000000..f2fc224 --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.controller; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.dto.AlarmUpload; +import com.casic.missiles.modular.system.dto.PeopleUpload; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.service.IAlarmService; +import com.casic.missiles.modular.system.websocket.WebSocket; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.Date; + +@Api(tags = "数据上报接口") +@Controller +@RequestMapping("/upload") +@RequiredArgsConstructor +public class UploadController { + + private final IAlarmService alarmService; + private final WebSocket webSocket; + + @ApiOperation("报警上报") + @PostMapping("alarm") + @ResponseBody + public Object alarmUpload(@RequestBody AlarmUpload alarmUpload){ + if(StrUtil.isEmpty(alarmUpload.getAlarmTime())){ + alarmUpload.setAlarmTime(DateUtil.formatDateTime(new Date())); + } + Alarm alarm = alarmService.alarmUpload(alarmUpload); + webSocket.sendAllMessage(JSONObject.toJSONString(alarmUpload)); + return ResponseData.success(); + } + + @ApiOperation("工作台人数上报") + @PostMapping("people") + @ResponseBody + public Object peopleUpload(@RequestBody PeopleUpload peopleUpload){ + webSocket.sendAllMessage(JSONObject.toJSONString(peopleUpload)); + return ResponseData.success(); + } +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java new file mode 100644 index 0000000..3cb6e6e --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.system.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "AlarmUpload",description = "报警上报") +public class AlarmUpload { + + @ApiModelProperty(value = "IP",required = true) + private String ip; + + @ApiModelProperty(value = "端口号",required = true) + private String port; + + @ApiModelProperty(value = "通道号") + private Integer channelNo; + + @ApiModelProperty(value = "报警类型",required = true) + private String alarmType; + + @ApiModelProperty(value = "报警图片(base64,不包含头)") + private String alarmImage; + + @ApiModelProperty(value = "报警时间(可以不传,默认为上传时间)") + private String alarmTime; + + @ApiModelProperty(value = "报警内容") + private String alarmContent; + + @ApiModelProperty(value = "报警人数") + private Integer peopleCount; +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java new file mode 100644 index 0000000..d7cb90e --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.system.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "PeopleUpload",description = "监测人数上报") +public class PeopleUpload { + + @ApiModelProperty(value = "IP",required = true) + private String ip; + + @ApiModelProperty(value = "端口号",required = true) + private String port; + + @ApiModelProperty(value = "通道号") + private Integer channelNo; + + @ApiModelProperty(value = "监测人数") + private Integer peopleCount; +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java index 4d2b7ef..c7db111 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java @@ -1,13 +1,15 @@ package com.casic.missiles.modular.system.entity; +import com.alibaba.fastjson.annotation.JSONField; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; -import java.time.LocalDateTime; import java.util.Date; /** @@ -18,6 +20,7 @@ * @author zyj * @since 2023-05-25 */ +@ApiModel("Alarm") @Data @TableName("bus_alarm") public class Alarm implements Serializable { @@ -33,58 +36,87 @@ /** * 设备ID */ + @ApiModelProperty(value = "设备ID",example = "0") @TableField("DEVICE_ID") private Long deviceId; /** * 报警类型 */ + @ApiModelProperty(value = "报警类型(字典值)") @TableField("ALARM_TYPE") private String alarmType; /** * 报警时间 */ + @ApiModelProperty(value = "报警时间") @TableField("ALARM_TIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date alarmTime; /** * 报警状态 */ + @ApiModelProperty(value = "报警状态(字典值)") @TableField("ALARM_STATUS") private String alarmStatus; /** * 报警位置 */ + @ApiModelProperty(value = "报警位置") @TableField("ALARM_LOCATION") private String alarmLocation; /** * 报警图片 */ + @ApiModelProperty(value = "报警图片(url)") @TableField("ALARM_IMAGE") private String alarmImage; /** * 视频通道号 */ + @ApiModelProperty(value = "视频通道号(预留)") @TableField("CHANNEL_NO") private Integer channelNo; /** * 报警内容 */ + @ApiModelProperty(value = "报警内容(预留)") @TableField("ALARM_CONTENT") private String alarmContent; /** * 消警时间 */ + @ApiModelProperty(value = "消警时间") @TableField("CANCEL_TIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date cancelTime; + /** + * 消警时间 + */ + @ApiModelProperty(value = "报警人数") + @TableField("PEOPLE_COUNT") + private Integer peopleCount; + + + @ApiModelProperty(value = "报警设备名称") + @TableField(exist = false) + private String deviceName; + @ApiModelProperty(value = "报警类型名称") + @TableField(exist = false) + private String alarmTypeName; + @ApiModelProperty(value = "报警状态名称") + @TableField(exist = false) + private String alarmStatusName; + @Override public String toString() { return "Alarm{" + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java index ea7db5f..0f8ba79 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; @@ -16,6 +18,7 @@ * @author zyj * @since 2023-05-25 */ +@ApiModel("Device") @Data @TableName("bus_device") public class Device implements Serializable { @@ -31,66 +34,82 @@ /** * 设备名称 */ + @ApiModelProperty(value = "设备名称") @TableField("DEVICE_NAME") private String deviceName; /** * IP */ + @ApiModelProperty(value = "IP") @TableField("IP") private String ip; /** * 端口 */ + @ApiModelProperty(value = "端口") @TableField("PORT") private String port; /** * 用户名 */ + @ApiModelProperty(value = "用户名") @TableField("USER_NAME") private String userName; /** * 密码 */ + @ApiModelProperty(value = "密码") @TableField("PASSWORD") private String password; /** * 连接类型 */ + @ApiModelProperty(value = "连接类型(字典值)") @TableField("CONNECT_TYPE") private String connectType; /** * 位置 */ + @ApiModelProperty(value = "位置") @TableField("LOCATION") - private String location; /** * 设备状态 */ + @ApiModelProperty(value = "设备状态(字典值)") @TableField("STATUS") - private String status; /** * 报警分组 */ + @ApiModelProperty(value = "报警分组",example = "0") @TableField("ALARM_GROUP") - private Long alarmGroup; /** * 视频通道数(预留) */ + @ApiModelProperty(value = "视频通道数(预留)") @TableField("CHANNEL_NUM") private Integer channelNum; + + @ApiModelProperty(value = "连接类型名称") + @TableField(exist = false) + private String connectTypeName; + + @ApiModelProperty(value = "设备状态名称") + @TableField(exist = false) + private String statusName; + @Override public String toString() { return "Device{" + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java index ea4c8be..c235dd8 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java @@ -1,7 +1,10 @@ package com.casic.missiles.modular.system.mapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.system.entity.Alarm; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; /** *

@@ -13,4 +16,6 @@ */ public interface AlarmMapper extends BaseMapper { + Page listPage(@Param("page")Page page, @Param("ew")QueryWrapper queryWrapper); + } diff --git a/casic_video_283_server/pom.xml b/casic_video_283_server/pom.xml index 353504b..7edf41f 100644 --- a/casic_video_283_server/pom.xml +++ b/casic_video_283_server/pom.xml @@ -63,6 +63,10 @@ knife4j-spring-boot-starter ${knife4j.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java index 1795cf1..fa6b41e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java @@ -1,9 +1,24 @@ package com.casic.missiles.modular.system.controller; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IAlarmService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ResponseBody; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; /** *

@@ -13,8 +28,42 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "报警管理接口") @Controller -@RequestMapping("/system/alarm") -public class AlarmController { +@RequestMapping("/alarm") +@RequiredArgsConstructor +public class AlarmController extends BaseController { + private final IAlarmService alarmService; + + @ApiOperation("报警分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "alarmLocation", value = "报警位置",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmType", value = "报警类型",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmStartTime", value = "报警开始时间",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmEndTime", value = "报警结束时间",dataType = "String", paramType = "query") + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String alarmLocation,String alarmType,String alarmStartTime,String alarmEndTime){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(alarmLocation)){ + queryWrapper.like("alarm.ALARM_LOCATION",alarmLocation); + } + if(StrUtil.isNotEmpty(alarmType)){ + queryWrapper.eq("alarm.ALARM_TYPE",alarmType); + } + if(StrUtil.isNotEmpty(alarmStartTime)){ + queryWrapper.ge("alarm.ALARM_TIME",alarmStartTime); + } + if(StrUtil.isNotEmpty(alarmEndTime)){ + queryWrapper.le("alarm.ALARM_TIME",alarmEndTime); + } + page = alarmService.listPage(page,queryWrapper); + return ResponseData.success(super.packForBT(page)); + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java index aa50d78..4a9243e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java @@ -1,10 +1,25 @@ package com.casic.missiles.modular.system.controller; -import org.springframework.web.bind.annotation.RequestMapping; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IDeviceService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; import org.springframework.stereotype.Controller; +import java.util.List; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; + /** *

* 设备记录表 前端控制器 @@ -13,8 +28,92 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "设备管理接口") @Controller -@RequestMapping("/system/device") -public class DeviceController { +@RequestMapping("/device") +@RequiredArgsConstructor +public class DeviceController extends BaseController { + + private final IDeviceService deviceService; + private final AbstractDictService dictService; + + @ApiOperation("新增设备") + @PostMapping("add") + @ResponseBody + public Object add(@RequestBody Device device){ + deviceService.save(device); + return ResponseData.success(); + } + + @ApiOperation("编辑设备") + @PostMapping("update") + @ResponseBody + public Object update(@RequestBody Device device){ + deviceService.updateById(device); + return ResponseData.success(); + } + + @ApiOperation("删除设备") + @PostMapping("delete") + @ResponseBody + public Object delete(@ApiParam(value = "设备id",example = "0")@RequestParam Long deviceId){ + deviceService.removeById(deviceId); + return ResponseData.success(); + } + + + @ApiOperation("设备分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String deviceName){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + page = deviceService.page(page,queryWrapper); + wrapperDevice(page.getRecords()); + return ResponseData.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "location", value = "设备位置",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("list") + @ResponseBody + public Object list(String deviceName,String location){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + if(StrUtil.isNotEmpty(location)){ + queryWrapper.like("LOCATION",location); + } + List deviceList = deviceService.list(queryWrapper); + wrapperDevice(deviceList); + return ResponseData.success(deviceList); + } + + private void wrapperDevice(List page) { + for (Device device : page) { + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setStatusName(dictService.getDictNameByCode("deviceStatus", device.getStatus())); + } + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setConnectTypeName(dictService.getDictNameByCode("connectType", device.getConnectType())); + } + } + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java new file mode 100644 index 0000000..f2fc224 --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.controller; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.dto.AlarmUpload; +import com.casic.missiles.modular.system.dto.PeopleUpload; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.service.IAlarmService; +import com.casic.missiles.modular.system.websocket.WebSocket; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.Date; + +@Api(tags = "数据上报接口") +@Controller +@RequestMapping("/upload") +@RequiredArgsConstructor +public class UploadController { + + private final IAlarmService alarmService; + private final WebSocket webSocket; + + @ApiOperation("报警上报") + @PostMapping("alarm") + @ResponseBody + public Object alarmUpload(@RequestBody AlarmUpload alarmUpload){ + if(StrUtil.isEmpty(alarmUpload.getAlarmTime())){ + alarmUpload.setAlarmTime(DateUtil.formatDateTime(new Date())); + } + Alarm alarm = alarmService.alarmUpload(alarmUpload); + webSocket.sendAllMessage(JSONObject.toJSONString(alarmUpload)); + return ResponseData.success(); + } + + @ApiOperation("工作台人数上报") + @PostMapping("people") + @ResponseBody + public Object peopleUpload(@RequestBody PeopleUpload peopleUpload){ + webSocket.sendAllMessage(JSONObject.toJSONString(peopleUpload)); + return ResponseData.success(); + } +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java new file mode 100644 index 0000000..3cb6e6e --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.system.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "AlarmUpload",description = "报警上报") +public class AlarmUpload { + + @ApiModelProperty(value = "IP",required = true) + private String ip; + + @ApiModelProperty(value = "端口号",required = true) + private String port; + + @ApiModelProperty(value = "通道号") + private Integer channelNo; + + @ApiModelProperty(value = "报警类型",required = true) + private String alarmType; + + @ApiModelProperty(value = "报警图片(base64,不包含头)") + private String alarmImage; + + @ApiModelProperty(value = "报警时间(可以不传,默认为上传时间)") + private String alarmTime; + + @ApiModelProperty(value = "报警内容") + private String alarmContent; + + @ApiModelProperty(value = "报警人数") + private Integer peopleCount; +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java new file mode 100644 index 0000000..d7cb90e --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.system.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "PeopleUpload",description = "监测人数上报") +public class PeopleUpload { + + @ApiModelProperty(value = "IP",required = true) + private String ip; + + @ApiModelProperty(value = "端口号",required = true) + private String port; + + @ApiModelProperty(value = "通道号") + private Integer channelNo; + + @ApiModelProperty(value = "监测人数") + private Integer peopleCount; +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java index 4d2b7ef..c7db111 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java @@ -1,13 +1,15 @@ package com.casic.missiles.modular.system.entity; +import com.alibaba.fastjson.annotation.JSONField; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; -import java.time.LocalDateTime; import java.util.Date; /** @@ -18,6 +20,7 @@ * @author zyj * @since 2023-05-25 */ +@ApiModel("Alarm") @Data @TableName("bus_alarm") public class Alarm implements Serializable { @@ -33,58 +36,87 @@ /** * 设备ID */ + @ApiModelProperty(value = "设备ID",example = "0") @TableField("DEVICE_ID") private Long deviceId; /** * 报警类型 */ + @ApiModelProperty(value = "报警类型(字典值)") @TableField("ALARM_TYPE") private String alarmType; /** * 报警时间 */ + @ApiModelProperty(value = "报警时间") @TableField("ALARM_TIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date alarmTime; /** * 报警状态 */ + @ApiModelProperty(value = "报警状态(字典值)") @TableField("ALARM_STATUS") private String alarmStatus; /** * 报警位置 */ + @ApiModelProperty(value = "报警位置") @TableField("ALARM_LOCATION") private String alarmLocation; /** * 报警图片 */ + @ApiModelProperty(value = "报警图片(url)") @TableField("ALARM_IMAGE") private String alarmImage; /** * 视频通道号 */ + @ApiModelProperty(value = "视频通道号(预留)") @TableField("CHANNEL_NO") private Integer channelNo; /** * 报警内容 */ + @ApiModelProperty(value = "报警内容(预留)") @TableField("ALARM_CONTENT") private String alarmContent; /** * 消警时间 */ + @ApiModelProperty(value = "消警时间") @TableField("CANCEL_TIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date cancelTime; + /** + * 消警时间 + */ + @ApiModelProperty(value = "报警人数") + @TableField("PEOPLE_COUNT") + private Integer peopleCount; + + + @ApiModelProperty(value = "报警设备名称") + @TableField(exist = false) + private String deviceName; + @ApiModelProperty(value = "报警类型名称") + @TableField(exist = false) + private String alarmTypeName; + @ApiModelProperty(value = "报警状态名称") + @TableField(exist = false) + private String alarmStatusName; + @Override public String toString() { return "Alarm{" + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java index ea7db5f..0f8ba79 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; @@ -16,6 +18,7 @@ * @author zyj * @since 2023-05-25 */ +@ApiModel("Device") @Data @TableName("bus_device") public class Device implements Serializable { @@ -31,66 +34,82 @@ /** * 设备名称 */ + @ApiModelProperty(value = "设备名称") @TableField("DEVICE_NAME") private String deviceName; /** * IP */ + @ApiModelProperty(value = "IP") @TableField("IP") private String ip; /** * 端口 */ + @ApiModelProperty(value = "端口") @TableField("PORT") private String port; /** * 用户名 */ + @ApiModelProperty(value = "用户名") @TableField("USER_NAME") private String userName; /** * 密码 */ + @ApiModelProperty(value = "密码") @TableField("PASSWORD") private String password; /** * 连接类型 */ + @ApiModelProperty(value = "连接类型(字典值)") @TableField("CONNECT_TYPE") private String connectType; /** * 位置 */ + @ApiModelProperty(value = "位置") @TableField("LOCATION") - private String location; /** * 设备状态 */ + @ApiModelProperty(value = "设备状态(字典值)") @TableField("STATUS") - private String status; /** * 报警分组 */ + @ApiModelProperty(value = "报警分组",example = "0") @TableField("ALARM_GROUP") - private Long alarmGroup; /** * 视频通道数(预留) */ + @ApiModelProperty(value = "视频通道数(预留)") @TableField("CHANNEL_NUM") private Integer channelNum; + + @ApiModelProperty(value = "连接类型名称") + @TableField(exist = false) + private String connectTypeName; + + @ApiModelProperty(value = "设备状态名称") + @TableField(exist = false) + private String statusName; + @Override public String toString() { return "Device{" + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java index ea4c8be..c235dd8 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java @@ -1,7 +1,10 @@ package com.casic.missiles.modular.system.mapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.system.entity.Alarm; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; /** *

@@ -13,4 +16,6 @@ */ public interface AlarmMapper extends BaseMapper { + Page listPage(@Param("page")Page page, @Param("ew")QueryWrapper queryWrapper); + } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml index 25cb4ab..703fcc5 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml @@ -2,4 +2,25 @@ + diff --git a/casic_video_283_server/pom.xml b/casic_video_283_server/pom.xml index 353504b..7edf41f 100644 --- a/casic_video_283_server/pom.xml +++ b/casic_video_283_server/pom.xml @@ -63,6 +63,10 @@ knife4j-spring-boot-starter ${knife4j.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java index 1795cf1..fa6b41e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java @@ -1,9 +1,24 @@ package com.casic.missiles.modular.system.controller; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IAlarmService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ResponseBody; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; /** *

@@ -13,8 +28,42 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "报警管理接口") @Controller -@RequestMapping("/system/alarm") -public class AlarmController { +@RequestMapping("/alarm") +@RequiredArgsConstructor +public class AlarmController extends BaseController { + private final IAlarmService alarmService; + + @ApiOperation("报警分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "alarmLocation", value = "报警位置",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmType", value = "报警类型",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmStartTime", value = "报警开始时间",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmEndTime", value = "报警结束时间",dataType = "String", paramType = "query") + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String alarmLocation,String alarmType,String alarmStartTime,String alarmEndTime){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(alarmLocation)){ + queryWrapper.like("alarm.ALARM_LOCATION",alarmLocation); + } + if(StrUtil.isNotEmpty(alarmType)){ + queryWrapper.eq("alarm.ALARM_TYPE",alarmType); + } + if(StrUtil.isNotEmpty(alarmStartTime)){ + queryWrapper.ge("alarm.ALARM_TIME",alarmStartTime); + } + if(StrUtil.isNotEmpty(alarmEndTime)){ + queryWrapper.le("alarm.ALARM_TIME",alarmEndTime); + } + page = alarmService.listPage(page,queryWrapper); + return ResponseData.success(super.packForBT(page)); + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java index aa50d78..4a9243e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java @@ -1,10 +1,25 @@ package com.casic.missiles.modular.system.controller; -import org.springframework.web.bind.annotation.RequestMapping; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IDeviceService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; import org.springframework.stereotype.Controller; +import java.util.List; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; + /** *

* 设备记录表 前端控制器 @@ -13,8 +28,92 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "设备管理接口") @Controller -@RequestMapping("/system/device") -public class DeviceController { +@RequestMapping("/device") +@RequiredArgsConstructor +public class DeviceController extends BaseController { + + private final IDeviceService deviceService; + private final AbstractDictService dictService; + + @ApiOperation("新增设备") + @PostMapping("add") + @ResponseBody + public Object add(@RequestBody Device device){ + deviceService.save(device); + return ResponseData.success(); + } + + @ApiOperation("编辑设备") + @PostMapping("update") + @ResponseBody + public Object update(@RequestBody Device device){ + deviceService.updateById(device); + return ResponseData.success(); + } + + @ApiOperation("删除设备") + @PostMapping("delete") + @ResponseBody + public Object delete(@ApiParam(value = "设备id",example = "0")@RequestParam Long deviceId){ + deviceService.removeById(deviceId); + return ResponseData.success(); + } + + + @ApiOperation("设备分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String deviceName){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + page = deviceService.page(page,queryWrapper); + wrapperDevice(page.getRecords()); + return ResponseData.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "location", value = "设备位置",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("list") + @ResponseBody + public Object list(String deviceName,String location){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + if(StrUtil.isNotEmpty(location)){ + queryWrapper.like("LOCATION",location); + } + List deviceList = deviceService.list(queryWrapper); + wrapperDevice(deviceList); + return ResponseData.success(deviceList); + } + + private void wrapperDevice(List page) { + for (Device device : page) { + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setStatusName(dictService.getDictNameByCode("deviceStatus", device.getStatus())); + } + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setConnectTypeName(dictService.getDictNameByCode("connectType", device.getConnectType())); + } + } + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java new file mode 100644 index 0000000..f2fc224 --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.controller; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.dto.AlarmUpload; +import com.casic.missiles.modular.system.dto.PeopleUpload; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.service.IAlarmService; +import com.casic.missiles.modular.system.websocket.WebSocket; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.Date; + +@Api(tags = "数据上报接口") +@Controller +@RequestMapping("/upload") +@RequiredArgsConstructor +public class UploadController { + + private final IAlarmService alarmService; + private final WebSocket webSocket; + + @ApiOperation("报警上报") + @PostMapping("alarm") + @ResponseBody + public Object alarmUpload(@RequestBody AlarmUpload alarmUpload){ + if(StrUtil.isEmpty(alarmUpload.getAlarmTime())){ + alarmUpload.setAlarmTime(DateUtil.formatDateTime(new Date())); + } + Alarm alarm = alarmService.alarmUpload(alarmUpload); + webSocket.sendAllMessage(JSONObject.toJSONString(alarmUpload)); + return ResponseData.success(); + } + + @ApiOperation("工作台人数上报") + @PostMapping("people") + @ResponseBody + public Object peopleUpload(@RequestBody PeopleUpload peopleUpload){ + webSocket.sendAllMessage(JSONObject.toJSONString(peopleUpload)); + return ResponseData.success(); + } +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java new file mode 100644 index 0000000..3cb6e6e --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.system.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "AlarmUpload",description = "报警上报") +public class AlarmUpload { + + @ApiModelProperty(value = "IP",required = true) + private String ip; + + @ApiModelProperty(value = "端口号",required = true) + private String port; + + @ApiModelProperty(value = "通道号") + private Integer channelNo; + + @ApiModelProperty(value = "报警类型",required = true) + private String alarmType; + + @ApiModelProperty(value = "报警图片(base64,不包含头)") + private String alarmImage; + + @ApiModelProperty(value = "报警时间(可以不传,默认为上传时间)") + private String alarmTime; + + @ApiModelProperty(value = "报警内容") + private String alarmContent; + + @ApiModelProperty(value = "报警人数") + private Integer peopleCount; +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java new file mode 100644 index 0000000..d7cb90e --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.system.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "PeopleUpload",description = "监测人数上报") +public class PeopleUpload { + + @ApiModelProperty(value = "IP",required = true) + private String ip; + + @ApiModelProperty(value = "端口号",required = true) + private String port; + + @ApiModelProperty(value = "通道号") + private Integer channelNo; + + @ApiModelProperty(value = "监测人数") + private Integer peopleCount; +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java index 4d2b7ef..c7db111 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java @@ -1,13 +1,15 @@ package com.casic.missiles.modular.system.entity; +import com.alibaba.fastjson.annotation.JSONField; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; -import java.time.LocalDateTime; import java.util.Date; /** @@ -18,6 +20,7 @@ * @author zyj * @since 2023-05-25 */ +@ApiModel("Alarm") @Data @TableName("bus_alarm") public class Alarm implements Serializable { @@ -33,58 +36,87 @@ /** * 设备ID */ + @ApiModelProperty(value = "设备ID",example = "0") @TableField("DEVICE_ID") private Long deviceId; /** * 报警类型 */ + @ApiModelProperty(value = "报警类型(字典值)") @TableField("ALARM_TYPE") private String alarmType; /** * 报警时间 */ + @ApiModelProperty(value = "报警时间") @TableField("ALARM_TIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date alarmTime; /** * 报警状态 */ + @ApiModelProperty(value = "报警状态(字典值)") @TableField("ALARM_STATUS") private String alarmStatus; /** * 报警位置 */ + @ApiModelProperty(value = "报警位置") @TableField("ALARM_LOCATION") private String alarmLocation; /** * 报警图片 */ + @ApiModelProperty(value = "报警图片(url)") @TableField("ALARM_IMAGE") private String alarmImage; /** * 视频通道号 */ + @ApiModelProperty(value = "视频通道号(预留)") @TableField("CHANNEL_NO") private Integer channelNo; /** * 报警内容 */ + @ApiModelProperty(value = "报警内容(预留)") @TableField("ALARM_CONTENT") private String alarmContent; /** * 消警时间 */ + @ApiModelProperty(value = "消警时间") @TableField("CANCEL_TIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date cancelTime; + /** + * 消警时间 + */ + @ApiModelProperty(value = "报警人数") + @TableField("PEOPLE_COUNT") + private Integer peopleCount; + + + @ApiModelProperty(value = "报警设备名称") + @TableField(exist = false) + private String deviceName; + @ApiModelProperty(value = "报警类型名称") + @TableField(exist = false) + private String alarmTypeName; + @ApiModelProperty(value = "报警状态名称") + @TableField(exist = false) + private String alarmStatusName; + @Override public String toString() { return "Alarm{" + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java index ea7db5f..0f8ba79 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; @@ -16,6 +18,7 @@ * @author zyj * @since 2023-05-25 */ +@ApiModel("Device") @Data @TableName("bus_device") public class Device implements Serializable { @@ -31,66 +34,82 @@ /** * 设备名称 */ + @ApiModelProperty(value = "设备名称") @TableField("DEVICE_NAME") private String deviceName; /** * IP */ + @ApiModelProperty(value = "IP") @TableField("IP") private String ip; /** * 端口 */ + @ApiModelProperty(value = "端口") @TableField("PORT") private String port; /** * 用户名 */ + @ApiModelProperty(value = "用户名") @TableField("USER_NAME") private String userName; /** * 密码 */ + @ApiModelProperty(value = "密码") @TableField("PASSWORD") private String password; /** * 连接类型 */ + @ApiModelProperty(value = "连接类型(字典值)") @TableField("CONNECT_TYPE") private String connectType; /** * 位置 */ + @ApiModelProperty(value = "位置") @TableField("LOCATION") - private String location; /** * 设备状态 */ + @ApiModelProperty(value = "设备状态(字典值)") @TableField("STATUS") - private String status; /** * 报警分组 */ + @ApiModelProperty(value = "报警分组",example = "0") @TableField("ALARM_GROUP") - private Long alarmGroup; /** * 视频通道数(预留) */ + @ApiModelProperty(value = "视频通道数(预留)") @TableField("CHANNEL_NUM") private Integer channelNum; + + @ApiModelProperty(value = "连接类型名称") + @TableField(exist = false) + private String connectTypeName; + + @ApiModelProperty(value = "设备状态名称") + @TableField(exist = false) + private String statusName; + @Override public String toString() { return "Device{" + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java index ea4c8be..c235dd8 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java @@ -1,7 +1,10 @@ package com.casic.missiles.modular.system.mapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.system.entity.Alarm; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; /** *

@@ -13,4 +16,6 @@ */ public interface AlarmMapper extends BaseMapper { + Page listPage(@Param("page")Page page, @Param("ew")QueryWrapper queryWrapper); + } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml index 25cb4ab..703fcc5 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml @@ -2,4 +2,25 @@ + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java index 8bc01f4..469085f 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java @@ -1,5 +1,8 @@ package com.casic.missiles.modular.system.service; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.system.dto.AlarmUpload; import com.casic.missiles.modular.system.entity.Alarm; import com.baomidou.mybatisplus.extension.service.IService; @@ -13,4 +16,9 @@ */ public interface IAlarmService extends IService { + Page listPage(Page page, QueryWrapper queryWrapper); + + Alarm alarmUpload(AlarmUpload alarmUpload); + + } diff --git a/casic_video_283_server/pom.xml b/casic_video_283_server/pom.xml index 353504b..7edf41f 100644 --- a/casic_video_283_server/pom.xml +++ b/casic_video_283_server/pom.xml @@ -63,6 +63,10 @@ knife4j-spring-boot-starter ${knife4j.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java index 1795cf1..fa6b41e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java @@ -1,9 +1,24 @@ package com.casic.missiles.modular.system.controller; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IAlarmService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ResponseBody; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; /** *

@@ -13,8 +28,42 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "报警管理接口") @Controller -@RequestMapping("/system/alarm") -public class AlarmController { +@RequestMapping("/alarm") +@RequiredArgsConstructor +public class AlarmController extends BaseController { + private final IAlarmService alarmService; + + @ApiOperation("报警分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "alarmLocation", value = "报警位置",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmType", value = "报警类型",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmStartTime", value = "报警开始时间",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmEndTime", value = "报警结束时间",dataType = "String", paramType = "query") + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String alarmLocation,String alarmType,String alarmStartTime,String alarmEndTime){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(alarmLocation)){ + queryWrapper.like("alarm.ALARM_LOCATION",alarmLocation); + } + if(StrUtil.isNotEmpty(alarmType)){ + queryWrapper.eq("alarm.ALARM_TYPE",alarmType); + } + if(StrUtil.isNotEmpty(alarmStartTime)){ + queryWrapper.ge("alarm.ALARM_TIME",alarmStartTime); + } + if(StrUtil.isNotEmpty(alarmEndTime)){ + queryWrapper.le("alarm.ALARM_TIME",alarmEndTime); + } + page = alarmService.listPage(page,queryWrapper); + return ResponseData.success(super.packForBT(page)); + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java index aa50d78..4a9243e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java @@ -1,10 +1,25 @@ package com.casic.missiles.modular.system.controller; -import org.springframework.web.bind.annotation.RequestMapping; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IDeviceService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; import org.springframework.stereotype.Controller; +import java.util.List; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; + /** *

* 设备记录表 前端控制器 @@ -13,8 +28,92 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "设备管理接口") @Controller -@RequestMapping("/system/device") -public class DeviceController { +@RequestMapping("/device") +@RequiredArgsConstructor +public class DeviceController extends BaseController { + + private final IDeviceService deviceService; + private final AbstractDictService dictService; + + @ApiOperation("新增设备") + @PostMapping("add") + @ResponseBody + public Object add(@RequestBody Device device){ + deviceService.save(device); + return ResponseData.success(); + } + + @ApiOperation("编辑设备") + @PostMapping("update") + @ResponseBody + public Object update(@RequestBody Device device){ + deviceService.updateById(device); + return ResponseData.success(); + } + + @ApiOperation("删除设备") + @PostMapping("delete") + @ResponseBody + public Object delete(@ApiParam(value = "设备id",example = "0")@RequestParam Long deviceId){ + deviceService.removeById(deviceId); + return ResponseData.success(); + } + + + @ApiOperation("设备分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String deviceName){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + page = deviceService.page(page,queryWrapper); + wrapperDevice(page.getRecords()); + return ResponseData.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "location", value = "设备位置",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("list") + @ResponseBody + public Object list(String deviceName,String location){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + if(StrUtil.isNotEmpty(location)){ + queryWrapper.like("LOCATION",location); + } + List deviceList = deviceService.list(queryWrapper); + wrapperDevice(deviceList); + return ResponseData.success(deviceList); + } + + private void wrapperDevice(List page) { + for (Device device : page) { + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setStatusName(dictService.getDictNameByCode("deviceStatus", device.getStatus())); + } + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setConnectTypeName(dictService.getDictNameByCode("connectType", device.getConnectType())); + } + } + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java new file mode 100644 index 0000000..f2fc224 --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.controller; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.dto.AlarmUpload; +import com.casic.missiles.modular.system.dto.PeopleUpload; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.service.IAlarmService; +import com.casic.missiles.modular.system.websocket.WebSocket; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.Date; + +@Api(tags = "数据上报接口") +@Controller +@RequestMapping("/upload") +@RequiredArgsConstructor +public class UploadController { + + private final IAlarmService alarmService; + private final WebSocket webSocket; + + @ApiOperation("报警上报") + @PostMapping("alarm") + @ResponseBody + public Object alarmUpload(@RequestBody AlarmUpload alarmUpload){ + if(StrUtil.isEmpty(alarmUpload.getAlarmTime())){ + alarmUpload.setAlarmTime(DateUtil.formatDateTime(new Date())); + } + Alarm alarm = alarmService.alarmUpload(alarmUpload); + webSocket.sendAllMessage(JSONObject.toJSONString(alarmUpload)); + return ResponseData.success(); + } + + @ApiOperation("工作台人数上报") + @PostMapping("people") + @ResponseBody + public Object peopleUpload(@RequestBody PeopleUpload peopleUpload){ + webSocket.sendAllMessage(JSONObject.toJSONString(peopleUpload)); + return ResponseData.success(); + } +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java new file mode 100644 index 0000000..3cb6e6e --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.system.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "AlarmUpload",description = "报警上报") +public class AlarmUpload { + + @ApiModelProperty(value = "IP",required = true) + private String ip; + + @ApiModelProperty(value = "端口号",required = true) + private String port; + + @ApiModelProperty(value = "通道号") + private Integer channelNo; + + @ApiModelProperty(value = "报警类型",required = true) + private String alarmType; + + @ApiModelProperty(value = "报警图片(base64,不包含头)") + private String alarmImage; + + @ApiModelProperty(value = "报警时间(可以不传,默认为上传时间)") + private String alarmTime; + + @ApiModelProperty(value = "报警内容") + private String alarmContent; + + @ApiModelProperty(value = "报警人数") + private Integer peopleCount; +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java new file mode 100644 index 0000000..d7cb90e --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.system.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "PeopleUpload",description = "监测人数上报") +public class PeopleUpload { + + @ApiModelProperty(value = "IP",required = true) + private String ip; + + @ApiModelProperty(value = "端口号",required = true) + private String port; + + @ApiModelProperty(value = "通道号") + private Integer channelNo; + + @ApiModelProperty(value = "监测人数") + private Integer peopleCount; +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java index 4d2b7ef..c7db111 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java @@ -1,13 +1,15 @@ package com.casic.missiles.modular.system.entity; +import com.alibaba.fastjson.annotation.JSONField; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; -import java.time.LocalDateTime; import java.util.Date; /** @@ -18,6 +20,7 @@ * @author zyj * @since 2023-05-25 */ +@ApiModel("Alarm") @Data @TableName("bus_alarm") public class Alarm implements Serializable { @@ -33,58 +36,87 @@ /** * 设备ID */ + @ApiModelProperty(value = "设备ID",example = "0") @TableField("DEVICE_ID") private Long deviceId; /** * 报警类型 */ + @ApiModelProperty(value = "报警类型(字典值)") @TableField("ALARM_TYPE") private String alarmType; /** * 报警时间 */ + @ApiModelProperty(value = "报警时间") @TableField("ALARM_TIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date alarmTime; /** * 报警状态 */ + @ApiModelProperty(value = "报警状态(字典值)") @TableField("ALARM_STATUS") private String alarmStatus; /** * 报警位置 */ + @ApiModelProperty(value = "报警位置") @TableField("ALARM_LOCATION") private String alarmLocation; /** * 报警图片 */ + @ApiModelProperty(value = "报警图片(url)") @TableField("ALARM_IMAGE") private String alarmImage; /** * 视频通道号 */ + @ApiModelProperty(value = "视频通道号(预留)") @TableField("CHANNEL_NO") private Integer channelNo; /** * 报警内容 */ + @ApiModelProperty(value = "报警内容(预留)") @TableField("ALARM_CONTENT") private String alarmContent; /** * 消警时间 */ + @ApiModelProperty(value = "消警时间") @TableField("CANCEL_TIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date cancelTime; + /** + * 消警时间 + */ + @ApiModelProperty(value = "报警人数") + @TableField("PEOPLE_COUNT") + private Integer peopleCount; + + + @ApiModelProperty(value = "报警设备名称") + @TableField(exist = false) + private String deviceName; + @ApiModelProperty(value = "报警类型名称") + @TableField(exist = false) + private String alarmTypeName; + @ApiModelProperty(value = "报警状态名称") + @TableField(exist = false) + private String alarmStatusName; + @Override public String toString() { return "Alarm{" + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java index ea7db5f..0f8ba79 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; @@ -16,6 +18,7 @@ * @author zyj * @since 2023-05-25 */ +@ApiModel("Device") @Data @TableName("bus_device") public class Device implements Serializable { @@ -31,66 +34,82 @@ /** * 设备名称 */ + @ApiModelProperty(value = "设备名称") @TableField("DEVICE_NAME") private String deviceName; /** * IP */ + @ApiModelProperty(value = "IP") @TableField("IP") private String ip; /** * 端口 */ + @ApiModelProperty(value = "端口") @TableField("PORT") private String port; /** * 用户名 */ + @ApiModelProperty(value = "用户名") @TableField("USER_NAME") private String userName; /** * 密码 */ + @ApiModelProperty(value = "密码") @TableField("PASSWORD") private String password; /** * 连接类型 */ + @ApiModelProperty(value = "连接类型(字典值)") @TableField("CONNECT_TYPE") private String connectType; /** * 位置 */ + @ApiModelProperty(value = "位置") @TableField("LOCATION") - private String location; /** * 设备状态 */ + @ApiModelProperty(value = "设备状态(字典值)") @TableField("STATUS") - private String status; /** * 报警分组 */ + @ApiModelProperty(value = "报警分组",example = "0") @TableField("ALARM_GROUP") - private Long alarmGroup; /** * 视频通道数(预留) */ + @ApiModelProperty(value = "视频通道数(预留)") @TableField("CHANNEL_NUM") private Integer channelNum; + + @ApiModelProperty(value = "连接类型名称") + @TableField(exist = false) + private String connectTypeName; + + @ApiModelProperty(value = "设备状态名称") + @TableField(exist = false) + private String statusName; + @Override public String toString() { return "Device{" + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java index ea4c8be..c235dd8 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java @@ -1,7 +1,10 @@ package com.casic.missiles.modular.system.mapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.system.entity.Alarm; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; /** *

@@ -13,4 +16,6 @@ */ public interface AlarmMapper extends BaseMapper { + Page listPage(@Param("page")Page page, @Param("ew")QueryWrapper queryWrapper); + } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml index 25cb4ab..703fcc5 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml @@ -2,4 +2,25 @@ + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java index 8bc01f4..469085f 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java @@ -1,5 +1,8 @@ package com.casic.missiles.modular.system.service; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.system.dto.AlarmUpload; import com.casic.missiles.modular.system.entity.Alarm; import com.baomidou.mybatisplus.extension.service.IService; @@ -13,4 +16,9 @@ */ public interface IAlarmService extends IService { + Page listPage(Page page, QueryWrapper queryWrapper); + + Alarm alarmUpload(AlarmUpload alarmUpload); + + } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IDeviceService.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IDeviceService.java index 00a421d..c851c83 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IDeviceService.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IDeviceService.java @@ -13,4 +13,6 @@ */ public interface IDeviceService extends IService { + Device selectDevice(String ip,String port,Integer channelNo); + } diff --git a/casic_video_283_server/pom.xml b/casic_video_283_server/pom.xml index 353504b..7edf41f 100644 --- a/casic_video_283_server/pom.xml +++ b/casic_video_283_server/pom.xml @@ -63,6 +63,10 @@ knife4j-spring-boot-starter ${knife4j.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java index 1795cf1..fa6b41e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java @@ -1,9 +1,24 @@ package com.casic.missiles.modular.system.controller; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IAlarmService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ResponseBody; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; /** *

@@ -13,8 +28,42 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "报警管理接口") @Controller -@RequestMapping("/system/alarm") -public class AlarmController { +@RequestMapping("/alarm") +@RequiredArgsConstructor +public class AlarmController extends BaseController { + private final IAlarmService alarmService; + + @ApiOperation("报警分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "alarmLocation", value = "报警位置",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmType", value = "报警类型",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmStartTime", value = "报警开始时间",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmEndTime", value = "报警结束时间",dataType = "String", paramType = "query") + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String alarmLocation,String alarmType,String alarmStartTime,String alarmEndTime){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(alarmLocation)){ + queryWrapper.like("alarm.ALARM_LOCATION",alarmLocation); + } + if(StrUtil.isNotEmpty(alarmType)){ + queryWrapper.eq("alarm.ALARM_TYPE",alarmType); + } + if(StrUtil.isNotEmpty(alarmStartTime)){ + queryWrapper.ge("alarm.ALARM_TIME",alarmStartTime); + } + if(StrUtil.isNotEmpty(alarmEndTime)){ + queryWrapper.le("alarm.ALARM_TIME",alarmEndTime); + } + page = alarmService.listPage(page,queryWrapper); + return ResponseData.success(super.packForBT(page)); + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java index aa50d78..4a9243e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java @@ -1,10 +1,25 @@ package com.casic.missiles.modular.system.controller; -import org.springframework.web.bind.annotation.RequestMapping; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IDeviceService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; import org.springframework.stereotype.Controller; +import java.util.List; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; + /** *

* 设备记录表 前端控制器 @@ -13,8 +28,92 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "设备管理接口") @Controller -@RequestMapping("/system/device") -public class DeviceController { +@RequestMapping("/device") +@RequiredArgsConstructor +public class DeviceController extends BaseController { + + private final IDeviceService deviceService; + private final AbstractDictService dictService; + + @ApiOperation("新增设备") + @PostMapping("add") + @ResponseBody + public Object add(@RequestBody Device device){ + deviceService.save(device); + return ResponseData.success(); + } + + @ApiOperation("编辑设备") + @PostMapping("update") + @ResponseBody + public Object update(@RequestBody Device device){ + deviceService.updateById(device); + return ResponseData.success(); + } + + @ApiOperation("删除设备") + @PostMapping("delete") + @ResponseBody + public Object delete(@ApiParam(value = "设备id",example = "0")@RequestParam Long deviceId){ + deviceService.removeById(deviceId); + return ResponseData.success(); + } + + + @ApiOperation("设备分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String deviceName){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + page = deviceService.page(page,queryWrapper); + wrapperDevice(page.getRecords()); + return ResponseData.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "location", value = "设备位置",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("list") + @ResponseBody + public Object list(String deviceName,String location){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + if(StrUtil.isNotEmpty(location)){ + queryWrapper.like("LOCATION",location); + } + List deviceList = deviceService.list(queryWrapper); + wrapperDevice(deviceList); + return ResponseData.success(deviceList); + } + + private void wrapperDevice(List page) { + for (Device device : page) { + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setStatusName(dictService.getDictNameByCode("deviceStatus", device.getStatus())); + } + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setConnectTypeName(dictService.getDictNameByCode("connectType", device.getConnectType())); + } + } + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java new file mode 100644 index 0000000..f2fc224 --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.controller; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.dto.AlarmUpload; +import com.casic.missiles.modular.system.dto.PeopleUpload; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.service.IAlarmService; +import com.casic.missiles.modular.system.websocket.WebSocket; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.Date; + +@Api(tags = "数据上报接口") +@Controller +@RequestMapping("/upload") +@RequiredArgsConstructor +public class UploadController { + + private final IAlarmService alarmService; + private final WebSocket webSocket; + + @ApiOperation("报警上报") + @PostMapping("alarm") + @ResponseBody + public Object alarmUpload(@RequestBody AlarmUpload alarmUpload){ + if(StrUtil.isEmpty(alarmUpload.getAlarmTime())){ + alarmUpload.setAlarmTime(DateUtil.formatDateTime(new Date())); + } + Alarm alarm = alarmService.alarmUpload(alarmUpload); + webSocket.sendAllMessage(JSONObject.toJSONString(alarmUpload)); + return ResponseData.success(); + } + + @ApiOperation("工作台人数上报") + @PostMapping("people") + @ResponseBody + public Object peopleUpload(@RequestBody PeopleUpload peopleUpload){ + webSocket.sendAllMessage(JSONObject.toJSONString(peopleUpload)); + return ResponseData.success(); + } +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java new file mode 100644 index 0000000..3cb6e6e --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.system.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "AlarmUpload",description = "报警上报") +public class AlarmUpload { + + @ApiModelProperty(value = "IP",required = true) + private String ip; + + @ApiModelProperty(value = "端口号",required = true) + private String port; + + @ApiModelProperty(value = "通道号") + private Integer channelNo; + + @ApiModelProperty(value = "报警类型",required = true) + private String alarmType; + + @ApiModelProperty(value = "报警图片(base64,不包含头)") + private String alarmImage; + + @ApiModelProperty(value = "报警时间(可以不传,默认为上传时间)") + private String alarmTime; + + @ApiModelProperty(value = "报警内容") + private String alarmContent; + + @ApiModelProperty(value = "报警人数") + private Integer peopleCount; +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java new file mode 100644 index 0000000..d7cb90e --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.system.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "PeopleUpload",description = "监测人数上报") +public class PeopleUpload { + + @ApiModelProperty(value = "IP",required = true) + private String ip; + + @ApiModelProperty(value = "端口号",required = true) + private String port; + + @ApiModelProperty(value = "通道号") + private Integer channelNo; + + @ApiModelProperty(value = "监测人数") + private Integer peopleCount; +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java index 4d2b7ef..c7db111 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java @@ -1,13 +1,15 @@ package com.casic.missiles.modular.system.entity; +import com.alibaba.fastjson.annotation.JSONField; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; -import java.time.LocalDateTime; import java.util.Date; /** @@ -18,6 +20,7 @@ * @author zyj * @since 2023-05-25 */ +@ApiModel("Alarm") @Data @TableName("bus_alarm") public class Alarm implements Serializable { @@ -33,58 +36,87 @@ /** * 设备ID */ + @ApiModelProperty(value = "设备ID",example = "0") @TableField("DEVICE_ID") private Long deviceId; /** * 报警类型 */ + @ApiModelProperty(value = "报警类型(字典值)") @TableField("ALARM_TYPE") private String alarmType; /** * 报警时间 */ + @ApiModelProperty(value = "报警时间") @TableField("ALARM_TIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date alarmTime; /** * 报警状态 */ + @ApiModelProperty(value = "报警状态(字典值)") @TableField("ALARM_STATUS") private String alarmStatus; /** * 报警位置 */ + @ApiModelProperty(value = "报警位置") @TableField("ALARM_LOCATION") private String alarmLocation; /** * 报警图片 */ + @ApiModelProperty(value = "报警图片(url)") @TableField("ALARM_IMAGE") private String alarmImage; /** * 视频通道号 */ + @ApiModelProperty(value = "视频通道号(预留)") @TableField("CHANNEL_NO") private Integer channelNo; /** * 报警内容 */ + @ApiModelProperty(value = "报警内容(预留)") @TableField("ALARM_CONTENT") private String alarmContent; /** * 消警时间 */ + @ApiModelProperty(value = "消警时间") @TableField("CANCEL_TIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date cancelTime; + /** + * 消警时间 + */ + @ApiModelProperty(value = "报警人数") + @TableField("PEOPLE_COUNT") + private Integer peopleCount; + + + @ApiModelProperty(value = "报警设备名称") + @TableField(exist = false) + private String deviceName; + @ApiModelProperty(value = "报警类型名称") + @TableField(exist = false) + private String alarmTypeName; + @ApiModelProperty(value = "报警状态名称") + @TableField(exist = false) + private String alarmStatusName; + @Override public String toString() { return "Alarm{" + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java index ea7db5f..0f8ba79 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; @@ -16,6 +18,7 @@ * @author zyj * @since 2023-05-25 */ +@ApiModel("Device") @Data @TableName("bus_device") public class Device implements Serializable { @@ -31,66 +34,82 @@ /** * 设备名称 */ + @ApiModelProperty(value = "设备名称") @TableField("DEVICE_NAME") private String deviceName; /** * IP */ + @ApiModelProperty(value = "IP") @TableField("IP") private String ip; /** * 端口 */ + @ApiModelProperty(value = "端口") @TableField("PORT") private String port; /** * 用户名 */ + @ApiModelProperty(value = "用户名") @TableField("USER_NAME") private String userName; /** * 密码 */ + @ApiModelProperty(value = "密码") @TableField("PASSWORD") private String password; /** * 连接类型 */ + @ApiModelProperty(value = "连接类型(字典值)") @TableField("CONNECT_TYPE") private String connectType; /** * 位置 */ + @ApiModelProperty(value = "位置") @TableField("LOCATION") - private String location; /** * 设备状态 */ + @ApiModelProperty(value = "设备状态(字典值)") @TableField("STATUS") - private String status; /** * 报警分组 */ + @ApiModelProperty(value = "报警分组",example = "0") @TableField("ALARM_GROUP") - private Long alarmGroup; /** * 视频通道数(预留) */ + @ApiModelProperty(value = "视频通道数(预留)") @TableField("CHANNEL_NUM") private Integer channelNum; + + @ApiModelProperty(value = "连接类型名称") + @TableField(exist = false) + private String connectTypeName; + + @ApiModelProperty(value = "设备状态名称") + @TableField(exist = false) + private String statusName; + @Override public String toString() { return "Device{" + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java index ea4c8be..c235dd8 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java @@ -1,7 +1,10 @@ package com.casic.missiles.modular.system.mapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.system.entity.Alarm; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; /** *

@@ -13,4 +16,6 @@ */ public interface AlarmMapper extends BaseMapper { + Page listPage(@Param("page")Page page, @Param("ew")QueryWrapper queryWrapper); + } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml index 25cb4ab..703fcc5 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml @@ -2,4 +2,25 @@ + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java index 8bc01f4..469085f 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java @@ -1,5 +1,8 @@ package com.casic.missiles.modular.system.service; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.system.dto.AlarmUpload; import com.casic.missiles.modular.system.entity.Alarm; import com.baomidou.mybatisplus.extension.service.IService; @@ -13,4 +16,9 @@ */ public interface IAlarmService extends IService { + Page listPage(Page page, QueryWrapper queryWrapper); + + Alarm alarmUpload(AlarmUpload alarmUpload); + + } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IDeviceService.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IDeviceService.java index 00a421d..c851c83 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IDeviceService.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IDeviceService.java @@ -13,4 +13,6 @@ */ public interface IDeviceService extends IService { + Device selectDevice(String ip,String port,Integer channelNo); + } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/AlarmServiceImpl.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/AlarmServiceImpl.java index 6e5959b..dead3c8 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/AlarmServiceImpl.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/AlarmServiceImpl.java @@ -1,9 +1,20 @@ package com.casic.missiles.modular.system.service.impl; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.modular.system.dto.AlarmUpload; import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.entity.Device; import com.casic.missiles.modular.system.mapper.AlarmMapper; import com.casic.missiles.modular.system.service.IAlarmService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.service.ICasicFileService; +import com.casic.missiles.modular.system.service.IDeviceService; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; /** @@ -15,6 +26,51 @@ * @since 2023-05-25 */ @Service +@RequiredArgsConstructor public class AlarmServiceImpl extends ServiceImpl implements IAlarmService { + private final AbstractDictService dictService; + private final IDeviceService deviceService; + private final ICasicFileService fileService; + + private static final String ALARM_STATUS_ON = "0"; + + @Override + public Page listPage(Page page, QueryWrapper queryWrapper) { + page = this.baseMapper.listPage(page, queryWrapper); + for (Alarm alarm : page.getRecords()) { + if(StrUtil.isNotEmpty(alarm.getAlarmType())){ + alarm.setAlarmTypeName(dictService.getDictNameByCode("alarmType",alarm.getAlarmType())); + } + if(StrUtil.isNotEmpty(alarm.getAlarmStatus())){ + alarm.setAlarmStatusName(dictService.getDictNameByCode("alarmStatus",alarm.getAlarmStatus())); + } + } + return page; + } + + @Override + public Alarm alarmUpload(AlarmUpload alarmUpload) { + Alarm alarm = new Alarm(); + if(StrUtil.isAllNotEmpty(alarmUpload.getIp(),alarmUpload.getPort())){ + Device device = deviceService.selectDevice(alarmUpload.getIp(),alarmUpload.getPort(),alarmUpload.getChannelNo()); + if(ObjectUtil.isNotEmpty(device)){ + alarm.setDeviceId(device.getId()); + alarm.setAlarmLocation(device.getLocation()); + } + } + alarm.setAlarmType(alarmUpload.getAlarmType()); + alarm.setAlarmTime(DateUtil.parseDateTime(alarmUpload.getAlarmTime())); + alarm.setAlarmStatus(ALARM_STATUS_ON); + if(StrUtil.isNotEmpty(alarmUpload.getAlarmImage())){ + String imgBase64 = "data:image/jpeg;base64," + alarmUpload.getAlarmImage(); + String imageUrl = fileService.saveFile(imgBase64); + alarm.setAlarmImage(imageUrl); + } + alarm.setChannelNo(alarmUpload.getChannelNo()); + alarm.setPeopleCount(alarmUpload.getPeopleCount()); + alarm.setAlarmContent(alarmUpload.getAlarmContent()); + this.save(alarm); + return alarm; + } } diff --git a/casic_video_283_server/pom.xml b/casic_video_283_server/pom.xml index 353504b..7edf41f 100644 --- a/casic_video_283_server/pom.xml +++ b/casic_video_283_server/pom.xml @@ -63,6 +63,10 @@ knife4j-spring-boot-starter ${knife4j.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java index 1795cf1..fa6b41e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java @@ -1,9 +1,24 @@ package com.casic.missiles.modular.system.controller; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IAlarmService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ResponseBody; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; /** *

@@ -13,8 +28,42 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "报警管理接口") @Controller -@RequestMapping("/system/alarm") -public class AlarmController { +@RequestMapping("/alarm") +@RequiredArgsConstructor +public class AlarmController extends BaseController { + private final IAlarmService alarmService; + + @ApiOperation("报警分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "alarmLocation", value = "报警位置",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmType", value = "报警类型",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmStartTime", value = "报警开始时间",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmEndTime", value = "报警结束时间",dataType = "String", paramType = "query") + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String alarmLocation,String alarmType,String alarmStartTime,String alarmEndTime){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(alarmLocation)){ + queryWrapper.like("alarm.ALARM_LOCATION",alarmLocation); + } + if(StrUtil.isNotEmpty(alarmType)){ + queryWrapper.eq("alarm.ALARM_TYPE",alarmType); + } + if(StrUtil.isNotEmpty(alarmStartTime)){ + queryWrapper.ge("alarm.ALARM_TIME",alarmStartTime); + } + if(StrUtil.isNotEmpty(alarmEndTime)){ + queryWrapper.le("alarm.ALARM_TIME",alarmEndTime); + } + page = alarmService.listPage(page,queryWrapper); + return ResponseData.success(super.packForBT(page)); + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java index aa50d78..4a9243e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java @@ -1,10 +1,25 @@ package com.casic.missiles.modular.system.controller; -import org.springframework.web.bind.annotation.RequestMapping; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IDeviceService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; import org.springframework.stereotype.Controller; +import java.util.List; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; + /** *

* 设备记录表 前端控制器 @@ -13,8 +28,92 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "设备管理接口") @Controller -@RequestMapping("/system/device") -public class DeviceController { +@RequestMapping("/device") +@RequiredArgsConstructor +public class DeviceController extends BaseController { + + private final IDeviceService deviceService; + private final AbstractDictService dictService; + + @ApiOperation("新增设备") + @PostMapping("add") + @ResponseBody + public Object add(@RequestBody Device device){ + deviceService.save(device); + return ResponseData.success(); + } + + @ApiOperation("编辑设备") + @PostMapping("update") + @ResponseBody + public Object update(@RequestBody Device device){ + deviceService.updateById(device); + return ResponseData.success(); + } + + @ApiOperation("删除设备") + @PostMapping("delete") + @ResponseBody + public Object delete(@ApiParam(value = "设备id",example = "0")@RequestParam Long deviceId){ + deviceService.removeById(deviceId); + return ResponseData.success(); + } + + + @ApiOperation("设备分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String deviceName){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + page = deviceService.page(page,queryWrapper); + wrapperDevice(page.getRecords()); + return ResponseData.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "location", value = "设备位置",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("list") + @ResponseBody + public Object list(String deviceName,String location){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + if(StrUtil.isNotEmpty(location)){ + queryWrapper.like("LOCATION",location); + } + List deviceList = deviceService.list(queryWrapper); + wrapperDevice(deviceList); + return ResponseData.success(deviceList); + } + + private void wrapperDevice(List page) { + for (Device device : page) { + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setStatusName(dictService.getDictNameByCode("deviceStatus", device.getStatus())); + } + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setConnectTypeName(dictService.getDictNameByCode("connectType", device.getConnectType())); + } + } + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java new file mode 100644 index 0000000..f2fc224 --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.controller; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.dto.AlarmUpload; +import com.casic.missiles.modular.system.dto.PeopleUpload; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.service.IAlarmService; +import com.casic.missiles.modular.system.websocket.WebSocket; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.Date; + +@Api(tags = "数据上报接口") +@Controller +@RequestMapping("/upload") +@RequiredArgsConstructor +public class UploadController { + + private final IAlarmService alarmService; + private final WebSocket webSocket; + + @ApiOperation("报警上报") + @PostMapping("alarm") + @ResponseBody + public Object alarmUpload(@RequestBody AlarmUpload alarmUpload){ + if(StrUtil.isEmpty(alarmUpload.getAlarmTime())){ + alarmUpload.setAlarmTime(DateUtil.formatDateTime(new Date())); + } + Alarm alarm = alarmService.alarmUpload(alarmUpload); + webSocket.sendAllMessage(JSONObject.toJSONString(alarmUpload)); + return ResponseData.success(); + } + + @ApiOperation("工作台人数上报") + @PostMapping("people") + @ResponseBody + public Object peopleUpload(@RequestBody PeopleUpload peopleUpload){ + webSocket.sendAllMessage(JSONObject.toJSONString(peopleUpload)); + return ResponseData.success(); + } +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java new file mode 100644 index 0000000..3cb6e6e --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.system.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "AlarmUpload",description = "报警上报") +public class AlarmUpload { + + @ApiModelProperty(value = "IP",required = true) + private String ip; + + @ApiModelProperty(value = "端口号",required = true) + private String port; + + @ApiModelProperty(value = "通道号") + private Integer channelNo; + + @ApiModelProperty(value = "报警类型",required = true) + private String alarmType; + + @ApiModelProperty(value = "报警图片(base64,不包含头)") + private String alarmImage; + + @ApiModelProperty(value = "报警时间(可以不传,默认为上传时间)") + private String alarmTime; + + @ApiModelProperty(value = "报警内容") + private String alarmContent; + + @ApiModelProperty(value = "报警人数") + private Integer peopleCount; +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java new file mode 100644 index 0000000..d7cb90e --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.system.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "PeopleUpload",description = "监测人数上报") +public class PeopleUpload { + + @ApiModelProperty(value = "IP",required = true) + private String ip; + + @ApiModelProperty(value = "端口号",required = true) + private String port; + + @ApiModelProperty(value = "通道号") + private Integer channelNo; + + @ApiModelProperty(value = "监测人数") + private Integer peopleCount; +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java index 4d2b7ef..c7db111 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java @@ -1,13 +1,15 @@ package com.casic.missiles.modular.system.entity; +import com.alibaba.fastjson.annotation.JSONField; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; -import java.time.LocalDateTime; import java.util.Date; /** @@ -18,6 +20,7 @@ * @author zyj * @since 2023-05-25 */ +@ApiModel("Alarm") @Data @TableName("bus_alarm") public class Alarm implements Serializable { @@ -33,58 +36,87 @@ /** * 设备ID */ + @ApiModelProperty(value = "设备ID",example = "0") @TableField("DEVICE_ID") private Long deviceId; /** * 报警类型 */ + @ApiModelProperty(value = "报警类型(字典值)") @TableField("ALARM_TYPE") private String alarmType; /** * 报警时间 */ + @ApiModelProperty(value = "报警时间") @TableField("ALARM_TIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date alarmTime; /** * 报警状态 */ + @ApiModelProperty(value = "报警状态(字典值)") @TableField("ALARM_STATUS") private String alarmStatus; /** * 报警位置 */ + @ApiModelProperty(value = "报警位置") @TableField("ALARM_LOCATION") private String alarmLocation; /** * 报警图片 */ + @ApiModelProperty(value = "报警图片(url)") @TableField("ALARM_IMAGE") private String alarmImage; /** * 视频通道号 */ + @ApiModelProperty(value = "视频通道号(预留)") @TableField("CHANNEL_NO") private Integer channelNo; /** * 报警内容 */ + @ApiModelProperty(value = "报警内容(预留)") @TableField("ALARM_CONTENT") private String alarmContent; /** * 消警时间 */ + @ApiModelProperty(value = "消警时间") @TableField("CANCEL_TIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date cancelTime; + /** + * 消警时间 + */ + @ApiModelProperty(value = "报警人数") + @TableField("PEOPLE_COUNT") + private Integer peopleCount; + + + @ApiModelProperty(value = "报警设备名称") + @TableField(exist = false) + private String deviceName; + @ApiModelProperty(value = "报警类型名称") + @TableField(exist = false) + private String alarmTypeName; + @ApiModelProperty(value = "报警状态名称") + @TableField(exist = false) + private String alarmStatusName; + @Override public String toString() { return "Alarm{" + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java index ea7db5f..0f8ba79 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; @@ -16,6 +18,7 @@ * @author zyj * @since 2023-05-25 */ +@ApiModel("Device") @Data @TableName("bus_device") public class Device implements Serializable { @@ -31,66 +34,82 @@ /** * 设备名称 */ + @ApiModelProperty(value = "设备名称") @TableField("DEVICE_NAME") private String deviceName; /** * IP */ + @ApiModelProperty(value = "IP") @TableField("IP") private String ip; /** * 端口 */ + @ApiModelProperty(value = "端口") @TableField("PORT") private String port; /** * 用户名 */ + @ApiModelProperty(value = "用户名") @TableField("USER_NAME") private String userName; /** * 密码 */ + @ApiModelProperty(value = "密码") @TableField("PASSWORD") private String password; /** * 连接类型 */ + @ApiModelProperty(value = "连接类型(字典值)") @TableField("CONNECT_TYPE") private String connectType; /** * 位置 */ + @ApiModelProperty(value = "位置") @TableField("LOCATION") - private String location; /** * 设备状态 */ + @ApiModelProperty(value = "设备状态(字典值)") @TableField("STATUS") - private String status; /** * 报警分组 */ + @ApiModelProperty(value = "报警分组",example = "0") @TableField("ALARM_GROUP") - private Long alarmGroup; /** * 视频通道数(预留) */ + @ApiModelProperty(value = "视频通道数(预留)") @TableField("CHANNEL_NUM") private Integer channelNum; + + @ApiModelProperty(value = "连接类型名称") + @TableField(exist = false) + private String connectTypeName; + + @ApiModelProperty(value = "设备状态名称") + @TableField(exist = false) + private String statusName; + @Override public String toString() { return "Device{" + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java index ea4c8be..c235dd8 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java @@ -1,7 +1,10 @@ package com.casic.missiles.modular.system.mapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.system.entity.Alarm; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; /** *

@@ -13,4 +16,6 @@ */ public interface AlarmMapper extends BaseMapper { + Page listPage(@Param("page")Page page, @Param("ew")QueryWrapper queryWrapper); + } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml index 25cb4ab..703fcc5 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml @@ -2,4 +2,25 @@ + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java index 8bc01f4..469085f 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java @@ -1,5 +1,8 @@ package com.casic.missiles.modular.system.service; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.system.dto.AlarmUpload; import com.casic.missiles.modular.system.entity.Alarm; import com.baomidou.mybatisplus.extension.service.IService; @@ -13,4 +16,9 @@ */ public interface IAlarmService extends IService { + Page listPage(Page page, QueryWrapper queryWrapper); + + Alarm alarmUpload(AlarmUpload alarmUpload); + + } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IDeviceService.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IDeviceService.java index 00a421d..c851c83 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IDeviceService.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IDeviceService.java @@ -13,4 +13,6 @@ */ public interface IDeviceService extends IService { + Device selectDevice(String ip,String port,Integer channelNo); + } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/AlarmServiceImpl.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/AlarmServiceImpl.java index 6e5959b..dead3c8 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/AlarmServiceImpl.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/AlarmServiceImpl.java @@ -1,9 +1,20 @@ package com.casic.missiles.modular.system.service.impl; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.modular.system.dto.AlarmUpload; import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.entity.Device; import com.casic.missiles.modular.system.mapper.AlarmMapper; import com.casic.missiles.modular.system.service.IAlarmService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.service.ICasicFileService; +import com.casic.missiles.modular.system.service.IDeviceService; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; /** @@ -15,6 +26,51 @@ * @since 2023-05-25 */ @Service +@RequiredArgsConstructor public class AlarmServiceImpl extends ServiceImpl implements IAlarmService { + private final AbstractDictService dictService; + private final IDeviceService deviceService; + private final ICasicFileService fileService; + + private static final String ALARM_STATUS_ON = "0"; + + @Override + public Page listPage(Page page, QueryWrapper queryWrapper) { + page = this.baseMapper.listPage(page, queryWrapper); + for (Alarm alarm : page.getRecords()) { + if(StrUtil.isNotEmpty(alarm.getAlarmType())){ + alarm.setAlarmTypeName(dictService.getDictNameByCode("alarmType",alarm.getAlarmType())); + } + if(StrUtil.isNotEmpty(alarm.getAlarmStatus())){ + alarm.setAlarmStatusName(dictService.getDictNameByCode("alarmStatus",alarm.getAlarmStatus())); + } + } + return page; + } + + @Override + public Alarm alarmUpload(AlarmUpload alarmUpload) { + Alarm alarm = new Alarm(); + if(StrUtil.isAllNotEmpty(alarmUpload.getIp(),alarmUpload.getPort())){ + Device device = deviceService.selectDevice(alarmUpload.getIp(),alarmUpload.getPort(),alarmUpload.getChannelNo()); + if(ObjectUtil.isNotEmpty(device)){ + alarm.setDeviceId(device.getId()); + alarm.setAlarmLocation(device.getLocation()); + } + } + alarm.setAlarmType(alarmUpload.getAlarmType()); + alarm.setAlarmTime(DateUtil.parseDateTime(alarmUpload.getAlarmTime())); + alarm.setAlarmStatus(ALARM_STATUS_ON); + if(StrUtil.isNotEmpty(alarmUpload.getAlarmImage())){ + String imgBase64 = "data:image/jpeg;base64," + alarmUpload.getAlarmImage(); + String imageUrl = fileService.saveFile(imgBase64); + alarm.setAlarmImage(imageUrl); + } + alarm.setChannelNo(alarmUpload.getChannelNo()); + alarm.setPeopleCount(alarmUpload.getPeopleCount()); + alarm.setAlarmContent(alarmUpload.getAlarmContent()); + this.save(alarm); + return alarm; + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/DeviceServiceImpl.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/DeviceServiceImpl.java index 31a5a18..3f0202c 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/DeviceServiceImpl.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/DeviceServiceImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.system.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.modular.system.entity.Device; import com.casic.missiles.modular.system.mapper.DeviceMapper; import com.casic.missiles.modular.system.service.IDeviceService; @@ -17,4 +18,12 @@ @Service public class DeviceServiceImpl extends ServiceImpl implements IDeviceService { + + @Override + public Device selectDevice(String ip, String port, Integer channelNo) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("IP",ip); + queryWrapper.eq("PORT",port); + return this.getOne(queryWrapper); + } } diff --git a/casic_video_283_server/pom.xml b/casic_video_283_server/pom.xml index 353504b..7edf41f 100644 --- a/casic_video_283_server/pom.xml +++ b/casic_video_283_server/pom.xml @@ -63,6 +63,10 @@ knife4j-spring-boot-starter ${knife4j.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java index 1795cf1..fa6b41e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java @@ -1,9 +1,24 @@ package com.casic.missiles.modular.system.controller; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IAlarmService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ResponseBody; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; /** *

@@ -13,8 +28,42 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "报警管理接口") @Controller -@RequestMapping("/system/alarm") -public class AlarmController { +@RequestMapping("/alarm") +@RequiredArgsConstructor +public class AlarmController extends BaseController { + private final IAlarmService alarmService; + + @ApiOperation("报警分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "alarmLocation", value = "报警位置",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmType", value = "报警类型",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmStartTime", value = "报警开始时间",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmEndTime", value = "报警结束时间",dataType = "String", paramType = "query") + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String alarmLocation,String alarmType,String alarmStartTime,String alarmEndTime){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(alarmLocation)){ + queryWrapper.like("alarm.ALARM_LOCATION",alarmLocation); + } + if(StrUtil.isNotEmpty(alarmType)){ + queryWrapper.eq("alarm.ALARM_TYPE",alarmType); + } + if(StrUtil.isNotEmpty(alarmStartTime)){ + queryWrapper.ge("alarm.ALARM_TIME",alarmStartTime); + } + if(StrUtil.isNotEmpty(alarmEndTime)){ + queryWrapper.le("alarm.ALARM_TIME",alarmEndTime); + } + page = alarmService.listPage(page,queryWrapper); + return ResponseData.success(super.packForBT(page)); + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java index aa50d78..4a9243e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java @@ -1,10 +1,25 @@ package com.casic.missiles.modular.system.controller; -import org.springframework.web.bind.annotation.RequestMapping; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IDeviceService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; import org.springframework.stereotype.Controller; +import java.util.List; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; + /** *

* 设备记录表 前端控制器 @@ -13,8 +28,92 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "设备管理接口") @Controller -@RequestMapping("/system/device") -public class DeviceController { +@RequestMapping("/device") +@RequiredArgsConstructor +public class DeviceController extends BaseController { + + private final IDeviceService deviceService; + private final AbstractDictService dictService; + + @ApiOperation("新增设备") + @PostMapping("add") + @ResponseBody + public Object add(@RequestBody Device device){ + deviceService.save(device); + return ResponseData.success(); + } + + @ApiOperation("编辑设备") + @PostMapping("update") + @ResponseBody + public Object update(@RequestBody Device device){ + deviceService.updateById(device); + return ResponseData.success(); + } + + @ApiOperation("删除设备") + @PostMapping("delete") + @ResponseBody + public Object delete(@ApiParam(value = "设备id",example = "0")@RequestParam Long deviceId){ + deviceService.removeById(deviceId); + return ResponseData.success(); + } + + + @ApiOperation("设备分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String deviceName){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + page = deviceService.page(page,queryWrapper); + wrapperDevice(page.getRecords()); + return ResponseData.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "location", value = "设备位置",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("list") + @ResponseBody + public Object list(String deviceName,String location){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + if(StrUtil.isNotEmpty(location)){ + queryWrapper.like("LOCATION",location); + } + List deviceList = deviceService.list(queryWrapper); + wrapperDevice(deviceList); + return ResponseData.success(deviceList); + } + + private void wrapperDevice(List page) { + for (Device device : page) { + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setStatusName(dictService.getDictNameByCode("deviceStatus", device.getStatus())); + } + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setConnectTypeName(dictService.getDictNameByCode("connectType", device.getConnectType())); + } + } + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java new file mode 100644 index 0000000..f2fc224 --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.controller; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.dto.AlarmUpload; +import com.casic.missiles.modular.system.dto.PeopleUpload; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.service.IAlarmService; +import com.casic.missiles.modular.system.websocket.WebSocket; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.Date; + +@Api(tags = "数据上报接口") +@Controller +@RequestMapping("/upload") +@RequiredArgsConstructor +public class UploadController { + + private final IAlarmService alarmService; + private final WebSocket webSocket; + + @ApiOperation("报警上报") + @PostMapping("alarm") + @ResponseBody + public Object alarmUpload(@RequestBody AlarmUpload alarmUpload){ + if(StrUtil.isEmpty(alarmUpload.getAlarmTime())){ + alarmUpload.setAlarmTime(DateUtil.formatDateTime(new Date())); + } + Alarm alarm = alarmService.alarmUpload(alarmUpload); + webSocket.sendAllMessage(JSONObject.toJSONString(alarmUpload)); + return ResponseData.success(); + } + + @ApiOperation("工作台人数上报") + @PostMapping("people") + @ResponseBody + public Object peopleUpload(@RequestBody PeopleUpload peopleUpload){ + webSocket.sendAllMessage(JSONObject.toJSONString(peopleUpload)); + return ResponseData.success(); + } +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java new file mode 100644 index 0000000..3cb6e6e --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.system.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "AlarmUpload",description = "报警上报") +public class AlarmUpload { + + @ApiModelProperty(value = "IP",required = true) + private String ip; + + @ApiModelProperty(value = "端口号",required = true) + private String port; + + @ApiModelProperty(value = "通道号") + private Integer channelNo; + + @ApiModelProperty(value = "报警类型",required = true) + private String alarmType; + + @ApiModelProperty(value = "报警图片(base64,不包含头)") + private String alarmImage; + + @ApiModelProperty(value = "报警时间(可以不传,默认为上传时间)") + private String alarmTime; + + @ApiModelProperty(value = "报警内容") + private String alarmContent; + + @ApiModelProperty(value = "报警人数") + private Integer peopleCount; +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java new file mode 100644 index 0000000..d7cb90e --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.system.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "PeopleUpload",description = "监测人数上报") +public class PeopleUpload { + + @ApiModelProperty(value = "IP",required = true) + private String ip; + + @ApiModelProperty(value = "端口号",required = true) + private String port; + + @ApiModelProperty(value = "通道号") + private Integer channelNo; + + @ApiModelProperty(value = "监测人数") + private Integer peopleCount; +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java index 4d2b7ef..c7db111 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java @@ -1,13 +1,15 @@ package com.casic.missiles.modular.system.entity; +import com.alibaba.fastjson.annotation.JSONField; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; -import java.time.LocalDateTime; import java.util.Date; /** @@ -18,6 +20,7 @@ * @author zyj * @since 2023-05-25 */ +@ApiModel("Alarm") @Data @TableName("bus_alarm") public class Alarm implements Serializable { @@ -33,58 +36,87 @@ /** * 设备ID */ + @ApiModelProperty(value = "设备ID",example = "0") @TableField("DEVICE_ID") private Long deviceId; /** * 报警类型 */ + @ApiModelProperty(value = "报警类型(字典值)") @TableField("ALARM_TYPE") private String alarmType; /** * 报警时间 */ + @ApiModelProperty(value = "报警时间") @TableField("ALARM_TIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date alarmTime; /** * 报警状态 */ + @ApiModelProperty(value = "报警状态(字典值)") @TableField("ALARM_STATUS") private String alarmStatus; /** * 报警位置 */ + @ApiModelProperty(value = "报警位置") @TableField("ALARM_LOCATION") private String alarmLocation; /** * 报警图片 */ + @ApiModelProperty(value = "报警图片(url)") @TableField("ALARM_IMAGE") private String alarmImage; /** * 视频通道号 */ + @ApiModelProperty(value = "视频通道号(预留)") @TableField("CHANNEL_NO") private Integer channelNo; /** * 报警内容 */ + @ApiModelProperty(value = "报警内容(预留)") @TableField("ALARM_CONTENT") private String alarmContent; /** * 消警时间 */ + @ApiModelProperty(value = "消警时间") @TableField("CANCEL_TIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date cancelTime; + /** + * 消警时间 + */ + @ApiModelProperty(value = "报警人数") + @TableField("PEOPLE_COUNT") + private Integer peopleCount; + + + @ApiModelProperty(value = "报警设备名称") + @TableField(exist = false) + private String deviceName; + @ApiModelProperty(value = "报警类型名称") + @TableField(exist = false) + private String alarmTypeName; + @ApiModelProperty(value = "报警状态名称") + @TableField(exist = false) + private String alarmStatusName; + @Override public String toString() { return "Alarm{" + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java index ea7db5f..0f8ba79 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; @@ -16,6 +18,7 @@ * @author zyj * @since 2023-05-25 */ +@ApiModel("Device") @Data @TableName("bus_device") public class Device implements Serializable { @@ -31,66 +34,82 @@ /** * 设备名称 */ + @ApiModelProperty(value = "设备名称") @TableField("DEVICE_NAME") private String deviceName; /** * IP */ + @ApiModelProperty(value = "IP") @TableField("IP") private String ip; /** * 端口 */ + @ApiModelProperty(value = "端口") @TableField("PORT") private String port; /** * 用户名 */ + @ApiModelProperty(value = "用户名") @TableField("USER_NAME") private String userName; /** * 密码 */ + @ApiModelProperty(value = "密码") @TableField("PASSWORD") private String password; /** * 连接类型 */ + @ApiModelProperty(value = "连接类型(字典值)") @TableField("CONNECT_TYPE") private String connectType; /** * 位置 */ + @ApiModelProperty(value = "位置") @TableField("LOCATION") - private String location; /** * 设备状态 */ + @ApiModelProperty(value = "设备状态(字典值)") @TableField("STATUS") - private String status; /** * 报警分组 */ + @ApiModelProperty(value = "报警分组",example = "0") @TableField("ALARM_GROUP") - private Long alarmGroup; /** * 视频通道数(预留) */ + @ApiModelProperty(value = "视频通道数(预留)") @TableField("CHANNEL_NUM") private Integer channelNum; + + @ApiModelProperty(value = "连接类型名称") + @TableField(exist = false) + private String connectTypeName; + + @ApiModelProperty(value = "设备状态名称") + @TableField(exist = false) + private String statusName; + @Override public String toString() { return "Device{" + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java index ea4c8be..c235dd8 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java @@ -1,7 +1,10 @@ package com.casic.missiles.modular.system.mapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.system.entity.Alarm; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; /** *

@@ -13,4 +16,6 @@ */ public interface AlarmMapper extends BaseMapper { + Page listPage(@Param("page")Page page, @Param("ew")QueryWrapper queryWrapper); + } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml index 25cb4ab..703fcc5 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml @@ -2,4 +2,25 @@ + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java index 8bc01f4..469085f 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java @@ -1,5 +1,8 @@ package com.casic.missiles.modular.system.service; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.system.dto.AlarmUpload; import com.casic.missiles.modular.system.entity.Alarm; import com.baomidou.mybatisplus.extension.service.IService; @@ -13,4 +16,9 @@ */ public interface IAlarmService extends IService { + Page listPage(Page page, QueryWrapper queryWrapper); + + Alarm alarmUpload(AlarmUpload alarmUpload); + + } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IDeviceService.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IDeviceService.java index 00a421d..c851c83 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IDeviceService.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IDeviceService.java @@ -13,4 +13,6 @@ */ public interface IDeviceService extends IService { + Device selectDevice(String ip,String port,Integer channelNo); + } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/AlarmServiceImpl.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/AlarmServiceImpl.java index 6e5959b..dead3c8 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/AlarmServiceImpl.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/AlarmServiceImpl.java @@ -1,9 +1,20 @@ package com.casic.missiles.modular.system.service.impl; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.modular.system.dto.AlarmUpload; import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.entity.Device; import com.casic.missiles.modular.system.mapper.AlarmMapper; import com.casic.missiles.modular.system.service.IAlarmService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.service.ICasicFileService; +import com.casic.missiles.modular.system.service.IDeviceService; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; /** @@ -15,6 +26,51 @@ * @since 2023-05-25 */ @Service +@RequiredArgsConstructor public class AlarmServiceImpl extends ServiceImpl implements IAlarmService { + private final AbstractDictService dictService; + private final IDeviceService deviceService; + private final ICasicFileService fileService; + + private static final String ALARM_STATUS_ON = "0"; + + @Override + public Page listPage(Page page, QueryWrapper queryWrapper) { + page = this.baseMapper.listPage(page, queryWrapper); + for (Alarm alarm : page.getRecords()) { + if(StrUtil.isNotEmpty(alarm.getAlarmType())){ + alarm.setAlarmTypeName(dictService.getDictNameByCode("alarmType",alarm.getAlarmType())); + } + if(StrUtil.isNotEmpty(alarm.getAlarmStatus())){ + alarm.setAlarmStatusName(dictService.getDictNameByCode("alarmStatus",alarm.getAlarmStatus())); + } + } + return page; + } + + @Override + public Alarm alarmUpload(AlarmUpload alarmUpload) { + Alarm alarm = new Alarm(); + if(StrUtil.isAllNotEmpty(alarmUpload.getIp(),alarmUpload.getPort())){ + Device device = deviceService.selectDevice(alarmUpload.getIp(),alarmUpload.getPort(),alarmUpload.getChannelNo()); + if(ObjectUtil.isNotEmpty(device)){ + alarm.setDeviceId(device.getId()); + alarm.setAlarmLocation(device.getLocation()); + } + } + alarm.setAlarmType(alarmUpload.getAlarmType()); + alarm.setAlarmTime(DateUtil.parseDateTime(alarmUpload.getAlarmTime())); + alarm.setAlarmStatus(ALARM_STATUS_ON); + if(StrUtil.isNotEmpty(alarmUpload.getAlarmImage())){ + String imgBase64 = "data:image/jpeg;base64," + alarmUpload.getAlarmImage(); + String imageUrl = fileService.saveFile(imgBase64); + alarm.setAlarmImage(imageUrl); + } + alarm.setChannelNo(alarmUpload.getChannelNo()); + alarm.setPeopleCount(alarmUpload.getPeopleCount()); + alarm.setAlarmContent(alarmUpload.getAlarmContent()); + this.save(alarm); + return alarm; + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/DeviceServiceImpl.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/DeviceServiceImpl.java index 31a5a18..3f0202c 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/DeviceServiceImpl.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/DeviceServiceImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.system.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.modular.system.entity.Device; import com.casic.missiles.modular.system.mapper.DeviceMapper; import com.casic.missiles.modular.system.service.IDeviceService; @@ -17,4 +18,12 @@ @Service public class DeviceServiceImpl extends ServiceImpl implements IDeviceService { + + @Override + public Device selectDevice(String ip, String port, Integer channelNo) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("IP",ip); + queryWrapper.eq("PORT",port); + return this.getOne(queryWrapper); + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/websocket/WebSocket.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/websocket/WebSocket.java new file mode 100644 index 0000000..c7bd687 --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/websocket/WebSocket.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.websocket; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Slf4j +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets =new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value="userId")String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + log.info("[websocket]connection open from {}, current size:{}",userId,webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + log.info("[websocket]connection close, current size:"+webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + log.info("[websocket]receiveMessage:"+message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for(WebSocket webSocket : webSockets) { + log.info("[websocket]sendAllMessage:"+message); + try { + webSocket.session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + // 发送列表消息 + public void sendListMessage(List userIds, String message){ + log.info("[websocket]sendListMessage:"+message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 发送列表消息 + +// public void sendListMessage(List userIds, Object data){ +// log.info("【websocket消息】列表消息:"+data); +// for (String userId : userIds) { +// Session session = sessionPool.get(userId); +// if (session != null) { +// try { +//// session.getAsyncRemote().sendText(message); +// session.getAsyncRemote().sendObject(data); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// } +// } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + log.info("[websocket]sendOneMessage:"+message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + +} diff --git a/casic_video_283_server/pom.xml b/casic_video_283_server/pom.xml index 353504b..7edf41f 100644 --- a/casic_video_283_server/pom.xml +++ b/casic_video_283_server/pom.xml @@ -63,6 +63,10 @@ knife4j-spring-boot-starter ${knife4j.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java index 1795cf1..fa6b41e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java @@ -1,9 +1,24 @@ package com.casic.missiles.modular.system.controller; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IAlarmService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ResponseBody; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; /** *

@@ -13,8 +28,42 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "报警管理接口") @Controller -@RequestMapping("/system/alarm") -public class AlarmController { +@RequestMapping("/alarm") +@RequiredArgsConstructor +public class AlarmController extends BaseController { + private final IAlarmService alarmService; + + @ApiOperation("报警分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "alarmLocation", value = "报警位置",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmType", value = "报警类型",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmStartTime", value = "报警开始时间",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmEndTime", value = "报警结束时间",dataType = "String", paramType = "query") + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String alarmLocation,String alarmType,String alarmStartTime,String alarmEndTime){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(alarmLocation)){ + queryWrapper.like("alarm.ALARM_LOCATION",alarmLocation); + } + if(StrUtil.isNotEmpty(alarmType)){ + queryWrapper.eq("alarm.ALARM_TYPE",alarmType); + } + if(StrUtil.isNotEmpty(alarmStartTime)){ + queryWrapper.ge("alarm.ALARM_TIME",alarmStartTime); + } + if(StrUtil.isNotEmpty(alarmEndTime)){ + queryWrapper.le("alarm.ALARM_TIME",alarmEndTime); + } + page = alarmService.listPage(page,queryWrapper); + return ResponseData.success(super.packForBT(page)); + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java index aa50d78..4a9243e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java @@ -1,10 +1,25 @@ package com.casic.missiles.modular.system.controller; -import org.springframework.web.bind.annotation.RequestMapping; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IDeviceService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; import org.springframework.stereotype.Controller; +import java.util.List; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; + /** *

* 设备记录表 前端控制器 @@ -13,8 +28,92 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "设备管理接口") @Controller -@RequestMapping("/system/device") -public class DeviceController { +@RequestMapping("/device") +@RequiredArgsConstructor +public class DeviceController extends BaseController { + + private final IDeviceService deviceService; + private final AbstractDictService dictService; + + @ApiOperation("新增设备") + @PostMapping("add") + @ResponseBody + public Object add(@RequestBody Device device){ + deviceService.save(device); + return ResponseData.success(); + } + + @ApiOperation("编辑设备") + @PostMapping("update") + @ResponseBody + public Object update(@RequestBody Device device){ + deviceService.updateById(device); + return ResponseData.success(); + } + + @ApiOperation("删除设备") + @PostMapping("delete") + @ResponseBody + public Object delete(@ApiParam(value = "设备id",example = "0")@RequestParam Long deviceId){ + deviceService.removeById(deviceId); + return ResponseData.success(); + } + + + @ApiOperation("设备分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String deviceName){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + page = deviceService.page(page,queryWrapper); + wrapperDevice(page.getRecords()); + return ResponseData.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "location", value = "设备位置",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("list") + @ResponseBody + public Object list(String deviceName,String location){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + if(StrUtil.isNotEmpty(location)){ + queryWrapper.like("LOCATION",location); + } + List deviceList = deviceService.list(queryWrapper); + wrapperDevice(deviceList); + return ResponseData.success(deviceList); + } + + private void wrapperDevice(List page) { + for (Device device : page) { + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setStatusName(dictService.getDictNameByCode("deviceStatus", device.getStatus())); + } + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setConnectTypeName(dictService.getDictNameByCode("connectType", device.getConnectType())); + } + } + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java new file mode 100644 index 0000000..f2fc224 --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.controller; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.dto.AlarmUpload; +import com.casic.missiles.modular.system.dto.PeopleUpload; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.service.IAlarmService; +import com.casic.missiles.modular.system.websocket.WebSocket; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.Date; + +@Api(tags = "数据上报接口") +@Controller +@RequestMapping("/upload") +@RequiredArgsConstructor +public class UploadController { + + private final IAlarmService alarmService; + private final WebSocket webSocket; + + @ApiOperation("报警上报") + @PostMapping("alarm") + @ResponseBody + public Object alarmUpload(@RequestBody AlarmUpload alarmUpload){ + if(StrUtil.isEmpty(alarmUpload.getAlarmTime())){ + alarmUpload.setAlarmTime(DateUtil.formatDateTime(new Date())); + } + Alarm alarm = alarmService.alarmUpload(alarmUpload); + webSocket.sendAllMessage(JSONObject.toJSONString(alarmUpload)); + return ResponseData.success(); + } + + @ApiOperation("工作台人数上报") + @PostMapping("people") + @ResponseBody + public Object peopleUpload(@RequestBody PeopleUpload peopleUpload){ + webSocket.sendAllMessage(JSONObject.toJSONString(peopleUpload)); + return ResponseData.success(); + } +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java new file mode 100644 index 0000000..3cb6e6e --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.system.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "AlarmUpload",description = "报警上报") +public class AlarmUpload { + + @ApiModelProperty(value = "IP",required = true) + private String ip; + + @ApiModelProperty(value = "端口号",required = true) + private String port; + + @ApiModelProperty(value = "通道号") + private Integer channelNo; + + @ApiModelProperty(value = "报警类型",required = true) + private String alarmType; + + @ApiModelProperty(value = "报警图片(base64,不包含头)") + private String alarmImage; + + @ApiModelProperty(value = "报警时间(可以不传,默认为上传时间)") + private String alarmTime; + + @ApiModelProperty(value = "报警内容") + private String alarmContent; + + @ApiModelProperty(value = "报警人数") + private Integer peopleCount; +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java new file mode 100644 index 0000000..d7cb90e --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.system.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "PeopleUpload",description = "监测人数上报") +public class PeopleUpload { + + @ApiModelProperty(value = "IP",required = true) + private String ip; + + @ApiModelProperty(value = "端口号",required = true) + private String port; + + @ApiModelProperty(value = "通道号") + private Integer channelNo; + + @ApiModelProperty(value = "监测人数") + private Integer peopleCount; +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java index 4d2b7ef..c7db111 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java @@ -1,13 +1,15 @@ package com.casic.missiles.modular.system.entity; +import com.alibaba.fastjson.annotation.JSONField; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; -import java.time.LocalDateTime; import java.util.Date; /** @@ -18,6 +20,7 @@ * @author zyj * @since 2023-05-25 */ +@ApiModel("Alarm") @Data @TableName("bus_alarm") public class Alarm implements Serializable { @@ -33,58 +36,87 @@ /** * 设备ID */ + @ApiModelProperty(value = "设备ID",example = "0") @TableField("DEVICE_ID") private Long deviceId; /** * 报警类型 */ + @ApiModelProperty(value = "报警类型(字典值)") @TableField("ALARM_TYPE") private String alarmType; /** * 报警时间 */ + @ApiModelProperty(value = "报警时间") @TableField("ALARM_TIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date alarmTime; /** * 报警状态 */ + @ApiModelProperty(value = "报警状态(字典值)") @TableField("ALARM_STATUS") private String alarmStatus; /** * 报警位置 */ + @ApiModelProperty(value = "报警位置") @TableField("ALARM_LOCATION") private String alarmLocation; /** * 报警图片 */ + @ApiModelProperty(value = "报警图片(url)") @TableField("ALARM_IMAGE") private String alarmImage; /** * 视频通道号 */ + @ApiModelProperty(value = "视频通道号(预留)") @TableField("CHANNEL_NO") private Integer channelNo; /** * 报警内容 */ + @ApiModelProperty(value = "报警内容(预留)") @TableField("ALARM_CONTENT") private String alarmContent; /** * 消警时间 */ + @ApiModelProperty(value = "消警时间") @TableField("CANCEL_TIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date cancelTime; + /** + * 消警时间 + */ + @ApiModelProperty(value = "报警人数") + @TableField("PEOPLE_COUNT") + private Integer peopleCount; + + + @ApiModelProperty(value = "报警设备名称") + @TableField(exist = false) + private String deviceName; + @ApiModelProperty(value = "报警类型名称") + @TableField(exist = false) + private String alarmTypeName; + @ApiModelProperty(value = "报警状态名称") + @TableField(exist = false) + private String alarmStatusName; + @Override public String toString() { return "Alarm{" + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java index ea7db5f..0f8ba79 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; @@ -16,6 +18,7 @@ * @author zyj * @since 2023-05-25 */ +@ApiModel("Device") @Data @TableName("bus_device") public class Device implements Serializable { @@ -31,66 +34,82 @@ /** * 设备名称 */ + @ApiModelProperty(value = "设备名称") @TableField("DEVICE_NAME") private String deviceName; /** * IP */ + @ApiModelProperty(value = "IP") @TableField("IP") private String ip; /** * 端口 */ + @ApiModelProperty(value = "端口") @TableField("PORT") private String port; /** * 用户名 */ + @ApiModelProperty(value = "用户名") @TableField("USER_NAME") private String userName; /** * 密码 */ + @ApiModelProperty(value = "密码") @TableField("PASSWORD") private String password; /** * 连接类型 */ + @ApiModelProperty(value = "连接类型(字典值)") @TableField("CONNECT_TYPE") private String connectType; /** * 位置 */ + @ApiModelProperty(value = "位置") @TableField("LOCATION") - private String location; /** * 设备状态 */ + @ApiModelProperty(value = "设备状态(字典值)") @TableField("STATUS") - private String status; /** * 报警分组 */ + @ApiModelProperty(value = "报警分组",example = "0") @TableField("ALARM_GROUP") - private Long alarmGroup; /** * 视频通道数(预留) */ + @ApiModelProperty(value = "视频通道数(预留)") @TableField("CHANNEL_NUM") private Integer channelNum; + + @ApiModelProperty(value = "连接类型名称") + @TableField(exist = false) + private String connectTypeName; + + @ApiModelProperty(value = "设备状态名称") + @TableField(exist = false) + private String statusName; + @Override public String toString() { return "Device{" + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java index ea4c8be..c235dd8 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java @@ -1,7 +1,10 @@ package com.casic.missiles.modular.system.mapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.system.entity.Alarm; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; /** *

@@ -13,4 +16,6 @@ */ public interface AlarmMapper extends BaseMapper { + Page listPage(@Param("page")Page page, @Param("ew")QueryWrapper queryWrapper); + } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml index 25cb4ab..703fcc5 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml @@ -2,4 +2,25 @@ + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java index 8bc01f4..469085f 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java @@ -1,5 +1,8 @@ package com.casic.missiles.modular.system.service; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.system.dto.AlarmUpload; import com.casic.missiles.modular.system.entity.Alarm; import com.baomidou.mybatisplus.extension.service.IService; @@ -13,4 +16,9 @@ */ public interface IAlarmService extends IService { + Page listPage(Page page, QueryWrapper queryWrapper); + + Alarm alarmUpload(AlarmUpload alarmUpload); + + } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IDeviceService.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IDeviceService.java index 00a421d..c851c83 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IDeviceService.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IDeviceService.java @@ -13,4 +13,6 @@ */ public interface IDeviceService extends IService { + Device selectDevice(String ip,String port,Integer channelNo); + } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/AlarmServiceImpl.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/AlarmServiceImpl.java index 6e5959b..dead3c8 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/AlarmServiceImpl.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/AlarmServiceImpl.java @@ -1,9 +1,20 @@ package com.casic.missiles.modular.system.service.impl; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.modular.system.dto.AlarmUpload; import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.entity.Device; import com.casic.missiles.modular.system.mapper.AlarmMapper; import com.casic.missiles.modular.system.service.IAlarmService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.service.ICasicFileService; +import com.casic.missiles.modular.system.service.IDeviceService; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; /** @@ -15,6 +26,51 @@ * @since 2023-05-25 */ @Service +@RequiredArgsConstructor public class AlarmServiceImpl extends ServiceImpl implements IAlarmService { + private final AbstractDictService dictService; + private final IDeviceService deviceService; + private final ICasicFileService fileService; + + private static final String ALARM_STATUS_ON = "0"; + + @Override + public Page listPage(Page page, QueryWrapper queryWrapper) { + page = this.baseMapper.listPage(page, queryWrapper); + for (Alarm alarm : page.getRecords()) { + if(StrUtil.isNotEmpty(alarm.getAlarmType())){ + alarm.setAlarmTypeName(dictService.getDictNameByCode("alarmType",alarm.getAlarmType())); + } + if(StrUtil.isNotEmpty(alarm.getAlarmStatus())){ + alarm.setAlarmStatusName(dictService.getDictNameByCode("alarmStatus",alarm.getAlarmStatus())); + } + } + return page; + } + + @Override + public Alarm alarmUpload(AlarmUpload alarmUpload) { + Alarm alarm = new Alarm(); + if(StrUtil.isAllNotEmpty(alarmUpload.getIp(),alarmUpload.getPort())){ + Device device = deviceService.selectDevice(alarmUpload.getIp(),alarmUpload.getPort(),alarmUpload.getChannelNo()); + if(ObjectUtil.isNotEmpty(device)){ + alarm.setDeviceId(device.getId()); + alarm.setAlarmLocation(device.getLocation()); + } + } + alarm.setAlarmType(alarmUpload.getAlarmType()); + alarm.setAlarmTime(DateUtil.parseDateTime(alarmUpload.getAlarmTime())); + alarm.setAlarmStatus(ALARM_STATUS_ON); + if(StrUtil.isNotEmpty(alarmUpload.getAlarmImage())){ + String imgBase64 = "data:image/jpeg;base64," + alarmUpload.getAlarmImage(); + String imageUrl = fileService.saveFile(imgBase64); + alarm.setAlarmImage(imageUrl); + } + alarm.setChannelNo(alarmUpload.getChannelNo()); + alarm.setPeopleCount(alarmUpload.getPeopleCount()); + alarm.setAlarmContent(alarmUpload.getAlarmContent()); + this.save(alarm); + return alarm; + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/DeviceServiceImpl.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/DeviceServiceImpl.java index 31a5a18..3f0202c 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/DeviceServiceImpl.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/DeviceServiceImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.system.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.modular.system.entity.Device; import com.casic.missiles.modular.system.mapper.DeviceMapper; import com.casic.missiles.modular.system.service.IDeviceService; @@ -17,4 +18,12 @@ @Service public class DeviceServiceImpl extends ServiceImpl implements IDeviceService { + + @Override + public Device selectDevice(String ip, String port, Integer channelNo) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("IP",ip); + queryWrapper.eq("PORT",port); + return this.getOne(queryWrapper); + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/websocket/WebSocket.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/websocket/WebSocket.java new file mode 100644 index 0000000..c7bd687 --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/websocket/WebSocket.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.websocket; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Slf4j +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets =new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value="userId")String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + log.info("[websocket]connection open from {}, current size:{}",userId,webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + log.info("[websocket]connection close, current size:"+webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + log.info("[websocket]receiveMessage:"+message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for(WebSocket webSocket : webSockets) { + log.info("[websocket]sendAllMessage:"+message); + try { + webSocket.session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + // 发送列表消息 + public void sendListMessage(List userIds, String message){ + log.info("[websocket]sendListMessage:"+message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 发送列表消息 + +// public void sendListMessage(List userIds, Object data){ +// log.info("【websocket消息】列表消息:"+data); +// for (String userId : userIds) { +// Session session = sessionPool.get(userId); +// if (session != null) { +// try { +//// session.getAsyncRemote().sendText(message); +// session.getAsyncRemote().sendObject(data); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// } +// } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + log.info("[websocket]sendOneMessage:"+message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + +} diff --git a/casic_video_283_web/src/main/java/com/casic/missiles/config/SwaggerConfig.java b/casic_video_283_web/src/main/java/com/casic/missiles/config/SwaggerConfig.java index fd233d8..6486ca7 100644 --- a/casic_video_283_web/src/main/java/com/casic/missiles/config/SwaggerConfig.java +++ b/casic_video_283_web/src/main/java/com/casic/missiles/config/SwaggerConfig.java @@ -19,7 +19,7 @@ public class SwaggerConfig{ private ApiInfo apiInfo() { return new ApiInfoBuilder() - .title("北燃四分二期接口文档")//文档说明 + .title("283视频监控接口文档")//文档说明 .version("1.0.0")//文档版本说明 .build(); } diff --git a/casic_video_283_server/pom.xml b/casic_video_283_server/pom.xml index 353504b..7edf41f 100644 --- a/casic_video_283_server/pom.xml +++ b/casic_video_283_server/pom.xml @@ -63,6 +63,10 @@ knife4j-spring-boot-starter ${knife4j.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java index 1795cf1..fa6b41e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java @@ -1,9 +1,24 @@ package com.casic.missiles.modular.system.controller; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IAlarmService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ResponseBody; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; /** *

@@ -13,8 +28,42 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "报警管理接口") @Controller -@RequestMapping("/system/alarm") -public class AlarmController { +@RequestMapping("/alarm") +@RequiredArgsConstructor +public class AlarmController extends BaseController { + private final IAlarmService alarmService; + + @ApiOperation("报警分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "alarmLocation", value = "报警位置",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmType", value = "报警类型",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmStartTime", value = "报警开始时间",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmEndTime", value = "报警结束时间",dataType = "String", paramType = "query") + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String alarmLocation,String alarmType,String alarmStartTime,String alarmEndTime){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(alarmLocation)){ + queryWrapper.like("alarm.ALARM_LOCATION",alarmLocation); + } + if(StrUtil.isNotEmpty(alarmType)){ + queryWrapper.eq("alarm.ALARM_TYPE",alarmType); + } + if(StrUtil.isNotEmpty(alarmStartTime)){ + queryWrapper.ge("alarm.ALARM_TIME",alarmStartTime); + } + if(StrUtil.isNotEmpty(alarmEndTime)){ + queryWrapper.le("alarm.ALARM_TIME",alarmEndTime); + } + page = alarmService.listPage(page,queryWrapper); + return ResponseData.success(super.packForBT(page)); + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java index aa50d78..4a9243e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java @@ -1,10 +1,25 @@ package com.casic.missiles.modular.system.controller; -import org.springframework.web.bind.annotation.RequestMapping; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IDeviceService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; import org.springframework.stereotype.Controller; +import java.util.List; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; + /** *

* 设备记录表 前端控制器 @@ -13,8 +28,92 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "设备管理接口") @Controller -@RequestMapping("/system/device") -public class DeviceController { +@RequestMapping("/device") +@RequiredArgsConstructor +public class DeviceController extends BaseController { + + private final IDeviceService deviceService; + private final AbstractDictService dictService; + + @ApiOperation("新增设备") + @PostMapping("add") + @ResponseBody + public Object add(@RequestBody Device device){ + deviceService.save(device); + return ResponseData.success(); + } + + @ApiOperation("编辑设备") + @PostMapping("update") + @ResponseBody + public Object update(@RequestBody Device device){ + deviceService.updateById(device); + return ResponseData.success(); + } + + @ApiOperation("删除设备") + @PostMapping("delete") + @ResponseBody + public Object delete(@ApiParam(value = "设备id",example = "0")@RequestParam Long deviceId){ + deviceService.removeById(deviceId); + return ResponseData.success(); + } + + + @ApiOperation("设备分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String deviceName){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + page = deviceService.page(page,queryWrapper); + wrapperDevice(page.getRecords()); + return ResponseData.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "location", value = "设备位置",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("list") + @ResponseBody + public Object list(String deviceName,String location){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + if(StrUtil.isNotEmpty(location)){ + queryWrapper.like("LOCATION",location); + } + List deviceList = deviceService.list(queryWrapper); + wrapperDevice(deviceList); + return ResponseData.success(deviceList); + } + + private void wrapperDevice(List page) { + for (Device device : page) { + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setStatusName(dictService.getDictNameByCode("deviceStatus", device.getStatus())); + } + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setConnectTypeName(dictService.getDictNameByCode("connectType", device.getConnectType())); + } + } + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java new file mode 100644 index 0000000..f2fc224 --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.controller; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.dto.AlarmUpload; +import com.casic.missiles.modular.system.dto.PeopleUpload; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.service.IAlarmService; +import com.casic.missiles.modular.system.websocket.WebSocket; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.Date; + +@Api(tags = "数据上报接口") +@Controller +@RequestMapping("/upload") +@RequiredArgsConstructor +public class UploadController { + + private final IAlarmService alarmService; + private final WebSocket webSocket; + + @ApiOperation("报警上报") + @PostMapping("alarm") + @ResponseBody + public Object alarmUpload(@RequestBody AlarmUpload alarmUpload){ + if(StrUtil.isEmpty(alarmUpload.getAlarmTime())){ + alarmUpload.setAlarmTime(DateUtil.formatDateTime(new Date())); + } + Alarm alarm = alarmService.alarmUpload(alarmUpload); + webSocket.sendAllMessage(JSONObject.toJSONString(alarmUpload)); + return ResponseData.success(); + } + + @ApiOperation("工作台人数上报") + @PostMapping("people") + @ResponseBody + public Object peopleUpload(@RequestBody PeopleUpload peopleUpload){ + webSocket.sendAllMessage(JSONObject.toJSONString(peopleUpload)); + return ResponseData.success(); + } +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java new file mode 100644 index 0000000..3cb6e6e --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.system.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "AlarmUpload",description = "报警上报") +public class AlarmUpload { + + @ApiModelProperty(value = "IP",required = true) + private String ip; + + @ApiModelProperty(value = "端口号",required = true) + private String port; + + @ApiModelProperty(value = "通道号") + private Integer channelNo; + + @ApiModelProperty(value = "报警类型",required = true) + private String alarmType; + + @ApiModelProperty(value = "报警图片(base64,不包含头)") + private String alarmImage; + + @ApiModelProperty(value = "报警时间(可以不传,默认为上传时间)") + private String alarmTime; + + @ApiModelProperty(value = "报警内容") + private String alarmContent; + + @ApiModelProperty(value = "报警人数") + private Integer peopleCount; +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java new file mode 100644 index 0000000..d7cb90e --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.system.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "PeopleUpload",description = "监测人数上报") +public class PeopleUpload { + + @ApiModelProperty(value = "IP",required = true) + private String ip; + + @ApiModelProperty(value = "端口号",required = true) + private String port; + + @ApiModelProperty(value = "通道号") + private Integer channelNo; + + @ApiModelProperty(value = "监测人数") + private Integer peopleCount; +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java index 4d2b7ef..c7db111 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java @@ -1,13 +1,15 @@ package com.casic.missiles.modular.system.entity; +import com.alibaba.fastjson.annotation.JSONField; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; -import java.time.LocalDateTime; import java.util.Date; /** @@ -18,6 +20,7 @@ * @author zyj * @since 2023-05-25 */ +@ApiModel("Alarm") @Data @TableName("bus_alarm") public class Alarm implements Serializable { @@ -33,58 +36,87 @@ /** * 设备ID */ + @ApiModelProperty(value = "设备ID",example = "0") @TableField("DEVICE_ID") private Long deviceId; /** * 报警类型 */ + @ApiModelProperty(value = "报警类型(字典值)") @TableField("ALARM_TYPE") private String alarmType; /** * 报警时间 */ + @ApiModelProperty(value = "报警时间") @TableField("ALARM_TIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date alarmTime; /** * 报警状态 */ + @ApiModelProperty(value = "报警状态(字典值)") @TableField("ALARM_STATUS") private String alarmStatus; /** * 报警位置 */ + @ApiModelProperty(value = "报警位置") @TableField("ALARM_LOCATION") private String alarmLocation; /** * 报警图片 */ + @ApiModelProperty(value = "报警图片(url)") @TableField("ALARM_IMAGE") private String alarmImage; /** * 视频通道号 */ + @ApiModelProperty(value = "视频通道号(预留)") @TableField("CHANNEL_NO") private Integer channelNo; /** * 报警内容 */ + @ApiModelProperty(value = "报警内容(预留)") @TableField("ALARM_CONTENT") private String alarmContent; /** * 消警时间 */ + @ApiModelProperty(value = "消警时间") @TableField("CANCEL_TIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date cancelTime; + /** + * 消警时间 + */ + @ApiModelProperty(value = "报警人数") + @TableField("PEOPLE_COUNT") + private Integer peopleCount; + + + @ApiModelProperty(value = "报警设备名称") + @TableField(exist = false) + private String deviceName; + @ApiModelProperty(value = "报警类型名称") + @TableField(exist = false) + private String alarmTypeName; + @ApiModelProperty(value = "报警状态名称") + @TableField(exist = false) + private String alarmStatusName; + @Override public String toString() { return "Alarm{" + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java index ea7db5f..0f8ba79 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; @@ -16,6 +18,7 @@ * @author zyj * @since 2023-05-25 */ +@ApiModel("Device") @Data @TableName("bus_device") public class Device implements Serializable { @@ -31,66 +34,82 @@ /** * 设备名称 */ + @ApiModelProperty(value = "设备名称") @TableField("DEVICE_NAME") private String deviceName; /** * IP */ + @ApiModelProperty(value = "IP") @TableField("IP") private String ip; /** * 端口 */ + @ApiModelProperty(value = "端口") @TableField("PORT") private String port; /** * 用户名 */ + @ApiModelProperty(value = "用户名") @TableField("USER_NAME") private String userName; /** * 密码 */ + @ApiModelProperty(value = "密码") @TableField("PASSWORD") private String password; /** * 连接类型 */ + @ApiModelProperty(value = "连接类型(字典值)") @TableField("CONNECT_TYPE") private String connectType; /** * 位置 */ + @ApiModelProperty(value = "位置") @TableField("LOCATION") - private String location; /** * 设备状态 */ + @ApiModelProperty(value = "设备状态(字典值)") @TableField("STATUS") - private String status; /** * 报警分组 */ + @ApiModelProperty(value = "报警分组",example = "0") @TableField("ALARM_GROUP") - private Long alarmGroup; /** * 视频通道数(预留) */ + @ApiModelProperty(value = "视频通道数(预留)") @TableField("CHANNEL_NUM") private Integer channelNum; + + @ApiModelProperty(value = "连接类型名称") + @TableField(exist = false) + private String connectTypeName; + + @ApiModelProperty(value = "设备状态名称") + @TableField(exist = false) + private String statusName; + @Override public String toString() { return "Device{" + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java index ea4c8be..c235dd8 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java @@ -1,7 +1,10 @@ package com.casic.missiles.modular.system.mapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.system.entity.Alarm; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; /** *

@@ -13,4 +16,6 @@ */ public interface AlarmMapper extends BaseMapper { + Page listPage(@Param("page")Page page, @Param("ew")QueryWrapper queryWrapper); + } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml index 25cb4ab..703fcc5 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml @@ -2,4 +2,25 @@ + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java index 8bc01f4..469085f 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java @@ -1,5 +1,8 @@ package com.casic.missiles.modular.system.service; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.system.dto.AlarmUpload; import com.casic.missiles.modular.system.entity.Alarm; import com.baomidou.mybatisplus.extension.service.IService; @@ -13,4 +16,9 @@ */ public interface IAlarmService extends IService { + Page listPage(Page page, QueryWrapper queryWrapper); + + Alarm alarmUpload(AlarmUpload alarmUpload); + + } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IDeviceService.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IDeviceService.java index 00a421d..c851c83 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IDeviceService.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IDeviceService.java @@ -13,4 +13,6 @@ */ public interface IDeviceService extends IService { + Device selectDevice(String ip,String port,Integer channelNo); + } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/AlarmServiceImpl.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/AlarmServiceImpl.java index 6e5959b..dead3c8 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/AlarmServiceImpl.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/AlarmServiceImpl.java @@ -1,9 +1,20 @@ package com.casic.missiles.modular.system.service.impl; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.modular.system.dto.AlarmUpload; import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.entity.Device; import com.casic.missiles.modular.system.mapper.AlarmMapper; import com.casic.missiles.modular.system.service.IAlarmService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.service.ICasicFileService; +import com.casic.missiles.modular.system.service.IDeviceService; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; /** @@ -15,6 +26,51 @@ * @since 2023-05-25 */ @Service +@RequiredArgsConstructor public class AlarmServiceImpl extends ServiceImpl implements IAlarmService { + private final AbstractDictService dictService; + private final IDeviceService deviceService; + private final ICasicFileService fileService; + + private static final String ALARM_STATUS_ON = "0"; + + @Override + public Page listPage(Page page, QueryWrapper queryWrapper) { + page = this.baseMapper.listPage(page, queryWrapper); + for (Alarm alarm : page.getRecords()) { + if(StrUtil.isNotEmpty(alarm.getAlarmType())){ + alarm.setAlarmTypeName(dictService.getDictNameByCode("alarmType",alarm.getAlarmType())); + } + if(StrUtil.isNotEmpty(alarm.getAlarmStatus())){ + alarm.setAlarmStatusName(dictService.getDictNameByCode("alarmStatus",alarm.getAlarmStatus())); + } + } + return page; + } + + @Override + public Alarm alarmUpload(AlarmUpload alarmUpload) { + Alarm alarm = new Alarm(); + if(StrUtil.isAllNotEmpty(alarmUpload.getIp(),alarmUpload.getPort())){ + Device device = deviceService.selectDevice(alarmUpload.getIp(),alarmUpload.getPort(),alarmUpload.getChannelNo()); + if(ObjectUtil.isNotEmpty(device)){ + alarm.setDeviceId(device.getId()); + alarm.setAlarmLocation(device.getLocation()); + } + } + alarm.setAlarmType(alarmUpload.getAlarmType()); + alarm.setAlarmTime(DateUtil.parseDateTime(alarmUpload.getAlarmTime())); + alarm.setAlarmStatus(ALARM_STATUS_ON); + if(StrUtil.isNotEmpty(alarmUpload.getAlarmImage())){ + String imgBase64 = "data:image/jpeg;base64," + alarmUpload.getAlarmImage(); + String imageUrl = fileService.saveFile(imgBase64); + alarm.setAlarmImage(imageUrl); + } + alarm.setChannelNo(alarmUpload.getChannelNo()); + alarm.setPeopleCount(alarmUpload.getPeopleCount()); + alarm.setAlarmContent(alarmUpload.getAlarmContent()); + this.save(alarm); + return alarm; + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/DeviceServiceImpl.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/DeviceServiceImpl.java index 31a5a18..3f0202c 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/DeviceServiceImpl.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/DeviceServiceImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.system.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.modular.system.entity.Device; import com.casic.missiles.modular.system.mapper.DeviceMapper; import com.casic.missiles.modular.system.service.IDeviceService; @@ -17,4 +18,12 @@ @Service public class DeviceServiceImpl extends ServiceImpl implements IDeviceService { + + @Override + public Device selectDevice(String ip, String port, Integer channelNo) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("IP",ip); + queryWrapper.eq("PORT",port); + return this.getOne(queryWrapper); + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/websocket/WebSocket.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/websocket/WebSocket.java new file mode 100644 index 0000000..c7bd687 --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/websocket/WebSocket.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.websocket; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Slf4j +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets =new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value="userId")String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + log.info("[websocket]connection open from {}, current size:{}",userId,webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + log.info("[websocket]connection close, current size:"+webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + log.info("[websocket]receiveMessage:"+message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for(WebSocket webSocket : webSockets) { + log.info("[websocket]sendAllMessage:"+message); + try { + webSocket.session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + // 发送列表消息 + public void sendListMessage(List userIds, String message){ + log.info("[websocket]sendListMessage:"+message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 发送列表消息 + +// public void sendListMessage(List userIds, Object data){ +// log.info("【websocket消息】列表消息:"+data); +// for (String userId : userIds) { +// Session session = sessionPool.get(userId); +// if (session != null) { +// try { +//// session.getAsyncRemote().sendText(message); +// session.getAsyncRemote().sendObject(data); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// } +// } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + log.info("[websocket]sendOneMessage:"+message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + +} diff --git a/casic_video_283_web/src/main/java/com/casic/missiles/config/SwaggerConfig.java b/casic_video_283_web/src/main/java/com/casic/missiles/config/SwaggerConfig.java index fd233d8..6486ca7 100644 --- a/casic_video_283_web/src/main/java/com/casic/missiles/config/SwaggerConfig.java +++ b/casic_video_283_web/src/main/java/com/casic/missiles/config/SwaggerConfig.java @@ -19,7 +19,7 @@ public class SwaggerConfig{ private ApiInfo apiInfo() { return new ApiInfoBuilder() - .title("北燃四分二期接口文档")//文档说明 + .title("283视频监控接口文档")//文档说明 .version("1.0.0")//文档版本说明 .build(); } diff --git a/casic_video_283_web/src/main/java/com/casic/missiles/config/WebSocketConfig.java b/casic_video_283_web/src/main/java/com/casic/missiles/config/WebSocketConfig.java new file mode 100644 index 0000000..9c9c4b5 --- /dev/null +++ b/casic_video_283_web/src/main/java/com/casic/missiles/config/WebSocketConfig.java @@ -0,0 +1,18 @@ +package com.casic.missiles.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +// tomcat启动无需配置 +@Configuration +public class WebSocketConfig { + /** + * 注入ServerEndpointExporter, + * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/casic_video_283_server/pom.xml b/casic_video_283_server/pom.xml index 353504b..7edf41f 100644 --- a/casic_video_283_server/pom.xml +++ b/casic_video_283_server/pom.xml @@ -63,6 +63,10 @@ knife4j-spring-boot-starter ${knife4j.version} + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java index 1795cf1..fa6b41e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/AlarmController.java @@ -1,9 +1,24 @@ package com.casic.missiles.modular.system.controller; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IAlarmService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ResponseBody; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; /** *

@@ -13,8 +28,42 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "报警管理接口") @Controller -@RequestMapping("/system/alarm") -public class AlarmController { +@RequestMapping("/alarm") +@RequiredArgsConstructor +public class AlarmController extends BaseController { + private final IAlarmService alarmService; + + @ApiOperation("报警分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "alarmLocation", value = "报警位置",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmType", value = "报警类型",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmStartTime", value = "报警开始时间",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "alarmEndTime", value = "报警结束时间",dataType = "String", paramType = "query") + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String alarmLocation,String alarmType,String alarmStartTime,String alarmEndTime){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(alarmLocation)){ + queryWrapper.like("alarm.ALARM_LOCATION",alarmLocation); + } + if(StrUtil.isNotEmpty(alarmType)){ + queryWrapper.eq("alarm.ALARM_TYPE",alarmType); + } + if(StrUtil.isNotEmpty(alarmStartTime)){ + queryWrapper.ge("alarm.ALARM_TIME",alarmStartTime); + } + if(StrUtil.isNotEmpty(alarmEndTime)){ + queryWrapper.le("alarm.ALARM_TIME",alarmEndTime); + } + page = alarmService.listPage(page,queryWrapper); + return ResponseData.success(super.packForBT(page)); + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java index aa50d78..4a9243e 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/DeviceController.java @@ -1,10 +1,25 @@ package com.casic.missiles.modular.system.controller; -import org.springframework.web.bind.annotation.RequestMapping; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.entity.Device; +import com.casic.missiles.modular.system.service.IDeviceService; +import io.swagger.annotations.*; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; import org.springframework.stereotype.Controller; +import java.util.List; + +import static com.casic.missiles.model.response.ResponseData.DEFAULT_SUCCESS_MESSAGE; + /** *

* 设备记录表 前端控制器 @@ -13,8 +28,92 @@ * @author zyj * @since 2023-05-25 */ +@Api(tags = "设备管理接口") @Controller -@RequestMapping("/system/device") -public class DeviceController { +@RequestMapping("/device") +@RequiredArgsConstructor +public class DeviceController extends BaseController { + + private final IDeviceService deviceService; + private final AbstractDictService dictService; + + @ApiOperation("新增设备") + @PostMapping("add") + @ResponseBody + public Object add(@RequestBody Device device){ + deviceService.save(device); + return ResponseData.success(); + } + + @ApiOperation("编辑设备") + @PostMapping("update") + @ResponseBody + public Object update(@RequestBody Device device){ + deviceService.updateById(device); + return ResponseData.success(); + } + + @ApiOperation("删除设备") + @PostMapping("delete") + @ResponseBody + public Object delete(@ApiParam(value = "设备id",example = "0")@RequestParam Long deviceId){ + deviceService.removeById(deviceId); + return ResponseData.success(); + } + + + @ApiOperation("设备分页列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("listPage") + @ResponseBody + public Object listPage(String deviceName){ + Page page = PageFactory.defaultPage(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + page = deviceService.page(page,queryWrapper); + wrapperDevice(page.getRecords()); + return ResponseData.success(super.packForBT(page)); + } + + @ApiOperation("设备列表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "deviceName", value = "设备名称",dataType = "String", paramType = "query"), + @ApiImplicitParam(name = "location", value = "设备位置",dataType = "String", paramType = "query"), + }) + @ApiResponses({ + @ApiResponse(code = 200,message = DEFAULT_SUCCESS_MESSAGE,response = Device.class), + }) + @GetMapping("list") + @ResponseBody + public Object list(String deviceName,String location){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(deviceName)){ + queryWrapper.like("DEVICE_NAME",deviceName); + } + if(StrUtil.isNotEmpty(location)){ + queryWrapper.like("LOCATION",location); + } + List deviceList = deviceService.list(queryWrapper); + wrapperDevice(deviceList); + return ResponseData.success(deviceList); + } + + private void wrapperDevice(List page) { + for (Device device : page) { + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setStatusName(dictService.getDictNameByCode("deviceStatus", device.getStatus())); + } + if (StrUtil.isNotEmpty(device.getConnectType())) { + device.setConnectTypeName(dictService.getDictNameByCode("connectType", device.getConnectType())); + } + } + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java new file mode 100644 index 0000000..f2fc224 --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/controller/UploadController.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.system.controller; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.system.dto.AlarmUpload; +import com.casic.missiles.modular.system.dto.PeopleUpload; +import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.service.IAlarmService; +import com.casic.missiles.modular.system.websocket.WebSocket; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.Date; + +@Api(tags = "数据上报接口") +@Controller +@RequestMapping("/upload") +@RequiredArgsConstructor +public class UploadController { + + private final IAlarmService alarmService; + private final WebSocket webSocket; + + @ApiOperation("报警上报") + @PostMapping("alarm") + @ResponseBody + public Object alarmUpload(@RequestBody AlarmUpload alarmUpload){ + if(StrUtil.isEmpty(alarmUpload.getAlarmTime())){ + alarmUpload.setAlarmTime(DateUtil.formatDateTime(new Date())); + } + Alarm alarm = alarmService.alarmUpload(alarmUpload); + webSocket.sendAllMessage(JSONObject.toJSONString(alarmUpload)); + return ResponseData.success(); + } + + @ApiOperation("工作台人数上报") + @PostMapping("people") + @ResponseBody + public Object peopleUpload(@RequestBody PeopleUpload peopleUpload){ + webSocket.sendAllMessage(JSONObject.toJSONString(peopleUpload)); + return ResponseData.success(); + } +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java new file mode 100644 index 0000000..3cb6e6e --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/AlarmUpload.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.system.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "AlarmUpload",description = "报警上报") +public class AlarmUpload { + + @ApiModelProperty(value = "IP",required = true) + private String ip; + + @ApiModelProperty(value = "端口号",required = true) + private String port; + + @ApiModelProperty(value = "通道号") + private Integer channelNo; + + @ApiModelProperty(value = "报警类型",required = true) + private String alarmType; + + @ApiModelProperty(value = "报警图片(base64,不包含头)") + private String alarmImage; + + @ApiModelProperty(value = "报警时间(可以不传,默认为上传时间)") + private String alarmTime; + + @ApiModelProperty(value = "报警内容") + private String alarmContent; + + @ApiModelProperty(value = "报警人数") + private Integer peopleCount; +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java new file mode 100644 index 0000000..d7cb90e --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/dto/PeopleUpload.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.system.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "PeopleUpload",description = "监测人数上报") +public class PeopleUpload { + + @ApiModelProperty(value = "IP",required = true) + private String ip; + + @ApiModelProperty(value = "端口号",required = true) + private String port; + + @ApiModelProperty(value = "通道号") + private Integer channelNo; + + @ApiModelProperty(value = "监测人数") + private Integer peopleCount; +} diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java index 4d2b7ef..c7db111 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Alarm.java @@ -1,13 +1,15 @@ package com.casic.missiles.modular.system.entity; +import com.alibaba.fastjson.annotation.JSONField; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; -import java.time.LocalDateTime; import java.util.Date; /** @@ -18,6 +20,7 @@ * @author zyj * @since 2023-05-25 */ +@ApiModel("Alarm") @Data @TableName("bus_alarm") public class Alarm implements Serializable { @@ -33,58 +36,87 @@ /** * 设备ID */ + @ApiModelProperty(value = "设备ID",example = "0") @TableField("DEVICE_ID") private Long deviceId; /** * 报警类型 */ + @ApiModelProperty(value = "报警类型(字典值)") @TableField("ALARM_TYPE") private String alarmType; /** * 报警时间 */ + @ApiModelProperty(value = "报警时间") @TableField("ALARM_TIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date alarmTime; /** * 报警状态 */ + @ApiModelProperty(value = "报警状态(字典值)") @TableField("ALARM_STATUS") private String alarmStatus; /** * 报警位置 */ + @ApiModelProperty(value = "报警位置") @TableField("ALARM_LOCATION") private String alarmLocation; /** * 报警图片 */ + @ApiModelProperty(value = "报警图片(url)") @TableField("ALARM_IMAGE") private String alarmImage; /** * 视频通道号 */ + @ApiModelProperty(value = "视频通道号(预留)") @TableField("CHANNEL_NO") private Integer channelNo; /** * 报警内容 */ + @ApiModelProperty(value = "报警内容(预留)") @TableField("ALARM_CONTENT") private String alarmContent; /** * 消警时间 */ + @ApiModelProperty(value = "消警时间") @TableField("CANCEL_TIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date cancelTime; + /** + * 消警时间 + */ + @ApiModelProperty(value = "报警人数") + @TableField("PEOPLE_COUNT") + private Integer peopleCount; + + + @ApiModelProperty(value = "报警设备名称") + @TableField(exist = false) + private String deviceName; + @ApiModelProperty(value = "报警类型名称") + @TableField(exist = false) + private String alarmTypeName; + @ApiModelProperty(value = "报警状态名称") + @TableField(exist = false) + private String alarmStatusName; + @Override public String toString() { return "Alarm{" + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java index ea7db5f..0f8ba79 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/entity/Device.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; @@ -16,6 +18,7 @@ * @author zyj * @since 2023-05-25 */ +@ApiModel("Device") @Data @TableName("bus_device") public class Device implements Serializable { @@ -31,66 +34,82 @@ /** * 设备名称 */ + @ApiModelProperty(value = "设备名称") @TableField("DEVICE_NAME") private String deviceName; /** * IP */ + @ApiModelProperty(value = "IP") @TableField("IP") private String ip; /** * 端口 */ + @ApiModelProperty(value = "端口") @TableField("PORT") private String port; /** * 用户名 */ + @ApiModelProperty(value = "用户名") @TableField("USER_NAME") private String userName; /** * 密码 */ + @ApiModelProperty(value = "密码") @TableField("PASSWORD") private String password; /** * 连接类型 */ + @ApiModelProperty(value = "连接类型(字典值)") @TableField("CONNECT_TYPE") private String connectType; /** * 位置 */ + @ApiModelProperty(value = "位置") @TableField("LOCATION") - private String location; /** * 设备状态 */ + @ApiModelProperty(value = "设备状态(字典值)") @TableField("STATUS") - private String status; /** * 报警分组 */ + @ApiModelProperty(value = "报警分组",example = "0") @TableField("ALARM_GROUP") - private Long alarmGroup; /** * 视频通道数(预留) */ + @ApiModelProperty(value = "视频通道数(预留)") @TableField("CHANNEL_NUM") private Integer channelNum; + + @ApiModelProperty(value = "连接类型名称") + @TableField(exist = false) + private String connectTypeName; + + @ApiModelProperty(value = "设备状态名称") + @TableField(exist = false) + private String statusName; + @Override public String toString() { return "Device{" + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java index ea4c8be..c235dd8 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/AlarmMapper.java @@ -1,7 +1,10 @@ package com.casic.missiles.modular.system.mapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.system.entity.Alarm; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; /** *

@@ -13,4 +16,6 @@ */ public interface AlarmMapper extends BaseMapper { + Page listPage(@Param("page")Page page, @Param("ew")QueryWrapper queryWrapper); + } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml index 25cb4ab..703fcc5 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/mapper/mapping/AlarmMapper.xml @@ -2,4 +2,25 @@ + diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java index 8bc01f4..469085f 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IAlarmService.java @@ -1,5 +1,8 @@ package com.casic.missiles.modular.system.service; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.system.dto.AlarmUpload; import com.casic.missiles.modular.system.entity.Alarm; import com.baomidou.mybatisplus.extension.service.IService; @@ -13,4 +16,9 @@ */ public interface IAlarmService extends IService { + Page listPage(Page page, QueryWrapper queryWrapper); + + Alarm alarmUpload(AlarmUpload alarmUpload); + + } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IDeviceService.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IDeviceService.java index 00a421d..c851c83 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IDeviceService.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/IDeviceService.java @@ -13,4 +13,6 @@ */ public interface IDeviceService extends IService { + Device selectDevice(String ip,String port,Integer channelNo); + } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/AlarmServiceImpl.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/AlarmServiceImpl.java index 6e5959b..dead3c8 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/AlarmServiceImpl.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/AlarmServiceImpl.java @@ -1,9 +1,20 @@ package com.casic.missiles.modular.system.service.impl; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.modular.system.dto.AlarmUpload; import com.casic.missiles.modular.system.entity.Alarm; +import com.casic.missiles.modular.system.entity.Device; import com.casic.missiles.modular.system.mapper.AlarmMapper; import com.casic.missiles.modular.system.service.IAlarmService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.system.service.ICasicFileService; +import com.casic.missiles.modular.system.service.IDeviceService; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; /** @@ -15,6 +26,51 @@ * @since 2023-05-25 */ @Service +@RequiredArgsConstructor public class AlarmServiceImpl extends ServiceImpl implements IAlarmService { + private final AbstractDictService dictService; + private final IDeviceService deviceService; + private final ICasicFileService fileService; + + private static final String ALARM_STATUS_ON = "0"; + + @Override + public Page listPage(Page page, QueryWrapper queryWrapper) { + page = this.baseMapper.listPage(page, queryWrapper); + for (Alarm alarm : page.getRecords()) { + if(StrUtil.isNotEmpty(alarm.getAlarmType())){ + alarm.setAlarmTypeName(dictService.getDictNameByCode("alarmType",alarm.getAlarmType())); + } + if(StrUtil.isNotEmpty(alarm.getAlarmStatus())){ + alarm.setAlarmStatusName(dictService.getDictNameByCode("alarmStatus",alarm.getAlarmStatus())); + } + } + return page; + } + + @Override + public Alarm alarmUpload(AlarmUpload alarmUpload) { + Alarm alarm = new Alarm(); + if(StrUtil.isAllNotEmpty(alarmUpload.getIp(),alarmUpload.getPort())){ + Device device = deviceService.selectDevice(alarmUpload.getIp(),alarmUpload.getPort(),alarmUpload.getChannelNo()); + if(ObjectUtil.isNotEmpty(device)){ + alarm.setDeviceId(device.getId()); + alarm.setAlarmLocation(device.getLocation()); + } + } + alarm.setAlarmType(alarmUpload.getAlarmType()); + alarm.setAlarmTime(DateUtil.parseDateTime(alarmUpload.getAlarmTime())); + alarm.setAlarmStatus(ALARM_STATUS_ON); + if(StrUtil.isNotEmpty(alarmUpload.getAlarmImage())){ + String imgBase64 = "data:image/jpeg;base64," + alarmUpload.getAlarmImage(); + String imageUrl = fileService.saveFile(imgBase64); + alarm.setAlarmImage(imageUrl); + } + alarm.setChannelNo(alarmUpload.getChannelNo()); + alarm.setPeopleCount(alarmUpload.getPeopleCount()); + alarm.setAlarmContent(alarmUpload.getAlarmContent()); + this.save(alarm); + return alarm; + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/DeviceServiceImpl.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/DeviceServiceImpl.java index 31a5a18..3f0202c 100644 --- a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/DeviceServiceImpl.java +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/service/impl/DeviceServiceImpl.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.system.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.modular.system.entity.Device; import com.casic.missiles.modular.system.mapper.DeviceMapper; import com.casic.missiles.modular.system.service.IDeviceService; @@ -17,4 +18,12 @@ @Service public class DeviceServiceImpl extends ServiceImpl implements IDeviceService { + + @Override + public Device selectDevice(String ip, String port, Integer channelNo) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("IP",ip); + queryWrapper.eq("PORT",port); + return this.getOne(queryWrapper); + } } diff --git a/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/websocket/WebSocket.java b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/websocket/WebSocket.java new file mode 100644 index 0000000..c7bd687 --- /dev/null +++ b/casic_video_283_server/src/main/java/com/casic/missiles/modular/system/websocket/WebSocket.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.system.websocket; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Slf4j +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets =new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value="userId")String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + log.info("[websocket]connection open from {}, current size:{}",userId,webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + log.info("[websocket]connection close, current size:"+webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + log.info("[websocket]receiveMessage:"+message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for(WebSocket webSocket : webSockets) { + log.info("[websocket]sendAllMessage:"+message); + try { + webSocket.session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + // 发送列表消息 + public void sendListMessage(List userIds, String message){ + log.info("[websocket]sendListMessage:"+message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 发送列表消息 + +// public void sendListMessage(List userIds, Object data){ +// log.info("【websocket消息】列表消息:"+data); +// for (String userId : userIds) { +// Session session = sessionPool.get(userId); +// if (session != null) { +// try { +//// session.getAsyncRemote().sendText(message); +// session.getAsyncRemote().sendObject(data); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// } +// } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + log.info("[websocket]sendOneMessage:"+message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + +} diff --git a/casic_video_283_web/src/main/java/com/casic/missiles/config/SwaggerConfig.java b/casic_video_283_web/src/main/java/com/casic/missiles/config/SwaggerConfig.java index fd233d8..6486ca7 100644 --- a/casic_video_283_web/src/main/java/com/casic/missiles/config/SwaggerConfig.java +++ b/casic_video_283_web/src/main/java/com/casic/missiles/config/SwaggerConfig.java @@ -19,7 +19,7 @@ public class SwaggerConfig{ private ApiInfo apiInfo() { return new ApiInfoBuilder() - .title("北燃四分二期接口文档")//文档说明 + .title("283视频监控接口文档")//文档说明 .version("1.0.0")//文档版本说明 .build(); } diff --git a/casic_video_283_web/src/main/java/com/casic/missiles/config/WebSocketConfig.java b/casic_video_283_web/src/main/java/com/casic/missiles/config/WebSocketConfig.java new file mode 100644 index 0000000..9c9c4b5 --- /dev/null +++ b/casic_video_283_web/src/main/java/com/casic/missiles/config/WebSocketConfig.java @@ -0,0 +1,18 @@ +package com.casic.missiles.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +// tomcat启动无需配置 +@Configuration +public class WebSocketConfig { + /** + * 注入ServerEndpointExporter, + * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/casic_video_283_web/src/main/resources/config/application-dev.yml b/casic_video_283_web/src/main/resources/config/application-dev.yml index fea6255..8c63f47 100644 --- a/casic_video_283_web/src/main/resources/config/application-dev.yml +++ b/casic_video_283_web/src/main/resources/config/application-dev.yml @@ -1,5 +1,5 @@ server: - port: 8083 + port: 5910 ################### spring配置 ################### spring: datasource: @@ -7,13 +7,16 @@ username: root password: Casic203 jms: - pub-sub-domain: true -# session: + pub-sub-domain: true + # session: # store-type: redis redis: host: 111.198.10.15 port: 11412 password: ew5T4K3#203lwh + web: + resources: + static-locations: file:/casic/casic-video-283-file/ # serializer: org.springframework.data.redis.serializer.StringRedisSerializer # redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer casic: @@ -24,7 +27,7 @@ init: enable: false file: - uploadPath: /casic/casic-gas-operation-file/ + uploadPath: /casic/casic-video-283-file/ logging: level.root: info level.com.casic: debug