| | |
| | | import com.xiaopeng.api.feignClient.map.XpMapClient; |
| | | import com.xiaopeng.api.feignClient.operation.*; |
| | | import com.xiaopeng.api.feignClient.order.XpCruiseOrderClient; |
| | | import com.xiaopeng.api.feignClient.payFront.XpPayFrontClient; |
| | | import com.xiaopeng.api.feignClient.pushMessage.XpPushMessageClient; |
| | | import com.xiaopeng.api.feignClient.vehicleConvoy.*; |
| | | import com.xiaopeng.api.model.maintenance.XpTaskRule; |
| | |
| | | import com.xiaopeng.api.model.order.*; |
| | | import com.xiaopeng.api.model.vehicleConvoy.XpFleet; |
| | | import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; |
| | | import com.xiaopeng.api.query.order.InvoiceOrdersQuery; |
| | | import com.xiaopeng.api.query.order.XpOrderInvoiceQuery; |
| | | import com.xiaopeng.api.vo.OrderType; |
| | | import com.xiaopeng.api.vo.account.CalculateDiscountAmountVo; |
| | | import com.xiaopeng.api.vo.account.LoginUser; |
| | |
| | | import com.xiaopeng.api.vo.operation.RouteVo; |
| | | import com.xiaopeng.api.vo.order.*; |
| | | import com.xiaopeng.api.vo.order.FareBreakdownVo; |
| | | import com.xiaopeng.api.vo.payFront.CreditOrderCreateVo; |
| | | import com.xiaopeng.api.vo.payFront.CreditPaySignQueryVo; |
| | | import com.xiaopeng.api.vo.payFront.CreditPrecreateVo; |
| | | import com.xiaopeng.api.vo.vehicleConvoy.AddTaxiPassengerVo; |
| | | import com.xiaopeng.api.vo.vehicleConvoy.BluetoothDeliverVo; |
| | | import com.xiaopeng.api.vo.vehicleConvoy.CancelTaxiPassengerVo; |
| | |
| | | import com.xiaopeng.order.utils.*; |
| | | import com.xiaopeng.order.utils.holiday.HolidayUtil; |
| | | import com.xiaopeng.order.vo.*; |
| | | import com.xiaopeng.api.dto.order.UpdateInvoiceStatusDto; |
| | | import com.xiaopeng.api.dto.payFront.*; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.shardingsphere.transaction.annotation.ShardingSphereTransactionType; |
| | |
| | | */ |
| | | @Slf4j |
| | | @Service |
| | | @RequiredArgsConstructor |
| | | @RequiredArgsConstructor(onConstructor_ = @Lazy) |
| | | public class XpOrderServiceImpl extends ServiceImpl<XpOrderMapper, XpOrder> implements IXpOrderService { |
| | | |
| | | private static final String REASSIGN_CANCEL_CONTEXT_PREFIX = "REASSIGN_CANCEL_CONTEXT:"; |
| | |
| | | private final XpFleetClient xpFleetClient; |
| | | private final XpFleetVehicleClient xpFleetVehicleClient; |
| | | private final UserVehicleClient userVehicleClient; |
| | | private final IXpOrderEvaluateService xpOrderEvaluateService; |
| | | @Lazy |
| | | @Autowired |
| | | private IXpOrderEvaluateService xpOrderEvaluateService; |
| | | private final IXpOrderCancelService xpOrderCancelService; |
| | | private final IXpOrderReassignService xpOrderReassignService; |
| | | @Lazy |
| | | @Autowired |
| | | private IXpOrderReassignService xpOrderReassignService; |
| | | private final RedisService redisService; |
| | | private final XpPricingClient xpPricingClient; |
| | | private final XpSystemSettingClient xpSystemSettingClient; |
| | |
| | | private final XpPricingUtil xpPricingUtil; |
| | | private final GDMapGeocodingUtil gdMapGeocodingUtil; |
| | | private final VehicleBuriedPointClient vehicleBuriedPointClient; |
| | | private final IXpTestOrderService xpTestOrderService; |
| | | @Lazy |
| | | @Autowired |
| | | private IXpTestOrderService xpTestOrderService; |
| | | private final XpMapClient xpMapClient; |
| | | @Resource |
| | | private XpRoutePlanClient xpRoutePlanClient; |
| | |
| | | |
| | | @Resource |
| | | private TokenService tokenService; |
| | | |
| | | @Resource |
| | | private XpPayFrontClient xpPayFrontClient; |
| | | |
| | | @Value("${robotaxi.appId:xp_robotaxi_api}") |
| | | private String appid; |
| | |
| | | pushOrderDto.setEndPoiName(order.getEndPointName()); |
| | | pushOrderDto.setOrderType(OrderType.USER_ORDER); |
| | | pushOrderDto.setStage(1); |
| | | pushOrderDto.setLastOrderId("XU" + cruiseOrder.getId()); |
| | | pushOrderDto.setLastXpuTaskId(cruiseOrder.getXpuTaskId()); |
| | | if(null != cruiseOrder){ |
| | | pushOrderDto.setLastOrderId("XU" + cruiseOrder.getId()); |
| | | pushOrderDto.setLastXpuTaskId(cruiseOrder.getXpuTaskId()); |
| | | } |
| | | pushOrderDto.setTaskActionType(TaskActionType.kTerminateForNewTask); |
| | | // 调用推送服务 orderId + carVin |
| | | orderMissionClient.pushOrder(pushOrderDto); |
| | |
| | | pushOrderDto.setEndLongitude(returnOrder.getEndLon()); |
| | | pushOrderDto.setOrderType(OrderType.CRUISE_ORDER); |
| | | pushOrderDto.setStage(2); |
| | | pushOrderDto.setLastOrderId("XU" + lastCruise.getId()); |
| | | pushOrderDto.setLastXpuTaskId(lastCruise.getXpuTaskId()); |
| | | if(null != lastCruise){ |
| | | pushOrderDto.setLastOrderId("XU" + lastCruise.getId()); |
| | | pushOrderDto.setLastXpuTaskId(lastCruise.getXpuTaskId()); |
| | | } |
| | | pushOrderDto.setTaskActionType(TaskActionType.kTerminateForNewTask); |
| | | // 调用推送服务 orderId + carVin |
| | | orderMissionClient.pushOrder(pushOrderDto); |
| | |
| | | pushOrderDto.setEndLongitude(xpCruiseOrder.getEndLon()); |
| | | pushOrderDto.setOrderType(OrderType.CRUISE_ORDER); |
| | | pushOrderDto.setStage(2); |
| | | pushOrderDto.setLastOrderId(order.getId() + ""); |
| | | pushOrderDto.setLastXpuTaskId(order.getXpuEndTaskId()); |
| | | if(null != order){ |
| | | pushOrderDto.setLastOrderId(order.getId() + ""); |
| | | pushOrderDto.setLastXpuTaskId(order.getXpuEndTaskId()); |
| | | } |
| | | pushOrderDto.setTaskActionType(TaskActionType.kTerminateForNewTask); |
| | | orderMissionClient.pushOrder(pushOrderDto); |
| | | log.info("下发XUP巡游订单报文成功"); |
| | |
| | | pushOrderDto.setEndLongitude(xpCruiseOrder.getEndLon()); |
| | | pushOrderDto.setOrderType(OrderType.CRUISE_ORDER); |
| | | pushOrderDto.setStage(2); |
| | | pushOrderDto.setLastOrderId(order.getId() + ""); |
| | | pushOrderDto.setLastXpuTaskId(status < 5 ? order.getXpuStartTaskId() : order.getXpuEndTaskId()); |
| | | if(null != order){ |
| | | pushOrderDto.setLastOrderId(order.getId() + ""); |
| | | pushOrderDto.setLastXpuTaskId(status < 5 ? order.getXpuStartTaskId() : order.getXpuEndTaskId()); |
| | | } |
| | | pushOrderDto.setTaskActionType(status < 5 ? TaskActionType.kTerminateForNewTask : TaskActionType.kWaitPrevTaskFinish); |
| | | // 调用推送服务 orderId + carVin |
| | | log.info("开始推送XPU巡游订单 {}", xpCruiseOrder.getVehicleVin()); |
| | |
| | | |
| | | @Override |
| | | public R payment(XpOrderPayDto dto, String uid) { |
| | | |
| | | |
| | | HashMap<String, Object> resultMap = new HashMap<>(); |
| | | |
| | | // 1.0 免密 //查询是否开通免密 |
| | | // 1先查用户是否申请 申请了拿到通过的businessOrderId |
| | | // boolean signed = false; |
| | | // CreditPaySignQueryDto creditPaySignQueryDto = new CreditPaySignQueryDto(); |
| | | // creditPaySignQueryDto.setUid(Long.valueOf(uid)); |
| | | // creditPaySignQueryDto.setBusinessId("xp-robotaxi"); |
| | | // creditPaySignQueryDto.setCategory("009001"); |
| | | // creditPaySignQueryDto.setBusinessOrderId(""); |
| | | // R<CreditPaySignQueryVo> creditPaySignQueryVoR = xpPayFrontClient.queryCreditPaySign(creditPaySignQueryDto); |
| | | // if (creditPaySignQueryVoR.getCode()==200) { |
| | | // CreditPaySignQueryVo data = creditPaySignQueryVoR.getData(); |
| | | // // 查看是否有签约的 |
| | | // long count = data.getSignList().stream().filter(e -> e.getStatus().equals("VALID")).count(); |
| | | // if (count > 0){ |
| | | // signed = true; |
| | | // } |
| | | // } |
| | | // |
| | | // |
| | | // if(signed){ |
| | | // // y已签约 1.信用下单 |
| | | // CreditOrderCreateDto creditOrderCreateDto = new CreditOrderCreateDto(); |
| | | // creditOrderCreateDto.setUid(Long.valueOf(uid)); |
| | | // creditOrderCreateDto.setBusinessId("xp-robotaxi"); |
| | | // creditOrderCreateDto.setCategory("xp_robotaxi_api"); |
| | | // creditOrderCreateDto.setBusinessOrderId(""); |
| | | // creditOrderCreateDto.setSubject("009001"); |
| | | // creditOrderCreateDto.setPayType("13"); |
| | | // |
| | | // |
| | | // // 信用下单 |
| | | // ArrayList<CreditOrderCreateDto.PostPayment> postPayments = new ArrayList<>(1); |
| | | // CreditOrderCreateDto.PostPayment postPayment = new CreditOrderCreateDto.PostPayment(); |
| | | // postPayment.setName("收费标准"); |
| | | // postPayment.setDescription("行程价格动态浮动,具体详情可在费用详情或计价规则查看"); |
| | | // postPayments.add(postPayment); |
| | | // creditOrderCreateDto.setPostPayments(postPayments); |
| | | // R<CreditOrderCreateVo> creditOrderCreateVoR = xpPayFrontClient.createCreditOrder(creditOrderCreateDto); |
| | | // if(creditOrderCreateVoR.getCode()==200){ |
| | | // CreditOrderCreateVo data = creditOrderCreateVoR.getData(); |
| | | // resultMap.put("status", 1); |
| | | // resultMap.put("value", data); |
| | | // return R.ok(resultMap); |
| | | // } |
| | | // |
| | | // }else { |
| | | // |
| | | // // 未签约 |
| | | // // 调用预下单接口 |
| | | // XpOrder order = this.getById(dto.getOrderId()); |
| | | // CreditPrecreateDto creditPrecreateDto = new CreditPrecreateDto(); |
| | | // creditPrecreateDto.setUid(uid); |
| | | // creditPrecreateDto.setBizId("xp-robotaxi"); |
| | | // creditPrecreateDto.setBizOrderId(""); |
| | | // creditPrecreateDto.setPayScene(99); |
| | | // creditPrecreateDto.setAmount(order.getOrderMoney().multiply(new BigDecimal(100)).intValue()); |
| | | // creditPrecreateDto.setCategory("009001"); |
| | | // creditPrecreateDto.setTitle("信用下单"); |
| | | // creditPrecreateDto.setDetail("信用下单"); |
| | | // |
| | | // HashMap<String, String> businessExtend = new HashMap<>(); |
| | | // businessExtend.put("returnUrl", ""); |
| | | // businessExtend.put("notifyUrl", ""); |
| | | // creditPrecreateDto.setBusinessExtend(businessExtend); |
| | | // |
| | | // R<CreditPrecreateVo> creditPrecreateVoR = xpPayFrontClient.precreate(creditPrecreateDto); |
| | | // if (creditPrecreateVoR.getCode()==200) { |
| | | // CreditPrecreateVo data = creditPrecreateVoR.getData(); |
| | | // resultMap.put("status", 2); |
| | | // resultMap.put("value", data); |
| | | // return R.ok(resultMap); |
| | | // } |
| | | // } |
| | | |
| | | |
| | | |
| | | // mvp版本不做支付 使用优惠券抵扣为0元订单处理 处理订单状态即可 |
| | | XpOrder order = this.getById(dto.getOrderId()); |
| | | order.setStatus(9); |
| | |
| | | vo.setVin(vehicle.getVehicleVin()); |
| | | vo.setPassengerUid(order.getAppUserId()); |
| | | BaseVehicleUserDto deliver = bluetoothUnlockClient.deliver(vo); |
| | | if(null == deliver){ |
| | | throw new ServiceException("下发蓝牙token失败"); |
| | | } |
| | | if(deliver.getCode() != 0){ |
| | | log.error("下发蓝牙token失败:{} {}", deliver.getMsg(), order.getOrderNumber()); |
| | | throw new ServiceException(deliver.getMsg()); |
| | | } |
| | | // if(null == deliver){ |
| | | // throw new ServiceException("下发蓝牙token失败"); |
| | | // } |
| | | // if(deliver.getCode() != 0){ |
| | | // log.error("下发蓝牙token失败:{} {}", deliver.getMsg(), order.getOrderNumber()); |
| | | // throw new ServiceException(deliver.getMsg()); |
| | | // } |
| | | log.info("下发蓝牙token成功:{} {}", deliver.getData(), order.getOrderNumber()); |
| | | } |
| | | |
| | |
| | | XpOrder xpOrder = this.getById(orderId); |
| | | OrderInfoVo vo = new OrderInfoVo(); |
| | | vo.setOrderId(xpOrder.getId()); |
| | | vo.setOrderNumber(xpOrder.getOrderNumber()); |
| | | vo.setOrderStatus(xpOrder.getStatus()); |
| | | XpPoint startPoint = xpPointClient.queryById(xpOrder.getStartPointId()).getData(); |
| | | vo.setPickupAddress(startPoint.getPointAddress()); |
| | |
| | | vo.setRemoteTakeoverAt(""); |
| | | return vo; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 发票列表 |
| | | * @param query |
| | | * @return |
| | | */ |
| | | @Override |
| | | public List<XpInvoiceVo> invoiceList(XpOrderInvoiceQuery query) { |
| | | |
| | | // 格式:yyyyMM 转yyyy-MM |
| | | query.setStartTime(query.getStartTime().substring(0, 4) + "-" + query.getStartTime().substring(4, 6)); |
| | | query.setEndTime(query.getEndTime().substring(0, 4) + "-" + query.getEndTime().substring(4, 6)); |
| | | |
| | | List<XpOrder> list =null; |
| | | // 通过uid 和时间查出来数据 先判断是否传入了分页 |
| | | if (query.getPageNo()!=null && query.getPageSize()!=null) { |
| | | Page<XpOrder> page = new Page<>(query.getPageNo(), query.getPageSize()); |
| | | Page<XpOrder> orderPage = this.baseMapper.selectPage(page, new LambdaQueryWrapper<XpOrder>().eq(XpOrder::getAppUserId, Long.valueOf(query.getUid())).ge(XpOrder::getStatus, 9).between(BaseModel::getCreateTime, query.getStartTime(), query.getEndTime())); |
| | | list = orderPage.getRecords(); |
| | | }else { |
| | | list = this.baseMapper.selectList(new LambdaQueryWrapper<XpOrder>().eq(XpOrder::getAppUserId, Long.valueOf(query.getUid())).ge(XpOrder::getStatus, 9).between(BaseModel::getCreateTime, query.getStartTime(), query.getEndTime())); |
| | | } |
| | | |
| | | if(list.isEmpty()){ |
| | | return new ArrayList<>(); |
| | | } |
| | | |
| | | |
| | | ArrayList<XpInvoiceVo> xpInvoiceVoList = new ArrayList<>(list.size()); |
| | | |
| | | R<List<XpVehicle>> r = xpVehicleClient.listByIds(list.stream().map(XpOrder::getVehicleId).collect(Collectors.toList())); |
| | | List<XpVehicle> vehicleList = r.getData(); |
| | | |
| | | // 数据组装 |
| | | for (XpOrder xpOrder : list) { |
| | | XpInvoiceVo xpInvoiceVo = new XpInvoiceVo(); |
| | | xpInvoiceVo.setUid(xpOrder.getAppUserId().toString()); |
| | | xpInvoiceVo.setOrderNo(xpOrder.getOrderNumber()); |
| | | xpInvoiceVo.setOrderTotalAmount(xpOrder.getOrderMoney()); |
| | | xpInvoiceVo.setOrderDiscountAmount(xpOrder.getCouponMoney()); |
| | | xpInvoiceVo.setOrderFinishTime(String.valueOf(xpOrder.getTripEnd())); |
| | | xpInvoiceVo.setXpInvoiceFlag(true); |
| | | xpInvoiceVo.setInvoiceStatus(xpOrder.getInvoiceStatus()); |
| | | XpInvoiceVo.Itinerary itinerary = new XpInvoiceVo.Itinerary(); |
| | | // yyyy-MM-dd格式 |
| | | itinerary.setTripStartDate(xpOrder.getAcceptanceTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); |
| | | itinerary.setTripEndDate(xpOrder.getTripEnd().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); |
| | | |
| | | |
| | | XpVehicle xpVehicle = vehicleList.stream().filter(vehicle -> vehicle.getId().equals(xpOrder.getVehicleId())).findFirst().get(); |
| | | itinerary.setCarType(xpVehicle.getVehicleModel()); |
| | | itinerary.setTripStartDate(xpOrder.getBoardingTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); |
| | | |
| | | itinerary.setCity(xpOrder.getCityName()); |
| | | itinerary.setStartPoint(xpOrder.getStartAddress()); |
| | | itinerary.setEndPoint(xpOrder.getEndAddress()); |
| | | itinerary.setMileage(xpOrder.getMileageKilometers().toString()); |
| | | itinerary.setAmount(xpOrder.getOrderMoney()); |
| | | |
| | | xpInvoiceVo.setItinerary(itinerary); |
| | | xpInvoiceVoList.add(xpInvoiceVo); |
| | | } |
| | | return xpInvoiceVoList; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 查询发票订单 |
| | | * @param query |
| | | * @return |
| | | */ |
| | | @Override |
| | | public List<XpInvoiceVo> queryInvoiceOrders(InvoiceOrdersQuery query) { |
| | | if(query.getOrderNoList().isEmpty()){ |
| | | return Collections.emptyList(); |
| | | } |
| | | List<XpOrder> list = this.baseMapper.selectList(new LambdaQueryWrapper<XpOrder>().eq(XpOrder::getAppUserId, Long.valueOf(query.getUid())).ge(XpOrder::getStatus, 9).in(XpOrder::getOrderNumber, query.getOrderNoList())); |
| | | if(list.isEmpty()){ |
| | | return Collections.emptyList(); |
| | | } |
| | | |
| | | |
| | | ArrayList<XpInvoiceVo> xpInvoiceVoList = new ArrayList<>(list.size()); |
| | | |
| | | R<List<XpVehicle>> r = xpVehicleClient.listByIds(list.stream().map(XpOrder::getVehicleId).collect(Collectors.toList())); |
| | | List<XpVehicle> vehicleList = r.getData(); |
| | | |
| | | // 数据组装 |
| | | for (XpOrder xpOrder : list) { |
| | | XpInvoiceVo xpInvoiceVo = new XpInvoiceVo(); |
| | | xpInvoiceVo.setUid(xpOrder.getAppUserId().toString()); |
| | | xpInvoiceVo.setOrderNo(xpOrder.getOrderNumber()); |
| | | xpInvoiceVo.setOrderTotalAmount(xpOrder.getOrderMoney()); |
| | | xpInvoiceVo.setOrderDiscountAmount(xpOrder.getCouponMoney()); |
| | | xpInvoiceVo.setOrderFinishTime(String.valueOf(xpOrder.getTripEnd())); |
| | | xpInvoiceVo.setXpInvoiceFlag(true); |
| | | xpInvoiceVo.setInvoiceStatus(xpOrder.getInvoiceStatus()); |
| | | XpInvoiceVo.Itinerary itinerary = new XpInvoiceVo.Itinerary(); |
| | | // yyyy-MM-dd格式 |
| | | itinerary.setTripStartDate(xpOrder.getAcceptanceTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); |
| | | itinerary.setTripEndDate(xpOrder.getTripEnd().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); |
| | | |
| | | |
| | | XpVehicle xpVehicle = vehicleList.stream().filter(vehicle -> vehicle.getId().equals(xpOrder.getVehicleId())).findFirst().get(); |
| | | itinerary.setCarType(xpVehicle.getVehicleModel()); |
| | | itinerary.setTripStartDate(xpOrder.getBoardingTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); |
| | | |
| | | itinerary.setCity(xpOrder.getCityName()); |
| | | itinerary.setStartPoint(xpOrder.getStartAddress()); |
| | | itinerary.setEndPoint(xpOrder.getEndAddress()); |
| | | itinerary.setMileage(xpOrder.getMileageKilometers().toString()); |
| | | itinerary.setAmount(xpOrder.getOrderMoney()); |
| | | |
| | | xpInvoiceVo.setItinerary(itinerary); |
| | | xpInvoiceVoList.add(xpInvoiceVo); |
| | | } |
| | | return xpInvoiceVoList; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 修改发票状态 |
| | | * @param dto |
| | | */ |
| | | @Override |
| | | public void updateInvoiceStatus(UpdateInvoiceStatusDto dto) { |
| | | List<UpdateInvoiceStatusDto.Order> orderList = dto.getOrderList(); |
| | | if(!orderList.isEmpty()){ |
| | | List<String> orderNos = orderList.stream().map(UpdateInvoiceStatusDto.Order::getOrderNo).collect(Collectors.toList()); |
| | | List<XpOrder> xpOrders = this.baseMapper.selectList(new LambdaQueryWrapper<XpOrder>().in(XpOrder::getOrderNumber, orderNos)); |
| | | for (XpOrder xpOrder : xpOrders) { |
| | | UpdateInvoiceStatusDto.Order order = orderList.stream().filter(e -> e.getOrderNo().equals(xpOrder.getOrderNumber())).findFirst().orElse(null); |
| | | if(order!=null){ |
| | | xpOrder.setInvoiceStatus(order.getInvoiceStatus()); |
| | | xpOrder.setInvoiceId(dto.getRequestId()); |
| | | xpOrder.setAppUserId(null); |
| | | this.updateById(xpOrder); |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | } |
| | | } |