package com.xzx.gc.order.controller; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.text.StrBuilder; import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.xzx.gc.common.Result; import com.xzx.gc.common.constant.*; import com.xzx.gc.common.dto.gdmap.CommonTraceDto; import com.xzx.gc.common.dto.gdmap.FindTraceDto; import com.xzx.gc.common.dto.gdmap.TrackDto; import com.xzx.gc.common.dto.gdmap.UploadTraceLocationDto; import com.xzx.gc.common.request.BaseController; import com.xzx.gc.common.utils.BusinessUtil; import com.xzx.gc.common.utils.DateUtils; import com.xzx.gc.common.utils.RedisUtil; import com.xzx.gc.common.utils.gdmap.GdTraceUtil; import com.xzx.gc.entity.ConfigInfo; import com.xzx.gc.entity.OrderInfo; import com.xzx.gc.entity.PartnerTrace; import com.xzx.gc.entity.UserTraceInfo; import com.xzx.gc.model.JsonResult; import com.xzx.gc.model.admin.XzxCityPartnerModel; import com.xzx.gc.model.order.OrderTraceCreateByTimeDTO; import com.xzx.gc.model.system.ConfigInfoReq; import com.xzx.gc.model.system.ConfigInfoVo; import com.xzx.gc.order.dto.TraceAllDto; import com.xzx.gc.order.dto.TraceInfoDto; import com.xzx.gc.order.dto.TrackDetailResultDto; import com.xzx.gc.order.dto.TrackResultDto; import com.xzx.gc.order.service.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; import java.util.stream.Collectors; /** * @author :zz */ @RestController @Api(tags = {"轨迹管理"}) @Slf4j public class TraceController extends BaseController { @Autowired private RedisUtil redisUtil; @Autowired private UserTraceInfoService userTraceInfoService; @Autowired private PartnerTraceService partnerTraceService; @Autowired private ConfigService configService; @Autowired private BusinessUtil businessUtil; @Autowired private OrderService orderService; @Autowired private TraceService traceService; @Autowired private CityPartnerService cityPartnerService; @Autowired private OtherUserService otherUserService; @PostMapping({"/trace/info",Constants.ADMIN_VIEW_PREFIX+"/trace/info"}) @ApiOperation(value = "轨迹清单") public Result add(@RequestBody TraceInfoDto traceInfoDto, HttpServletRequest request) { //兼容原来的接口 自定义负值类型 String type=traceInfoDto.getType(); String userType=traceInfoDto.getUserType(); String userId = traceInfoDto.getUserId(); String time1 = traceInfoDto.getTime(); //兼容原来的接口 自定义负值类型 if(OrderEnum.回收员全天轨迹.getValue().equals(type)){ userType=Constants.DEFAULT_ID; } PartnerTrace partnerTrace = partnerTraceService.findByUserIdAndType(userId, userType); // if(SpringUtil.isDev()){ // partnerTrace=new PartnerTrace(); // partnerTrace.setPartnerServiceType(Convert.toShort(3)); // partnerTrace.setPartnerServiceId("160878"); // partnerTrace.setPartnerKey("a64d28b2e036f4688b05916ef321b17d"); // OtherUserInfo otherUserInfo=new OtherUserInfo(); // otherUserInfo.setTerminalDayId("268834485"); // partnerTrace.setOtherUserInfo(otherUserInfo); // } if (partnerTrace != null) { String key = partnerTrace.getPartnerKey(); String sid = partnerTrace.getPartnerServiceId(); FindTraceDto findTraceDto = new FindTraceDto(); findTraceDto.setKey(key); findTraceDto.setSid(sid); String tid ; if(OrderEnum.回收员全天轨迹.getValue().equals(type)){ tid=partnerTrace.getOtherUserInfo().getTerminalDayId(); }else { tid = partnerTrace.getOtherUserInfo().getTerminalId(); } // // if(SpringUtil.isDev()){ // tid="251615392"; //// findTraceDto.setTrid("80"); // } findTraceDto.setTid(tid); String trid = traceInfoDto.getTraceId(); if (StrUtil.isNotBlank(trid)) { findTraceDto.setTrid(trid); } else { UserTraceInfo byUserAndDate = userTraceInfoService.findByUserAndDate(userId, time1); if(byUserAndDate!=null){ findTraceDto.setTrid(byUserAndDate.getTraceId()); } ConfigInfoReq configInfoReq = new ConfigInfoReq(); configInfoReq.setConfigTypeCode("WORK_TIME"); List configInfoVos = configService.configInfoQuery(configInfoReq); String configValue = configInfoVos.get(0).getConfigValue(); String[] split = configValue.split("-"); //Unix时间戳(轨迹点的定位时间),需要精准到毫秒 String startTime = time1 + " " + split[0] + ":00"; String endTime = time1 + " " + split[1] + ":00"; findTraceDto.setStarttime(DateUtil.parse(startTime, DateUtils.DATE_FORMAT_YMDHMS).getTime()); findTraceDto.setEndtime(DateUtil.parse(endTime, DateUtils.DATE_FORMAT_YMDHMS).getTime()); } Result> trace = GdTraceUtil.findTrace(findTraceDto); if (trace.getCode() == 0) { List data = trace.getData(); TrackDto trackDto = data.get(0); TrackResultDto trackResultDto = new TrackResultDto(); trackResultDto.setCounts(trackDto.getCounts()); trackResultDto.setTime(NumberUtil.round(Convert.toDouble(trackDto.getTime()) / 1000 /60 , 1, RoundingMode.DOWN)); if (trackDto.getDistance() != 0) { String s = businessUtil.changeWeight(Convert.toStr(Convert.toDouble(trackDto.getDistance()) / 1000)); trackResultDto.setDistance(s); } else { trackResultDto.setDistance("0.000"); } List points = trackDto.getPoints(); List details = new ArrayList<>(); if (CollUtil.isNotEmpty(points)) { for (UploadTraceLocationDto point : points) { Long locatetime = point.getLocatetime(); String location = point.getLocation(); TrackDetailResultDto trackDetailResultDto = new TrackDetailResultDto(); trackDetailResultDto.setLocation(location); trackDetailResultDto.setLocatetime(locatetime.toString()); String props = point.getProps(); if (StrUtil.isNotBlank(props)) { JSONObject jsonObject = JSONUtil.parseObj(props); trackDetailResultDto.setAddress(jsonObject.getStr("address")); } details.add(trackDetailResultDto); } //将连续的数据进行合并统计逗留时间 if(CollUtil.isNotEmpty(details)){ List collect = details.stream().sorted(Comparator.comparing(TrackDetailResultDto::getLocatetime)).collect(Collectors.toList()); List list2 = new ArrayList<>(); list2.add(collect.get(0)); for(int i=1;i30000){ trackDetailResultDto2.setOffline(true); } list2.add(trackDetailResultDto1); }else { trackDetailResultDto2.setLingerTime(NumberUtil.sub(Convert.toLong(locatetime), Convert.toLong(locatetime1)).toString()); trackDetailResultDto2.setLingerLocateTime(locatetime); } } //处理轨迹时间的数据 for (TrackDetailResultDto trackDetailResultDto : list2) { Date locatetime = new Date(Convert.toLong(trackDetailResultDto.getLocatetime())); trackDetailResultDto.setLocatetime(DateUtil.format(locatetime, DateUtils.DATE_FORMAT_HM)); String lingerTime = trackDetailResultDto.getLingerTime(); if (StrUtil.isNotBlank(lingerTime)) { double l = Convert.toDouble(lingerTime) / 1000 / 60; BigDecimal round = NumberUtil.round(l, 1, RoundingMode.DOWN); trackDetailResultDto.setLingerTime(Convert.toStr(round)); } } details=list2; //重置轨迹点数为处理后的点数 trackResultDto.setCounts(list2.size()); } } trackResultDto.setDetails(details); //当前时间戳 trackResultDto.setTimestamp(System.currentTimeMillis()); return Result.success(trackResultDto); }else { return Result.error(-1, trace.getMsg()); } } else { return Result.error(-1, "合伙人没有分配对应的服务轨迹"); } } @PostMapping("/trace/upload") @ApiOperation(value = "上传轨迹") public Result upload(@RequestBody TraceAllDto traceAllDto, HttpServletRequest request) { Runnable callable=()->{ traceService.upload(traceAllDto); }; ThreadUtil.execAsync(callable); return Result.success(); } @PostMapping("/trace/createByTime") @ApiOperation(value = "根据时间创建轨迹") public Result createByTime(HttpServletRequest request,@RequestBody OrderTraceCreateByTimeDTO orderTraceCreateByTimeDTO) { String userId = getUserId(request); //外部骑手 Short originType = otherUserService.findById(userId).getOriginType(); if(originType!=null&&originType.intValue()==1){ return Result.success(-1); } if(redisUtil.setnx(RedisKeyConstant.CREATE_TRACE+userId,"0")){ try { String type = orderTraceCreateByTimeDTO.getType(); String userType=null; UserTraceInfo byUserAndDate = userTraceInfoService.findByUserAndDate(userId, DateUtil.today()); if(byUserAndDate==null){ //创建轨迹 if(OrderEnum.回收员全天轨迹.getValue().equals(type)){ userType=Constants.DEFAULT_ID; } PartnerTrace partnerTrace = partnerTraceService.findByUserIdAndType(userId, userType); if(partnerTrace!=null){ String terminalId; if(OrderEnum.回收员全天轨迹.getValue().equals(type)){ terminalId = partnerTrace.getOtherUserInfo().getTerminalDayId(); }else { terminalId = partnerTrace.getOtherUserInfo().getTerminalId(); } String key=partnerTrace.getPartnerKey(); String partnerServiceId = partnerTrace.getPartnerServiceId(); Result traceCreate = GdTraceUtil.createTrace(key, partnerServiceId, terminalId); if(traceCreate.getCode()==0){ String traceId=traceCreate.getData().toString(); UserTraceInfo obj=new UserTraceInfo(); obj.setUserId(userId); obj.setTerminalId(terminalId); obj.setTraceId(traceId); obj.setKeyId(key); obj.setServiceId(partnerServiceId); try { userTraceInfoService.add(obj); } catch (Exception e) { CommonTraceDto commonTraceDto = new CommonTraceDto(); commonTraceDto.setKey(key); commonTraceDto.setSid(partnerServiceId); commonTraceDto.setTid(terminalId); commonTraceDto.setTrid(traceId); GdTraceUtil.deleteTrace(commonTraceDto); return Result.error(Convert.toInt(ExceptionEnum.可忽略异常.getValue()),"创建轨迹失败:数据库操作异常"); } return Result.success(traceId); }else { return Result.error(Convert.toInt(ExceptionEnum.可忽略异常.getValue()),"创建轨迹失败:"+traceCreate.getMsg()); } }else { return Result.error(Convert.toInt(ExceptionEnum.可忽略异常.getValue()),"未找到对应的合伙人"); } }else { return Result.success(byUserAndDate.getTraceId()); } }catch (Exception e){ throw e; }finally { redisUtil.del(RedisKeyConstant.CREATE_TRACE+userId); } } return Result.error(Convert.toInt(ExceptionEnum.可忽略异常.getValue()),"创建轨迹失败:重复操作"); } @PostMapping("/trace/findByReceiver") @ApiOperation(value = "查询回收员当前正在进行的轨迹") public Result findByReceiver(HttpServletRequest request) { List detailByReceiverAndStatus = orderService.findDetailByReceiverAndStatus(getUserId(request), OrderEnum.服务中.getValue()); StrBuilder strBuilder = StrBuilder.create(); if(CollUtil.isNotEmpty(detailByReceiverAndStatus)){ for (OrderInfo byReceiverAndStatus : detailByReceiverAndStatus) { if(StrUtil.isNotBlank(byReceiverAndStatus.getTraceId())) { strBuilder.append(byReceiverAndStatus.getTraceId() + ","); } } } if(strBuilder.length()>0){ String s = strBuilder.toString(); String s1 = StrUtil.removeSuffix(s, ","); return Result.success(s1); } return Result.success(null); } // @PostMapping({"/trace/info2",Constants.ADMIN_VIEW_PREFIX+"/trace/info"}) // @ApiOperation(value = "修复高德服务") // public Result findByReceiver2(HttpServletRequest request) { // traceService.fixService(); // return Result.success(); // } @PostMapping( "/admin/front/trace/queryGaodeByUserId.json") @ApiOperation(value="查询轨迹接口", notes="test: 仅0有正确返回") @ApiImplicitParams({ @ApiImplicitParam(paramType="query", name ="userId", value = "用户Id", required = true, dataType = "String"), @ApiImplicitParam(paramType="query", name ="orderId", value = "订单Id", required = true, dataType = "String"), @ApiImplicitParam(paramType="query", name ="dayTime", value = "日期", required = true, dataType = "String"), @ApiImplicitParam(paramType="query", name ="dateTime", value = "时间段", required = true, dataType = "String") }) public JsonResult>> queryGaodeByUserId(@RequestBody XzxCityPartnerModel model){ List> list = cityPartnerService.queryGaodeByUserId(model); return JsonResult.success(list); } }