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