| | |
| | | import com.alibaba.fastjson2.JSONArray; |
| | | import com.alibaba.fastjson2.JSONObject; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | import com.mongodb.client.MongoCollection; |
| | | import com.xiaopeng.api.dto.operation.VehiclePositionByVinDto; |
| | |
| | | import com.xiaopeng.api.dto.vehicleConvoy.VehicleTemperatureDto; |
| | | import com.xiaopeng.api.feignClient.maintenance.*; |
| | | import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient; |
| | | import com.xiaopeng.api.model.account.XpOperationsUser;import com.xiaopeng.api.model.maintenance.XpTask; |
| | | import com.xiaopeng.api.model.account.XpOperationsUser; |
| | | import com.xiaopeng.api.model.maintenance.XpErrorType; |
| | | import com.xiaopeng.api.model.maintenance.XpTask; |
| | | import com.xiaopeng.api.model.maintenance.XpTaskRule; |
| | | import com.xiaopeng.api.model.operation.XpGeoQueryEntity; |
| | | import com.xiaopeng.api.model.maintenance.XpVehicleModel; |
| | | import com.xiaopeng.api.model.operation.XpOfficialPartner; |
| | | import com.xiaopeng.api.model.vehicleConvoy.XpFleet; |
| | |
| | | import com.xiaopeng.vehicleConvoy.model.importExcel.XpVehicleImportExcel; |
| | | import com.xiaopeng.vehicleConvoy.model.query.*; |
| | | import com.xiaopeng.api.vo.vehicleConvoy.XpVehicleVO; |
| | | import com.xiaopeng.vehicleConvoy.model.vo.VehicleListByVinVo; |
| | | import com.xiaopeng.vehicleConvoy.model.vo.VehiclePositionDto; |
| | | import com.xiaopeng.vehicleConvoy.service.IXpFleetService; |
| | | import com.xiaopeng.vehicleConvoy.service.IXpFleetVehicleService; |
| | |
| | | import org.springframework.context.MessageSource; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.context.i18n.LocaleContextHolder; |
| | | import org.springframework.data.geo.Distance; |
| | | import org.springframework.data.geo.Metrics; |
| | | import org.springframework.data.geo.Point; |
| | | import org.springframework.data.geo.*; |
| | | import org.springframework.data.mongodb.core.MongoTemplate; |
| | | import org.springframework.data.mongodb.core.geo.GeoJsonPoint; |
| | | import org.springframework.data.mongodb.core.query.Criteria; |
| | | import org.springframework.data.mongodb.core.query.NearQuery; |
| | | import org.springframework.data.mongodb.core.query.Query; |
| | | import org.springframework.util.CollectionUtils; |
| | | import org.springframework.web.bind.annotation.*; |
| | |
| | | @PostMapping("/logan/inner/vehicle/queryVehiclePositionByVin") |
| | | public R<List<String>> queryVehiclePositionByVin(@RequestBody VehiclePositionByVinDto dto){ |
| | | List<XpVehicle> list = xpVehicleService.list(new LambdaQueryWrapper<XpVehicle>().eq(XpVehicle::getState, Optional.ofNullable(dto.getStatus()).orElse(0)) |
| | | .eq(XpVehicle::getOperatingStatus, 1).eq(XpVehicle::getElectronicId, dto.getFenceId()).in(XpVehicle::getVehicleVin, buildVinQueryValues(dto.getVinList()))); |
| | | .eq(XpVehicle::getOperatingStatus, 1).eq(XpVehicle::getElectronicId, dto.getFenceId()) |
| | | .eq(XpVehicle::getVehicleType, 2).in(XpVehicle::getVehicleVin, buildVinQueryValues(dto.getVinList()))); |
| | | if (list.isEmpty()) { |
| | | return R.ok(new ArrayList<>()); |
| | | } else { |
| | |
| | | return R.ok(xpVehicleService.listByPlateNumber(plateNumber)); |
| | | } |
| | | |
| | | /** |
| | | * 车辆详情-车门解锁/后备箱解锁 |
| | | */ |
| | | @ApiOperation(value = "车辆运维-车门解锁/后备箱解锁", tags = {"运维APP-车辆管理"}) |
| | | @PostMapping("/maintenance-app/api/v1/vehicle/unlockByType") |
| | | public R<String> unlockByType(@RequestBody UnlockByTypeDTO dto) { |
| | | |
| | | // TODO 车门解锁、后备箱解锁 |
| | | |
| | | return R.ok(); |
| | | } |
| | | |
| | | /** |
| | | * 业务流程-车门解锁/后备箱解锁 |
| | |
| | | @GetMapping("/api/v1/mini-program/order/queryTemperatureByOrderId") |
| | | @XpClientCheck(checkToken = false, checkOtpToken = true) |
| | | public R<String> queryTemperatureByOrderId(@RequestParam Long orderId, HttpServletRequest request) { |
| | | String uid = request.getHeader("XP-Uid"); |
| | | VehicleTemperatureDto vehicleTemperatureDto = xpVehicleService.queryTemperatureByOrderId(orderId, uid); |
| | | VehicleStateVo hvacInnerTemp = vehicleTemperatureDto.getStateMap().get("hvacInnerTemp"); |
| | | if(null == hvacInnerTemp){ |
| | | VehicleDoorStatusVo vehicleDoorStatus = xpVehicleService.getVehicleDoorStatus(orderId); |
| | | if(null == vehicleDoorStatus){ |
| | | return R.fail("查询车内温度失败"); |
| | | } |
| | | return R.ok(hvacInnerTemp.getValue()); |
| | | if(null == vehicleDoorStatus.getRearLeftHvacTempFloat()){ |
| | | return R.ok("25"); |
| | | } |
| | | return R.ok(vehicleDoorStatus.getRearLeftHvacTempFloat().toString()); |
| | | } |
| | | |
| | | |
| | | |
| | | @ApiOperation(value = "通过订单id查询当前车辆车门状态", tags = {"小程序-业务流程"}) |
| | | @GetMapping("/api/v1/mini-program/order/queryVehicleTrunkOpenStatus") |
| | | public R<VehicleTemperatureDto> queryVehicleTrunkOpenStatus(@RequestParam Long orderId, HttpServletRequest request) { |
| | | @XpClientCheck(checkToken = false, checkOtpToken = true) |
| | | public R<Integer> queryVehicleTrunkOpenStatus(@RequestParam Long orderId, HttpServletRequest request) { |
| | | String uid = request.getHeader("XP-Uid"); |
| | | VehicleTemperatureDto vehicleTemperatureDto = xpVehicleService.queryTemperatureByOrderId(orderId,uid); |
| | | return R.ok(vehicleTemperatureDto); |
| | | Boolean trunkOpenStatus = xpVehicleService.queryTrunkOpenStatusByOrderId(orderId, uid); |
| | | return R.ok(trunkOpenStatus ? 1 : 0); |
| | | } |
| | | |
| | | |
| | |
| | | @PostMapping("/api/v1/vehicle/page-list") |
| | | public R<PageInfo<XpVehicleVO>> getVehiclePageList(@RequestBody VehicleSelectPageQuery query) { |
| | | return R.ok(xpVehicleService.getVehiclePageList(query)); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 获取车辆不分页列表 |
| | | * |
| | | * @param query |
| | | * @return |
| | | */ |
| | | @ApiOperation(value = "获取车辆分页列表", tags = {"管理后台-定向服务"}) |
| | | @PostMapping("/api/v1/vehicle/getTargetedVehiclePageList") |
| | | public R<PageInfo<XpVehicleVO>> getTargetedVehiclePageList(@RequestBody VehicleSelectPageQuery query) { |
| | | return R.ok(xpVehicleService.getTargetedVehiclePageList(query)); |
| | | } |
| | | |
| | | |
| | |
| | | @GetMapping("/api/v1/mini-program/vehicle/nearby") |
| | | @XpClientCheck(checkToken = false, checkOtpToken = false) |
| | | public R<List<XpVehicleVO>> carAround(@RequestParam double lon, @RequestParam double lat) { |
| | | |
| | | Point point = new Point(lon, lat); |
| | | Distance distance = new Distance(3, Metrics.KILOMETERS); |
| | | Criteria criteria = Criteria.where("point") |
| | | .nearSphere(point) |
| | | .maxDistance(distance.getNormalizedValue()); |
| | | Query query = new Query(criteria); |
| | | List<VehiclePositionVo> vehiclePositions = mongoTemplate.find(query, VehiclePositionVo.class); |
| | | //找到中心点 |
| | | GeoJsonPoint geoJsonPoint = new GeoJsonPoint(lon, lat); |
| | | //构造半径 |
| | | Distance distanceR = new Distance(3, Metrics.KILOMETERS); |
| | | //画圆 |
| | | Circle circle = new Circle(geoJsonPoint, distanceR); |
| | | // 构造query对象 |
| | | Query query = Query.query(Criteria.where("point").withinSphere(circle)); |
| | | List<VehiclePosition> vehiclePositions = mongoTemplate.find(query, VehiclePosition.class); |
| | | if (CollectionUtils.isEmpty(vehiclePositions)) { |
| | | return R.ok(new ArrayList<>()); |
| | | } |
| | | log.info("周围车辆查询结果:{}", JSON.toJSONString(vehiclePositions)); |
| | | List<XpVehicleVO> xpVehicleList = vehiclePositions.stream() |
| | | .sorted(Comparator.comparingDouble(VehiclePositionVo::getDistance)) |
| | | .map(vp -> { |
| | | XpVehicle xpVehicle = xpVehicleService.getOne(new LambdaQueryWrapper<XpVehicle>().in(XpVehicle::getVehicleVin, SensitiveDataCryptoUtil.queryValues(vp.getVin()))); |
| | | XpVehicle xpVehicle = xpVehicleService.getOne(new LambdaQueryWrapper<XpVehicle>().eq(XpVehicle::getState, 0).eq(XpVehicle::getOperatingStatus, 1) |
| | | .eq(XpVehicle::getAcceptOrTest, 1).eq(XpVehicle::getDeleted, 0).in(XpVehicle::getVehicleVin, SensitiveDataCryptoUtil.queryValues(vp.getVin()))); |
| | | if (xpVehicle == null) { |
| | | return null; |
| | | } |
| | | XpVehicleVO vo = new XpVehicleVO(); |
| | | BeanUtils.copyProperties(xpVehicle, vo); |
| | | vo.setLongitude(vp.getPoint().getX()); |
| | | vo.setLatitude(vp.getPoint().getY()); |
| | | vo.setDirection(vp.getCourse()); |
| | | vo.setId(xpVehicle.getId()); |
| | | return vo; |
| | | }) |
| | | .filter(Objects::nonNull) |
| | | .filter(v -> v.getState() != null && v.getState() == 0) |
| | | .limit(5) |
| | | .collect(Collectors.toList()); |
| | | log.info("周围车辆筛选结果:{}", JSON.toJSONString(xpVehicleList)); |
| | | return R.ok(xpVehicleList); |
| | | } |
| | | |
| | |
| | | .distinct() |
| | | .collect(Collectors.toList()); |
| | | } |
| | | |
| | | |
| | | |
| | | @ApiOperation(value = "根据VIN码查询车辆信息", response = XpErrorType.class, tags = "远程代驾") |
| | | @GetMapping("/logan/assistance/v1/vehicle/getVehicleListByVin/{vin}") |
| | | public R<VehicleListByVinVo> getVehicleListByVin(@PathVariable String vin) { |
| | | XpVehicle vehicle = xpVehicleService.getOne(new QueryWrapper<XpVehicle>().eq("vehicle_vin", SensitiveDataCryptoUtil.encrypt(vin)) |
| | | .eq("is_deleted", 0)); |
| | | VehicleListByVinVo vehicleListByVinVo = new VehicleListByVinVo(); |
| | | BeanUtil.copyProperties(vehicle, vehicleListByVinVo); |
| | | vehicleListByVinVo.setVin(vin); |
| | | return R.ok(vehicleListByVinVo); |
| | | } |
| | | } |