package com.stylefeng.guns.modular.system.controller; import com.alibaba.druid.support.json.JSONUtils; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.stylefeng.guns.core.base.tips.ErrorTip; import com.stylefeng.guns.core.common.constant.JwtConstants; import com.stylefeng.guns.core.common.exception.BizExceptionEnum; import com.stylefeng.guns.core.exception.GunsException; import com.stylefeng.guns.core.shiro.ShiroKit; import com.stylefeng.guns.core.util.DateUtil; import com.stylefeng.guns.modular.system.dto.QuestionDto; import com.stylefeng.guns.modular.system.model.*; import com.stylefeng.guns.modular.system.service.ITDeviceService; import com.stylefeng.guns.modular.system.service.ITUserDataService; import com.stylefeng.guns.modular.system.service.ITUserDateDataService; import com.stylefeng.guns.modular.system.service.IUserService; import com.stylefeng.guns.modular.system.util.*; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import org.apache.poi.ss.formula.functions.T; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import java.io.InputStream; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; import java.time.temporal.ChronoUnit; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @Controller public class AppController { @Autowired private IUserService userService; @Autowired private RedisService redisService; @ResponseBody @PostMapping("/api/question") @ApiOperation(value = "填写问卷调查", tags = {"App接口"}, notes = "") @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public R queryHomeData(HttpServletRequest request, @RequestBody QuestionDto questionDto) throws JsonProcessingException { Integer uid = redisService.getCacheObject(request.getHeader(JwtConstants.AUTH_HEADER)); User user = userService.selectById(uid); ObjectMapper mapper = new ObjectMapper(); // 将TUserData数组转换为JSON字符串 String jsonInString = mapper.writeValueAsString(questionDto); user.setQuestion(jsonInString); userService.updateById(user); return R.ok("填写成功"); } @Autowired private ITDeviceService deviceService; @ResponseBody @PostMapping("/api/checkeq") @ApiOperation(value = "判断当前用户是否绑定硬件", tags = {"App接口"}, notes = "") @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public R checkeq(HttpServletRequest request){ Integer uid = redisService.getCacheObject(request.getHeader(JwtConstants.AUTH_HEADER)); List bindId = deviceService.selectList(new EntityWrapper().eq("bindId", uid)); if (bindId.isEmpty()){ return R.fail("当前用户暂未绑定设备"); } return R.ok(bindId.get(0)); } @ResponseBody @PostMapping("/api/unbind") @ApiOperation(value = "解绑", tags = {"App接口"}, notes = "") @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public R unbind(HttpServletRequest request){ Integer uid = redisService.getCacheObject(request.getHeader(JwtConstants.AUTH_HEADER)); List bindId = deviceService.selectList(new EntityWrapper().eq("bindId", uid)); for (TDevice tDevice : bindId) { deviceService.deleteById(tDevice.getId()); } return R.ok(); } @ResponseBody @PostMapping("/api/checkques") @ApiOperation(value = "判断当前用户信息", tags = {"App接口"}, notes = "") @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public R checkques(HttpServletRequest request){ Integer uid = redisService.getCacheObject(request.getHeader(JwtConstants.AUTH_HEADER)); User user = userService.selectById(uid); return R.ok(user); } @ResponseBody @PostMapping("/api/bind") @ApiOperation(value = "绑定设备", tags = {"App接口"}, notes = "") @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public R bind(HttpServletRequest request, @RequestBody TDevice device){ Integer uid = redisService.getCacheObject(request.getHeader(JwtConstants.AUTH_HEADER)); device.setBindId(uid); if (deviceService.selectList(new EntityWrapper().eq("mac", device.getMac())).isEmpty()) { device.setBindId(uid); device.setBindTime(new Date()); deviceService.insert(device); }else { TDevice serNum = deviceService.selectOne(new EntityWrapper().eq("serNum", device.getSerNum())); serNum.setBindId(uid); serNum.setBindTime(new Date()); deviceService.updateById(serNum); } return R.ok(); } @PostMapping("/api/changePwd") @ApiOperation(value = "修改密码", tags = {"App接口"}, notes = "") @ResponseBody @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public R changePwd(@RequestParam String oldPwd, @RequestParam String newPwd, @RequestParam String rePwd,HttpServletRequest request) { if (!newPwd.equals(rePwd)) { // throw new GunsException(BizExceptionEnum.TWO_PWD_NOT_MATCH); return R.fail("两次输入密码不一致"); } Integer userId = redisService.getCacheObject(request.getHeader(JwtConstants.AUTH_HEADER)); User user = userService.selectById(userId); String oldMd5 = ShiroKit.md5(oldPwd, user.getSalt()); if (user.getPassword().equals(oldMd5)) { String newMd5 = ShiroKit.md5(newPwd, user.getSalt()); user.setPassword(newMd5); user.updateById(); return R.ok(); } else { // throw new GunsException(BizExceptionEnum.OLD_PWD_NOT_RIGHT); return R.fail("原密码不正确"); } } @PostMapping("/api/changeInfo") @ApiOperation(value = "修改个人信息", tags = {"App接口"}, notes = "") @ResponseBody @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public R changeInfo(@RequestBody User user,HttpServletRequest request) { userService.updateById(user); return R.ok(); } @PostMapping("/api/datalist") @ApiOperation(value = "检测记录", tags = {"App接口"}, notes = "") @ResponseBody @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public R> datalist(HttpServletRequest request, Integer pageNum, Integer pageSize, Integer night, String date) { Integer userId = redisService.getCacheObject(request.getHeader(JwtConstants.AUTH_HEADER)); PageHelper.startPage(pageNum,pageSize); EntityWrapper tUserDateDataEntityWrapper = new EntityWrapper<>(); tUserDateDataEntityWrapper.eq("userId",userId).last("ORDER BY date desc,night desc"); if (night!=null){ tUserDateDataEntityWrapper.eq("night",night).eq("date",date); } tUserDateDataEntityWrapper.setSqlSelect("id","date","night"); List tUserDateData = dateDataService.selectList(tUserDateDataEntityWrapper); for (TUserDateData tUserDateDatum : tUserDateData) { tUserDateDatum.setTUserDataArray(new TUserData[]{}); } PageInfo info=new PageInfo<>(tUserDateData); System.err.println(info); return R.ok(info); } @PostMapping("/api/clear") @ApiOperation(value = "设备clear", tags = {"App接口"}, notes = "") @ResponseBody @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public R clear(String serNum) { //获取当天18点的时间 redisService.setCacheObject("CLEAR:"+serNum, new Date()); return R.ok(); } @PostMapping("/api/ifclear") @ApiOperation(value = "设备是否需要clear", tags = {"App接口"}, notes = "") @ResponseBody @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public R ifclear(String serNum) { //获取当天18点的时间 Date cacheObject = redisService.getCacheObject("CLEAR:"+serNum); if (cacheObject!=null){ Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 18); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); Date dateAt1800 = calendar.getTime(); if (cacheObject.before(dateAt1800)){ return R.ok(false); }else { return R.ok(true); } }else { return R.ok(true); } } @PostMapping("/api/link") @ApiOperation(value = "设备连接断开", tags = {"App接口"}, notes = "") @ResponseBody @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public R link(@RequestBody LinkQuery linkQuery) { TDevice serNum = deviceService.selectOne(new EntityWrapper().eq("serNum", linkQuery.getSerNum())); serNum.setStatus(linkQuery.getStatus()); deviceService.updateById(serNum); if (linkQuery.getStatus()==0){ Long timestamp = new Date().getTime(); redisService.setCacheObject(linkQuery.getSerNum(), timestamp.toString()); } return R.ok(); } @PostMapping("/api/last") @ApiOperation(value = "获取上次断开时间", tags = {"App接口"}, notes = "") @ResponseBody @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public R last(String serNum) { String date = (String)redisService.getCacheObject(serNum); return R.ok(date); } @PostMapping("/api/datadetail") @ApiOperation(value = "检测记录详情", tags = {"App接口"}, notes = "") @ResponseBody @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public R datadetail(HttpServletRequest request,Integer dataId) { TUserDateData tUserDateData = dateDataService.selectById(dataId); ObjectMapper mapper = new ObjectMapper(); TUserData[] tUserDataArray = new TUserData[]{}; try { // 将JSON字符串转换为TUserData数组 tUserDataArray = mapper.readValue(tUserDateData.getData(), TUserData[].class); for (TUserData tUserData : tUserDataArray) { tUserData.setTime(tUserData.getDetectionTime().getTime()); } tUserDateData.setTUserDataArray(tUserDataArray); // 打印转换后的数组,以便验证 System.out.println(Arrays.toString(tUserDataArray)); } catch (Exception e) { e.printStackTrace(); } tUserDateData.setData(null); return R.ok(tUserDateData); } @Autowired private ITUserDataService userDataService; @ResponseBody @PostMapping("/api/pulldata") @ApiOperation(value = "推送数据", tags = {"App接口"}, notes = "") @ApiImplicitParams({ @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) public R pulldata(HttpServletRequest request, @RequestParam("file") MultipartFile file) throws ParseException, JsonProcessingException { Integer uid = redisService.getCacheObject(request.getHeader(JwtConstants.AUTH_HEADER)); List data = new ArrayList<>(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Workbook book = WoUtil.ImportFile(file); Sheet sh = book.getSheetAt(0); //获取到第一个表 for (int i = 1; i <= sh.getLastRowNum(); i++) { Row row = sh.getRow(i); Cell cell2 = row.getCell(2); //所属加盟商[提示:加盟车辆选填] Integer two = null; if (SinataUtil.isNotEmpty(cell2)) { two = (int)cell2.getNumericCellValue(); } Cell cell4 = row.getCell(4); //服务模式:出租车[是/否] String four = null; if (SinataUtil.isNotEmpty(cell4)) { four = String.valueOf(cell4.getStringCellValue()).trim(); } Cell cell5 = row.getCell(1); // 服务模式: 出租车[是/否] Date five = null; int divisor = 5; if (SinataUtil.isNotEmpty(cell5)) { double numericValue = cell5.getNumericCellValue(); long timestamp = (long) numericValue; // 如果数值是整数毫秒时间戳 five = new Date(timestamp); long seconds = timestamp / 1000; // 判断秒数是否为divisor的倍数 boolean isMultiple = seconds % divisor == 0; if (!isMultiple){ // continue; } } else { // 处理单元格为空的情况 } // System.err.println("===="); TUserData tUserData = new TUserData(); tUserData.setUserId(uid); tUserData.setDetectionTime(five); tUserData.setPosition(four); tUserData.setShapeVariable(Integer.valueOf(two)); data.add(tUserData); } // data = userDataService.selectList(null); Map> groupedData = data.stream() .collect(Collectors.groupingBy( item -> { LocalDateTime dateTime = item.getDetectionTime().toInstant() .atZone(ZoneId.systemDefault()) .toLocalDateTime(); LocalTime timeOfDay = dateTime.toLocalTime(); String groupKey; if (timeOfDay.isAfter(LocalTime.of(22, 0))) { // 晚上时间,归入前一天 LocalDate previousDay = dateTime.toLocalDate(); groupKey = previousDay + " 晚上"; } else if (timeOfDay.isBefore(LocalTime.of(10, 0))) { LocalDate previousDay = dateTime.toLocalDate().minusDays(1); // 早上的时间,即00:00 - 10:00 groupKey = previousDay + " 晚上"; } else { // 其余时间,即10:00 - 22:00 groupKey = dateTime.toLocalDate() + " 白天"; } return groupKey; } )); // 输出分组结果 for (Map.Entry> entry : groupedData.entrySet()) { System.out.println("Group: " + entry.getKey()); String[] s = entry.getKey().split(" "); System.out.println("Data: " + entry.getValue()); //判断是否已经存过数据,如果存过就在后面累加 List tUserDateData = dateDataService.selectList(new EntityWrapper().eq("userId", uid).eq("date", s[0]).eq("night", "晚上".equals(s[1]) ? 1 : 0)); //没有就直接save if (!tUserDateData.isEmpty()){ //累加数据 TUserDateData tUserDateData1 = tUserDateData.get(0); ObjectMapper mapper = new ObjectMapper(); TUserData[] tUserDataArray = new TUserData[]{}; try { tUserDataArray = mapper.readValue(tUserDateData1.getData(), TUserData[].class); System.out.println(Arrays.toString(tUserDataArray)); } catch (Exception e) { e.printStackTrace(); } List list = new ArrayList<>(); // 初始化一个空的 ArrayList list.addAll(Arrays.asList(tUserDataArray)); // 将原始数组添加到列表中 List value = entry.getValue(); list.addAll(value); String jsonInString = mapper.writeValueAsString(list); tUserDateData1.setData(jsonInString); dateDataService.updateById(tUserDateData1); }else { TUserDateData tUserDateData2 = new TUserDateData(); ObjectMapper mapper = new ObjectMapper(); try { // 将TUserData数组转换为JSON字符串 String jsonInString = mapper.writeValueAsString(entry.getValue()); System.out.println(jsonInString); tUserDateData2.setData(jsonInString); tUserDateData2.setNight("晚上".equals(s[1]) ? 1 : 0); tUserDateData2.setUserId(uid); tUserDateData2.setDate(s[0]); dateDataService.insert(tUserDateData2); } catch (Exception e) { e.printStackTrace(); } } } return R.ok(); } @Autowired private ITUserDateDataService dateDataService; @ResponseBody @PostMapping("/base/putdata") @ApiOperation(value = "测试用接口", tags = {"App接口"}, notes = "") public R putdata(HttpServletRequest request){ // 创建一个Random对象用于生成随机数 Random random = new Random(); // 计算总秒数,现在每隔10秒生成一条数据 int totalSeconds = 24 * 60 * 6; // 一天内每10秒一条数据 // 创建一个TUserData对象数组 TUserData[] tUserDataArray = new TUserData[totalSeconds]; // 生成并添加数据到数组中 Calendar calendar = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); int shapeVariable = 0; // 初始化shapeVariable for (int i = 0; i < totalSeconds; i++) { // 设置检测时间为当前时间加上i*10秒 calendar.setTime(new Date()); calendar.add(Calendar.SECOND, i * 10); Date detectionTime = calendar.getTime(); // 每10条数据shapeVariable才变化一次 if (i % 10 == 0) { shapeVariable = random.nextInt(200) + 1; // 生成1到200之间的随机整数 } // 假设userId也是1到100之间的随机整数 Integer userId = random.nextInt(100) + 1; TUserData dataPoint = new TUserData(); dataPoint.setDetectionTime(detectionTime); dataPoint.setShapeVariable(shapeVariable); tUserDataArray[i] = dataPoint; } // 打印前10个数据点的时间戳和shapeVariable以验证 for (int i = 0; i < 10; i++) { System.out.println("Detection Time: " + sdf.format(tUserDataArray[i].getDetectionTime())); System.out.println("Shape Variable: " + tUserDataArray[i].getShapeVariable()); System.out.println("-------------"); } String str = Arrays.stream(tUserDataArray) .map(TUserData::toString) .collect(Collectors.joining(", ", "[", "]")); TUserDateData tUserDateData = new TUserDateData(); tUserDateData.setDate("2024-07-15"); tUserDateData.setUserId(1); ObjectMapper mapper = new ObjectMapper(); try { // 将TUserData数组转换为JSON字符串 String jsonInString = mapper.writeValueAsString(tUserDataArray); System.out.println(jsonInString); tUserDateData.setData(jsonInString); } catch (Exception e) { e.printStackTrace(); } dateDataService.insert(tUserDateData); return R.ok(); } }