cjl
2023-07-10 6344a8b6b7e2853dbfa9e6506ff2e17a31930297
Merge remote-tracking branch 'origin/cjl' into dev
8 files added
12 files modified
936 ■■■■■ changed files
screen-api/pom.xml 11 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/controller/MonitorPointController.java 62 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/HistoryHourlyService.java 9 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/MonitorPointService.java 7 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java 9 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/impl/MonitorPointServiceImpl.java 176 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/utils/EasyExcelUtils.java 77 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/utils/NoModelWriteData.java 15 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/utils/SimpleWriteData.java 11 ●●●●● patch | view | raw | blame | history
screen-api/src/main/resources/application-qa.yml 136 ●●●●● patch | view | raw | blame | history
screen-common/src/main/java/com/moral/util/DateUtils.java 16 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/controller/PubController.java 64 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/HistoryDailyService.java 4 ●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/impl/HistoryDailyServiceImpl.java 15 ●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/task/HistoryTableInsertTask.java 6 ●●●● patch | view | raw | blame | history
screen-job/src/main/resources/application-qa.yml 109 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/controller/PubController.java 73 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/kafka/consumer/DeviceConsumer.java 5 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/util/CacheUtils.java 2 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/resources/application-qa.yml 129 ●●●●● patch | view | raw | blame | history
screen-api/pom.xml
@@ -37,6 +37,17 @@
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.1.6</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.66</version>
        </dependency>
    </dependencies>
    <build>
screen-api/src/main/java/com/moral/api/controller/MonitorPointController.java
@@ -5,6 +5,8 @@
import com.moral.api.pojo.vo.monitorPoint.MonitorPointsVO;
import com.moral.api.service.HistoryFiveMinutelyService;
import com.moral.api.service.MonitorPointService;
import com.moral.api.utils.EasyExcelUtils;
import com.moral.api.utils.NoModelWriteData;
import com.moral.constant.ResponseCodeEnum;
import com.moral.constant.ResultMessage;
import com.moral.util.WebUtils;
@@ -14,6 +16,8 @@
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
@@ -22,13 +26,11 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * @ClassName DeviceController
@@ -97,7 +99,7 @@
            return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
        }
        String[] monitorPointIds = params.remove("monitorPointIds").toString().split(",");
        if (monitorPointIds.length >3){
        if (monitorPointIds.length > 3) {
            return ResultMessage.ok();
        }
        params.put("monitorPointIds", monitorPointIds);
@@ -137,4 +139,54 @@
        return ResultMessage.ok(resList);
    }
    @PostMapping("getHourlyDataExcelNew")
    public ResultMessage getHourlyDataExcelNew(@RequestBody Map<String, Object> params) {
        if (!params.containsKey("macs") || !params.containsKey("sensors") || !params.containsKey("times") || !params.containsKey("type")) {
            return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
        }
        List<Map<String, Object>> resList = monitorPointService.getHourlyDataDataV3Excel(params);
        return ResultMessage.ok(resList);
    }
    @PostMapping("/exlOut")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "token", value = "token", required = true, paramType = "header", dataType = "String")
    })
    public void exlOut(HttpServletResponse response,@RequestBody Map<String, Object> params) {
        //导出字段集合
        // List<ExcelHeader> excelHeaders = Arrays.asList(new ExcelHeader("phone", "手机号"), new ExcelHeader("sexStr", "性别"));
       /* Map<String, Object> params = new HashMap<>();
        params.put("macs", Arrays.asList("p5dnd7a0245446", "p5dnd7a0745450"));
        params.put("sensors", "a34004,a34002");
        params.put("type", "hours");
        params.put("times", Arrays.asList("2023-07-01 00", "2023-07-02 00"));*/
        if (!params.containsKey("macs") || !params.containsKey("sensors") || !params.containsKey("times") || !params.containsKey("type")) {
            return;
        }
        //数据集合
        List<Map<String, Object>> resList = monitorPointService.getHourlyDataDataV3Excel(params);
        if (CollectionUtils.isEmpty(resList)) {
            return;
        }
        Map<String, Object> map = resList.get(0);
        List<String> list = new ArrayList<>();
        for (String key : map.keySet()) {
            list.add(key);
        }
        String[] s2 = new String[list.size()];
        list.toArray(s2);
        NoModelWriteData d = new NoModelWriteData();
        d.setFileName("数据导出");
        d.setHeadMap(s2);
        d.setDataStrMap(s2);
        d.setDataList(resList);
        try {
            EasyExcelUtils easyExcelUtils = new EasyExcelUtils();
            easyExcelUtils.noModleWrite(d, response);
        } catch (Exception e) {
            int i = 0;
        }
    }
}
screen-api/src/main/java/com/moral/api/service/HistoryHourlyService.java
@@ -92,6 +92,15 @@
    List<HistoryHourly> getValueByMacAndTime(String mac, Date startDate, Date endDate);
    /**
     * @Description: 根据mac和时间获取小时值
     * @Param: [mac, startDate, endDate]
     * @return: java.util.List<com.moral.api.entity.HistoryHourly>
     * @Author: 陈凯裕
     * @Date: 2021/9/28
     */
    List<HistoryHourly> getValueByMacAndTime(List<String> mac, Date startDate, Date endDate);
    /**
     * @param macs List<String>
     * @param time String 例:2021-12-23
     * @description: 通过设备和时间获取小时数据
screen-api/src/main/java/com/moral/api/service/MonitorPointService.java
@@ -45,6 +45,13 @@
     */
    List<Map<String, Object>> getHourlyDataDataV3(Map<String, Object> params);
    /**
     * 监测站点数据导出
     * @param params
     * @return
     */
    List<Map<String, Object>> getHourlyDataDataV3Excel(Map<String, Object> params);
}
screen-api/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java
@@ -755,6 +755,15 @@
        List<HistoryHourly> datas = multiTableQuery(wrapper, tableNames);
        return datas;
    }
    @Override
    public List<HistoryHourly> getValueByMacAndTime(List<String> mac, Date startDate, Date endDate) {
        QueryWrapper<HistoryHourly> wrapper = new QueryWrapper<>();
        wrapper.in("mac", mac);
        wrapper.between("time", startDate, endDate);
        List<String> tableNames = MybatisPLUSUtils.getTableNamesByWrapper(startDate, endDate, SeparateTableType.MONTH);
        List<HistoryHourly> datas = multiTableQuery(wrapper, tableNames);
        return datas;
    }
    @Override
    public List<HistoryHourly> getValueByMacs(List<String> macs, String time) {
screen-api/src/main/java/com/moral/api/service/impl/MonitorPointServiceImpl.java
@@ -314,6 +314,170 @@
        return resultList;
    }
    @Override
    public List<Map<String, Object>> getHourlyDataDataV3Excel(Map<String, Object> params) {
        List<String> macs = (List<String>) params.remove("macs");
        List<String> times = (List<String>) params.remove("times");
        String type = params.get("type").toString();
        String startTime = times.get(0);
        String endTime = times.get(1);
//        String[] macs = params.remove("macs").toString().split(",");
//        List<String> macsList = Arrays.asList(macs);
        QueryWrapper<Device> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("is_delete",Constants.NOT_DELETE);
        queryWrapper.in("mac", macs);
        List<Device> devices = deviceMapper.selectList(queryWrapper);
        if (devices.size()<=0){
            return null;
        }
        String[] sensors = params.remove("sensors").toString().split(",");
        List<String> sensorsList = Arrays.asList(sensors);
        List<Map<String,Object>> resultList = new ArrayList<>();
//        List<String> sensorsList = (List<String>) params.remove("sensors");
//        String startTime = params.get("startTime").toString();
//        String endTime = params.get("endTime").toString();
        if (type.equals("hours")){
            Date startDate = DateUtils.getDate(startTime,DateUtils.yyyy_MM_dd_HH_EN);
            Date endDate = DateUtils.getDate(endTime,DateUtils.yyyy_MM_dd_HH_EN);
            List<HistoryHourly> hourlies = historyHourlyService.getValueByMacAndTime(macs, DateUtils.getDate(startTime, DateUtils.yyyy_MM_dd_HH_EN), DateUtils.getDate(endTime, DateUtils.yyyy_MM_dd_HH_EN));
            Map<String,Map<String,Object>> map = resultMap(hourlies);
            Map<Integer,String> pointMap = pointMap(devices);
            Map<String,String> sensorMap = sensorMap(sensorsList);
            for (Device device:devices) {
                Date ks = DateUtils.getDate(startTime,"yyyy-MM-dd HH");
                Date js = DateUtils.getDateAddHour(DateUtils.getDate(endTime,"yyyy-MM-dd HH"),1);
                while (DateUtils.isTimeBefor(js,ks)){
                    Map<String, Object> timeValueMap = new LinkedHashMap<>();//key为time,value为数据的json
                    timeValueMap.put("监测站点",pointMap.get(device.getMonitorPointId()));
                    timeValueMap.put("name",device.getName());
                    String c = DateUtils.dateToDateString(ks,DateUtils.yyyy_MM_dd_HH_EN);
                    timeValueMap.put("日期",c);
                    for (String sensor:sensorsList) {
                        String k = c+"_"+device.getMac();
                        Double num = 0d;
                        if(map.containsKey(k)){
                            Object o = map.get(k).get(sensor);
                            num = Objects.nonNull(o)?Double.valueOf(o.toString()):0d;
                        }
                        timeValueMap.put(sensorMap.get(sensor),num);
                    }
                    resultList.add(timeValueMap);
                    ks = DateUtils.getDateAddHour(ks,1);
                }
            }
        } else  if("day".equals(type)){
            Date startDate = DateUtils.getDate(startTime,DateUtils.yyyy_MM_dd_HH_EN);
            Date endDate = DateUtils.getDate(endTime,DateUtils.yyyy_MM_dd_HH_EN);
            List<HistoryDaily> historyDailyByMacAndTimeSlot = historyDailyService.getHistoryDailyByMacAndTimeSlot(macs, startDate, endDate);
            Map<String,Map<String,Object>> map = resultMap(historyDailyByMacAndTimeSlot,new ArrayList<>());
            Map<Integer,String> pointMap = pointMap(devices);
            Map<String,String> sensorMap = sensorMap(sensorsList);
            for (Device device:devices) {
                Date ks = DateUtils.getDate(startTime,"yyyy-MM-dd");
                Date js = DateUtils.getDateOfDay(DateUtils.getDate(endTime,"yyyy-MM-dd"),1);
                String nameSite = pointMap.get(device.getMonitorPointId());
                String name = device.getName();
                Map<String, Object> timeValueMap = new LinkedHashMap<>();
                Map<String,ArrayList<Double>> listMap = new HashMap<>();
                int numCount = 0;
                while (DateUtils.isTimeBefor(js,ks)){
                    timeValueMap = new LinkedHashMap<>();//key为time,value为数据的json
                    timeValueMap.put("监测站点",nameSite);
                    timeValueMap.put("name",name);
                    String c = DateUtils.dateToDateString(ks,"yyyy-MM-dd");
                    timeValueMap.put("日期",c);
                    for (String sensor:sensorsList) {
                        String k = c+"_"+device.getMac();
                        Double num = 0d;
                        if(map.containsKey(k)){
                            Object o = map.get(k).get(sensor);
                            num = Objects.nonNull(o)?Double.valueOf(o.toString()):0d;
                            if(Objects.nonNull(num)){
                                ArrayList<Double> doubleArrayList = Objects.isNull(listMap.get(numCount+"_"+sensorMap.get(sensor)))?new ArrayList<>():listMap.get(numCount+"_"+sensorMap.get(sensor));
                                doubleArrayList.add(num);
                                listMap.put(numCount+"_"+sensorMap.get(sensor),doubleArrayList);
                            }
                        }
                        timeValueMap.put(sensorMap.get(sensor),num);
                    }
                     resultList.add(timeValueMap);
                     ks = DateUtils.getDateOfDay(ks,1);
                }
                timeValueMap = new LinkedHashMap<>();
                timeValueMap.put("监测站点",nameSite);
                timeValueMap.put("name",name);
                timeValueMap.put("日期","累计值");
                for(int z = 0 ;z< sensorsList.size();z++){
                    double rsAvg = 0L;
                    String son = numCount+"_"+sensorMap.get(sensorsList.get(z));
                    if(listMap.containsKey(numCount+"_"+sensorMap.get(sensorsList.get(z)))){
                        Double ListAvg = listMap.get(numCount+"_"+sensorMap.get(sensorsList.get(z))).stream().collect(Collectors.averagingDouble(Double::doubleValue));
                        rsAvg = new BigDecimal(ListAvg).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();
                    }
                    timeValueMap.put(sensorMap.get(sensorsList.get(z)),rsAvg);
                }
                resultList.add(timeValueMap);
                numCount++;
            }
        }else {
            QueryWrapper<HistoryMonthly> HistoryMonthlyWrapper = new QueryWrapper<>();
            HistoryMonthlyWrapper.in("mac",devices.stream().map(Device::getMac).collect(Collectors.toList()));
            HistoryMonthlyWrapper.between("time",startTime,endTime);
            List<HistoryMonthly> historyMonthlyList = historyMonthlyMapper.selectList(HistoryMonthlyWrapper);
            Map<String,Map<String,Object>> map = resultMap(new ArrayList<>(),historyMonthlyList);
            Map<Integer,String> pointMap = pointMap(devices);
            Map<String,String> sensorMap = sensorMap(sensorsList);
            for (Device device:devices) {
                Date ks = DateUtils.getDate(startTime,"yyyy-MM");
                Date js = DateUtils.addMonths(DateUtils.getDate(endTime,"yyyy-MM"),1);
                while (DateUtils.isTimeBefor(js,ks)){
                    Map<String, Object> timeValueMap = new LinkedHashMap<>();//key为time,value为数据的json
                    timeValueMap.put("监测站点",pointMap.get(device.getMonitorPointId()));
                    timeValueMap.put("name",device.getName());
                    String c = DateUtils.dateToDateString(ks,"yyyy-MM");
                    timeValueMap.put("日期",c);
                    for (String sensor:sensorsList) {
                        String k = c+"_"+device.getMac();
                        Double num = 0d;
                        if(map.containsKey(k)){
                            Object o = map.get(k).get(sensor);
                            num = Objects.nonNull(o)?Double.valueOf(o.toString()):0d;
                        }
                        timeValueMap.put(sensorMap.get(sensor),num);
                    }
                    resultList.add(timeValueMap);
                    ks = DateUtils.addMonths(ks,1);
                }
                /*for (String sensor:sensorsList) {
                    Date ks = DateUtils.getDate(startTime,"yyyy-MM");
                    Date js = DateUtils.addMonths(DateUtils.getDate(endTime,"yyyy-MM"),1);
                    Map<String, Object> timeValueMap = new LinkedHashMap<>();//key为time,value为数据的json
                    timeValueMap.put("监测站点",pointMap.get(device.getMonitorPointId()));
                    timeValueMap.put("name",device.getName());
                    timeValueMap.put("sensor",sensorMap.get(sensor));
                    while (DateUtils.isTimeBefor(js,ks)){
                        String c = DateUtils.dateToDateString(ks,"yyyy-MM");
                        String k = c+"_"+device.getMac();
                        if(map.containsKey(k)){
                            Object o = map.get(k).get(sensor);
                            timeValueMap.put(c,Objects.nonNull(o)?Double.valueOf(o.toString()):0);
                        }else {
                            timeValueMap.put(c,0);
                        }
                        ks = DateUtils.addMonths(ks,1);
                    }
                    resultList.add(timeValueMap);
                }*/
            }
        }
        return resultList;
    }
    private Map<String,Map<String,Object>> resultMap(List<HistoryDaily> list ,List<HistoryMonthly> historyMonthlyList){
        Map<String,Map<String,Object>> map = new HashMap<>();
        for(HistoryDaily h : list){
@@ -333,6 +497,18 @@
        return map;
    }
    private Map<String,Map<String,Object>> resultMap(List<HistoryHourly> list){
        Map<String,Map<String,Object>> map = new HashMap<>();
        for(HistoryHourly h : list){
            String dateStr = DateUtils.dateToDateString( h.getTime(), DateUtils.yyyy_MM_dd_HH_EN)+"_"+h.getMac();
            Map<String,Object> jsonMap = new HashMap<>();
            JSONObject jsonObject = JSONObject.parseObject(h.getValue());
            jsonMap = jsonObject.getInnerMap();
            map.put(dateStr,jsonMap);
        }
        return map;
    }
    private Map<String,String> sensorMap(List<String> sensorsList){
        Map<String,String> map = new HashMap<>();
        QueryWrapper<Sensor> sensorQueryWrapper = new QueryWrapper<>();
screen-api/src/main/java/com/moral/api/utils/EasyExcelUtils.java
New file
@@ -0,0 +1,77 @@
package com.moral.api.utils;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.fastjson.JSON;
import com.google.common.net.HttpHeaders;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.web.bind.annotation.RequestBody;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.*;
public class EasyExcelUtils {
    //不创建对象的导出
    public void noModleWrite(@RequestBody NoModelWriteData data, HttpServletResponse response) throws IOException {
        // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
        try {
//            response.setContentType("application/vnd.ms-excel");
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
            String fileName = URLEncoder.encode(data.getFileName(), "UTF-8");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
            // 这里需要设置不关闭流
            EasyExcel.write(response.getOutputStream()).head(head(data.getHeadMap())).sheet(data.getFileName()).doWrite(dataList(data.getDataList(), data.getDataStrMap()));
        } catch (Exception e) {
            // 重置response
            response.reset();
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");
            Map<String, String> map = new HashMap<String, String>();
            map.put("status", "failure");
            map.put("message", "下载文件失败" + e.getMessage());
            response.getWriter().println(JSON.toJSONString(map));
        }
    }
    //创建对象的导出
    public <T> void simpleWrite(@RequestBody SimpleWriteData data,Class<T> clazz, HttpServletResponse response) throws IOException {
        // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
//        response.setContentType("application/vnd.ms-excel");
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode(data.getFileName(), "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
        EasyExcel.write(response.getOutputStream(), clazz).sheet(data.getFileName()).doWrite(data.getDataList());
    }
    //设置表头
    private List<List<String>> head(String[] headMap) {
        List<List<String>> list = new ArrayList<List<String>>();
        for (String head : headMap) {
            List<String> headList = new ArrayList<String>();
            headList.add(head);
            list.add(headList);
        }
        return list;
    }
    //设置导出的数据内容
    private List<List<Object>> dataList(List<Map<String, Object>> dataList, String[] dataStrMap) {
        List<List<Object>> list = new ArrayList<List<Object>>();
        for (Map<String, Object> map : dataList) {
            List<Object> data = new ArrayList<Object>();
            for (int i = 0; i < dataStrMap.length; i++) {
                data.add(map.get(dataStrMap[i]));
            }
            list.add(data);
        }
        return list;
    }
}
screen-api/src/main/java/com/moral/api/utils/NoModelWriteData.java
New file
@@ -0,0 +1,15 @@
package com.moral.api.utils;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
@Data
public class NoModelWriteData implements Serializable {
    private String fileName;//文件名
    private String[] headMap;//表头数组
    private String[] dataStrMap;//对应数据字段数组
    private List<Map<String, Object>> dataList;//数据集合
}
screen-api/src/main/java/com/moral/api/utils/SimpleWriteData.java
New file
@@ -0,0 +1,11 @@
package com.moral.api.utils;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Data
public class SimpleWriteData implements Serializable {
    private String fileName;//文件名
    private List<?> dataList;//数据列表
}
screen-api/src/main/resources/application-qa.yml
New file
@@ -0,0 +1,136 @@
server:
  port: 8081
  tomcat:
    uri-encoding: UTF-8
    #最小线程数
    min-spare-threads: 500
    #最大线程数
    max-threads: 2500
    #最大链接数
    max-connections: 6500
    #最大等待队列长度
    accept-count: 1000
spring:
  profiles:
    active: dev
    include: bulletin, specialCity, announcement
  application:
    name: screen-api
  redis:
    host: r-bp1hez4g7rkqjswpaypd1.redis.rds.aliyuncs.com
    port: 6379
    password: moral_123456
    timeout: 30000
    jedis:
      pool:
        max-active: 256
        max-wait: 30000
        max-idle: 64
        min-idle: 32
    lettuce:
      pool:
        max-active: 256
        max-idle: 64
        max-wait: 30000
        min-idle: 32
  tokenRedis:
    host: r-bp1hez4g7rkqjswpaypd1.redis.rds.aliyuncs.com
    port: 6379
    password: moral_123456
    timeout: 30000
    database: 15
    pool:
      max-active: 256
      max-wait: 30000
      max-idle: 64
      min-idle: 32
  datasource:
    minIdle: 1
    time-between-eviction-runs-millis: 60000
    max-active: 20
    test-while-idle: true
    validation-query: select 'x'
    filters: stat
    type: com.alibaba.druid.pool.DruidDataSource
    max-wait: 60000
    url: jdbc:mysql://172.16.44.71:3306/moral?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: moral_123456
    test-on-borrow: false
    sql-script-encoding: utf-8
    pool-prepared-statements: true
    min-evictable-idle-time-millis: 300000
    initial-size: 1
    driver-class-name: com.mysql.cj.jdbc.Driver
    max-conn-lifetime-millis: 20
    test-on-return: false
  servlet:
    multipart:
      enabled: true
      max-file-size: 10MB
      max-request-size: 10MB
mybatis-plus:
  mapper-locations: classpath:mapper/*.xml
  global-config:
    db-config:
      id-type: auto
      field-strategy: NOT_EMPTY
      db-type: MYSQL
  configuration:
    map-underscore-to-camel-case: true
    call-setters-on-nulls: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
kafka:
  listener:
    # 自动提交关闭,需要设置手动消息确认
    ack-mode: manual_immediate
  consumer:
    auto:
      offset:
        reset: latest
    # 在侦听器容器中运行的线程数,一般设置为 机器数*分区数
    concurrency: 3
    # 是否自动提交偏移量,默认值是true,为了避免出现重复数据和数据丢失,可以把它设置为false,然后手动提交偏移量
    enable:
      auto:
        commit: false
    servers: 47.99.145.48:9092,47.111.116.38:9092,47.111.124.159:9092
    session:
      timeout: 6000
    zookeeper:
      connect: 47.99.145.48:2181,47.111.116.38:2181,47.111.124.159:2181
  producer:
    batch:
      size: 4096
    buffer:
      memory: 40960
    linger: 1
    # 发生错误后,消息重发的次数。
    retries: 0
    servers: 47.99.145.48:9092,47.111.116.38:9092,47.111.124.159:9092
  groupId:
    second-data: SecondsDataGroup1
    cruiser-data: cruiserDataGroup1
mvc:
  interceptor:
    exclude:
      - /login
      - /swagger-ui.html
      - /swagger-resources/**
      - /swagger-ui.html/**
      - /webjars/**
      - /verificationCode/**
      - /static/**
      - /file/**
AES:
  KEY:
    AD42F7787B035B7580000EF93BE20BAD
TOKEN:
  KEY:
    foh3wi2ooghiCh5
screen-common/src/main/java/com/moral/util/DateUtils.java
@@ -622,6 +622,22 @@
        return dateToDateString(now.getTime(), formatStr);
    }
    /**
     * 获取指定日期day天后的一个(formatStr)的字符串
     *
     * @param date
     * @param date,
     * @param hours
     * @return
     */
    public static Date getDateAddHour(Date date,int hours) {
        Calendar now = Calendar.getInstance(TimeZone.getDefault());
        now.setTime(date);
        now.add(Calendar.HOUR_OF_DAY, hours);
        return now.getTime();
    }
    /**
     * @Description: 获取指定日期day天后的日期
     * @Param: [date, day]
screen-job/src/main/java/com/moral/api/controller/PubController.java
New file
@@ -0,0 +1,64 @@
package com.moral.api.controller;
import com.moral.api.service.HistoryDailyService;
import com.moral.api.service.HistoryFiveMinutelyService;
import com.moral.constant.ResultMessage;
import com.moral.util.DateUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
/**
 * @ClassName UserController
 * @Description 用户管理
 * @Author 陈凯裕
 * @Date 2021/3/22 13:52
 * @Version TODO
 **/
@Slf4j
@Api(tags = {"公共功能"})
@RestController
@RequestMapping("/pub")
public class PubController {
    @Autowired
    private HistoryDailyService historyDailyService;
    @Autowired
    private HistoryFiveMinutelyService historyFiveMinutelyService;
    @GetMapping("insertHistoryDaily")
    @ApiOperation(value = "天数据补录", notes = "天数据补录")
    public ResultMessage insertHistoryDaily(String time) {
        Date d = DateUtils.getDate(time,"yyyy-MM-dd");
        historyDailyService.insertHistoryDaily(time);
        int i = 0;
        return new ResultMessage();
    }
    @GetMapping("insertHistoryFiveMinutely")
    @ApiOperation(value = "5分钟数据", notes = "5分钟数据")
    public ResultMessage insertHistoryFiveMinutely() {
        historyFiveMinutelyService.insertHistoryFiveMinutely();
        return new ResultMessage();
    }
    public static void main(String[] args) {
        String s = "2023-9-01";
        Date d = DateUtils.getDate(s,"yyyy-MM-dd");
        System.out.println(DateUtils.dateToDateFullString(d));
        //System.out.println( DateUtils.dateToDateFullString(DateUtils.getDateOfDay(d, -1), "yyyy-MM-dd"));
    }
}
screen-job/src/main/java/com/moral/api/service/HistoryDailyService.java
@@ -6,6 +6,8 @@
import com.moral.api.entity.HistoryDaily;
import com.baomidou.mybatisplus.extension.service.IService;
import javax.xml.crypto.Data;
/**
 * <p>
 * 服务类
@@ -17,6 +19,6 @@
public interface HistoryDailyService extends IService<HistoryDaily> {
    //日数据统计
    void insertHistoryDaily();
    void insertHistoryDaily(String time);
}
screen-job/src/main/java/com/moral/api/service/impl/HistoryDailyServiceImpl.java
@@ -17,7 +17,9 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import javax.xml.crypto.Data;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
@@ -49,9 +51,14 @@
    @Override
    @Transactional
    public void insertHistoryDaily() {
    public void insertHistoryDaily(String time) {
        String format = DateUtils.yyyy_MM_dd_EN;
        Date now = new Date();
        Date now;
        if(StringUtils.isEmpty(time)){
            now = new Date();
        } else {
            now = DateUtils.getDate(time,"yyyy-MM-dd");
        }
        //开始时间,昨日
        Date start = DateUtils.dataToTimeStampTime(DateUtils.getDateOfDay(now, -1), format);
        //结束时间,今日
@@ -60,7 +67,6 @@
        QueryWrapper<Sensor> sensorQueryWrapper = new QueryWrapper<>();
        sensorQueryWrapper.select("code", "lower", "upper").eq("is_delete", Constants.NOT_DELETE);
        List<Sensor> sensors = sensorService.list(sensorQueryWrapper);
        //获取所有设备小时数据
        Map<String, Object> prop = new HashMap<>();
        String timeUnits = DateUtils.dateToDateString(start, DateUtils.yyyyMM_EN);
@@ -70,6 +76,7 @@
        List<Map<String, Object>> dailyData = historyHourlyService.selectDailyData(prop);
        if (dailyData.size() == 0) {
            System.out.println("没有小时数据"+DateUtils.dateToDateString(start));
            return;
        }
@@ -179,8 +186,8 @@
            dataMap.put("value", JSONObject.toJSONString(jsonMap));
            insertData.add(dataMap);
        });
        //存入数据库
        historyDailyMapper.insertHistoryDaily(insertData);
        System.out.println("补偿完成");
    }
}
screen-job/src/main/java/com/moral/api/task/HistoryTableInsertTask.java
@@ -12,6 +12,9 @@
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import javax.xml.crypto.Data;
import java.util.Date;
@Component
public class HistoryTableInsertTask {
@@ -46,7 +49,8 @@
    @XxlJob("insertHistoryDaily")
    public ReturnT insertHistoryDaily() {
        try {
            historyDailyService.insertHistoryDaily();
            Date now = new Date();
            historyDailyService.insertHistoryDaily(null);
        } catch (Exception e) {
            XxlJobHelper.log(e.getMessage());
            return ReturnT.FAIL;
screen-job/src/main/resources/application-qa.yml
New file
@@ -0,0 +1,109 @@
server:
  port: 8083
  tomcat:
    uri-encoding: UTF-8
    #最小线程数
    min-spare-threads: 500
    #最大线程数
    max-threads: 2500
    #最大链接数
    max-connections: 6500
    #最大等待队列长度
    accept-count: 1000
spring:
  profiles:
    active: dev
    include:
      moduleFormColumn
  application:
    name: screen-job
  redis:
    host: r-bp1hez4g7rkqjswpaypd1.redis.rds.aliyuncs.com
    port: 6379
    password: moral_123456
    timeout: 30000
    jedis:
      pool:
        max-active: 256
        max-wait: 30000
        max-idle: 64
        min-idle: 32
    lettuce:
      pool:
        max-active: 256
        max-idle: 64
        max-wait: 30000
        min-idle: 32
  tokenRedis:
    host: r-bp1hez4g7rkqjswpaypd1.redis.rds.aliyuncs.com
    port: 6379
    password: moral_123456
    timeout: 30000
    database: 14
    pool:
      max-active: 256
      max-wait: 30000
      max-idle: 64
      min-idle: 32
  datasource:
    minIdle: 1
    time-between-eviction-runs-millis: 60000
    max-active: 20
    test-while-idle: true
    validation-query: select 'x'
    filters: stat
    type: com.alibaba.druid.pool.DruidDataSource
    max-wait: 60000
    url: jdbc:mysql://rm-bp1pr3rx9m3fnkwsk8o2.mysql.rds.aliyuncs.com:3306/moral?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: moral_123456
    test-on-borrow: false
    sql-script-encoding: utf-8
    pool-prepared-statements: true
    min-evictable-idle-time-millis: 300000
    initial-size: 1
    driver-class-name: com.mysql.cj.jdbc.Driver
    max-conn-lifetime-millis: 20
    test-on-return: false
mybatis-plus:
  mapper-locations: classpath:mapper/*.xml
  global-config:
    db-config:
      id-type: auto
      field-strategy: NOT_EMPTY
      db-type: MYSQL
  configuration:
    map-underscore-to-camel-case: true
    call-setters-on-nulls: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
logging:
  config: classpath:logback.xml
xxl:
  job:
    admin:
      # 调度中心部署地址:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调"
      addresses: http://127.0.0.1:8090/xxl-job-admin
    #执行器通讯TOKEN,无TOKEN则可以空白
    accessToken:
    #执行器配置,可以配置多个
    executor:
      # 执行器的名字和地址信息配置:是该执行器心跳注册分组依据;
      #地址信息用于"调度中心请求并触发任务"和"执行器注册"。
      #执行器默认端口为9999,执行器IP默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用。
      #单机部署多个执行器时,注意要配置不同执行器端口
      appname: xxl-job-executor-sample-springboot
      ip:
      port: 9999
      #执行器运行日志文件存储的磁盘位置,需要对该路径拥有读写权限
      logpath: /data/applogs/xxl-job/jobhandler
      #执行器日志文件定期清理功能,指定日志保存天数,过期自动删除,最少保存3天否则不生效,-1则不启动。
      logretentiondays: -1
screen-manage/src/main/java/com/moral/api/controller/PubController.java
New file
@@ -0,0 +1,73 @@
package com.moral.api.controller;
import com.moral.api.pojo.dto.user.UserDTO;
import com.moral.api.pojo.dto.user.UserQueryDTO;
import com.moral.api.pojo.form.user.UserInsertForm;
import com.moral.api.pojo.form.user.UserQueryForm;
import com.moral.api.pojo.form.user.UserUpdateForm;
import com.moral.api.pojo.vo.user.UserQueryVO;
import com.moral.api.service.DeviceAdjustValueService;
import com.moral.api.service.UserService;
import com.moral.api.util.CacheUtils;
import com.moral.constant.ResponseCodeEnum;
import com.moral.constant.ResultMessage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.Map;
/**
 * @ClassName UserController
 * @Description 用户管理
 * @Author 陈凯裕
 * @Date 2021/3/22 13:52
 * @Version TODO
 **/
@Slf4j
@Api(tags = {"公共功能"})
@RestController
@RequestMapping("/pub")
public class PubController {
    @Autowired
    private CacheUtils cacheUtils;
    @Resource
    private DeviceAdjustValueService deviceAdjustValueService;
    @GetMapping("deviceAlarmInfo")
    @ApiOperation(value = "设备因子", notes = "设备因子")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "token", value = "token", required = true, paramType = "header", dataType = "String")
    })
    public ResultMessage refreshDeviceAlarmInfo() {
        cacheUtils.refreshDeviceAlarmInfo();
        return new ResultMessage();
    }
    @GetMapping("sensor")
    @ApiOperation(value = "sensor编码", notes = "sensor编码")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "token", value = "token", required = true, paramType = "header", dataType = "String")
    })
    public ResultMessage sensor() {
        cacheUtils.refreshSensor();
        return new ResultMessage();
    }
    @GetMapping(value = "adjust")
    @ApiOperation(value = "adjust编码", notes = "adjust编码")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "token", value = "token", required = true, paramType = "header", dataType = "String")
    })
    public ResultMessage adjust() {
        Map<String,Object> resultMap = deviceAdjustValueService.refreshRedis();
        return new ResultMessage();
    }
}
screen-manage/src/main/java/com/moral/api/kafka/consumer/DeviceConsumer.java
@@ -18,9 +18,8 @@
import com.moral.constant.KafkaConstants;
import com.moral.constant.RedisConstants;
/*
 * 普通设备消费者
 * */
@Component
@Slf4j
public class DeviceConsumer {
screen-manage/src/main/java/com/moral/api/util/CacheUtils.java
@@ -89,7 +89,9 @@
        Map<String, SysDictData> unitMap = sysDictDataService.getDictDatasByType("unit");
        //查询对应的单位名称以及转换公式
        Map<String,Device> result = new HashMap<>();
        int i = 0;
        for (Device device : devices) {
            System.out.println(">>>>>>>>>>>:"+(i++));
            Version version = device.getVersion();
            List<Sensor> sensors = version.getSensors();
            for (Sensor sensor : sensors) {
screen-manage/src/main/resources/application-qa.yml
New file
@@ -0,0 +1,129 @@
server:
  port: 8082
  tomcat:
    uri-encoding: UTF-8
    #最小线程数
    min-spare-threads: 500
    #最大线程数
    max-threads: 2500
    #最大链接数
    max-connections: 6500
    #最大等待队列长度
    accept-count: 1000
spring:
  profiles:
    active: dev
    include:
      moduleFormColumn
  application:
    name: screen-manage
  redis:
      host: r-bp1hez4g7rkqjswpaypd1.redis.rds.aliyuncs.com
      port: 6379
      password: moral_123456
      timeout: 30000
      jedis:
        pool:
          max-active: 256
          max-wait: 30000
          max-idle: 64
          min-idle: 32
      lettuce:
        pool:
          max-active: 256
          max-idle: 64
          max-wait: 30000
          min-idle: 32
  tokenRedis:
    host: r-bp1hez4g7rkqjswpaypd1.redis.rds.aliyuncs.com
    port: 6379
    password: moral_123456
    timeout: 30000
    database: 14
    pool:
      max-active: 256
      max-wait: 30000
      max-idle: 64
      min-idle: 32
  datasource:
    minIdle: 1
    time-between-eviction-runs-millis: 60000
    max-active: 20
    test-while-idle: true
    validation-query: select 'x'
    filters: stat
    type: com.alibaba.druid.pool.DruidDataSource
    max-wait: 60000
    url: jdbc:mysql://172.16.44.71:3306/moral?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: moral_123456
    test-on-borrow: false
    sql-script-encoding: utf-8
    pool-prepared-statements: true
    min-evictable-idle-time-millis: 300000
    initial-size: 1
    driver-class-name: com.mysql.cj.jdbc.Driver
    max-conn-lifetime-millis: 20
    test-on-return: false
mybatis-plus:
  mapper-locations: classpath:mapper/*.xml
  global-config:
    db-config:
      id-type: auto
      field-strategy: NOT_EMPTY
      db-type: MYSQL
  configuration:
     map-underscore-to-camel-case: true
     call-setters-on-nulls: true
     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
kafka:
  listener:
    ack-mode: manual_immediate
  consumer:
    auto:
      commit:
        interval: 100
      offset:
        reset: latest
    concurrency: 3
    enable:
      auto:
        commit: false
    servers: 172.16.44.65:9092,172.16.44.67:9092,172.16.44.66:9092
    session:
      timeout: 6000
    zookeeper:
      connect: 172.16.44.65:2181,172.16.44.67:2181,172.16.44.66:2181
  producer:
    batch:
      size: 4096
    buffer:
      memory: 40960
    linger: 1
    retries: 0
    servers: 172.16.44.65:9092,172.16.44.67:9092,172.16.44.66:9092
  groupId:
    insert: Dev_insert
    state: Dev_state
mvc:
  interceptor:
    exclude:
      - /login
      - /swagger-ui.html
      - /swagger-resources/**
      - /webjars/**
      - /verificationCode/**
      - /manageLog/**
      - /dataReplication/**
AES:
  KEY:
    AD42F7787B035B7580000EF93BE20BAD
TOKEN:
  KEY:
    foh3wi2ooghiCh5