ycl-common/src/main/java/com/ycl/enums/common/DictTypeEnum.java
@@ -37,10 +37,11 @@ /** * 获得所有枚举类型到map * * @return */ public static Map<String,String> getAllToMap() { Map<String,String> map = new HashMap<>(); public static Map<String, String> getAllToMap() { Map<String, String> map = new HashMap<>(); for (DictTypeEnum alarmType : values()) { map.put(alarmType.getCode(), alarmType.getType()); } ycl-platform/src/main/java/com/ycl/controller/platformApi/AlarmController.java
@@ -7,6 +7,7 @@ import com.ycl.annotation.LogSave; import com.ycl.api.CommonResult; import com.ycl.dto.video.AlarmParam; import com.ycl.dto.video.HKAlarmParam; import com.ycl.entity.video.VideoPoint; import com.ycl.enums.common.ResultCode; import com.ycl.service.video.IVideoAlarmReportService; @@ -66,6 +67,15 @@ return new CommonResult(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage()); } @ApiOperation("海康视频报警推送API") @PostMapping("/HK/alarmReport") @LogSave(operationType = "报警管理", contain = "海康视频报警推送") public CommonResult hkAlarmReport(@RequestBody @Validated HKAlarmParam alarmParam) { // System.out.println("保存报警数据:" + JSONObject.toJSONString(alarmParam)); videoAlarmReportService.saveFromHK(alarmParam); return new CommonResult(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage()); } @GetMapping("/Video/{code}/{subType}") @ApiOperation(value = "设备获取监控地址") @SneakyThrows ycl-platform/src/main/java/com/ycl/controller/platformApi/TranspondDHController.java
New file @@ -0,0 +1,135 @@ package com.ycl.controller.platformApi; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.ycl.annotation.LogSave; import com.ycl.api.CommonResult; import com.ycl.dto.v1.Req.FirstReq; import com.ycl.dto.v1.Req.SecondReq; import com.ycl.dto.v1.Res.FirstRes; import com.ycl.dto.video.AlarmParam; import com.ycl.enums.common.ResultCode; import com.ycl.utils.MD5Util; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.*; import org.springframework.http.client.ClientHttpResponse; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.client.DefaultResponseErrorHandler; import org.springframework.web.client.RestTemplate; import java.net.URI; @Api(tags = "第三方接口-大华") @RestController @RequestMapping("/API/videoService/eventCenter/messages") public class TranspondDHController { @Value("${videoPoint.url}") private String url; @Value("${videoPoint.userName}") private String userName; @Value("${videoPoint.passWord}") private String passWord; @Value("${videoPoint.ip}") private String ip; @ApiOperation("消息订阅") @GetMapping("/subscribeAddress") public CommonResult subscribeAddress() { String url = "/videoService/eventCenter/messages/subscribeAddress"; return getResult(url, ""); } @ApiOperation("长轮询获取消息") @GetMapping("/subscribe") public CommonResult subscribe(@RequestParam Integer type, @RequestParam Integer msgId, @RequestParam(required = false) Integer msgNum, @RequestParam(required = false) Integer waitSec) { String url = "/videoService/eventCenter/messages/subscribe"; String param = "?type=" + type + "&msgId=" + msgId + "&msgNum=" + msgNum + "&waitSec=" + waitSec; return getResult(url, param); } private CommonResult<?> getResult(String url, String param) { try { String token = getToken(); HttpHeaders deviceHeaders = new HttpHeaders(); ObjectMapper objectMapper = new ObjectMapper(); deviceHeaders.add("X-Subject-Token", token); HttpEntity<Object> deviceEntity = new HttpEntity<>(deviceHeaders); RestTemplate restTemplate = new RestTemplate(); ResponseEntity<String> exchange = restTemplate.exchange(url + param, HttpMethod.GET, deviceEntity, String.class); System.out.println(exchange); return CommonResult.success(exchange); } catch (Exception ex) { return CommonResult.failed(); } } private String getToken() throws JsonProcessingException { String clientType = "winpc"; String reqUrl = "/videoService/accounts/authorize"; RestTemplate restTemplate = new RestTemplate(); restTemplate.setErrorHandler(new DefaultResponseErrorHandler() { @Override public boolean hasError(HttpStatus status) { return super.hasError(status); } @Override public void handleError(URI url, HttpMethod method, ClientHttpResponse response) { } }); SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory(); simpleClientHttpRequestFactory.setOutputStreaming(false); restTemplate.setRequestFactory(simpleClientHttpRequestFactory); //请求头 HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_JSON); //第一次权限请求体 FirstReq firstReq = new FirstReq(); firstReq.setIpAddress(ip); firstReq.setUserName(userName); firstReq.setClientType(clientType); ObjectMapper objectMapper = new ObjectMapper(); HttpEntity<String> firstEntity = new HttpEntity<>(objectMapper.writeValueAsString(firstReq), httpHeaders); ResponseEntity<String> responseEntity = restTemplate.postForEntity(url + reqUrl, firstEntity, String.class); FirstRes firstRes = objectMapper.readValue(responseEntity.getBody(), FirstRes.class); String signature = MD5Util.md5Encrypt(passWord); signature = MD5Util.md5Encrypt(userName + signature); signature = MD5Util.md5Encrypt(signature); signature = MD5Util.md5Encrypt(userName + ":" + firstRes.getRealm() + ":" + signature); signature = MD5Util.md5Encrypt(signature + ":" + firstRes.getRandomKey()); SecondReq secondReq = new SecondReq(); secondReq.setIpAddress(ip); secondReq.setEncryptType(firstRes.getEncryptType()); secondReq.setSignature(signature); secondReq.setRandomKey(firstRes.getRandomKey()); secondReq.setClientType(clientType); secondReq.setUserName(userName); HttpEntity<String> secondEntity = new HttpEntity<>(objectMapper.writeValueAsString(secondReq), httpHeaders); ResponseEntity<String> secondResEntity = restTemplate.postForEntity(url + reqUrl, secondEntity, String.class); return objectMapper.readTree(secondResEntity.getBody()).get("token").textValue(); } } ycl-platform/src/main/java/com/ycl/controller/smoke/OdsStatisticsController.java
New file @@ -0,0 +1,66 @@ package com.ycl.controller.smoke; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ycl.annotation.LogSave; import com.ycl.api.CommonPage; import com.ycl.api.CommonResult; import com.ycl.controller.BaseController; import com.ycl.entity.smoke.OdsCurAlarm; import com.ycl.entity.smoke.OdsCustomer; import com.ycl.entity.smoke.OdsStatistics; import com.ycl.service.smoke.IOdsCurAlarmService; import com.ycl.service.smoke.IOdsStatisticsService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController @RequestMapping("/smoke") @Api(tags = "油烟管理管理-统计数据数据") public class OdsStatisticsController extends BaseController { IOdsStatisticsService odsStatisticsService; IOdsCurAlarmService curAlarmService; @Autowired public void setOdsStatisticsService(IOdsStatisticsService odsStatisticsService) { this.odsStatisticsService = odsStatisticsService; } @Autowired public void setCurAlarmService(IOdsCurAlarmService curAlarmService) { this.curAlarmService = curAlarmService; } @ApiOperation("检测仪总体情况报表") @RequestMapping(value = "/statistics/listDataDetectorDailyStats", method = RequestMethod.GET) @ResponseBody @LogSave(operationType = "油烟模块", contain = "检测仪总体情况报表") public CommonResult<String> findDataDetectorDailyStats() { OdsStatistics odsStatistics = odsStatisticsService.getByType("listDataDetectorDailyStats"); return CommonResult.success(odsStatistics.getContent()); } @ApiOperation("油烟减排统计") @RequestMapping(value = "/statistics/listDetectorDaily", method = RequestMethod.GET) @ResponseBody @LogSave(operationType = "油烟模块", contain = "油烟减排统计") public CommonResult<String> findDetectorDaily() { OdsStatistics odsStatistics = odsStatisticsService.getByType("listDetectorDaily"); return CommonResult.success(odsStatistics.getContent()); } @ApiOperation("监测报警统计&运维情况报表") @RequestMapping(value = "/statistics/listCurAlarm", method = RequestMethod.GET) @ResponseBody @LogSave(operationType = "油烟模块", contain = "监测报警统计&运维情况报表") public CommonResult<List<OdsCurAlarm>> findCurAlarm() { List<OdsCurAlarm> list = curAlarmService.list(); return CommonResult.success(list); } } ycl-platform/src/main/java/com/ycl/dto/video/HKAlarmParam.java
New file @@ -0,0 +1,105 @@ package com.ycl.dto.video; import io.swagger.models.auth.In; import lombok.Data; @Data public class HKAlarmParam { /** * 事件唯一标识 */ private String eventId; /** * 上报人电话 */ private String contact; /** * 事件内容 */ private String eventContent; /** * 对方事件编号 */ private String eventNumber; /** * 事项名称 */ private String eventType; /** * 事件规模(1特大,2重大,3一般) */ private String eventscale; /** * 附件,多个用逗号隔开 */ private String fileUrl; /** * 省大类 */ private String firsttype; /** * 是否重点场所(0:否;1:是) */ private Integer focusSite; /** * 事发时间 */ private String incidentDate; /** * 是否重点事件(0否,1是) */ private Integer keyEvent; /** * 纬度 */ private Double latitude; /** * 经度 */ private Double longitude; /** * 省adcode */ private String prefectureCodeIdaas; /** * 涉事人数 */ private String relatepeoplecount; /** * 上报人姓名 */ private String reportUserName; /** * 上报时间 */ private String reportedDate; /** * 上报系统名称 */ private String reportedDepartment; /** * 事发地点 */ private String scene; /** * 省小类 */ private String secondtype; /** * 事件标题 */ private String subject; /** * 事件来源系统 */ private String synergySource; /** * 省细分类 */ private String thirdtype; /** * 紧急程度(1:紧急;2非紧急) */ private String urgentExtent; } ycl-platform/src/main/java/com/ycl/entity/region/SccgRegion.java
@@ -46,6 +46,10 @@ @ApiModelProperty(value = "默认0") private Long parentId; @TableField("region_code") @ApiModelProperty(value = "地域编码") private String regionCode; /** * 类型1-街道2-社区3-乡4-镇 */ ycl-platform/src/main/java/com/ycl/entity/smoke/OdsStatistics.java
New file @@ -0,0 +1,46 @@ package com.ycl.entity.smoke; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; /** * <p> * 报警消息 * </p> * * @author lyq * @since 2023-02-28 */ @Data @EqualsAndHashCode(callSuper = false) @TableName("ums_ods_statistics") public class OdsStatistics implements Serializable { private static final long serialVersionUID = 1L; /** * Id */ @TableId("id") @JsonProperty("Id") private String id; /** * 设备的mn数据 */ @TableField("type_name") private String typeName; /** * 数据收集时间 */ @TableField("content") private String content; } ycl-platform/src/main/java/com/ycl/mapper/smoke/OdsStatisticsMapper.java
New file @@ -0,0 +1,16 @@ package com.ycl.mapper.smoke; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ycl.entity.smoke.OdsStatistics; /** * <p> * 报警消息 Mapper 接口 * </p> * * @author lyq * @since 2023-02-28 */ public interface OdsStatisticsMapper extends BaseMapper<OdsStatistics> { } ycl-platform/src/main/java/com/ycl/service/caseHandler/IViolationsService.java
@@ -1,5 +1,6 @@ package com.ycl.service.caseHandler; import com.ycl.dto.video.HKAlarmParam; import com.ycl.entity.caseHandler.Violations; import com.baomidou.mybatisplus.extension.service.IService; import com.ycl.entity.video.VideoAlarmReport; @@ -27,5 +28,6 @@ */ void saveFromVideo(List<VideoAlarmReport> videoAlarmReports); void saveFromHKVideo(HKAlarmParam alarmParam); List<VideoAndAreaVO> selectType(); } ycl-platform/src/main/java/com/ycl/service/caseHandler/impl/ViolationsServiceImpl.java
@@ -3,11 +3,13 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ycl.common.util.UtilNumber; import com.ycl.dto.video.HKAlarmParam; import com.ycl.entity.caseHandler.BaseCase; import com.ycl.entity.caseHandler.EventSource; import com.ycl.entity.caseHandler.QuestionCategory; import com.ycl.entity.caseHandler.Violations; import com.ycl.entity.dict.DataDictionary; import com.ycl.entity.region.SccgRegion; import com.ycl.entity.resources.ImageResources; import com.ycl.entity.video.VideoAlarmReport; import com.ycl.entity.video.VideoPoint; @@ -17,6 +19,7 @@ import com.ycl.service.caseHandler.IBaseCaseService; import com.ycl.service.caseHandler.IViolationsService; import com.ycl.service.dict.IDataDictionaryService; import com.ycl.service.region.ISccgRegionService; import com.ycl.service.resources.IImageResourcesService; import com.ycl.service.video.impl.IVideoPointService; import com.ycl.vo.cockpit.enforcementEvents.VideoAndAreaVO; @@ -24,8 +27,11 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.List; /** * <p> @@ -42,7 +48,7 @@ private IBaseCaseService baseCaseService; private IDataDictionaryService dataDictionaryService; private IImageResourcesService imageResourcesService; private ISccgRegionService regionService; @Resource BaseCaseMapper baseCaseMapper; @@ -69,20 +75,19 @@ this.imageResourcesService = imageResourcesService; } @Autowired public void setRegionService(ISccgRegionService regionService) { this.regionService = regionService; } @Override public void saveFromVideo(List<VideoAlarmReport> videoAlarmReports) { for (VideoAlarmReport videoAlarmReport : videoAlarmReports) { VideoPoint videoPoint = null; LambdaQueryWrapper<VideoPoint> queryWrapper = new LambdaQueryWrapper<VideoPoint>() .eq(VideoPoint::getPlatResourceId, videoAlarmReport.getPlatResourceId()) .or().eq(VideoPoint::getCode, videoAlarmReport.getPlatResourceId()); List<VideoPoint> pointList = videoPointService.list(queryWrapper); if (pointList.size() > 0) { videoPoint = pointList.get(0); } BaseCase baseCase = BaseCase.builder().eventSource(EventSource.VIDEO.getCode()).category(QuestionCategory.VIOLATION.getCode()) .code(utilNumber.createCaseCode()).createTime(LocalDateTime.now()).createUser(0L).state(1).alarmTime(videoAlarmReport.getAlarmTime()).build(); Violations violations = new Violations(); VideoPoint videoPoint = videoPointService.getByCode(videoAlarmReport.getPlatResourceId()); if (videoPoint != null) { baseCase.setLatitude(videoPoint.getLatitude()); baseCase.setLongitude(videoPoint.getLongitude()); @@ -120,6 +125,59 @@ } @Override public void saveFromHKVideo(HKAlarmParam alarmParam) { SccgRegion region = regionService.getByCode(alarmParam.getPrefectureCodeIdaas()); VideoPoint videoPoint = videoPointService.getByCode(alarmParam.getEventNumber()); List<DataDictionary> dataDictionaries = dataDictionaryService.queryByRemark(alarmParam.getSubject()); Instant instant = Instant.ofEpochMilli(Long.parseLong(alarmParam.getIncidentDate())); BaseCase baseCase = BaseCase.builder().eventSource(1).category(QuestionCategory.VIOLATION.getCode()) .code(utilNumber.createCaseCode()).createTime(LocalDateTime.now()).createUser(0L).state(1). alarmTime(LocalDateTime.ofInstant(instant, ZoneId.systemDefault())).build(); Violations violations = new Violations(); baseCase.setLatitude(alarmParam.getLatitude()); baseCase.setLongitude(alarmParam.getLongitude()); if (region != null) { baseCase.setStreetId(region.getId().intValue()); } baseCase.setSite(alarmParam.getScene()); baseCaseService.save(baseCase); violations.setId(baseCase.getId()); if (dataDictionaries.size() > 0) { violations.setGradeId(dataDictionaries.get(0).getId()); } violations.setDescription(alarmParam.getEventContent()); violations.setInformant(alarmParam.getReportUserName()); violations.setInformantPhoneCode(alarmParam.getContact()); if (videoPoint != null) { violations.setVideoPointId(videoPoint.getId()); } baseMapper.insert(violations); String[] imgs = alarmParam.getFileUrl().split(","); try { for (int i = 0; i < imgs.length; i++) { ImageResources imageResources = new ImageResources(); imageResources.setType("01"); imageResources.setBelongToId(baseCase.getId()); imageResources.setUrl(imgs[i]); imageResources.setCreateTime(LocalDateTime.now()); imageResourcesService.save(imageResources); } } catch (Exception ex) { } } @Override public List<VideoAndAreaVO> selectType() { return baseCaseMapper.selectType(); } ycl-platform/src/main/java/com/ycl/service/dict/IDataDictionaryService.java
@@ -35,4 +35,6 @@ Page listViolations(Integer current, Integer size, String keyWord); List<DataDictionaryVo> queryTreeType(String typeCode, Integer level); List<DataDictionary> queryByRemark(String remark); } ycl-platform/src/main/java/com/ycl/service/dict/impl/DataDictionaryServiceImpl.java
@@ -83,4 +83,13 @@ public List<DataDictionaryVo> queryTreeType(String typeCode, Integer level) { return baseMapper.queryTreeType(typeCode, level); } @Override public List<DataDictionary> queryByRemark(String remark) { LambdaQueryWrapper<DataDictionary> queryWrapper = new LambdaQueryWrapper<DataDictionary>() .eq(DataDictionary::getRemark, remark); List<DataDictionary> dataDictionary = dataDictionaryMapper.selectList(queryWrapper); return dataDictionary; } } ycl-platform/src/main/java/com/ycl/service/region/ISccgRegionService.java
@@ -24,4 +24,6 @@ Page<SccgRegion> list(Integer pageSize, Integer pageNum); List<SccgRegion> getChildren(Long parentId); SccgRegion getByCode(String code); } ycl-platform/src/main/java/com/ycl/service/region/impl/SccgRegionServiceImpl.java
@@ -101,4 +101,12 @@ List<SccgRegion> regions = baseMapper.selectList(wrapper); return regions; } @Override public SccgRegion getByCode(String code) { LambdaQueryWrapper<SccgRegion> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(SccgRegion::getRegionCode, code); return baseMapper.selectOne(wrapper); } } ycl-platform/src/main/java/com/ycl/service/smoke/IOdsStatisticsService.java
New file @@ -0,0 +1,17 @@ package com.ycl.service.smoke; import com.baomidou.mybatisplus.extension.service.IService; import com.ycl.entity.smoke.OdsStatistics; /** * <p> * 报警消息 服务类 * </p> * * @author lyq * @since 2023-02-28 */ public interface IOdsStatisticsService extends IService<OdsStatistics> { OdsStatistics getByType(String typeName); } ycl-platform/src/main/java/com/ycl/service/smoke/impl/OdsStatisticsServiceImpl.java
New file @@ -0,0 +1,34 @@ package com.ycl.service.smoke.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ycl.entity.caseHandler.WorkflowConfigStep; import com.ycl.entity.smoke.OdsStatistics; import com.ycl.mapper.smoke.OdsStatisticsMapper; import com.ycl.service.smoke.IOdsStatisticsService; import org.springframework.stereotype.Service; import java.util.List; /** * <p> * 报警消息 服务实现类 * </p> * * @author lyq * @since 2023-02-28 */ @Service public class OdsStatisticsServiceImpl extends ServiceImpl<OdsStatisticsMapper, OdsStatistics> implements IOdsStatisticsService { @Override public OdsStatistics getByType(String typeName) { LambdaQueryWrapper<OdsStatistics> queryWrapper = new LambdaQueryWrapper<OdsStatistics>().eq(OdsStatistics::getTypeName, typeName).orderByDesc(OdsStatistics::getId); List<OdsStatistics> list = this.list(queryWrapper); if (list.size() > 0) { return list.get(0); } return null; } } ycl-platform/src/main/java/com/ycl/service/video/IVideoAlarmReportService.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ycl.dto.video.AlarmParam; import com.ycl.dto.video.HKAlarmParam; import com.ycl.entity.video.VideoAlarmReport; /** @@ -21,4 +22,5 @@ */ void save(AlarmParam alarmParam); void saveFromHK(HKAlarmParam alarmParam); } ycl-platform/src/main/java/com/ycl/service/video/impl/IVideoPointService.java
@@ -20,4 +20,6 @@ public interface IVideoPointService extends IService<VideoPoint> { IPage<VideoPointVo> getList(Integer streetId, Integer communityId, Integer current, Integer size); VideoPoint getByCode(String code); } ycl-platform/src/main/java/com/ycl/service/video/impl/VideoAlarmReportServiceImpl.java
@@ -219,6 +219,13 @@ } } @Override public void saveFromHK(HKAlarmParam alarmParam) { if (alarmParam != null) { violationsService.saveFromHKVideo(alarmParam); } } private List<VideoAlarmReport> getByAlarmId(String alarmId) { LambdaQueryWrapper<VideoAlarmReport> queryWrapper = new LambdaQueryWrapper<VideoAlarmReport>().eq(VideoAlarmReport::getAlarmId, alarmId); return this.list(queryWrapper); ycl-platform/src/main/java/com/ycl/service/video/impl/VideoPointServiceImpl.java
@@ -1,5 +1,6 @@ package com.ycl.service.video.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ycl.entity.video.VideoPoint; @@ -27,4 +28,17 @@ public IPage<VideoPointVo> getList(Integer streetId, Integer communityId, Integer current, Integer size) { return baseMapper.search(new Page<>(current, size), streetId, communityId); } @Override public VideoPoint getByCode(String code) { VideoPoint videoPoint = null; LambdaQueryWrapper<VideoPoint> queryWrapper = new LambdaQueryWrapper<VideoPoint>() .eq(VideoPoint::getPlatResourceId, code) .or().eq(VideoPoint::getCode, code); List<VideoPoint> pointList = this.list(queryWrapper); if (pointList.size() > 0) { videoPoint = pointList.get(0); } return videoPoint; } } ycl-platform/src/main/resources/application-dev.yml
@@ -35,7 +35,7 @@ timeout: 0 datasource: url: jdbc:mysql://42.193.1.25:3306/sccg1020?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false url: jdbc:mysql://42.193.1.25:3306/sccg?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false username: root password: 321$YcYl@1970! type: com.alibaba.druid.pool.DruidDataSource ycl-smoke/src/main/java/com/ycl/smoke/dto/CurAlarmParam2Dto.java
New file @@ -0,0 +1,47 @@ package com.ycl.smoke.dto; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; @Data @Builder @EqualsAndHashCode(callSuper = false) @JsonInclude(JsonInclude.Include.NON_NULL) public class CurAlarmParam2Dto { /** * 起始位置 - 必填 */ @JsonProperty("StartAt") private Integer StartAt; /** * 请求数量 - 必填 */ @JsonProperty("Size") private Integer Size; /** * 1:超标2:异常 - 必填 */ @JsonProperty("Typ") private Integer Typ; /** * 排序依据 - 否 */ @JsonProperty("SortBy") private String SortBy; /** * 升序、降序 */ @JsonProperty("SortMode") private String SortMode; @JsonProperty("Param") private CurAlarmParamChild2Dto Param; } ycl-smoke/src/main/java/com/ycl/smoke/dto/CurAlarmParamChild2Dto.java
New file @@ -0,0 +1,50 @@ package com.ycl.smoke.dto; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; @Data @Builder @EqualsAndHashCode(callSuper = false) @JsonInclude(JsonInclude.Include.NON_NULL) public class CurAlarmParamChild2Dto { /** * 是 是否需要最高浓度日期 */ @JsonProperty("WithCEmissionsMaxDate") public Boolean WithCEmissionsMaxDate; @JsonProperty("LocaleWithDevice") public Boolean LocaleWithDevice; /** * 是 查询起始时间 */ @JsonProperty("startAt") public Long StartAt; /** * 是 查询结束时间 */ @JsonProperty("endAt") public Long EndAt; /** * 否 健康码颜色 */ @JsonProperty("HealthCodeColor") public String HealthCodeColor; /** * 否 设备编码 */ @JsonProperty("mn") public String mn; /** * 25 否 所属单位 */ @JsonProperty("Owner") public String Owner; } ycl-smoke/src/main/java/com/ycl/smoke/dto/CurAlarmParamChildDto.java
@@ -1,5 +1,6 @@ package com.ycl.smoke.dto; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Builder; import lombok.Data; @@ -8,12 +9,17 @@ @Data @Builder @EqualsAndHashCode(callSuper = false) @JsonInclude(JsonInclude.Include.NON_NULL) public class CurAlarmParamChildDto { /** * 是 是否需要最高浓度日期 */ @JsonProperty("WithCEmissionsMaxDate") public Boolean WithCEmissionsMaxDate; @JsonProperty("LocaleWithDevice") public Boolean LocaleWithDevice; /** * 是 查询起始时间 */ @@ -24,6 +30,7 @@ */ @JsonProperty("EndAt") public Long EndAt; /** * 否 健康码颜色 */ ycl-smoke/src/main/java/com/ycl/smoke/dto/CurAlarmParamDto.java
@@ -1,5 +1,6 @@ package com.ycl.smoke.dto; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Builder; import lombok.Data; @@ -8,6 +9,7 @@ @Data @Builder @EqualsAndHashCode(callSuper = false) @JsonInclude(JsonInclude.Include.NON_NULL) public class CurAlarmParamDto { /** * 起始位置 - 必填 ycl-smoke/src/main/java/com/ycl/smoke/dto/DataDetectorDailyStatsParamDto.java
New file @@ -0,0 +1,21 @@ package com.ycl.smoke.dto; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; @Data @Builder @EqualsAndHashCode(callSuper = false) @JsonInclude(JsonInclude.Include.NON_NULL) public class DataDetectorDailyStatsParamDto { // {"Typ":1,"WithAreaLocaleReport":false,"Owner":"/7686/","AcquitDateBegin":"2023-10-12","AcquitDateEnd":"2023-11-11"}: @JsonProperty("Typ") private Integer Typ; private Boolean WithAreaLocaleReport; private String Owner; private String AcquitDateBegin; private String AcquitDateEnd; } ycl-smoke/src/main/java/com/ycl/smoke/entity/OdsCurAlarm.java
@@ -209,14 +209,14 @@ */ @TableField("local_lat") @JsonProperty("LocaleLat") private String localLat; private String LocaleLat; /** * 经度 */ @TableField("local_lng") @JsonProperty("LocaleLng") private String localLng; private String LocaleLng; /** * 设备的mn数据 @@ -237,7 +237,7 @@ */ @TableField("off_line_cause_by_shop_days") @JsonProperty("OfflineCausedByShopDays") private Integer offLineCauseByShopDays; private Integer OfflineCausedByShopDays; /** * 所属单位 @@ -251,7 +251,7 @@ */ @TableField("shop_close_days") @JsonProperty("ShopClosedDays") private Integer shopCloseDays; private Integer ShopClosedDays; /** * 状态[1:一般监测点,2:特殊监测点,99:废弃监测点] ycl-smoke/src/main/java/com/ycl/smoke/entity/OdsStatistics.java
New file @@ -0,0 +1,46 @@ package com.ycl.smoke.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; /** * <p> * 报警消息 * </p> * * @author lyq * @since 2023-02-28 */ @Data @EqualsAndHashCode(callSuper = false) @TableName("ums_ods_statistics") public class OdsStatistics implements Serializable { private static final long serialVersionUID = 1L; /** * Id */ @TableId("id") @JsonProperty("Id") private String id; /** * 设备的mn数据 */ @TableField("type_name") private String typeName; /** * 数据收集时间 */ @TableField("content") private String content; } ycl-smoke/src/main/java/com/ycl/smoke/mapper/OdsStatisticsMapper.java
New file @@ -0,0 +1,17 @@ package com.ycl.smoke.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ycl.smoke.entity.OdsAlarmMsg; import com.ycl.smoke.entity.OdsStatistics; /** * <p> * 报警消息 Mapper 接口 * </p> * * @author lyq * @since 2023-02-28 */ public interface OdsStatisticsMapper extends BaseMapper<OdsStatistics> { } ycl-smoke/src/main/java/com/ycl/smoke/remote/service/ISmokeDetectionService.java
@@ -47,6 +47,35 @@ @RequestHeader("Auth") String token); /** * 总体情况 * * @param {"Typ":1,"WithAreaLocaleReport":false,"AcquitDateBegin":"2023-10-12","AcquitDateEnd":"2023-11-11"}: * @param token * @return */ @PostMapping(value = "/admin/listDataDetectorDailyStats") String getListDataDetectorDailyStats(@RequestBody DataDetectorDailyStatsParamDto paramDto, @RequestHeader("Auth") String token); /** * 油烟减排 * * @param {"StartAt":0,"Size":20,"Param":{"startAt":1697040000,"endAt":1699631999}}: * @param token * @return */ @PostMapping(value = "/admin/listDetectorDaily") String getListDetectorDaily(@RequestBody CurAlarmParam2Dto paramDto, @RequestHeader("Auth") String token); /** * 监测报警统计 运维情况报表 * * @param {"StartAt":0,"Size":20,"Typ":2,"SortBy":"status","SortMode":"asc","Param":{"StartAt":1696953600,"EndAt":1699545600,"LocaleWithDevice":true}}: * @param token * @return */ @PostMapping(value = "/admin/listCurAlarm") String getListCurAlarm(@RequestBody CurAlarmParamDto paramDto, @RequestHeader("Auth") String token); ycl-smoke/src/main/java/com/ycl/smoke/service/IOdsCurAlarmService.java
@@ -13,4 +13,5 @@ */ public interface IOdsCurAlarmService extends IService<OdsCurAlarm> { void saveByLocalId(OdsCurAlarm o); } ycl-smoke/src/main/java/com/ycl/smoke/service/IOdsStatisticsService.java
New file @@ -0,0 +1,17 @@ package com.ycl.smoke.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ycl.smoke.entity.OdsAlarmMsg; import com.ycl.smoke.entity.OdsStatistics; /** * <p> * 报警消息 服务类 * </p> * * @author lyq * @since 2023-02-28 */ public interface IOdsStatisticsService extends IService<OdsStatistics> { } ycl-smoke/src/main/java/com/ycl/smoke/service/impl/OdsCurAlarmServiceImpl.java
@@ -1,10 +1,13 @@ package com.ycl.smoke.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ycl.smoke.entity.OdsCurAlarm; import com.ycl.smoke.mapper.OdsCurAlarmMapper; import com.ycl.smoke.service.IOdsCurAlarmService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; import java.util.List; /** * <p> @@ -17,4 +20,15 @@ @Service public class OdsCurAlarmServiceImpl extends ServiceImpl<OdsCurAlarmMapper, OdsCurAlarm> implements IOdsCurAlarmService { @Override public void saveByLocalId(OdsCurAlarm o) { LambdaQueryWrapper<OdsCurAlarm> queryWrapper = new LambdaQueryWrapper<OdsCurAlarm>().eq(OdsCurAlarm::getLocaleId, o.getLocaleId()); List<OdsCurAlarm> list = this.list(queryWrapper); if (list.size() > 0) { o.setId(list.get(0).getId()); updateById(o); } else { save(o); } } } ycl-smoke/src/main/java/com/ycl/smoke/service/impl/OdsStatisticsServiceImpl.java
New file @@ -0,0 +1,23 @@ package com.ycl.smoke.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ycl.smoke.entity.OdsAlarmMsg; import com.ycl.smoke.entity.OdsStatistics; import com.ycl.smoke.mapper.OdsAlarmMsgMapper; import com.ycl.smoke.mapper.OdsStatisticsMapper; import com.ycl.smoke.service.IOdsAlarmMsgService; import com.ycl.smoke.service.IOdsStatisticsService; import org.springframework.stereotype.Service; /** * <p> * 报警消息 服务实现类 * </p> * * @author lyq * @since 2023-02-28 */ @Service public class OdsStatisticsServiceImpl extends ServiceImpl<OdsStatisticsMapper, OdsStatistics> implements IOdsStatisticsService { } ycl-smoke/src/main/java/com/ycl/smoke/task/ScheduledTask.java
@@ -4,26 +4,30 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.ycl.service.redis.RedisService; import com.ycl.smoke.entity.*; import com.ycl.smoke.dto.*; import com.ycl.smoke.remote.service.ISmokeDetectionService; import com.ycl.smoke.service.*; import com.ycl.smoke.utils.HttpUtil; import com.ycl.utils.redis.RedisKey; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Calendar; import java.util.Date; import java.util.List; @Component public class ScheduledTask { private final String host = "http://116.62.234.187:8120"; ISmokeDetectionService smokeDetectionService; IOdsAlarmMsgService alarmMsgService; @@ -43,6 +47,8 @@ IOdsAlarmRecordService alarmRecordService; IOdsCurAlarmService curAlarmService; IOdsStatisticsService odsStatisticsService; @Resource private RedisService redisService; @@ -95,6 +101,11 @@ @Autowired public void setDetectorDailyService(IOdsDetectorDailyService detectorDailyService) { this.detectorDailyService = detectorDailyService; } @Autowired public void setOdsStatisticsService(IOdsStatisticsService odsStatisticsService) { this.odsStatisticsService = odsStatisticsService; } @Scheduled(cron = "0 0 1 * * ?") // 每天零点执行 @@ -194,6 +205,10 @@ } } @Scheduled(cron = "0 */30 * * * ?") // 每5分钟执行 public void loginTask() { login(); } // @Scheduled(cron = "0 0 1 * * ?") // 每天零点执行 @Scheduled(cron = "0 */1 * * * ?") // 每5分钟执行 @@ -218,7 +233,6 @@ private void getInTimeData(DataIntimeParamDto paramDto) { try { String jj = JSON.toJSONString(paramDto); String json = smokeDetectionService.listDataIntime(paramDto, redisService.get(RedisKey.SMOKE_TOKEN).toString()); SmokeResultResponseDto responseDto = JSON.parseObject(json, SmokeResultResponseDto.class); @@ -358,11 +372,32 @@ } } /** * 监测报警统计 运维情况报表 */ @Scheduled(cron = "0 0 1 * * ?") // 每天零点执行 // @Scheduled(cron = "0/1 * * * * ?") // 每秒执行 public void listCurAlarm() { try { CurAlarmParamDto paramDto = CurAlarmParamDto.builder().Typ(2).build(); CurAlarmParamDto paramDto = CurAlarmParamDto.builder().StartAt(0).Size(20).SortBy("status").SortMode("asc").Typ(2).build(); CurAlarmParamChildDto childDto = CurAlarmParamChildDto.builder().build(); Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MILLISECOND, 0); calendar.add(Calendar.DAY_OF_MONTH, -1); long todayZero = calendar.getTimeInMillis(); calendar.add(Calendar.DAY_OF_MONTH, 1); calendar.add(Calendar.MONTH, -1); long lastMonthZero = calendar.getTimeInMillis(); childDto.setStartAt(lastMonthZero / 1000); childDto.setEndAt(todayZero / 1000); childDto.setLocaleWithDevice(true); paramDto.setParam(childDto); String json = smokeDetectionService.getListCurAlarm(paramDto, redisService.get(RedisKey.SMOKE_TOKEN).toString()); SmokeResultResponseDto responseDto = JSON.parseObject(json, SmokeResultResponseDto.class); @@ -372,7 +407,7 @@ List<OdsCurAlarm> list = responseDataDto.getContent(); list.forEach(o -> { try { curAlarmService.save(o); curAlarmService.saveByLocalId(o); } catch (Exception ex) { System.out.printf(ex.getMessage()); } @@ -380,7 +415,7 @@ // alarmMsgService.saveBatch(list); } else if (responseDto.getStatus() == 114) { login(); queryDataDetectorDaily2Task(); listCurAlarm(); } else { System.out.printf(responseDto.getData().toString()); } @@ -389,6 +424,89 @@ } } /** * 检测仪总体情况报表 */ @Scheduled(cron = "0 0 1 * * ?") // 每天零点执行 // @Scheduled(cron = "0/1 * * * * ?") // 每秒执行 public void listDataDetectorDailyStats() { try { DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); Calendar calendar = Calendar.getInstance(); String dateEnd = df.format(calendar.getTime()); calendar.add(Calendar.MONTH, -1); String dateBegin = df.format(calendar.getTime()); DataDetectorDailyStatsParamDto paramDto = DataDetectorDailyStatsParamDto.builder().Typ(1).WithAreaLocaleReport(false) .AcquitDateBegin(dateBegin).AcquitDateEnd(dateEnd).build(); String json = smokeDetectionService.getListDataDetectorDailyStats(paramDto, redisService.get(RedisKey.SMOKE_TOKEN).toString()); SmokeResultResponseDto responseDto = JSON.parseObject(json, SmokeResultResponseDto.class); if (responseDto.getStatus() == 200) { LambdaUpdateWrapper<OdsStatistics> update = new LambdaUpdateWrapper<OdsStatistics>() .eq(OdsStatistics::getTypeName, "listDataDetectorDailyStats") .set(OdsStatistics::getContent, responseDto.getData().toString()); odsStatisticsService.update(update); } else if (responseDto.getStatus() == 114) { login(); listDataDetectorDailyStats(); } else { System.out.printf(responseDto.getData().toString()); } } catch (Exception ex) { System.out.printf(ex.getMessage()); } } /** * 油烟减排统计 */ @Scheduled(cron = "0 0 1 * * ?") // 每天零点执行 // @Scheduled(cron = "0/1 * * * * ?") // 每秒执行 public void listDetectorDaily() { try { CurAlarmParam2Dto paramDto = CurAlarmParam2Dto.builder().StartAt(0).Size(20).build(); CurAlarmParamChild2Dto childDto = CurAlarmParamChild2Dto.builder().build(); Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MILLISECOND, 0); calendar.add(Calendar.DAY_OF_MONTH, -1); long todayZero = calendar.getTimeInMillis(); calendar.add(Calendar.DAY_OF_MONTH, 1); calendar.add(Calendar.MONTH, -1); long lastMonthZero = calendar.getTimeInMillis(); childDto.setStartAt(lastMonthZero / 1000); childDto.setEndAt(todayZero / 1000); paramDto.setParam(childDto); // {"StartAt":0,"Size":20,"Param":{"startAt":1697040000,"endAt":1699631999}}: String json = smokeDetectionService.getListDetectorDaily(paramDto, redisService.get(RedisKey.SMOKE_TOKEN).toString()); SmokeResultResponseDto responseDto = JSON.parseObject(json, SmokeResultResponseDto.class); if (responseDto.getStatus() == 200) { LambdaUpdateWrapper<OdsStatistics> update = new LambdaUpdateWrapper<OdsStatistics>() .eq(OdsStatistics::getTypeName, "listDetectorDaily") .set(OdsStatistics::getContent, responseDto.getData().toString()); odsStatisticsService.update(update); } else if (responseDto.getStatus() == 114) { login(); listDetectorDaily(); } else { System.out.printf(responseDto.getData().toString()); } } catch (Exception ex) { System.out.printf(ex.getMessage()); } } void login() { LoginParamDto loginParamDto = LoginParamDto.builder().username("遂昌城管局").password("123456").noCode(true).build(); String json = smokeDetectionService.loginAction(loginParamDto); ycl-smoke/src/main/java/com/ycl/smoke/utils/HttpUtil.java
@@ -118,7 +118,7 @@ //第三步:给httpPost设置JSON格式的参数 StringEntity requestEntity = new StringEntity(json,"utf-8"); requestEntity.setContentEncoding("UTF-8"); httpPost.setHeader("Content-type", "application/json"); httpPost.setHeader("Content-type", "application/x-www-form-urlencoded"); httpPost.setHeader("Auth",token); httpPost.setEntity(requestEntity); ycl-smoke/src/main/resources/mapper/smoke/OdsStatisticsMapper.xml
New file @@ -0,0 +1,17 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ycl.smoke.mapper.OdsStatisticsMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.ycl.smoke.entity.OdsStatistics"> <id column="id" property="id" /> <result column="type_name" property="typeName" /> <result column="content" property="content" /> </resultMap> <!-- 通用查询结果列 --> <sql id="Base_Column_List"> id, type_name, content </sql> </mapper>