加载当前订单
需求
-
无论是司机端,还是乘客端,遇到页面切换,重新登录小程序等,只要回到首页面,查看当前是否有正在执行订单,如果有跳转到当前订单执行页面
-
之前这个接口已经开发,为了测试,临时跳过去,默认没有当前订单的
乘客端查找当前订单
@Operation(summary = "乘客端查找当前订单")
@GetMapping("/searchCustomerCurrentOrder/{customerId}")
public Result<CurrentOrderInfoVo> searchCustomerCurrentOrder(@PathVariable Long customerId) {
return Result.ok(orderInfoService.searchCustomerCurrentOrder(customerId));
}
//乘客端查找当前订单
@Override
public CurrentOrderInfoVo searchCustomerCurrentOrder(Long customerId) {
//封装条件
//乘客id
LambdaQueryWrapper<OrderInfo> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(OrderInfo::getCustomerId,customerId);
//各种状态
// 这些状态都表明该订单在执行中,所以要所有状态都查询
Integer[] statusArray = {
OrderStatus.ACCEPTED.getStatus(),
OrderStatus.DRIVER_ARRIVED.getStatus(),
OrderStatus.UPDATE_CART_INFO.getStatus(),
OrderStatus.START_SERVICE.getStatus(),
OrderStatus.END_SERVICE.getStatus(),
OrderStatus.UNPAID.getStatus()
};
wrapper.in(OrderInfo::getStatus,statusArray);
//获取最新一条记录
wrapper.orderByDesc(OrderInfo::getId);
wrapper.last(" limit 1");
//调用方法
OrderInfo orderInfo = orderInfoMapper.selectOne(wrapper);
//封装到CurrentOrderInfoVo
CurrentOrderInfoVo currentOrderInfoVo = new CurrentOrderInfoVo();
if(orderInfo != null) {
currentOrderInfoVo.setOrderId(orderInfo.getId());
currentOrderInfoVo.setStatus(orderInfo.getStatus());
currentOrderInfoVo.setIsHasCurrentOrder(true);
} else {
currentOrderInfoVo.setIsHasCurrentOrder(false);
}
return currentOrderInfoVo;
}
/**
* 乘客端查找当前订单
* @param customerId
* @return
*/
@GetMapping("/order/info/searchCustomerCurrentOrder/{customerId}")
Result<CurrentOrderInfoVo> searchCustomerCurrentOrder(@PathVariable("customerId") Long customerId);
@Operation(summary = "乘客端查找当前订单")
@GuiguLogin
@GetMapping("/searchCustomerCurrentOrder")
public Result<CurrentOrderInfoVo> searchCustomerCurrentOrder() {
Long customerId = AuthContextHolder.getUserId();
return Result.ok(orderService.searchCustomerCurrentOrder(customerId));
}
//乘客查找当前订单
@Override
public CurrentOrderInfoVo searchCustomerCurrentOrder(Long customerId) {
return orderInfoFeignClient.searchCustomerCurrentOrder(customerId).getData();
}
司机端查找当前订单
@Operation(summary = "司机端查找当前订单")
@GetMapping("/searchDriverCurrentOrder/{driverId}")
public Result<CurrentOrderInfoVo> searchDriverCurrentOrder(@PathVariable Long driverId) {
return Result.ok(orderInfoService.searchDriverCurrentOrder(driverId));
}
//司机端查找当前订单
@Override
public CurrentOrderInfoVo searchDriverCurrentOrder(Long driverId) {
//封装条件
LambdaQueryWrapper<OrderInfo> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(OrderInfo::getDriverId,driverId);
Integer[] statusArray = {
OrderStatus.ACCEPTED.getStatus(),
OrderStatus.DRIVER_ARRIVED.getStatus(),
OrderStatus.UPDATE_CART_INFO.getStatus(),
OrderStatus.START_SERVICE.getStatus(),
OrderStatus.END_SERVICE.getStatus()
};
wrapper.in(OrderInfo::getStatus,statusArray);
wrapper.orderByDesc(OrderInfo::getId);
wrapper.last(" limit 1");
OrderInfo orderInfo = orderInfoMapper.selectOne(wrapper);
//封装到vo
CurrentOrderInfoVo currentOrderInfoVo = new CurrentOrderInfoVo();
if(null != orderInfo) {
currentOrderInfoVo.setStatus(orderInfo.getStatus());
currentOrderInfoVo.setOrderId(orderInfo.getId());
currentOrderInfoVo.setIsHasCurrentOrder(true);
} else {
currentOrderInfoVo.setIsHasCurrentOrder(false);
}
return currentOrderInfoVo;
}
/**
* 司机端查找当前订单
* @param driverId
* @return
*/
@GetMapping("/order/info/searchDriverCurrentOrder/{driverId}")
Result<CurrentOrderInfoVo> searchDriverCurrentOrder(@PathVariable("driverId") Long driverId);
@Operation(summary = "司机端查找当前订单")
@GuiguLogin
@GetMapping("/searchDriverCurrentOrder")
public Result<CurrentOrderInfoVo> searchDriverCurrentOrder() {
Long driverId = AuthContextHolder.getUserId();
return Result.ok(orderService.searchDriverCurrentOrder(driverId));
}
@Override
public CurrentOrderInfoVo searchDriverCurrentOrder(Long driverId) {
return orderInfoFeignClient.searchDriverCurrentOrder(driverId).getData();
}
获取订单信息
进入首页,在有执行中订单的情况下,我们需要获取订单信息,才能知道页面跳转到那里去,因此现在把这个接口给实现了。
- 订单的各个状态,获取的订单信息不一样,当前我们只是获取订单基本信息,后续完善
@Operation(summary = "根据订单id获取订单信息")
@GetMapping("/getOrderInfo/{orderId}")
public Result<OrderInfo> getOrderInfo(@PathVariable Long orderId) {
return Result.ok(orderInfoService.getById(orderId));
}
/**
* 远程调用
* 根据订单id获取订单信息
* @param orderId
* @return
*/
@GetMapping("/order/info/getOrderInfo/{orderId}")
Result<OrderInfo> getOrderInfo(@PathVariable("orderId") Long orderId);
// 乘客端web接口
@Operation(summary = "获取订单信息")
@GuiguLogin
@GetMapping("/getOrderInfo/{orderId}")
public Result<OrderInfoVo> getOrderInfo(@PathVariable Long orderId) {
Long customerId = AuthContextHolder.getUserId();
return Result.ok(orderService.getOrderInfo(orderId, customerId));
}
@Override
public OrderInfoVo getOrderInfo(Long orderId, Long customerId) {
OrderInfo orderInfo = orderInfoFeignClient.getOrderInfo(orderId).getData();
//判断
if(orderInfo.getCustomerId() != customerId) {
throw new GuiguException(ResultCodeEnum.ILLEGAL_REQUEST);
}
OrderInfoVo orderInfoVo = new OrderInfoVo();
orderInfoVo.setOrderId(orderId);
BeanUtils.copyProperties(orderInfo,orderInfoVo);
return orderInfoVo;
}
// 司机端web接口
@Operation(summary = "获取订单账单详细信息")
@GuiguLogin
@GetMapping("/getOrderInfo/{orderId}")
public Result<OrderInfoVo> getOrderInfo(@PathVariable Long orderId) {
Long driverId = AuthContextHolder.getUserId();
return Result.ok(orderService.getOrderInfo(orderId, driverId));
}
@Override
public OrderInfoVo getOrderInfo(Long orderId, Long driverId) {
OrderInfo orderInfo = orderInfoFeignClient.getOrderInfo(orderId).getData();
if(orderInfo.getDriverId() != driverId) {
throw new GuiguException(ResultCodeEnum.ILLEGAL_REQUEST);
}
OrderInfoVo orderInfoVo = new OrderInfoVo();
orderInfoVo.setOrderId(orderId);
BeanUtils.copyProperties(orderInfo,orderInfoVo);
return orderInfoVo;
}
司乘同显
- 司机抢单成功后要赶往上车点,我们要计算司机赶往上车点的最佳线路,司机端与乘客端都要显示司机乘同显,这样乘客就能实时看见司机的动向。
司机端司乘同显
- 司机所在地址司乘同显开始位置,代驾地址就是司乘同显终点
- 计算司机司乘同显最佳路线
@Operation(summary = "计算最佳驾驶线路")
@GuiguLogin
@PostMapping("/calculateDrivingLine")
public Result<DrivingLineVo> calculateDrivingLine(@RequestBody CalculateDrivingLineForm calculateDrivingLineForm) {
return Result.ok(orderService.calculateDrivingLine(calculateDrivingLineForm));
}
//计算最佳驾驶线路
@Override
public DrivingLineVo calculateDrivingLine(CalculateDrivingLineForm calculateDrivingLineForm) {
return mapFeignClient.calculateDrivingLine(calculateDrivingLineForm).getData();
}
更新位置到Redis里面
- 司机要赶往代驾地址,实时更新司机当前最新位置(经纬度)到Redis里面
- 乘客看到司机的动向,司机端更新,乘客端获取
@Operation(summary = "司机赶往代驾起始点:更新订单地址到缓存")
@PostMapping("/updateOrderLocationToCache")
public Result<Boolean> updateOrderLocationToCache(@RequestBody UpdateOrderLocationForm updateOrderLocationForm) {
return Result.ok(locationService.updateOrderLocationToCache(updateOrderLocationForm));
}
//司机赶往代驾起始点:更新订单地址到缓存
@Override
public Boolean updateOrderLocationToCache(UpdateOrderLocationForm updateOrderLocationForm) {
OrderLocationVo orderLocationVo = new OrderLocationVo();
orderLocationVo.setLongitude(updateOrderLocationForm.getLongitude());
orderLocationVo.setLatitude(updateOrderLocationForm.getLatitude());
String key = RedisConstant.UPDATE_ORDER_LOCATION + updateOrderLocationForm.getOrderId();
redisTemplate.opsForValue().set(key,orderLocationVo);
return true;
}
/**
* 司机赶往代驾起始点:更新订单地址到缓存
* @param updateOrderLocationForm
* @return
*/
@PostMapping("/map/location/updateOrderLocationToCache")
Result<Boolean> updateOrderLocationToCache(@RequestBody UpdateOrderLocationForm updateOrderLocationForm);
@Operation(summary = "司机赶往代驾起始点:更新订单位置到Redis缓存")
@GuiguLogin
@PostMapping("/updateOrderLocationToCache")
public Result updateOrderLocationToCache(@RequestBody UpdateOrderLocationForm updateOrderLocationForm) {
return Result.ok(locationService.updateOrderLocationToCache(updateOrderLocationForm));
}
@Override
public Boolean updateOrderLocationToCache(UpdateOrderLocationForm updateOrderLocationForm) {
return locationFeignClient.updateOrderLocationToCache(updateOrderLocationForm).getData();
}
获取司机基本信息
- 乘客进入司乘同显页面,需要加载司机基本信息,司机姓名,头像等信息
@Operation(summary = "获取司机基本信息")
@GetMapping("/getDriverInfo/{driverId}")
public Result<DriverInfoVo> getDriverInfoOrder(@PathVariable Long driverId) {
return Result.ok(driverInfoService.getDriverInfoOrder(driverId));
}
//获取司机基本信息
@Override
public DriverInfoVo getDriverInfoOrder(Long driverId) {
//司机id获取基本信息
DriverInfo driverInfo = driverInfoMapper.selectById(driverId);
//封装DriverInfoVo
DriverInfoVo driverInfoVo = new DriverInfoVo();
BeanUtils.copyProperties(driverInfo,driverInfoVo);
//计算驾龄
//获取当前年
int currentYear = new DateTime().getYear();
//获取驾驶证初次领证日期
//driver_license_issue_date
int firstYear = new DateTime(driverInfo.getDriverLicenseIssueDate()).getYear();
int driverLicenseAge = currentYear - firstYear;
driverInfoVo.setDriverLicenseAge(driverLicenseAge);
return driverInfoVo;
}
/**
* 获取司机基本信息
* @param driverId
* @return
*/
@GetMapping("/driver/info/getDriverInfo/{driverId}")
Result<DriverInfoVo> getDriverInfo(@PathVariable("driverId") Long driverId);
@Operation(summary = "根据订单id获取司机基本信息")
@GuiguLogin
@GetMapping("/getDriverInfo/{orderId}")
public Result<DriverInfoVo> getDriverInfo(@PathVariable Long orderId) {
Long customerId = AuthContextHolder.getUserId();
return Result.ok(orderService.getDriverInfo(orderId, customerId));
}
@Override
public DriverInfoVo getDriverInfo(Long orderId, Long customerId) {
//根据订单id获取订单信息
OrderInfo orderInfo = orderInfoFeignClient.getOrderInfo(orderId).getData();
if(orderInfo.getCustomerId() != customerId) {
throw new GuiguException(ResultCodeEnum.DATA_ERROR);
}
return driverInfoFeignClient.getDriverInfo(orderInfo.getDriverId()).getData();
}
乘客端获取司机经纬度位置
@Operation(summary = "司机赶往代驾起始点:获取订单经纬度位置")
@GetMapping("/getCacheOrderLocation/{orderId}")
public Result<OrderLocationVo> getCacheOrderLocation(@PathVariable Long orderId) {
return Result.ok(locationService.getCacheOrderLocation(orderId));
}
@Override
public OrderLocationVo getCacheOrderLocation(Long orderId) {
String key = RedisConstant.UPDATE_ORDER_LOCATION + orderId;
OrderLocationVo orderLocationVo = (OrderLocationVo)redisTemplate.opsForValue().get(key);
return orderLocationVo;
}
/**
* 司机赶往代驾起始点:获取订单经纬度位置
* @param orderId
* @return
*/
@GetMapping("/map/location/getCacheOrderLocation/{orderId}")
Result<OrderLocationVo> getCacheOrderLocation(@PathVariable("orderId") Long orderId);
@Operation(summary = "司机赶往代驾起始点:获取订单经纬度位置")
@GetMapping("/getCacheOrderLocation/{orderId}")
public Result<OrderLocationVo> getCacheOrderLocation(@PathVariable Long orderId) {
return Result.ok(locationService.getCacheOrderLocation(orderId));
}
@Override
public OrderLocationVo getCacheOrderLocation(Long orderId) {
return locationFeignClient.getCacheOrderLocation(orderId).getData();
}
@Operation(summary = "计算最佳驾驶线路")
@GuiguLogin
@PostMapping("/calculateDrivingLine")
public Result<DrivingLineVo> calculateDrivingLine(@RequestBody CalculateDrivingLineForm calculateDrivingLineForm) {
return Result.ok(orderService.calculateDrivingLine(calculateDrivingLineForm));
}
@Override
public DrivingLineVo calculateDrivingLine(CalculateDrivingLineForm calculateDrivingLineForm) {
return mapFeignClient.calculateDrivingLine(calculateDrivingLineForm).getData();
}
司机到达起始点
- 司机到达代驾起始点之后,更新当前代驾订单数据
- 更新订单状态:司机到达
- 更新订单到达时间
@Operation(summary = "司机到达起始点")
@GetMapping("/driverArriveStartLocation/{orderId}/{driverId}")
public Result<Boolean> driverArriveStartLocation(@PathVariable Long orderId, @PathVariable Long driverId) {
return Result.ok(orderInfoService.driverArriveStartLocation(orderId, driverId));
}
//司机到达起始点
@Override
public Boolean driverArriveStartLocation(Long orderId, Long driverId) {
// 更新订单状态和到达时间,条件:orderId + driverId
LambdaQueryWrapper<OrderInfo> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(OrderInfo::getId,orderId);
wrapper.eq(OrderInfo::getDriverId,driverId);
OrderInfo orderInfo = new OrderInfo();
orderInfo.setStatus(OrderStatus.DRIVER_ARRIVED.getStatus());
orderInfo.setArriveTime(new Date());
int rows = orderInfoMapper.update(orderInfo, wrapper);
if(rows == 1) {
return true;
} else {
throw new GuiguException(ResultCodeEnum.UPDATE_ERROR);
}
}
/**
* 司机到达起始点
* @param orderId
* @param driverId
* @return
*/
@GetMapping("/order/info/driverArriveStartLocation/{orderId}/{driverId}")
Result<Boolean> driverArriveStartLocation(@PathVariable("orderId") Long orderId, @PathVariable("driverId") Long driverId);
@Operation(summary = "司机到达代驾起始地点")
@GuiguLogin
@GetMapping("/driverArriveStartLocation/{orderId}")
public Result<Boolean> driverArriveStartLocation(@PathVariable Long orderId) {
Long driverId = AuthContextHolder.getUserId();
return Result.ok(orderService.driverArriveStartLocation(orderId, driverId));
}
//司机到达代驾起始地点
@Override
public Boolean driverArriveStartLocation(Long orderId, Long driverId) {
return orderInfoFeignClient.driverArriveStartLocation(orderId,driverId).getData();
}
司机更新代驾车辆信息
司机到达代驾起始点,联系了乘客,见到了代驾车辆,要拍照与录入车辆信息
@Operation(summary = "更新代驾车辆信息")
@PostMapping("/updateOrderCart")
public Result<Boolean> updateOrderCart(@RequestBody UpdateOrderCartForm updateOrderCartForm) {
return Result.ok(orderInfoService.updateOrderCart(updateOrderCartForm));
}
Boolean updateOrderCart(UpdateOrderCartForm updateOrderCartForm);
@Transactional(rollbackFor = Exception.class)
@Override
public Boolean updateOrderCart(UpdateOrderCartForm updateOrderCartForm) {
LambdaQueryWrapper<OrderInfo> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(OrderInfo::getId, updateOrderCartForm.getOrderId());
queryWrapper.eq(OrderInfo::getDriverId, updateOrderCartForm.getDriverId());
OrderInfo updateOrderInfo = new OrderInfo();
BeanUtils.copyProperties(updateOrderCartForm, updateOrderInfo);
updateOrderInfo.setStatus(OrderStatus.UPDATE_CART_INFO.getStatus());
//只能更新自己的订单
int row = orderInfoMapper.update(updateOrderInfo, queryWrapper);
if(row == 1) {
//记录日志
this.log(updateOrderCartForm.getOrderId(), OrderStatus.UPDATE_CART_INFO.getStatus());
} else {
throw new GuiguException(ResultCodeEnum.UPDATE_ERROR);
}
return true;
}
/**
* 更新代驾车辆信息
* @param updateOrderCartForm
* @return
*/
@PostMapping("/order/info//updateOrderCart")
Result<Boolean> updateOrderCart(@RequestBody UpdateOrderCartForm updateOrderCartForm);
@Operation(summary = "更新代驾车辆信息")
@GuiguLogin
@PostMapping("/updateOrderCart")
public Result<Boolean> updateOrderCart(@RequestBody UpdateOrderCartForm updateOrderCartForm) {
Long driverId = AuthContextHolder.getUserId();
updateOrderCartForm.setDriverId(driverId);
return Result.ok(orderService.updateOrderCart(updateOrderCartForm));
}
@Override
public Boolean updateOrderCart(UpdateOrderCartForm updateOrderCartForm) {
return orderInfoFeignClient.updateOrderCart(updateOrderCartForm).getData();
}
公司只有一个总的理想,员工不能要求公司去实现你的理想,你必须适应这个总的理想,参加主力部队作战,发挥你的作用。我们的主航道不会变化,你们与大学合作的面宽一点,到2012实验室的时候窄一点,到产品研发更是窄窄的,要有长期性的清晰指标。
https://baijiahao.baidu.com/s?id=1760664270073856317&wfr=spider&for=pc
擦亮花火、共创未来——任正非在“难题揭榜”花火奖座谈会上的讲话
任正非