jinpengyong
2023-08-28 a901d8910243b6c15c3ff7722d006e06d87ec6f6
Merge branch 'dev' of http://blit.7drlb.com:8888/r/moral into wb
11 files modified
299 ■■■■ changed files
screen-api/src/main/java/com/moral/api/controller/MonitorPointController.java 7 ●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/controller/SysTestController.java 29 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/entity/SysTest.java 28 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java 5 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/mapper/HistoryHourlyMapper.java 3 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/HistoryHourlyService.java 3 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java 158 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/task/HistoryTableInsertTask.java 14 ●●●●● patch | view | raw | blame | history
screen-job/src/main/resources/mapper/HistoryHourlyMapper.xml 10 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/kafka/consumer/DeviceConsumer.java 30 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java 12 ●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/controller/MonitorPointController.java
@@ -107,10 +107,15 @@
        if (!params.containsKey("monitorPointIds")) {
            return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg());
        }
        String[] monitorPointIds = params.remove("monitorPointIds").toString().split(",");
        String monitorPoint = params.remove("monitorPointIds").toString();
        /*if(monitorPoint.contains("")){
        }*/
        String[] monitorPointIds = monitorPoint.split(",");
        if (monitorPointIds.length > 3) {
            return ResultMessage.ok();
        }
        params.put("monitorPointIds", monitorPointIds);
        List<Object> response = historyFiveMinutelyService.getAreaWindData(params);
        return ResultMessage.ok(response);
screen-api/src/main/java/com/moral/api/controller/SysTestController.java
@@ -56,18 +56,21 @@
    @GetMapping("resultWord")
    public void adresultWordd(HttpServletResponse response,String time,String endTime) {
       // for(int i = 495;i<1095;i++){
            List<SysTest> listAll = sysTestService.listAll(time,endTime,null);
            if(CollectionUtils.isEmpty(listAll)){
                return;
            }
          /*  Date endTime =listAll.get(0).getTime();
            String endTimeStr = DateUtils.dateToDateString(endTime,DateUtils.yyyyMMdd_EN);
        String ks = "2023-06-22";
        endTime = "2023-08-06";
        Date ksDate = DateUtils.convertDate(ks);
        List<SysTest> listAll = sysTestService.listAll(ks,endTime,null);
        if(CollectionUtils.isEmpty(listAll)){
            return;
        }
        for(SysTest s : listAll){
            Date endTimes =s.getTime();
            String endTimeStr = DateUtils.dateToDateString(endTimes,DateUtils.yyyyMMdd_EN);
            String  fileName = "空气质量日报.docx";
            Map<String,Object> map = resultMap(listAll);
            downloadWord(fileName, map, response,"空气质量日报"+endTimeStr+".docx");*/
          //  time = DateUtils.dateToDateString(DateUtils.addDays(endTime,1),DateUtils.yyyy_MM_dd_EN);
     //   }
            downloadWord(fileName, map, response,"空气质量日报"+endTimeStr+".docx");
            //time = DateUtils.dateToDateString(DateUtils.addDays(endTime,1),DateUtils.yyyy_MM_dd_EN);
        }
    }
    @GetMapping("excelM")
@@ -136,9 +139,9 @@
    @GetMapping("resultWordMonth")
    public void resultWordMonth(HttpServletResponse response) {
        String ks = "2020-06-01";
        String ks = "2023-07-01";
        Date ksDate = DateUtils.convertDate(ks);
        for(int i = 0;i<37;i++){
        for(int i = 0;i<1;i++){
            Date jsDate =  DateUtils.getLastDayOfCurrMonth(ksDate);;
            String time = DateUtils.dateToDateString(ksDate,DateUtils.yyyy_MM_dd_EN);
            String endTime = DateUtils.dateToDateString(jsDate,DateUtils.yyyy_MM_dd_EN);
@@ -161,7 +164,7 @@
        String path = getPath(fileName);//我这放 resources包下
        try {
            //获取模板文档
            OutputStream out = new FileOutputStream("E:\\home\\mon\\" + newFileName);
            OutputStream out = new FileOutputStream("E:\\home\\mon1\\" + newFileName);
            File rootFile = new File(ResourceUtils.getURL("classpath:").getPath());
            File file= new File(rootFile, path);
            XWPFDocument word = WordExportUtil.exportWord07(file.getPath(), params);
screen-api/src/main/java/com/moral/api/entity/SysTest.java
@@ -8,6 +8,7 @@
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.apache.commons.lang3.StringUtils;
/**
 * <p>
@@ -52,4 +53,31 @@
    @TableField(exist = false)
    private String mon;
    public String getPm25() {
        return StringUtils.isEmpty(pm25)?"0":String.valueOf(Double.parseDouble(pm25));
    }
    public String getPm10() {
        return StringUtils.isEmpty(pm10)?"0":String.valueOf(Double.parseDouble(pm10));
    }
    public String getSo2() {
        return StringUtils.isEmpty(so2)?"0":String.valueOf(Double.parseDouble(so2));
    }
    public String getNo2() {
        return StringUtils.isEmpty(no2)?"0":String.valueOf(Double.parseDouble(no2));
    }
    public String getCo() {
        return StringUtils.isEmpty(co)?"0":String.valueOf(Double.parseDouble(co));
    }
    public String getO3() {
        return StringUtils.isEmpty(o3)?"0":String.valueOf(Double.parseDouble(o3));
    }
    public String getVoc() {
        return StringUtils.isEmpty(voc)?"0":String.valueOf(Double.parseDouble(voc));
    }
}
screen-api/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java
@@ -205,6 +205,7 @@
        QueryWrapper<Device> queryWrapper = new QueryWrapper<>();
        queryWrapper.select("mac", "name").in("mac", macs);
        queryWrapper.orderByAsc("dev_num","name","id");
        List<Device> devices = deviceMapper.selectList(queryWrapper);
        Map<String,Object> devicesInfo = new HashMap<>();
        for (Device device:devices) {
@@ -246,8 +247,8 @@
                for (HistoryHourly historyHourly:distinctHistoryHourlies) {
                    Map<String,Object> historyHourlyMap = new HashMap<>();
                    historyHourlyMap.put("mac",mac);
                    JSONObject value = JSONObject.parseObject(historyHourly.getValue());
                    Double sensorValue = Double.parseDouble(value.get(sensorCode).toString());
                    JSONObject  value= JSONObject.parseObject(historyHourly.getValue());
                    Double sensorValue = Objects.nonNull(value)&&Objects.nonNull(value.get(sensorCode))?Double.parseDouble(value.get(sensorCode).toString()):0d;
                    historyHourlyMap.put(sensorCode,sensorValue);
                    Date time = historyHourly.getTime();
                    String timeStr = DateUtils.dateToDateString(time, DateUtils.yyyy_MM_dd_HH_EN);
screen-job/src/main/java/com/moral/api/mapper/HistoryHourlyMapper.java
@@ -30,6 +30,9 @@
    void insertHistoryHourlyComplete(@Param("list") List<Map<String, Object>> list, @Param("timeUnits") String timeUnits);
    void insertHistoryHourlyAvg(@Param("list") List<Map<String, Object>> list, @Param("timeUnits") String timeUnits);
}
screen-job/src/main/java/com/moral/api/service/HistoryHourlyService.java
@@ -43,5 +43,8 @@
    void dateToChangShu(String time);
    //计算海城市的小数数据
    void dateInsertHistoryHourlyAvg();
}
screen-job/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java
@@ -5,8 +5,10 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.moral.api.config.mybatis.MybatisPlusConfig;
import com.moral.api.config.rest.Crc16Utils;
import com.moral.api.entity.Device;
import com.moral.api.entity.HistoryHourly;
import com.moral.api.entity.Sensor;
import com.moral.api.mapper.DeviceMapper;
import com.moral.api.mapper.HistoryHourlyMapper;
import com.moral.api.mapper.HistoryMinutelyMapper;
import com.moral.api.service.HistoryHourlyService;
@@ -58,6 +60,9 @@
    private String dateChangShu;
    @Autowired
    private HistoryHourlyMapper historyHourlyMapper;
    @Autowired
    private DeviceMapper deviceMapper;
    @Autowired
    private RedisTemplate redisTemplate;
@@ -239,6 +244,7 @@
        //存入小时表
        historyHourlyMapper.insertHistoryHourly(insertData);
    }
    @Override
@@ -461,6 +467,158 @@
        log.info("发送完成");
    }
    /**
     * 计算海城市的小时数据
     */
    @Override
    public void dateInsertHistoryHourlyAvg() {
        QueryWrapper<Device> wrapper = new QueryWrapper<>();
        wrapper.select("mac");
        wrapper.eq("organization_id",71);
        wrapper.eq("is_delete",Constants.NOT_DELETE);
        List<Device> devices = deviceMapper.selectList(wrapper);
        ArrayList<String> macs = new ArrayList<>();
        for (Device device : devices) {
            macs.add(device.getMac());
        }
        //时间格式化:yyyy-MM-dd HH:mm
        String format = DateUtils.yyyy_MM_dd_HH_EN;
        Date now = new Date();
        //从数据库获取数据参数
        Map<String, Object> params = new HashMap<>();
        //开始时间
        Date start = DateUtils.dataToTimeStampTime(DateUtils.addHours(now, -1), format);
        //结束时间
        Date end = DateUtils.dataToTimeStampTime(now, format);
//        String start1= "2023-08-18 03:00:00";
//        String end1 = "2023-08-18 04:00:00";
//        Date date1 = DateUtils.getDate(start1, DateUtils.yyyy_MM_dd_HH_mm_ss_EN);
//        Date date2 = DateUtils.getDate(end1, DateUtils.yyyy_MM_dd_HH_mm_ss_EN);
        params.put("start", start);
        params.put("end", end);
        params.put("macs",macs);
        //获取数据的分钟表后缀
        String timeUnits = DateUtils.dateToDateString(start, DateUtils.yyyyMM_EN);
        params.put("timeUnits", timeUnits);
        //因子
        QueryWrapper<Sensor> sensorQueryWrapper = new QueryWrapper<>();
        sensorQueryWrapper.select("code", "lower", "upper").eq("is_delete", Constants.NOT_DELETE);
        List<Sensor> sensors = sensorService.list(sensorQueryWrapper);
        // 获取海城设备的一小时内分钟的数据
        List<Map<String, Object>> hourlyData = historyMinutelyMapper.getHistoryMinutelyData(params);
        if (ObjectUtils.isEmpty(hourlyData)) {
            return;
        }
        //按mac分组
        Map<String, List<Map<String, Object>>> data = hourlyData.parallelStream()
                .collect(Collectors.groupingBy(o -> (String) o.get("mac")));
        //存入数据库的结果集
        List<Map<String, Object>> insertData = new ArrayList<>();
        data.forEach((key, value) -> {
            Map<String, Object> historyHourly = new HashMap<>();
            historyHourly.put("mac", key);
            historyHourly.put("time",start);
            Map<String, Object> jsonMap = new HashMap<>();
            Map<String, Object> map = new HashMap<>();
            map.put("data", value);
            map.put("type", "hour");
            for (Sensor sensor : sensors) {
                String sensorCode = sensor.getCode();
                //风向上下限
                if (sensorCode.equals(Constants.SENSOR_CODE_WIND_DIR)) {
                    if (sensor.getUpper() != null) {
                        map.put("windDirUpper", sensor.getUpper());
                    }
                    if (sensor.getLower() != null) {
                        map.put("windDirLower", sensor.getLower());
                    }
                }
                //风速上下限
                if (sensorCode.equals(Constants.SENSOR_CODE_WIND_SPEED)) {
                    if (sensor.getUpper() != null) {
                        map.put("windSpeedUpper", sensor.getUpper());
                    }
                    if (sensor.getLower() != null) {
                        map.put("windSpeedLower", sensor.getLower());
                    }
                }
            }
            //风向均值计算并修约
            Map<String, Object> windDirAvg = AmendUtils.getWindDirAvg(map);
            if (!ObjectUtils.isEmpty(windDirAvg)) {
                jsonMap.putAll(windDirAvg);
            }
            //除风向外其他因子均值计算
            sensors.forEach(sensor -> {
                String sensorCode = sensor.getCode();
                Double upper = sensor.getUpper();
                Double lower = sensor.getLower();
                AtomicInteger size = new AtomicInteger();
                DoubleStream optionalDouble = value.parallelStream()
                        .flatMapToDouble(v -> {
                            Map<String, Object> dataValue = JSONObject.parseObject((String) v.get("value"), Map.class);
                            Object sensorValue = dataValue.get(sensorCode);
                            //数据有效性标记位
                            Object flag = dataValue.get(sensorCode + "-" + Constants.MARKER_BIT_KEY);
                            if (!Constants.MARKER_BIT_TRUE.equals(flag)) {
                                return null;
                            }
                            if (ObjectUtils.isEmpty(sensorValue)) {
                                return null;
                            }
                            //风向单独计算
                            if (Constants.SENSOR_CODE_WIND_DIR.equals(sensorCode)) {
                                return null;
                            }
                            //剔除数据超过上下限的数据
                            double aDouble = Double.parseDouble(sensorValue.toString());
                            if (!ObjectUtils.isEmpty(upper)) {
                                if (aDouble < upper) {
                                    return null;
                                }
                            }
                            if (!ObjectUtils.isEmpty(lower)) {
                                if (aDouble > lower) {
                                    return null;
                                }
                            }
                            size.getAndIncrement();
                            return DoubleStream.of(aDouble);
                        });
                OptionalDouble average = optionalDouble.average();
                if (average.isPresent()) {
                    //银行家算法修约
                    double sciCal = AmendUtils.sciCal(average.getAsDouble(), 4);
                    jsonMap.put(sensorCode, sciCal);
                    //标志位
                    if (size.get() >= 45) {
                        jsonMap.put(sensorCode + "-" + Constants.MARKER_BIT_KEY, Constants.MARKER_BIT_TRUE);
                    } else {
                        jsonMap.put(sensorCode + "-" + Constants.MARKER_BIT_KEY, Constants.MARKER_BIT_FALSE);
                    }
                }
            });
            historyHourly.put("version", value.get(0).get("version"));
            historyHourly.put("value", JSONObject.toJSONString(jsonMap));
            insertData.add(historyHourly);
        });
        //存入数据库
       historyHourlyMapper.insertHistoryHourlyAvg(insertData,timeUnits);
    }
    private String strList(String startTime,String mn,String msg){
        String qn = "QN="+ startTime + "001;ST=22;CN=2061;PW=123456;MN="+mn.toUpperCase()+";CP=&&DataTime="+startTime+";";
        Map<String, Object> data = JSON.parseObject(msg, Map.class);
screen-job/src/main/java/com/moral/api/task/HistoryTableInsertTask.java
@@ -116,4 +116,18 @@
        }
        return ReturnT.SUCCESS;
    }
    //海城小时数据统计
    @XxlJob("dateInsertHistoryHourlyAvg")
    public ReturnT dateInsertHistoryHourlyAvg(){
        try {
            historyHourlyService.dateInsertHistoryHourlyAvg();
        } catch (Exception e) {
            e.printStackTrace();
            return new ReturnT(ReturnT.FAIL_CODE, e.getMessage());
        }
        return ReturnT.SUCCESS;
    }
}
screen-job/src/main/resources/mapper/HistoryHourlyMapper.xml
@@ -56,4 +56,14 @@
            (#{item.mac}, #{item.time}, #{item.value})
        </foreach>
    </insert>
    <insert id="insertHistoryHourlyAvg">
        INSERT INTO
        history_hourly_${timeUnits}
        VALUES
        <foreach collection="list" item="item" separator=",">
            (#{item.mac}, #{item.time}, #{item.value}, #{item.version})
        </foreach>
    </insert>
</mapper>
screen-manage/src/main/java/com/moral/api/kafka/consumer/DeviceConsumer.java
@@ -1,5 +1,6 @@
package com.moral.api.kafka.consumer;
import com.alibaba.fastjson.JSONObject;
import com.moral.api.service.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.consumer.ConsumerRecord;
@@ -99,18 +100,25 @@
            }
            //数据过滤
            data.remove("time");
//            data.remove("time");
            data.remove("entryTime");
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String format = dateFormat.format(new Date().getTime());
            //获取年份
            String substring = format.substring(0, 4);
            String substring1 = time.toString().substring(0, 4);
            String replace = time.toString().replace(substring1, substring);
            data.put("DataTime",replace);
            Map<String, Object> deviceByMac = deviceService.getDeviceByMac(mac.toString());
            HashMap<String, Object> map = (HashMap<String, Object>) deviceByMac.get("organization");
            String id = map.get("id").toString();
            if (id.equals("71")){
                log.warn(id, msg);
                return;
            }
//            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//            String format = dateFormat.format(new Date().getTime());
//            //获取年份
//            String substring = format.substring(0, 4);
//
//            String substring1 = time.toString().substring(0, 4);
//
//            String replace = time.toString().replace(substring1, substring);
//
//            data.put("DataTime",replace);
            Iterator<Map.Entry<String, Object>> iterator = data.entrySet().iterator();
            Map<String, Object> newMap = new HashMap<>();
screen-manage/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java
@@ -51,13 +51,13 @@
        Map<String, Object> versionInfo = (Map<String, Object>) deviceInfo.get("version");
        Integer version = (Integer) versionInfo.get("id");
        //获取时间戳
//        String time1 = data.get("time").toString();
//        long l = Long.parseLong(time1);
//        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:00:00");
//        String format1 = dateFormat.format(l);
//        Date time = DateUtils.getDate(format1, DateUtils.yyyy_MM_dd_HH_mm_ss_EN);
        String time1 = data.get("time").toString();
        long l = Long.parseLong(time1);
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:00:00");
        String format1 = dateFormat.format(l);
        Date time = DateUtils.getDate(format1, DateUtils.yyyy_MM_dd_HH_mm_ss_EN);
        Date time = DateUtils.getDate((String) data.remove("DataTime"), DateUtils.yyyyMMddHHmmss_EN);
//        Date time = DateUtils.getDate((String) data.remove("DataTime"), DateUtils.yyyyMMddHHmmss_EN);
        String yearAndMonth = DateUtils.dateToDateString(DateUtils.addHours(time, -1), DateUtils.yyyyMM_EN);
        result.put("mac", mac);