package com.moral.api.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.moral.api.entity.Organization; import com.moral.api.entity.ServicesScope; import com.moral.api.mapper.OrganizationMapper; import com.moral.api.service.HistoryDailyService; import com.moral.api.service.HistoryHourlyService; import com.moral.api.service.HistoryMonthlyService; import com.moral.api.service.ServicesScopeService; import com.moral.constant.Constants; import com.moral.constant.ResponseCodeEnum; import com.moral.constant.ResultMessage; import com.moral.util.DateUtils; import com.moral.util.WebUtils; import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.system.ApplicationHome; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLEncoder; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; /** * @program: screen * @description: 图表数据 * @author: lizijie * @create: 2021-11-10 16:05 **/ @Slf4j @Api(tags = {"设备小时数据"}) @RestController @CrossOrigin(origins = "*", maxAge = 3600) @RequestMapping("/chart") public class ChartController { @Resource private OrganizationMapper organizationMapper; @Resource private HistoryHourlyService historyHourlyService; @Resource private HistoryDailyService historyDailyService; @Resource private HistoryMonthlyService historyMonthlyService; @Resource private ServicesScopeService servicesScopeService; @RequestMapping(value = "getThermodynamicDiagramDataByCondition", method = RequestMethod.GET) @ResponseBody public ResultMessage getThermodynamicDiagramDataByCondition(HttpServletRequest request) throws ParseException { Map parameters = WebUtils.getParametersStartingWith(request,null); Object orgid = parameters.get("organization_id"); Object sensorCode = parameters.get("sensor_code"); Object type = parameters.get("type"); if (ObjectUtils.isEmpty(orgid) || ObjectUtils.isEmpty(sensorCode) || ObjectUtils.isEmpty(type)){ return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg()); } Organization organization = organizationMapper.selectById(Integer.parseInt(orgid.toString())); if (ObjectUtils.isEmpty(organization)){ return ResultMessage.fail(ResponseCodeEnum.ORGANIZATION_NOT_EXIST.getCode(), ResponseCodeEnum.ORGANIZATION_NOT_EXIST.getMsg()); } Map resultMap = new HashMap<>(); List> resultList = new ArrayList<>(); if (type.equals("hourly")){ Object time = parameters.get("time"); if (ObjectUtils.isEmpty(time)){ return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg()); } resultMap = historyHourlyService.getThermodynamicDiagramDataByOrgIdSensorCodeTime(parameters); return ResultMessage.ok(resultMap); } if (type.equals("daily")){ Object time = parameters.get("time"); if (ObjectUtils.isEmpty(time)){ return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg()); } resultMap = historyDailyService.getThermodynamicDiagramDataByOrgIdSensorCodeTime(parameters); return ResultMessage.ok(resultMap); } if (type.equals("monthly")){ Object time = parameters.get("time"); if (ObjectUtils.isEmpty(time)){ return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg()); } resultMap = historyMonthlyService.getThermodynamicDiagramDataByOrgIdSensorCodeTime(parameters); return ResultMessage.ok(resultMap); } if (type.equals("custom")){ String startTime = parameters.get("startTime").toString(); String endTime = parameters.get("endTime").toString(); if (ObjectUtils.isEmpty(startTime) || ObjectUtils.isEmpty(endTime)){ return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg()); } if (startTime.length() == 13){ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//24小时制 long newTime1 = simpleDateFormat.parse(startTime+":00:00").getTime(); long newTime2 = simpleDateFormat.parse(endTime+":00:00").getTime(); Long result = newTime2 - newTime1; //获取两时间相差的毫秒数 long nd = 1000 * 24 * 60 * 60; long nh = 1000 * 60 * 60; long nm = 1000 * 60; long hour = result / nh; //获取相差的小时数 if (hour+1>12){ return ResultMessage.fail(-1, "时间不能超过12小时"); } if (hour<0){ return ResultMessage.fail(ResponseCodeEnum.TIME_FORMAT_INVALID.getCode(), ResponseCodeEnum.TIME_FORMAT_INVALID.getMsg()); } parameters.put("hour",hour); resultList = historyHourlyService.getThermodynamicDiagramDataByOrgIdSensorCodeTimeslot(parameters); return ResultMessage.ok(resultList); } if (startTime.length() == 10){ long days = DateUtils.getQuotByDays(startTime, endTime); if (days+1>12){ return ResultMessage.fail(-1, "时间不能超过12天"); } parameters.put("days",days); resultList = historyDailyService.getThermodynamicDiagramDataByOrgIdSensorCodeTimeSlot(parameters); return ResultMessage.ok(resultList); } if (startTime.length() == 7){ SimpleDateFormat df = new SimpleDateFormat("yyyy-MM"); Date satrtTimeDate = df.parse(startTime); Date endTimeDate = df.parse(endTime); long months = DateUtils.getMonth(satrtTimeDate,endTimeDate); //获取相差的小时数 if (months+1>12){ return ResultMessage.fail(-1, "时间不能超过12月"); } parameters.put("months",months); resultList = historyMonthlyService.getThermodynamicDiagramDataByOrgIdSensorCodeTimeSlot(parameters); return ResultMessage.ok(resultList); } } return ResultMessage.ok(resultMap); } @RequestMapping(value = "getThermodynamicDiagramDataByConditionV2", method = RequestMethod.GET) @ResponseBody public ResultMessage getThermodynamicDiagramDataByConditionV2(HttpServletRequest request) throws ParseException { Map parameters = WebUtils.getParametersStartingWith(request,null); Object servicesScopeId = parameters.get("servicesScopeId"); Object sensorCode = parameters.get("sensor_code"); Object type = parameters.get("type"); if (ObjectUtils.isEmpty(servicesScopeId) || ObjectUtils.isEmpty(sensorCode) || ObjectUtils.isEmpty(type)){ return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg()); } QueryWrapper servicesScopeQueryWrapper = new QueryWrapper<>(); servicesScopeQueryWrapper.eq("is_delete",Constants.NOT_DELETE); servicesScopeQueryWrapper.eq("id",servicesScopeId); ServicesScope servicesScope = servicesScopeService.getOne(servicesScopeQueryWrapper); if (ObjectUtils.isEmpty(servicesScope)){ return ResultMessage.fail(ResponseCodeEnum.ORGANIZATION_NOT_EXIST.getCode(), ResponseCodeEnum.ORGANIZATION_NOT_EXIST.getMsg()); } Map resultMap = new HashMap<>(); List> resultList = new ArrayList<>(); if (type.equals("hourly")){ Object time = parameters.get("time"); if (ObjectUtils.isEmpty(time)){ return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg()); } resultMap = historyHourlyService.getThermodynamicDiagramDataByOrgIdSensorCodeTimeV2(parameters); return ResultMessage.ok(resultMap); } if (type.equals("daily")){ Object time = parameters.get("startTime"); parameters.put("time",time); if (ObjectUtils.isEmpty(time)){ return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg()); } resultMap = historyDailyService.getThermodynamicDiagramDataByOrgIdSensorCodeTimeV2(parameters); return ResultMessage.ok(resultMap); } if (type.equals("monthly")){ Object time = parameters.get("time"); if (ObjectUtils.isEmpty(time)){ return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg()); } resultMap = historyMonthlyService.getThermodynamicDiagramDataByOrgIdSensorCodeTimeV2(parameters); return ResultMessage.ok(resultMap); } if (type.equals("custom")){ String startTime = parameters.get("startTime").toString(); String endTime = parameters.get("endTime").toString(); if (ObjectUtils.isEmpty(startTime) || ObjectUtils.isEmpty(endTime)){ return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg()); } if (startTime.length() == 13){ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//24小时制 long newTime1 = simpleDateFormat.parse(startTime+":00:00").getTime(); long newTime2 = simpleDateFormat.parse(endTime+":00:00").getTime(); Long result = newTime2 - newTime1; //获取两时间相差的毫秒数 long nd = 1000 * 24 * 60 * 60; long nh = 1000 * 60 * 60; long nm = 1000 * 60; long hour = result / nh; //获取相差的小时数 if (hour+1>12){ return ResultMessage.fail(-1, "时间不能超过12小时"); } if (hour<0){ return ResultMessage.fail(ResponseCodeEnum.TIME_FORMAT_INVALID.getCode(), ResponseCodeEnum.TIME_FORMAT_INVALID.getMsg()); } parameters.put("hour",hour); resultList = historyHourlyService.getThermodynamicDiagramDataByOrgIdSensorCodeTimeslotV2(parameters); return ResultMessage.ok(resultList); } if (startTime.length() == 10){ long days = DateUtils.getQuotByDays(startTime, endTime); if (days+1>12){ return ResultMessage.fail(-1, "时间不能超过12天"); } parameters.put("days",days); resultList = historyDailyService.getThermodynamicDiagramDataByOrgIdSensorCodeTimeSlotV2(parameters); return ResultMessage.ok(resultList); } if (startTime.length() == 7){ SimpleDateFormat df = new SimpleDateFormat("yyyy-MM"); Date satrtTimeDate = df.parse(startTime); Date endTimeDate = df.parse(endTime); long months = DateUtils.getMonth(satrtTimeDate,endTimeDate); //获取相差的小时数 if (months+1>12){ return ResultMessage.fail(-1, "时间不能超过12月"); } parameters.put("months",months); resultList = historyMonthlyService.getThermodynamicDiagramDataByOrgIdSensorCodeTimeSlotV2(parameters); return ResultMessage.ok(resultList); } } return ResultMessage.ok(resultMap); } @GetMapping("honeycombDiagram") public ResultMessage honeycombDiagram (HttpServletRequest httpServletRequest, HttpServletResponse response) throws IOException { Map params = WebUtils.getParametersStartingWith(httpServletRequest, null); Object serviceScopeId = params.get("serviceScopeId"); Object sensor_code = params.get("sensor_code"); Object type = params.get("type"); Object time = params.get("time"); Object distance = params.get("distance"); if (ObjectUtils.isEmpty(serviceScopeId)){ return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg()); } List> resultList = servicesScopeService.honeycombDiagram(Integer.parseInt(serviceScopeId.toString()), Integer.parseInt(distance.toString()), type.toString(), time.toString(), sensor_code.toString()); //List> resultList = servicesScopeService.honeycombDiagram(6, 40, "monthly", "2022-02", "a34004"); //获取jar包所在目录 ApplicationHome applicationHome = new ApplicationHome(getClass()); //在jar包所在目录下生成一个upload文件夹用来存储上传的图片 String path = applicationHome.getSource().getParentFile().toString() + "/static/tsv"; //File file = File.createTempFile("test",".tsv"); /*if (!new File(path).exists()){ new File(path).mkdir(); }*/ File file = null; File dir = new File(path); file = File.createTempFile("honeycombDiagram",".tsv",dir); //构建输出流,同时指定编码 OutputStreamWriter ow = new OutputStreamWriter(new FileOutputStream(file),"UTF-8"); //tsv文件是空格分隔,除第一个外,每次写入一个单元格数据后需要输入空格 ow.write("lng"); ow.write(" "); ow.write("lat"); ow.write(" "); ow.write("count"); //写完文件头换行 ow.write("\r\n"); //写内容 for (Map map:resultList) { ow.write(map.get("lon").toString()); ow.write(" "); ow.write(map.get("lat").toString()); ow.write(" "); ow.write(map.get("value").toString()); //写完一行换行 ow.write("\r\n"); } ow.flush(); ow.close(); /*String localAddr = httpServletRequest.getLocalAddr(); int serverPort = httpServletRequest.getServerPort();*/ Map res = new HashMap<>(); res.put("path","http://47.99.64.149:8081"+"/static/tsv/"+file.getName()); return ResultMessage.ok(res); } @RequestMapping(value = "returnDataTest", method = RequestMethod.GET) @ResponseBody public ResultMessage returnDataTest(HttpServletRequest request, HttpServletResponse response) throws ParseException, IOException { Map params = WebUtils.getParametersStartingWith(request, null); Object serviceScopeId = params.get("serviceScopeId"); Object sensor_code = params.get("sensor_code"); Object type = params.get("type"); Object time = params.get("time"); Object distance = params.get("distance"); /*if (ObjectUtils.isEmpty(serviceScopeId)){ return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg()); }*/ List> resultList = servicesScopeService.honeycombDiagram(Integer.parseInt(serviceScopeId.toString()), Integer.parseInt(distance.toString()), type.toString(), time.toString(), sensor_code.toString()); //List> resultList = servicesScopeService.honeycombDiagram(6, 40, "monthly", "2022-02", "a34004"); //获取jar包所在目录 ApplicationHome applicationHome = new ApplicationHome(getClass()); //在jar包所在目录下生成一个upload文件夹用来存储上传的图片 String path = applicationHome.getSource().getParentFile().toString() + "/static/tsv"; //File file = File.createTempFile("test",".tsv"); if (!new File(path).exists()){ new File(path).mkdir(); } File file = null; File dir = new File(path); file = File.createTempFile("honeycombDiagram",".tsv",dir); //构建输出流,同时指定编码 OutputStreamWriter ow = new OutputStreamWriter(new FileOutputStream(file),"UTF-8"); //tsv文件是空格分隔,除第一个外,每次写入一个单元格数据后需要输入空格 ow.write("lon"); ow.write(" "); ow.write("lat"); ow.write(" "); ow.write("value"); //写完文件头换行 ow.write("\r\n"); //写内容 for (Map map:resultList) { ow.write(map.get("lon").toString()); ow.write(" "); ow.write(map.get("lat").toString()); ow.write(" "); ow.write(map.get("value").toString()); //写完一行换行 ow.write("\r\n"); } ow.flush(); ow.close(); /*File file1 = new File(file.getPath()); InputStream inputStream = new FileInputStream(file1); OutputStream outputStream = new BufferedOutputStream(response.getOutputStream()); byte[] bytes = new byte[1024]; int len; while ((len = inputStream.read(bytes)) != -1){ response.getOutputStream().write(bytes,0,len); } outputStream.flush(); outputStream.close(); inputStream.close();*/ /*response.setCharacterEncoding("UTF-8"); System.out.println(file.getName()); String realFileName = file.getName(); response.setHeader("content-type", "application/octet-stream;charset=UTF-8"); response.addHeader("Content-Length",String.valueOf(file.length())); response.setHeader("Content-Disposition", "attachment;filename=" + java.net.URLEncoder.encode(realFileName.trim(), "UTF-8")); byte[] buff = new byte[1024]; BufferedInputStream bis = null; OutputStream os = null; os = response.getOutputStream(); bis = new BufferedInputStream(new FileInputStream(file)); int i = bis.read(buff); while (i != -1) { os.write(buff, 0, buff.length); os.flush(); i = bis.read(buff); } bis.close();*/ /*//1、设置response 响应头 response.reset(); //设置页面不缓存,清空buffer response.setCharacterEncoding("UTF-8"); //字符编码 response.setContentType("multipart/form-data"); //二进制传输数据 //设置响应头 response.setHeader("Content-Disposition", "attachment;fileName="+ URLEncoder.encode(file.getName(), "UTF-8")); File file1 = new File(file.getParent(),file.getName()); System.out.println(file1.getParent()); //2、 读取文件--输入流 InputStream input=new FileInputStream(file1); //3、 写出文件--输出流 OutputStream out = response.getOutputStream(); byte[] buff =new byte[1024]; int index=0; //4、执行 写出操作 while((index= input.read(buff))!= -1){ out.write(buff, 0, index); out.flush(); } out.close(); input.close();*/ Map res = new HashMap<>(); res.put("path",file.getPath()); return ResultMessage.ok(res); } }