| | |
| | | package com.ruoyi.worker.controller; |
| | | |
| | | |
| | | import cn.afterturn.easypoi.cache.manager.IFileLoader; |
| | | import com.alibaba.fastjson2.JSONObject; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.ruoyi.common.core.constant.Constants; |
| | |
| | | import java.io.IOException; |
| | | import java.nio.file.Files; |
| | | import java.nio.file.Paths; |
| | | import java.time.Duration; |
| | | import java.time.LocalDateTime; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.util.ArrayList; |
| | | import java.util.HashSet; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Optional; |
| | | import java.util.Set; |
| | | import java.util.concurrent.TimeUnit; |
| | | import java.util.stream.Collectors; |
| | | import javax.annotation.Resource; |
| | | |
| | | import lombok.Synchronized; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | |
| | | /** |
| | | * linux服务器保存订单轨迹文件夹 |
| | | */ |
| | | // private static final String BASE_PATH = "/usr/local/coordinate/"; |
| | | private static final String BASE_PATH = "F:/DeskTop/coordinate/"; |
| | | // private static final String BASE_MARKER_PATH = "/usr/local/marker/"; |
| | | private static final String BASE_PATH = "/usr/local/coordinate/"; |
| | | // private static final String BASE_PATH = "F:/DeskTop/coordinate/"; |
| | | private static final String BASE_MARKER_PATH = "/usr/local/marker/"; |
| | | // private static final String BASE_PATH = "D:/Desktop/coordinate/"; |
| | | private static final String BASE_MARKER_PATH = "F:/DeskTop/marker/"; |
| | | // private static final String BASE_MARKER_PATH = "F:/DeskTop/marker/"; |
| | | /** |
| | | * 师傅端-获取订单列表 |
| | | * |
| | |
| | | } |
| | | return orderClient.orderSubmit(orderSubmitRequest); |
| | | } |
| | | |
| | | private static final double EARTH_RADIUS_METERS = 6371000.0; |
| | | /** |
| | | * 师傅端-定时调度记录师傅所走路线经纬度 |
| | | * |
| | |
| | | @ApiImplicitParam(value = "经度", name = "longitude", dataType = "Integer", required = true), |
| | | @ApiImplicitParam(value = "纬度", name = "latitude", dataType = "Integer", required = true) |
| | | }) |
| | | @Synchronized |
| | | public R<Boolean> coordinate(@RequestParam Double longitude, @RequestParam Double latitude) { |
| | | |
| | | System.err.println("调用记录经纬度"+ LocalDateTime.now()); |
| | | |
| | | LoginUserInfo loginWorker = tokenService.getLoginUserByWorker(); |
| | | if (null == loginWorker) { |
| | | return R.loginExpire("登录失效!"); |
| | | } |
| | | Object cacheObject2 = redisService.getCacheObject("LOCK" + loginWorker.getUserid()); |
| | | if (cacheObject2!=null){ |
| | | return R.ok(); |
| | | }else { |
| | | redisService.setCacheObject("LOCK" + loginWorker.getUserid(),"1", 10L, TimeUnit.SECONDS); |
| | | } |
| | | |
| | | // 获取当天时间 |
| | | String today = DateUtils.dateTimeNow("yyyy-MM-dd"); |
| | | Integer workerId = loginWorker.getUserid(); |
| | |
| | | // 读取订单ID的JSON文件内容 |
| | | try { |
| | | String jsonContent = new String(Files.readAllBytes(Paths.get(jsonFilePath))); |
| | | System.out.println("JSON 文件内容:" + jsonContent); |
| | | List<ServeCoordinate> coordinate = JSONObject.parseObject(jsonContent, List.class); |
| | | // 订单轨迹信息 |
| | | ServeCoordinate data = new ServeCoordinate(); |
| | |
| | | return R.fail(e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | |
| | | //拿到三十分钟之前的时间,并已 yyyy-MM-dd HH:mm格式存储 |
| | | // 当前时间 |
| | | LocalDateTime now = LocalDateTime.now(); |
| | | |
| | | // 减去三十分钟 |
| | | LocalDateTime thirtyMinutesAgo = now.minusMinutes(5); |
| | | |
| | | // 定义日期时间格式 |
| | | DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); |
| | | |
| | | // 格式化时间 |
| | | String formattedTime = thirtyMinutesAgo.format(formatter); |
| | | String nowStr = now.format(formatter); |
| | | |
| | | |
| | | redisService.setCacheObject("MARK:"+workerId+":"+nowStr,longitude + "," + latitude, 10L, TimeUnit.MINUTES); |
| | | |
| | | String cacheObject = redisService.getCacheObject("MARK:" + workerId + ":" + formattedTime); |
| | | if (cacheObject!=null){ |
| | | |
| | | String cacheObject1 = redisService.getCacheObject("TIME:" + workerId); |
| | | if (cacheObject1==null){ |
| | | cacheObject1 = "2000-09-06 20:24:10.740"; |
| | | } |
| | | // 定义日期时间格式 |
| | | DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); |
| | | |
| | | // 解析字符串为 LocalDateTime |
| | | LocalDateTime localDateTime = LocalDateTime.parse(cacheObject1, formatter1); |
| | | if (isWithinTwoMinutes(localDateTime, now)){ |
| | | //计算两点之间的距离 |
| | | String[] split = cacheObject.split(","); |
| | | String longitude1 = split[0]; |
| | | String latitude1 = split[1]; |
| | | double longitude1Double = Double.parseDouble(longitude1); |
| | | double latitude1Double = Double.parseDouble(latitude1); |
| | | double lat1Rad = Math.toRadians(latitude); |
| | | double lon1Rad = Math.toRadians(longitude); |
| | | double lat2Rad = Math.toRadians(latitude1Double); |
| | | double lon2Rad = Math.toRadians(longitude1Double); |
| | | |
| | | // 计算经纬度差值 |
| | | double dlon = lon2Rad - lon1Rad; |
| | | double dlat = lat2Rad - lat1Rad; |
| | | |
| | | // Haversine 公式 |
| | | double a = Math.pow(Math.sin(dlat / 2), 2) + |
| | | Math.cos(lat1Rad) * Math.cos(lat2Rad) * |
| | | Math.pow(Math.sin(dlon / 2), 2); |
| | | double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); |
| | | // 计算距离 |
| | | double distance = EARTH_RADIUS_METERS * c; |
| | | System.err.println("-----当前距离"+distance); |
| | | //如果超出一定范围,存入Mark文件 |
| | | if (distance<50){ |
| | | redisService.setCacheObject("TIME:"+workerId,LocalDateTime.now(), 10L, TimeUnit.MINUTES); |
| | | marker(longitude,latitude); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | redisService.deleteObject("LOCK" + loginWorker.getUserid()); |
| | | return R.ok(); |
| | | } |
| | | |
| | | public static boolean isWithinTwoMinutes(LocalDateTime dateTime1, LocalDateTime dateTime2) { |
| | | // 计算两个时间之间的差值 |
| | | Duration duration = Duration.between(dateTime1, dateTime2); |
| | | |
| | | // 检查差值是否小于等于2分钟 |
| | | long minutes = Math.abs(duration.toMinutes()); |
| | | return minutes >= 5; |
| | | } |
| | | /** |
| | | * 师傅端-定时调度记录师傅当天的轨迹标点 |
| | |
| | | @ApiImplicitParam(value = "纬度", name = "latitude", dataType = "Integer", required = true) |
| | | }) |
| | | public R<Boolean> marker(@RequestParam Double longitude, @RequestParam Double latitude) { |
| | | System.err.println("调用标点"+ LocalDateTime.now()); |
| | | LoginUserInfo loginWorker = tokenService.getLoginUserByWorker(); |
| | | if (null == loginWorker) { |
| | | return R.loginExpire("登录失效!"); |
| | | } |
| | | // 获取当天时间 |
| | | String today = DateUtils.dateTimeNow("yyyy-MM-dd"); |
| | | Integer workerId = 1; |
| | | // Integer workerId = loginWorker.getUserid(); |
| | | // Integer workerId = 1; |
| | | Integer workerId = loginWorker.getUserid(); |
| | | ServeCoordinate serveCoordinate = new ServeCoordinate(); |
| | | serveCoordinate.setWorkerId(workerId); |
| | | serveCoordinate.setDate(today); |
| | |
| | | // 读取订单ID的JSON文件内容 |
| | | try { |
| | | String jsonContent = new String(Files.readAllBytes(Paths.get(jsonFilePath))); |
| | | System.out.println("JSON 文件内容:" + jsonContent); |
| | | List<ServeCoordinate> coordinate = JSONObject.parseObject(jsonContent, List.class); |
| | | // 订单轨迹信息 |
| | | ServeCoordinate data = new ServeCoordinate(); |
| | |
| | | } |
| | | return R.ok(); |
| | | } |
| | | // @ApiOperation(value = "算经纬度", tags = {"师傅端-订单列表"}) |
| | | // @GetMapping(value = "/distance") |
| | | // @ApiImplicitParams({ |
| | | // @ApiImplicitParam(value = "经度", name = "longitude", dataType = "Integer", required = true), |
| | | // @ApiImplicitParam(value = "纬度", name = "latitude", dataType = "Integer", required = true) |
| | | // }) |
| | | // public R<Boolean> distance(@RequestParam Double longitude1, @RequestParam Double latitude1,@RequestParam Double longitude2, @RequestParam Double latitude2) { |
| | | // |
| | | // |
| | | // } |
| | | |
| | | @ApiOperation(value = "上传经纬度", tags = {"师傅端-首页"}) |
| | | @GetMapping(value = "/putLocation") |