zhanghua
2023-11-12 ead280567beb29e26e0980c6b3770815e6fe86d9
油烟统计
22个文件已修改
15个文件已添加
993 ■■■■■ 已修改文件
ycl-common/src/main/java/com/ycl/enums/common/DictTypeEnum.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/controller/platformApi/AlarmController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/controller/platformApi/TranspondDHController.java 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/controller/smoke/OdsStatisticsController.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/dto/video/HKAlarmParam.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/entity/region/SccgRegion.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/entity/smoke/OdsStatistics.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/mapper/smoke/OdsStatisticsMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/service/caseHandler/IViolationsService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/service/caseHandler/impl/ViolationsServiceImpl.java 76 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/service/dict/IDataDictionaryService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/service/dict/impl/DataDictionaryServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/service/region/ISccgRegionService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/service/region/impl/SccgRegionServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/service/smoke/IOdsStatisticsService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/service/smoke/impl/OdsStatisticsServiceImpl.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/service/video/IVideoAlarmReportService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/service/video/impl/IVideoPointService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/service/video/impl/VideoAlarmReportServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/service/video/impl/VideoPointServiceImpl.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/resources/application-dev.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-smoke/src/main/java/com/ycl/smoke/dto/CurAlarmParam2Dto.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-smoke/src/main/java/com/ycl/smoke/dto/CurAlarmParamChild2Dto.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-smoke/src/main/java/com/ycl/smoke/dto/CurAlarmParamChildDto.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-smoke/src/main/java/com/ycl/smoke/dto/CurAlarmParamDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-smoke/src/main/java/com/ycl/smoke/dto/DataDetectorDailyStatsParamDto.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-smoke/src/main/java/com/ycl/smoke/entity/OdsCurAlarm.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-smoke/src/main/java/com/ycl/smoke/entity/OdsStatistics.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-smoke/src/main/java/com/ycl/smoke/mapper/OdsStatisticsMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-smoke/src/main/java/com/ycl/smoke/remote/service/ISmokeDetectionService.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-smoke/src/main/java/com/ycl/smoke/service/IOdsCurAlarmService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-smoke/src/main/java/com/ycl/smoke/service/IOdsStatisticsService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-smoke/src/main/java/com/ycl/smoke/service/impl/OdsCurAlarmServiceImpl.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-smoke/src/main/java/com/ycl/smoke/service/impl/OdsStatisticsServiceImpl.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-smoke/src/main/java/com/ycl/smoke/task/ScheduledTask.java 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-smoke/src/main/java/com/ycl/smoke/utils/HttpUtil.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-smoke/src/main/resources/mapper/smoke/OdsStatisticsMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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>