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.AreaNames; import com.moral.entity.Device; import com.moral.entity.MonitorPoint; import com.moral.entity.Organization; import com.moral.service.*; import com.moral.util.DateUtil; import com.moral.util.LatLngTransformation; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import jdk.nashorn.internal.runtime.logging.Logger; import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; 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 { @Resource AccountService accountService; @Resource DictionaryDataService dictionaryDataService; OrganizationService organizationService; @Resource WebTokenService webTokenService; @Resource RedisHashUtil redisHashUtil; @Resource HistoryMinutelyService historyMinutelyService; @Resource MonitorPointService monitorPointService; @Resource DeviceService deviceService; @UserLoginToken @GetMapping("test") public String add() { return "test success!"; } /** * @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.webLogin(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; } /** * @Description: * @Param: [request] * @return: java.util.Map * @Author: 下雨听风 * @Date: 2020/10/19 */ @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); Object orgId = resultMap.get("orgId"); if (resultMap.get("orgId") != null && resultMap.get("orgId") instanceof Integer) { StringBuilder areaNamesBuilder = new StringBuilder("中国"); //判断是否为本公司开发者 if (!((Integer) orgId).equals(dictionaryDataService.querySupperOrgId())) { //不是本公司开发者则获取用户所属地区 Organization organization = organizationService.getOrganizationById((Integer) orgId); if (organization.getAreaNames() != null) { Map areaNameMap = BeanUtils.beanToMap(organization.getAreaNames()); List names = areaNameMap.entrySet().stream().filter(item -> { return item.getValue() != null; }).map(item -> { return item.getValue(); }).collect(Collectors.toList()); AreaNames areaNames = organization.getAreaNames(); areaNamesBuilder.append("/"); areaNamesBuilder.append(String.join("/", names)); } // 企业用户 if (organization.getRank() != null && organization.getRank() == 0) { resultMap.put("type", "enterprise"); } else { resultMap.put("type", "government"); } Number mapAreaCode = null; if (organization.getVillageCode() != null) { mapAreaCode = organization.getVillageCode(); } else if (organization.getTownCode() != null) { mapAreaCode = organization.getTownCode(); } else if (organization.getAreaCode() != null) { mapAreaCode = organization.getAreaCode(); } else if (organization.getCityCode() != null) { mapAreaCode = organization.getCityCode(); } else if (organization.getProvinceCode() != null) { mapAreaCode = organization.getProvinceCode(); } resultMap.put("mapAreaCode", mapAreaCode.toString()); } resultMap.put("mapPath", areaNamesBuilder.toString()); 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 */ @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 = historyMinutelyService.getFiveMinutesDataByMacsAndTime(parameters); datas = insertDeviceInfo(datas,devices); return new ResultBean>>(datas); } /** * @Description: 返回结果添加设备经纬度以及state * @Param: [datas, devices] * @return: java.util.List> * @Author: 下雨听风 * @Date: 2020/10/19 */ public 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) { StringBuilder time = new StringBuilder(sdf.format(date)); startTime = time.replace(15, 19, "0:00").toString(); } else { date = DateUtil.rollMinute(date, -5); StringBuilder time = new StringBuilder(sdf.format(date)); startTime = time.replace(15, 19, "5:00").toString(); } year = DateUtil.getYear(date); month = DateUtil.getMonth(date); yearAndMonth = year + month; map.put("time", startTime); map.put("yearAndMonth", yearAndMonth); return map; } }