xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/vehicleConvoy/ServiceVehicleListDto.java
New file @@ -0,0 +1,22 @@ package com.xiaopeng.api.dto.vehicleConvoy; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotNull; @Data @ApiModel public class ServiceVehicleListDto { @ApiModelProperty("车牌号") private String plateNumber; @ApiModelProperty("vim码") private String vim; @ApiModelProperty("页码") @NotNull(message = "页码不能为空") private Integer pageNo; @ApiModelProperty("每页数量") @NotNull(message = "每页数量不能为空") private Integer pageSize; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/vehicleConvoy/XpVehicleClientFallbackFactory.java
@@ -1,6 +1,7 @@ package com.xiaopeng.api.factory.vehicleConvoy; import com.xiaopeng.api.dto.operation.VehiclePositionByVinDto; import com.xiaopeng.api.dto.vehicleConvoy.ServiceVehicleListDto; import com.xiaopeng.api.dto.vehicleConvoy.UpdateVehicleStateDto; import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient; import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; @@ -12,6 +13,7 @@ import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** @@ -105,6 +107,13 @@ public R<Boolean> getVehicleTrunkOpenStatus(Long uid, Long id) { log.error("获取车辆后备箱开关状态失败,原因: {}", cause.getMessage()); return R.fail("获取车辆后备箱开关状态失败:" + cause.getMessage()); }}; } @Override public R<List<XpVehicle>> getServiceVehicleList(ServiceVehicleListDto dto) { log.error("获取服务车辆列表失败,原因: {}", cause.getMessage()); return R.fail("获取服务车辆列表失败:" + cause.getMessage()); } }; } } xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/vehicleConvoy/XpVehicleClient.java
@@ -1,6 +1,7 @@ package com.xiaopeng.api.feignClient.vehicleConvoy; import com.xiaopeng.api.dto.operation.VehiclePositionByVinDto; import com.xiaopeng.api.dto.vehicleConvoy.ServiceVehicleListDto; import com.xiaopeng.api.dto.vehicleConvoy.UpdateVehicleStateDto; import com.xiaopeng.api.factory.vehicleConvoy.XpVehicleClientFallbackFactory; import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; @@ -134,4 +135,13 @@ @PostMapping("/logan/inner/vi/vehicle/getVehicleTrunkOpenStatus") R<Boolean> getVehicleTrunkOpenStatus(@RequestParam("uid") Long uid, @RequestParam("id") Long id); /** * 分页获取运营车辆列表 * @param dto * @return */ @PostMapping("/logan/inner/vehicle/getServiceVehicleList") R<List<XpVehicle>> getServiceVehicleList(@RequestBody ServiceVehicleListDto dto); } xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/CustomerServiceController.java
New file @@ -0,0 +1,144 @@ package com.xiaopeng.order.controller; 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.common.core.domain.R; import com.xiaopeng.common.core.utils.StringUtils; import com.xiaopeng.order.dto.UserOrderListDto; import com.xiaopeng.order.service.IXpOrderService; import com.xiaopeng.order.vo.OrderInfoVo; import com.xiaopeng.order.vo.ServiceOrderVo; import com.xiaopeng.order.vo.ServiceVehicleListVo; import com.xiaopeng.order.vo.UserOrderListVo; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; 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; /** * 1. 判断 VIN 是否为 robotaxi 车辆 * @param vim * @return */ @GetMapping("/isRobotaxi/{vim}") @ApiOperation(value = "判断 VIN 是否为 robotaxi 车辆", notes = "客服系统对接") @ApiImplicitParam(name = "vim", value = "VIN码", required = true, dataType = "string", paramType = "path") public R<Boolean> isRobotaxi(@PathVariable String vim){ if(StringUtils.isEmpty(vim)){ return R.fail("VIM码不能为空"); } XpVehicle xpVehicle = xpVehicleClient.findByVehicleVin(vim).getData(); if(null != xpVehicle){ return R.ok(true); } return R.ok(false); } /** * 2. 根据 VIN 查询在途/最近订单客户手机号 * @param vim * @return */ @GetMapping("/getServiceOrder/{vim}") @ApiOperation(value = "根据 VIN 查询在途/最近订单客户手机号", notes = "客服系统对接") @ApiImplicitParam(name = "vim", value = "VIN码", required = true, dataType = "string", paramType = "path") public R<ServiceOrderVo> getServiceOrder(@PathVariable String vim){ if(StringUtils.isEmpty(vim)){ return R.fail("VIM码不能为空"); } XpVehicle xpVehicle = xpVehicleClient.findByVehicleVin(vim).getData(); if(null == xpVehicle){ return R.fail("VIM码不存在"); } XpOrder one = xpOrderService.getOne(new QueryWrapper<XpOrder>().eq("vehicle_id", xpVehicle.getId()) .eq("is_deleted", 0).last(" order by create_time desc limit 1")); if(null == one){ return R.ok(new ServiceOrderVo()); } 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<List<ServiceVehicleListVo>> getServiceVehicleList(@RequestBody ServiceVehicleListDto dto){ R<List<XpVehicle>> serviceVehicleList = xpVehicleClient.getServiceVehicleList(dto); if(serviceVehicleList.getCode() != 200){ return R.fail(serviceVehicleList.getMsg()); } List<ServiceVehicleListVo> collect = serviceVehicleList.getData().stream().map(xpVehicle -> { ServiceVehicleListVo vo = new ServiceVehicleListVo(); vo.setVim(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<List<UserOrderListVo>> getUserOrderList(@RequestBody UserOrderListDto dto){ List<UserOrderListVo> 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<OrderInfoVo> getOrderDetail(@PathVariable Long orderId){ if(null == orderId){ return R.fail("订单ID不能为空"); } return R.ok(xpOrderService.getOrderInfo(orderId)); } } xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/dto/UserOrderListDto.java
New file @@ -0,0 +1,26 @@ package com.xiaopeng.order.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotNull; @Data @ApiModel public class UserOrderListDto { @ApiModelProperty("用户id") @NotNull(message = "用户id不能为空") private Long uid; @ApiModelProperty("订单id") private Long orderId; @ApiModelProperty("订单状态") private Integer orderStatus; @ApiModelProperty("页码") @NotNull(message = "页码不能为空") private Integer pageNo; @ApiModelProperty("每页数量") @NotNull(message = "每页数量不能为空") private Integer pageSize; } xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderService.java
@@ -14,6 +14,7 @@ import com.xiaopeng.api.vo.order.XpPointInfoVo; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.web.page.PageInfo; import com.xiaopeng.order.dto.UserOrderListDto; import com.xiaopeng.order.mangodb.model.OrderTrajectory; import com.xiaopeng.order.model.dto.XpOrderCommentDto; import com.xiaopeng.order.model.dto.XpOrderPayDto; @@ -24,6 +25,10 @@ import com.xiaopeng.order.model.vo.XpOrderHistoryVO; import com.xiaopeng.order.model.vo.XpOrderPageVO; import com.xiaopeng.order.vo.OrderDetailVo; import com.xiaopeng.order.vo.OrderInfoVo; import com.xiaopeng.order.vo.UserOrderListVo; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import java.math.BigDecimal; import java.util.List; @@ -242,4 +247,19 @@ */ Integer getWaitPayOrderNum(String uid); /** * 根据 UID 查询用户是否有 RT 订单 & 订单列表 * @param dto * @return */ List<UserOrderListVo> getUserOrderList(UserOrderListDto dto); /** * 获取订单信息 * @param orderId * @return */ OrderInfoVo getOrderInfo(Long orderId); } xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -7,6 +7,7 @@ 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.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.collect.ImmutableMap; @@ -68,6 +69,7 @@ import com.xiaopeng.common.security.utils.SecurityUtils; import com.xiaopeng.order.constant.I18nKeyConstant; import com.xiaopeng.order.dto.MileageDto; import com.xiaopeng.order.dto.UserOrderListDto; import com.xiaopeng.order.job.base.QuartzManager; import com.xiaopeng.order.job.base.TimeJobType; import com.xiaopeng.order.job.jobs.*; @@ -86,6 +88,8 @@ import com.xiaopeng.order.utils.*; import com.xiaopeng.order.utils.holiday.HolidayUtil; import com.xiaopeng.order.vo.OrderDetailVo; import com.xiaopeng.order.vo.OrderInfoVo; import com.xiaopeng.order.vo.UserOrderListVo; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.shardingsphere.transaction.annotation.ShardingSphereTransactionType; @@ -108,6 +112,7 @@ import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.time.*; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; @@ -3800,4 +3805,45 @@ ); return num.intValue(); } /** * 根据 UID 查询用户是否有 RT 订单 & 订单列表 * @param dto * @return */ @Override public List<UserOrderListVo> getUserOrderList(UserOrderListDto dto) { List<XpOrder> list = this.list(new QueryWrapper<XpOrder>().eq("app_user_id", dto.getUid()) .eq("is_deleted", 0) .eq(dto.getOrderStatus() != null, "status", dto.getOrderStatus()) .eq(dto.getOrderId() != null, "id", dto.getOrderId()) .last(" order by create_time desc limit " + dto.getPageNo() + "," + dto.getPageSize()) ); List<UserOrderListVo> collect = list.stream().map(order -> { UserOrderListVo vo = new UserOrderListVo(); vo.setOrderId(order.getId()); vo.setOrderStatus(order.getStatus()); vo.setOrderCreatedAt(order.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); XpPoint startPoint = xpPointClient.queryById(order.getStartPointId()).getData(); vo.setPickupAddress(null != startPoint ? startPoint.getPointAddress() : null); XpPoint endPoint = xpPointClient.queryById(order.getEndPointId()).getData(); vo.setDestAddress(null != endPoint ? endPoint.getPointAddress() : null); vo.setTotalPrice(order.getOrderMoney()); return vo; }).collect(Collectors.toList()); return collect; } /** * 获取订单详情 * @param orderId * @return */ @Override public OrderInfoVo getOrderInfo(Long orderId) { return null; } } xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/OrderInfoVo.java
New file @@ -0,0 +1,51 @@ package com.xiaopeng.order.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; @Data @ApiModel public class OrderInfoVo { @ApiModelProperty("订单id") private Long orderId; @ApiModelProperty("订单状态(0=已取消,1=待接单,2=待出发,3=接驾中,4=待客上车,5=乘客已上车,6=服务中,7=待客下车,8=待付款,9=待评价,10=已完成)") private Integer orderStatus; @ApiModelProperty("预约上车点") private String pickupAddress; @ApiModelProperty("预约目的地") private String destAddress; @ApiModelProperty("靠边停车点") private String pullOverAddress; @ApiModelProperty("预计到达时间") private String estimatedArrivalTime; @ApiModelProperty("实际到达时间") private String actualArrivalTime; @ApiModelProperty("实际行驶里程(浮点数,如 21.1)") private BigDecimal actualMileage; @ApiModelProperty("订单总价") private BigDecimal totalPrice; @ApiModelProperty("起步价") private BigDecimal startPrice; @ApiModelProperty("等待费") private BigDecimal waitFee; @ApiModelProperty("里程费") private BigDecimal mileageFee; @ApiModelProperty("时长费") private BigDecimal durationFee; @ApiModelProperty("远途费") private BigDecimal longDistanceFee; @ApiModelProperty("优惠券使用金额") private BigDecimal couponDiscount; @ApiModelProperty("实际支付费用") private BigDecimal actualPayment; @ApiModelProperty("接单车辆 VIN") private String vin; @ApiModelProperty("接单车辆车牌号") private String plateNumber; @ApiModelProperty("取消原因类型(用户取消/系统取消/超时取消,仅已取消订单)") private String cancelReasonType; } xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/ServiceOrderVo.java
New file @@ -0,0 +1,26 @@ package com.xiaopeng.order.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel public class ServiceOrderVo { /** * 订单id */ @ApiModelProperty("订单id") private Long orderId; /** * 客户手机号 */ @ApiModelProperty("客户手机号") private String customerPhone; /** * 是否有在途订单(布尔值) */ @ApiModelProperty("是否有在途订单(布尔值)") private Boolean hasActiveOrder; } xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/ServiceVehicleListVo.java
New file @@ -0,0 +1,15 @@ package com.xiaopeng.order.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel public class ServiceVehicleListVo { @ApiModelProperty("vim码") private String vim; @ApiModelProperty("车牌号") private String plateNumber; } xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/UserOrderListVo.java
New file @@ -0,0 +1,27 @@ package com.xiaopeng.order.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; @Data @ApiModel public class UserOrderListVo { @ApiModelProperty("订单id") private Long orderId; @ApiModelProperty("订单状态(0=已取消,1=待接单,2=待出发,3=接驾中,4=待客上车,5=乘客已上车,6=服务中,7=待客下车,8=待付款,9=待评价,10=已完成)") private Integer orderStatus; @ApiModelProperty("下单时间") private String orderCreatedAt; @ApiModelProperty("预约上车点") private String pickupAddress; @ApiModelProperty("预约目的地") private String destAddress; @ApiModelProperty("到达目的地时间") private String arrivedDestinationAt; @ApiModelProperty("支付金额") private BigDecimal totalPrice; } xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java
@@ -11,8 +11,10 @@ import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.mongodb.client.MongoCollection; import com.xiaopeng.api.dto.operation.VehiclePositionByVinDto; import com.xiaopeng.api.dto.vehicleConvoy.ServiceVehicleListDto; import com.xiaopeng.api.dto.vehicleConvoy.UpdateVehicleStateDto; import com.xiaopeng.api.dto.vehicleConvoy.VehicleTemperatureDto; import com.xiaopeng.api.feignClient.maintenance.*; @@ -1097,7 +1099,13 @@ public R<String> generateBluetoothUnlockToken(){ /** * 分页获取运营车辆列表 * @param dto * @return */ @PostMapping("/logan/inner/vehicle/getServiceVehicleList") public R<List<XpVehicle>> getServiceVehicleList(@RequestBody ServiceVehicleListDto dto){ return R.ok(xpVehicleService.getServiceVehicleList(dto)); } } xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/IXpVehicleService.java
@@ -1,6 +1,8 @@ package com.xiaopeng.vehicleConvoy.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.xiaopeng.api.dto.vehicleConvoy.ServiceVehicleListDto; import com.xiaopeng.api.dto.vehicleConvoy.VehicleTemperatureDto; import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; import com.xiaopeng.common.core.web.page.PageInfo; @@ -8,6 +10,7 @@ import com.xiaopeng.vehicleConvoy.model.importExcel.XpVehicleImportExcel; import com.xiaopeng.vehicleConvoy.model.query.*; import com.xiaopeng.vehicleConvoy.model.vo.XpVehicleVO; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import java.util.List; @@ -198,4 +201,12 @@ * @return */ Boolean getVehicleTrunkOpenStatus(String uid, Long id); /** * 分页获取运营车辆列表 * @param dto * @return */ List<XpVehicle> getServiceVehicleList(ServiceVehicleListDto dto); } xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java
@@ -5,12 +5,14 @@ import cn.hutool.core.lang.Validator; 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.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.collect.ImmutableMap; import com.xiaopeng.api.dto.pushMessage.SendMessageDTO; import com.xiaopeng.api.dto.vehicleConvoy.ServiceVehicleListDto; import com.xiaopeng.api.dto.vehicleConvoy.VehicleTemperatureDto; import com.xiaopeng.api.feignClient.automaticPilot.XpuVinClient; import com.xiaopeng.api.feignClient.map.AdcFencePushClient; @@ -1114,4 +1116,22 @@ return false; } } /** * 获取服务车辆列表 * @param dto * @return */ @Override public List<XpVehicle> getServiceVehicleList(ServiceVehicleListDto dto) { List<XpVehicle> list = this.list(new QueryWrapper<XpVehicle>().eq("vehicle_type", 2) .eq("status", 2).eq("operating_status", 1) .eq("is_deleted", 0).like(StringUtils.isNotBlank(dto.getPlateNumber()), "plate_number", dto.getPlateNumber()) .like(StringUtils.isNotBlank(dto.getVim()), "vehicle_vin", dto.getVim()) .last(" order by create_time desc limit " + dto.getPageNo() + "," + dto.getPageSize()) ); return list; } }