package com.xiaopeng.order.controller; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.xiaopeng.api.dto.account.UcUserInfo; import com.xiaopeng.api.dto.vehicleConvoy.ServiceVehicleListDto; import com.xiaopeng.api.feignClient.account.UserResourcesClient; import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient; import com.xiaopeng.api.model.order.XpOrder; import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; import com.xiaopeng.api.vo.automaticPilot.VehiclePosition; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.utils.StringUtils; import com.xiaopeng.order.dto.UserOrderListDto; import com.xiaopeng.order.mangodb.model.OrderTrajectory; import com.xiaopeng.order.service.IXpOrderService; import com.xiaopeng.order.vo.*; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; /** * 提供三方客服系统接口 */ @RestController @RequestMapping("/logan/rt/customerService") public class CustomerServiceController { @Resource private XpVehicleClient xpVehicleClient; @Resource private IXpOrderService xpOrderService; @Resource private UserResourcesClient userResourcesClient; @Resource private MongoTemplate mongoTemplate; /** * 1. 判断 VIN 是否为 robotaxi 车辆 * @param vin * @return */ @GetMapping("/isRobotaxi/{vin}") @ApiOperation(value = "判断 VIN 是否为 robotaxi 车辆", notes = "客服系统对接") @ApiImplicitParam(name = "vin", value = "VIN码", required = true, dataType = "string", paramType = "path") public R isRobotaxi(@PathVariable String vin){ XpVehicle xpVehicle = xpVehicleClient.findByVehicleVin(vin).getData(); if(null != xpVehicle){ return R.ok(true); } return R.ok(false); } /** * 2. 根据 VIN 查询在途/最近订单客户手机号 * @param vin * @return */ @GetMapping("/getServiceOrder/{vin}") @ApiOperation(value = "根据 VIN 查询在途/最近订单客户手机号", notes = "客服系统对接") @ApiImplicitParam(name = "vin", value = "VIN码", required = true, dataType = "string", paramType = "path") public R getServiceOrder(@PathVariable String vin){ XpVehicle xpVehicle = xpVehicleClient.findByVehicleVin(vin).getData(); if(null == xpVehicle){ return R.ok(); } XpOrder one = xpOrderService.getOne(new QueryWrapper().eq("vehicle_id", xpVehicle.getId()) .eq("is_deleted", 0).last(" order by create_time desc limit 1")); if(null == one){ return R.ok(); } ServiceOrderVo vo = new ServiceOrderVo(); vo.setOrderId(one.getId()); UcUserInfo ucUserInfo = userResourcesClient.getBaseUserByUid(one.getAppUserId().toString()); vo.setCustomerPhone(null != ucUserInfo ? ucUserInfo.getMobile() : null); vo.setHasActiveOrder(!Arrays.asList(0, 8, 9, 10).contains(one.getStatus())); return R.ok(vo); } /** * 3. 获取当前在运营车辆列表 * @param dto * @return */ @PostMapping("/getServiceVehicleList") @ApiOperation(value = "获取当前在运营车辆列表", notes = "客服系统对接") public R> getServiceVehicleList(@RequestBody ServiceVehicleListDto dto){ R> serviceVehicleList = xpVehicleClient.getServiceVehicleList(dto); if(serviceVehicleList.getCode() != 200){ return R.fail(serviceVehicleList.getMsg()); } List collect = serviceVehicleList.getData().stream().map(xpVehicle -> { ServiceVehicleListVo vo = new ServiceVehicleListVo(); vo.setVin(xpVehicle.getVehicleVin()); vo.setPlateNumber(xpVehicle.getPlateNumber()); return vo; }).collect(Collectors.toList()); return R.ok(collect); } /** * 4. 根据 UID 查询用户是否有 RT 订单 & 订单列表 * @param dto * @return */ @PostMapping("/getUserOrderList") @ApiOperation(value = "根据 UID 查询用户是否有 RT 订单 & 订单列表", notes = "客服系统对接") public R> getUserOrderList(@RequestBody UserOrderListDto dto){ List userOrderList = xpOrderService.getUserOrderList(dto); return R.ok(userOrderList); } /** * 5. 根据订单号查询订单详情 * @param orderId * @return */ @GetMapping("/getOrderDetail/{orderId}") @ApiOperation(value = "根据订单号查询订单详情", notes = "客服系统对接") @ApiImplicitParam(name = "orderId", value = "订单ID", required = true, dataType = "Long", paramType = "path") public R getOrderDetail(@PathVariable Long orderId){ return R.ok(xpOrderService.getOrderInfo(orderId)); } /** * 7. 根据订单号查询实际行驶路径 * @param orderId * @return */ @GetMapping("/getOrderHistoryTrajectory/{orderId}") @ApiOperation(value = "根据订单号查询实际行驶路径", notes = "客服系统对接") @ApiImplicitParam(name = "orderId", value = "订单ID", required = true, dataType = "Long", paramType = "path") public R> getOrderHistoryTrajectory(@PathVariable Long orderId){ List orderTrajectoryList = mongoTemplate.find(Query.query(Criteria.where("orderId").is(orderId)), OrderTrajectory.class); List collect = orderTrajectoryList.stream().map(trajectory -> { String[] split = trajectory.getLocation().split(","); TrajectoryVo jsonObject = new TrajectoryVo(); jsonObject.setLng(Double.parseDouble(split[0])); jsonObject.setLat(Double.parseDouble(split[1])); return jsonObject; }).collect(Collectors.toList()); return R.ok(collect); } /** * 10. 根据 VIN 查询剩余电量及预估续航 * @param vin * @return */ @GetMapping("/getVehicleRange/{vin}") @ApiOperation(value = "根据 VIN 查询剩余电量及预估续航", notes = "客服系统对接") @ApiImplicitParam(name = "vin", value = "vin码", required = true, dataType = "string", paramType = "path") public R getVehicleRange(@PathVariable String vin){ VehiclePosition vehiclePositions = mongoTemplate.findOne(Query.query(Criteria.where("vin").is(vin)), VehiclePosition.class); if(null == vehiclePositions){ return R.ok(); } VehicleRangeVo vo = new VehicleRangeVo(); vo.setBatteryLevel(vehiclePositions.getCurrentElectricity()); vo.setEstimatedRange(Double.valueOf(vehiclePositions.getMileageRange())); return R.ok(vo); } }