package com.moral.controller; import com.auth0.jwt.exceptions.JWTDecodeException; import com.moral.common.bean.ResultBean; import com.moral.common.exception.WebAuthException; import com.moral.common.util.*; import com.moral.common.webAnno.UserLoginToken; import com.moral.entity.*; import com.moral.mapper.MapPathMapper; import com.moral.service.*; import com.moral.util.DateUtil; import com.moral.util.LatLngTransformation; import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.PostConstruct; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; import static com.moral.common.util.WebUtils.getParametersStartingWith; @RestController @RequestMapping("/web") @CrossOrigin(origins = "*", maxAge = 3600) @SuppressWarnings({"rawtypes", "unchecked", "unused"}) public class WebController { private static Map sensors; @PostConstruct public void init() { sensors = new HashMap<>(); List allSensors = sensorService.getAllSensors(); for (Sensor sensor : allSensors) { sensors.put(sensor.getSensorKey(), sensor); } } @Resource AccountService accountService; @Resource DictionaryDataService dictionaryDataService; @Resource OrganizationService organizationService; @Resource WebTokenService webTokenService; @Resource RedisHashUtil redisHashUtil; @Resource HistoryMinutelyService historyMinutelyService; @Resource MonitorPointService monitorPointService; @Resource DeviceService deviceService; @Resource HistoryFiveMinutelyService historyFiveMinutelyService; @Resource SensorService sensorService; @Resource OrganizationSensorsService organizationSensorsService; @Resource MapPathService mapPathService; @GetMapping("test") public ResultBean> add(HttpServletRequest request) { String token = request.getHeader("token"); List mapPath = mapPathService.getMapPath(token); if (ObjectUtils.isEmpty(mapPath)) return new ResultBean<>("获取地图信息失败", ResultBean.FAIL); return new ResultBean<>(mapPath); } /** * @Description: 登陆接口 * @Param: [parameters] * @return: java.util.Map * @Author: 下雨听风 * @Date: 2020/10/19 */ @PostMapping("login") public Map login(@RequestBody Map parameters) { Map resultMap = new HashMap(); if (!(parameters.containsKey("account") && parameters.containsKey("password"))) { resultMap.put("msg", "用户名及密码不允许为空!"); resultMap.put("accountId", -1); } else { resultMap = accountService.bsWebLogin(parameters); String accountId = String.valueOf(resultMap.get("accountId")); if (!accountId.equals("-1")) { redisHashUtil.deleteMapVal("webToken", accountId); resultMap.put("token", webTokenService.getToken(accountId)); } } return resultMap; } /** * @Description: 退出接口 * @Param: [request] * @return: java.util.Map * @Author: 下雨听风 * @Date: 2020/10/19 */ @UserLoginToken @PostMapping("logout") public Map logout(HttpServletRequest request) { Map resultMap = new HashMap<>(); String token = request.getHeader("token"); String id = WebTokenUtils.getIdBytoken(token); redisHashUtil.addMapOne("webToken", String.valueOf(id), token); resultMap.put("msg", "退出成功!"); return resultMap; } public static void main(String[] args) { } @UserLoginToken @GetMapping("getAccountInfo") public Map getAccountInfo(HttpServletRequest request) { String token = request.getHeader("token"); String id = ""; try { id = WebTokenUtils.getIdBytoken(token); } catch (JWTDecodeException e) { throw new WebAuthException("401,token无效"); } Map resultMap = accountService.getAccountInfoById(id); String accountId = String.valueOf(resultMap.get("accountId")); resultMap.put("token", webTokenService.getToken(accountId)); return resultMap; } /** * @Description: 获取传感器平均值 * @Param: [request] * @return: com.moral.common.bean.ResultBean>> * @Author: 下雨听风 * @Date: 2020/10/19 */ @UserLoginToken @GetMapping("report_avg_datas") public ResultBean>> getMonitorPointOrDeviceAvgData(HttpServletRequest request) throws Exception { Map parameters = WebUtils.getParametersStartingWith(request, null); //该方法用于判断时间是具体到年月日 ParameterUtils.getTimeType4Time(parameters); Object sensorKey = parameters.remove("sensorKey"); parameters.put("sensors", Arrays.asList(sensorKey)); List> list = historyMinutelyService.getMonitorPointOrDeviceAvgData(parameters); for (Map map : list) { String time = map.get("time").toString(); time = time.substring(time.length() - 2); map.put("time", Integer.valueOf(time)); if (parameters.get("type").equals("day")) { map.put("time", Integer.valueOf(time) + 1); } map.put("value", map.remove(sensorKey)); } return new ResultBean>>(list); } /** * @Description: 获取某个站点设备信息 * @Param: [request] * @return: com.moral.common.bean.ResultBean> * @Author: 下雨听风 * @Date: 2020/10/19 */ @UserLoginToken @GetMapping("monitorpoints-devices") public ResultBean> getMonitorPointsAndDevicesByRegion(HttpServletRequest request) throws Exception { Map parameters = WebUtils.getParametersStartingWith(request, null); List monitorPoints = monitorPointService.getMonitorPointsAndDevicesByRegion(parameters); return new ResultBean>(monitorPoints); } /** * @Description: 获取坐标接口,前端用于建点 * @Param: [request] * @return: com.moral.common.bean.ResultBean> * @Author: 下雨听风 * @Date: 2020/10/19 */ /* @UserLoginToken*/ @GetMapping("coordinates") public ResultBean> getDeviceCoordinatesAndState(HttpServletRequest request) { Map parameters = WebUtils.getParametersStartingWith(request, null); ParameterUtils.getRegionType4RegionCode(parameters); return new ResultBean>(deviceService.queryDevice(parameters)); } /** * @Description: 根据monitorId获取该站点下每一台设备具体传感器的五分钟平均值 * @Param: [] * @return: com.moral.common.bean.ResultBean> * @Author: 下雨听风 * @Date: 2020/10/19 */ @UserLoginToken @GetMapping("fiveMinuteAvgDataNew") public ResultBean> getSensorFiveMinuteAvgDataNew(HttpServletRequest request) { //获取参数,传感器和regionCode Map parameters = WebUtils.getParametersStartingWith(request, null); if ((!parameters.containsKey("sensorKey")) || (!parameters.containsKey("regionCode"))) return ResultBean.fail("参数为null"); String sensorKey = (String) parameters.get("sensorKey"); String regionCode = (String) parameters.get("regionCode"); String token = request.getHeader("token"); //根据orgId获取该站点下所有设备mac集合 String accountId = WebTokenUtils.getIdBytoken(token); Account account = accountService.getAccountById(Integer.parseInt(accountId)); parameters.put("organizationId", account.getOrganizationId()); List monitorPoints = monitorPointService.getMonitorPointsByRegionAndOrgId(parameters); if (ObjectUtils.isEmpty(monitorPoints)) return ResultBean.fail("该账号对应地区无站点"); List devices = new ArrayList<>(); for (MonitorPoint monitorPoint : monitorPoints) { if (!ObjectUtils.isEmpty(monitorPoint.getDevices())) devices.addAll(monitorPoint.getDevices()); } if (ObjectUtils.isEmpty(devices)) return ResultBean.fail("该账号对应地区无设备"); List macs = new ArrayList<>(); devices.forEach(p -> { macs.add(p.getMac()); }); //根据时间和mac号集合以及传感器参数查询五分钟平均数据 Map timeAndYearMonth = getTimeAndYearMonthForFiveMinuteData(); String time = (String) timeAndYearMonth.get("time"); String yearAndMonth = (String) timeAndYearMonth.get("yearAndMonth"); parameters.put("time", time); parameters.put("yearAndMonth", yearAndMonth); parameters.put("macs", macs); List> datas = historyFiveMinutelyService.getFiveMinutesDataByMacsAndTime(parameters); //如果当前五分钟数据还没有插入,则提取前五分钟数据返回 if (ObjectUtils.isEmpty(datas)) { time = getFiveMinuteAgoTime(time); parameters.put("time", time); datas = historyFiveMinutelyService.getFiveMinutesDataByMacsAndTime(parameters); } datas = insertDeviceInfo(datas, devices); //根据monitorPointId获取国控站坐标 List> coordinate = new ArrayList<>(); Integer orgId = account.getOrganizationId(); monitorPoints.forEach(value -> { if ("国控站".equals(value.getDescription())) { List list = LatLngTransformation.Convert_BD09_To_GCJ02(value.getLatitude(), value.getLongitude()); Map controlStation = new HashMap<>(); controlStation.put("name", value.getName()); controlStation.put("longitude", list.get(0)); controlStation.put("latitude", list.get(1)); coordinate.add(controlStation); } }); Map datasMap = new HashMap<>(); datasMap.put("coordinate", coordinate); datasMap.put("device", datas); return new ResultBean>(datasMap); } @GetMapping("fiveMinuteAvgData") public ResultBean> getSensorFiveMinuteAvgData(HttpServletRequest request) { //获取参数,传感器和monitorpointId Map parameters = WebUtils.getParametersStartingWith(request, null); if ((!parameters.containsKey("sensorKey")) || (!parameters.containsKey("monitorPointId"))) return ResultBean.fail("参数为null"); String sensorKey = (String) parameters.get("sensorKey"); Integer monitorPointId = Integer.parseInt((String) parameters.get("monitorPointId")); //根据monitorpointId获取该站点下所有设备mac集合 List devices = deviceService.getDevicesByMonitorPointId(monitorPointId); if (ObjectUtils.isEmpty(devices)) return ResultBean.fail("站点下无设备或monitorPointId错误"); List macs = new ArrayList<>(); devices.forEach(p -> { macs.add(p.getMac()); }); //根据时间和mac号集合以及传感器参数查询五分钟平均数据 Map timeAndYearMonth = getTimeAndYearMonthForFiveMinuteData(); String time = (String) timeAndYearMonth.get("time"); String yearAndMonth = (String) timeAndYearMonth.get("yearAndMonth"); parameters.put("time", time); parameters.put("yearAndMonth", yearAndMonth); parameters.put("macs", macs); List> datas = historyFiveMinutelyService.getFiveMinutesDataByMacsAndTime(parameters); //如果当前五分钟数据还没有插入,则提取前五分钟数据返回 if (ObjectUtils.isEmpty(datas)) { time = getFiveMinuteAgoTime(time); parameters.put("time", time); datas = historyFiveMinutelyService.getFiveMinutesDataByMacsAndTime(parameters); } datas = insertDeviceInfo(datas, devices); //根据monitorPointId获取国控站坐标 List> coordinate = new ArrayList<>(); MonitorPoint monitorPoint = monitorPointService.queryMonitorPointById(monitorPointId); Integer orgId = monitorPoint.getOrganizationId(); List monitorPoints = monitorPointService.getMonitorPointsByOrganizationId(orgId); monitorPoints.forEach(value -> { if ("国控站".equals(value.getDescription())) { List list = LatLngTransformation.Convert_BD09_To_GCJ02(value.getLatitude(), value.getLongitude()); Map controlStation = new HashMap<>(); controlStation.put("name", value.getName()); controlStation.put("longitude", list.get(0)); controlStation.put("latitude", list.get(1)); coordinate.add(controlStation); } }); Map datasMap = new HashMap<>(); datasMap.put("coordinate", coordinate); datasMap.put("device", datas); return new ResultBean>(datasMap); } @GetMapping("cangzhouMIdGetAllDevice") public ResultBean> cangzhouMIdGetAllDevice(HttpServletRequest request) { //获取参数,传感器和monitorpointId Map parameters = WebUtils.getParametersStartingWith(request, null); if ((!parameters.containsKey("sensorKey")) || (!parameters.containsKey("monitorPointId"))) return ResultBean.fail("参数为null"); String sensorKey = (String) parameters.get("sensorKey"); Integer monitorPointId = Integer.parseInt((String) parameters.get("monitorPointId")); MonitorPoint mPoint = monitorPointService.queryMonitorPointById(monitorPointId); Integer code = mPoint.getCityCode(); List devices = null; if (code == 130900) { devices = deviceService.getDeviceByCode(); } else { devices = deviceService.getDevicesByMonitorPointId(monitorPointId); } //根据monitorpointId获取该站点下所有设备mac集合 if (ObjectUtils.isEmpty(devices)) return ResultBean.fail("站点下无设备或monitorPointId错误"); List macs = new ArrayList<>(); devices.forEach(p -> { macs.add(p.getMac()); }); //根据时间和mac号集合以及传感器参数查询五分钟平均数据 Map timeAndYearMonth = getTimeAndYearMonthForFiveMinuteData(); String time = (String) timeAndYearMonth.get("time"); String yearAndMonth = (String) timeAndYearMonth.get("yearAndMonth"); parameters.put("time", time); parameters.put("yearAndMonth", yearAndMonth); parameters.put("macs", macs); List> datas = historyFiveMinutelyService.getFiveMinutesDataByMacsAndTime(parameters); //如果当前五分钟数据还没有插入,则提取前五分钟数据返回 if (ObjectUtils.isEmpty(datas)) { time = getFiveMinuteAgoTime(time); parameters.put("time", time); datas = historyFiveMinutelyService.getFiveMinutesDataByMacsAndTime(parameters); } datas = insertDeviceInfo(datas, devices); //根据monitorPointId获取国控站坐标 List> coordinate = new ArrayList<>(); MonitorPoint monitorPoint = monitorPointService.queryMonitorPointById(monitorPointId); Integer orgId = monitorPoint.getOrganizationId(); List monitorPoints = monitorPointService.getMonitorPointsByOrganizationId(orgId); monitorPoints.forEach(value -> { if ("国控站".equals(value.getDescription())) { List list = LatLngTransformation.Convert_BD09_To_GCJ02(value.getLatitude(), value.getLongitude()); Map controlStation = new HashMap<>(); controlStation.put("name", value.getName()); controlStation.put("longitude", list.get(0)); controlStation.put("latitude", list.get(1)); coordinate.add(controlStation); } }); Map datasMap = new HashMap<>(); datasMap.put("coordinate", coordinate); datasMap.put("device", datas); return new ResultBean>(datasMap); } /** * @Description: 根据mac号获取单台设备信息,特殊客户只显示客户需要的传感器信息 * @Param: [request] * @return: com.moral.common.bean.ResultBean> * @Author: 下雨听风 * @Date: 2020/10/22 */ @GetMapping("fiveMinuteAvgDataByMac") public ResultBean> fiveMinuteAvgDataByMac(HttpServletRequest request) { //获取参数,mac号 Map parameters = WebUtils.getParametersStartingWith(request, null); if ((!parameters.containsKey("mac"))) return ResultBean.fail("参数为null"); String mac = (String) parameters.get("mac"); //根据mac获取orgId String orgId = monitorPointService.getOrgIdByMac(mac); //判断是否特殊定制客户,如果为特殊定制客户则选取特定参数 Map specialSensors = organizationSensorsService.getSensorsByOrgId(orgId); if (ObjectUtils.isEmpty(specialSensors)) { List sensorKeys = sensorService.getSensorKeys(); parameters.put("sensorKeys", sensorKeys); } else { String sensorKeys = (String) specialSensors.get("sensors"); sensorKeys.trim(); sensorKeys = sensorKeys.substring(1, sensorKeys.length() - 1); parameters.put("sensorKeys", Arrays.asList(sensorKeys.split(","))); } //设置查询参数 Map timeAndYearMonth = getTimeAndYearMonthForFiveMinuteData(); String time = (String) timeAndYearMonth.get("time"); String yearAndMonth = (String) timeAndYearMonth.get("yearAndMonth"); parameters.put("time", time); parameters.put("yearAndMonth", yearAndMonth); parameters.put("mac", mac); Map datas = historyFiveMinutelyService.getFiveMinutesDataByMac(parameters); //如果当前五分钟数据还没有插入,则提取前五分钟数据返回 if (ObjectUtils.isEmpty(datas)) { time = getFiveMinuteAgoTime(time); parameters.put("time", time); datas = historyFiveMinutelyService.getFiveMinutesDataByMac(parameters); } //去除无效参数 datas.values().removeIf((value) -> { return ObjectUtils.isEmpty(value) || value.equals("[0, 0, 0]"); }); //添加设备名称 Map sortDatas = new LinkedHashMap<>();//排序后的数据,用于发送前端 Device device = deviceService.getDeviceByMac(mac, true); sortDatas.put("名称", device.getName()); //参数转换中文 datas.forEach((key, value) -> { Sensor sensor = sensors.get(key); if (!ObjectUtils.isEmpty(sensor)) { String unit = ObjectUtils.isEmpty(sensor.getUnit()) ? "" : (String) sensor.getUnit(); String str = (String) value; str.trim(); str = str.substring(1, str.length() - 1); sortDatas.put(sensor.getName(), Arrays.asList(str.split(",")).get(0) + unit); } }); sortDatas.put("时间", time); return new ResultBean>(sortDatas); } /** * @Description: 根据token获取用户地图 * @Param: [request] * @return: com.moral.common.bean.ResultBean> * @Author: 下雨听风 * @Date: 2020/11/27 */ @UserLoginToken @GetMapping("mapPath") public ResultBean> getMapPath(HttpServletRequest request) { String token = request.getHeader("token"); List mapPath = mapPathService.getMapPath(token); if (ObjectUtils.isEmpty(mapPath)) return new ResultBean<>("获取地图信息失败", ResultBean.FAIL); return new ResultBean<>(mapPath); } @UserLoginToken @GetMapping("monitor-points") public ResultBean> getmMnitorPoints(HttpServletRequest request) { String accountId = WebTokenUtils.getIdBytoken(request.getHeader("token")); Account account = accountService.getAccountById(Integer.parseInt(accountId)); String regionCode = request.getParameter("regionCode"); Map paramMap = new HashMap<>(); paramMap.put("organizationId", account.getOrganizationId()); paramMap.put("regionCode", regionCode); List monitorPoints = monitorPointService.getMonitorPointsAndDevicesByRegion(paramMap); if (ObjectUtils.isEmpty(monitorPoints)) return new ResultBean<>("无对应站点设备信息", ResultBean.FAIL); return new ResultBean>(monitorPoints); } /** * @Description: 返回结果添加设备经纬度以及state * @Param: [datas, devices] * @Author: 下雨听风 * @Date: 2020/10/19 */ private List> insertDeviceInfo(List> datas, List devices) { Map map = new HashMap<>(); devices.forEach(p -> { map.put(p.getMac(), p); }); datas.forEach(p -> { String mac = (String) p.get("mac"); Device device = map.get(mac); List list = LatLngTransformation.Convert_BD09_To_GCJ02(device.getLatitude(), device.getLongitude()); p.put("longitude", list.get(0)); p.put("latitude", list.get(1)); p.put("state", device.getState()); }); return datas; } /** * @Description: 根据当前时间判断要获取五分钟平均数据在数据库中的时间 * @Param: [] * @return: java.lang.String * @Author: 下雨听风 * @Date: 2020/10/19 */ private Map getTimeAndYearMonthForFiveMinuteData() { Map map = new HashMap<>(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); String minute = DateUtil.getMinute(date); String year = ""; String month = ""; String yearAndMonth = ""; String startTime = ""; Integer endMinute = Integer.parseInt(String.valueOf(minute.charAt(minute.length() - 1))); if (endMinute >= 6 || endMinute == 0) {//分钟结尾如果是 6 7 8 9 0 比如12:16,12:20进入, 则获取12:10-12:15的数据 date = DateUtil.rollMinute(date, -1); StringBuilder time = new StringBuilder(sdf.format(date)); startTime = time.replace(15, 19, "5:00").toString(); } else {// 分钟结尾如果是1 2 3 4 5 则获取上个五分钟数据 比如12:11分钟进入 则获取12:05-12:10的数据 StringBuilder time = new StringBuilder(sdf.format(date)); startTime = time.replace(15, 19, "0:00").toString(); } year = DateUtil.getYear(date); month = DateUtil.getMonth(date); yearAndMonth = year + month; map.put("time", startTime); map.put("yearAndMonth", yearAndMonth); return map; } /** * @Description: 根据传入时间获取五分钟前的数据并且格式化 * @Param: [time] * @return: java.lang.String * @Author: 下雨听风 * @Date: 2020/10/20 */ private String getFiveMinuteAgoTime(String time) { try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = sdf.parse(time); date = DateUtil.rollMinute(date, -5); time = sdf.format(date); return time; } catch (ParseException e) { return null; } } }