package com.usky.controller; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.qrcode.QrCodeUtil; import com.baomidou.mybatisplus.extension.api.R; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.usky.common.annotation.ModuleRequired; import com.usky.common.bo.CommonBo; import com.usky.common.listener.ConfigCacheListener; import com.usky.common.utils.QrCodeUtils; import com.usky.global.Common; import com.usky.modules.entity.global.bo.ChannelAddBo; import com.usky.modules.entity.global.vo.FeatureVo; import com.usky.modules.entity.perception.bo.PerceptionChannelListBo; import com.usky.modules.entity.perception.bo.PerceptionDeviceAddBo; import com.usky.modules.entity.perception.bo.PerceptionEventAddBo; import com.usky.modules.entity.perception.bo.PerceptionUpdateHeartBo; import com.usky.modules.entity.usbalarm.bo.ChannelUpdateBo; import com.usky.modules.service.PerceptionEventCodeService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartHttpServletRequest; @RestController @Api( tags = {"状态感知探测控制器"} ) @ModuleRequired("1009") public class PerceptionController { private static final Logger log = LoggerFactory.getLogger(PerceptionController.class); private final PerceptionEventCodeService service; private final ConfigCacheListener config; @ApiOperation("状态感知探测控制器对外接口") @PostMapping({"/agbox/device/perception", "/agbox/device/perception/**"}) public Object patrol(@ModelAttribute CommonBo bo, HttpServletRequest servletRequest) throws IOException { log.info("状态感知控制器请求报文:{}", bo.toString()); String key = bo.getKey(); String json = bo.getJson(); if (StrUtil.isNotBlank(this.config.getConfig("key")) && !Common.key.equals(this.config.getConfig("key")) && !key.equals(this.config.getConfig("key"))) { return R.failed("key错误或缺失!"); } else if (StringUtils.isBlank(json)) { return R.failed("json不能为空!"); } else { JsonNode jsonNode = (new ObjectMapper()).readTree(json); String jsonrpc = null; String standjsonrpc = jsonNode.path("jsonrpc").asText(); if (StrUtil.isNotBlank(standjsonrpc)) { if (!standjsonrpc.equals("2.0")) { return R.failed("JSON-RPC 协议版本的字符串,必须准确写为'2.0'!"); } jsonrpc = standjsonrpc; } String json_rpc = jsonNode.path("json-rpc").asText(); if (StrUtil.isNotBlank(json_rpc)) { if (!json_rpc.equals("2.0")) { return R.failed("JSON-RPC 协议版本的字符串,必须准确写为'2.0'!"); } jsonrpc = json_rpc; } if (StrUtil.isBlank(json_rpc) && StrUtil.isBlank(jsonrpc)) { return R.failed("JSON-RPC 协议版本的字符串,必须准确写为'2.0'!"); } else { String method = jsonNode.path("method").asText(); JsonNode params = jsonNode.path("params"); MultipartHttpServletRequest request = null; if (servletRequest instanceof MultipartHttpServletRequest) { request = (MultipartHttpServletRequest)servletRequest; } if (method.equals("getEventCode")) { String id = jsonNode.path("id").asText(); return this.getEventCode(jsonrpc, id); } else if (method.equals("addEvent")) { String id = jsonNode.path("id").asText(); PerceptionEventAddBo eventAddBo = (PerceptionEventAddBo)(new ObjectMapper()).registerModule(new JavaTimeModule()).treeToValue(params, PerceptionEventAddBo.class); return this.addEvent(jsonrpc, eventAddBo, request, id, servletRequest); } else if (method.equals("updateHeart")) { String id = jsonNode.path("id").asText(); PerceptionUpdateHeartBo updateHeartBo = (PerceptionUpdateHeartBo)(new ObjectMapper()).registerModule(new JavaTimeModule()).treeToValue(params, PerceptionUpdateHeartBo.class); return this.updateHeart(jsonrpc, updateHeartBo, servletRequest, id); } else if (method.equals("getDeviceList")) { String id = jsonNode.path("id").asText(); return this.getDeviceList(jsonrpc, id); } else if (method.equals("getChannelList")) { String id = jsonNode.path("id").asText(); PerceptionChannelListBo channelListBo = (PerceptionChannelListBo)(new ObjectMapper()).treeToValue(params, PerceptionChannelListBo.class); return this.getChannelList(jsonrpc, channelListBo, id); } else { return R.failed("方法名不存在!"); } } } } private Object getChannelList(String jsonrpc, PerceptionChannelListBo params, String id) { log.info("perception通道列表"); return this.service.getChannelList(jsonrpc, params, id); } private Object getDeviceList(String jsonrpc, String id) { log.info("perception设备列表"); return this.service.getDeviceList(jsonrpc, id); } private Object updateHeart(String jsonrpc, PerceptionUpdateHeartBo bo, HttpServletRequest servletRequest, String id) { log.info("perception心跳"); return this.service.updateHeart(jsonrpc, bo, servletRequest, id); } private Object addEvent(String jsonrpc, PerceptionEventAddBo bo, MultipartHttpServletRequest request, String id, HttpServletRequest servletRequest) { log.info("perception添加事件"); return this.service.addEvent(jsonrpc, bo, request, id, servletRequest); } private Object getEventCode(String jsonrpc, String id) { return this.service.getEventCode(jsonrpc, id); } @ApiOperation("获取设备列表") @PostMapping({"/device/perception/getDeviceIdList"}) public Object getDeviceIdListAdmin() { return this.service.getDeviceIdListAdmin(); } @ApiOperation("获取事件类型列表") @PostMapping({"/device/perception/getEventCode"}) public Object getEventCodeListAdmin() { return this.service.getEventCodeListAdmin(); } @ApiOperation("获取即时事件列表") @PostMapping({"/device/perception/getEventListAdmin"}) public Object getEventList(@RequestParam(value = "deviceId",required = false) String deviceId, @RequestParam(value = "eventCode",required = false) Integer eventCode, @RequestParam(value = "date",required = false) String date, @RequestParam("page") Integer page, @RequestParam("pageSize") Integer pageSize, HttpServletRequest request) { return this.service.getEventList(deviceId, eventCode, date, page, pageSize, request); } @ApiOperation("获取设备配置列表") @PostMapping({"/device/perception/getDeviceListAdmin"}) public Object getDeviceListAdmin(@RequestParam(value = "deviceId",required = false) String deviceId, @RequestParam(value = "page",defaultValue = "1") Integer page, @RequestParam(value = "pageSize",defaultValue = "10000") Integer pageSize) { return this.service.getDeviceListAdmin(deviceId, page, pageSize); } @ApiOperation("新增设备配置") @PostMapping({"/device/perception/addDeviceAdmin"}) public Object addDeviceAdmin(@RequestBody PerceptionDeviceAddBo bo) { return this.service.addDeviceAdmin(bo); } @ApiOperation("获取设备配置") @PostMapping({"/device/perception/getDeviceInfoAdmin"}) public Object getDeviceInfoAdmin(@RequestParam("deviceId") String deviceId) { return this.service.getDeviceInfoAdmin(deviceId); } @ApiOperation("修改设备配置") @PostMapping({"/device/perception/updateDeviceInfoAdmin"}) public Object updateDeviceInfoAdmin(@RequestBody PerceptionDeviceAddBo bo) { return this.service.updateDeviceInfoAdmin(bo); } @ApiOperation("删除设备配置") @PostMapping({"/device/perception/delDeviceAdmin"}) public Object delDeviceAdmin(@RequestParam("deviceId") String deviceId) { return this.service.delDeviceAdmin(deviceId); } @ApiOperation("获取通道配置列表") @PostMapping({"/device/perception/getChannelList"}) public Object getChannelListAdmin(@RequestParam("deviceId") String deviceId, @RequestParam(value = "page",defaultValue = "1") Integer page, @RequestParam(value = "pageSize",defaultValue = "10000") Integer pageSize) { return this.service.getChannelListAdmin(deviceId, page, pageSize); } @ApiOperation("新增通道配置") @PostMapping({"/device/perception/addChannelAdmin"}) public Object addChannelAdmin(@RequestBody ChannelAddBo bo) { return this.service.addChannelAdmin(bo); } @ApiOperation("获取通道配置信息") @PostMapping({"/device/perception/getChannelInfoAdmin"}) public Object getChannelInfoAdmin(@RequestParam("id") String id) { return this.service.getChannelInfoAdmin(id); } @ApiOperation("修改通道配置信息") @PostMapping({"/device/perception/updateChannelInfoAdmin"}) public Object updateChannelInfoAdmin(@RequestBody ChannelUpdateBo bo) { return this.service.updateChannelInfoAdmin(bo); } @ApiOperation("删除通道配置信息") @PostMapping({"/device/perception/delChannelInfoAdmin"}) public Object delChannelInfoAdmin(@RequestParam("id") String id) { return this.service.delChannelInfoAdmin(id); } @ApiOperation("获取设备特征编码及二维码") @PostMapping({"/device/perception/getFeatures"}) public Object getFeatures() { String features = IdUtil.randomUUID(); String imageToBase64 = QrCodeUtils.imageToBase64(QrCodeUtil.generate(features, 200, 200)); return R.ok((new FeatureVo()).setFeature(features).setFeatureQrCode(imageToBase64)); } @ApiOperation("获取已占用通道集合") @PostMapping({"/device/perception/getOccupiedChannelList"}) public Object getOccupiedChannelList(@RequestParam(value = "deviceId",required = false) String deviceId) { return this.service.getOccupiedChannelList(deviceId); } @ApiOperation("通道标签列表") @PostMapping({"/device/perception/getChannelTagList"}) public Object getChannelTagList() { return this.service.getChannelTagList(); } public PerceptionController(final PerceptionEventCodeService service, final ConfigCacheListener config) { this.service = service; this.config = config; } }