增加驳回订单和换车接口

This commit is contained in:
2025-09-04 00:46:30 +08:00
parent f7bad9eedb
commit f076a65126
10 changed files with 304 additions and 11 deletions

View File

@ -15,7 +15,8 @@ public enum SubOrderTypeEnum {
RENTCAR("RENTCAR", "租车订单"),
RENTBATTEY("RENTBATTEY", "租电订单"),
OVERDUE("OVERDUE", "逾期订单"),
FD_DEPOSIT("FD_DEPOSIT", "退押金订单")
FD_DEPOSIT("FD_DEPOSIT", "退押金订单"),
FD_REJECT("FD_REJECT", "驳回退款订单")
;
private final String code;

View File

@ -36,12 +36,25 @@ public class StoreOrderController {
return Result.ok(orderService.pageStoreOrder(pageNo, pageSize, storeOrderQueryReq));
}
@ApiOperation(value = "驳回租车订单")
@PostMapping("/rejectRentOrder")
public Result<Boolean> rejectRentOrder(@RequestBody RejectOrderReq rejectOrderReq){
orderService.rejectRentOrder(rejectOrderReq);
return Result.ok(true);
}
@ApiOperation(value = "绑定车辆")
@PostMapping("/bindCarToOrder")
public Result<OrderDTO> bindCarToOrder(@RequestBody BindCarToOrderReq bindCarToOrderReq){
return Result.ok(orderService.bindCarToOrder(bindCarToOrderReq));
}
@ApiOperation(value = "更换车辆")
@PostMapping("/changeCarToOrder")
public Result<OrderDTO> changeCarToOrder(@RequestBody BindCarToOrderReq bindCarToOrderReq){
return Result.ok(orderService.changeCarToOrder(bindCarToOrderReq));
}
@ApiOperation(value = "确认还车")
@PostMapping("/confirmReturnCar")
public Result<OrderDTO> confirmReturnCar(@RequestBody ReturnCarReq returnCarReq){

View File

@ -0,0 +1,19 @@
package com.sczx.order.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Data;
@Builder
@ApiModel(value = "驳回订单请求")
@Data
public class RejectOrderReq {
@ApiModelProperty(value = "订单编号")
private String orderNo;
@ApiModelProperty(value = "驳回原因")
private String rejectReason;
}

View File

@ -0,0 +1,16 @@
package com.sczx.order.mapper;
import com.sczx.order.po.OrderCarChangePO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 订单车辆变更表 Mapper 接口
* </p>
*
* @author zhangli
* @since 2025-09-03 23:12:55
*/
public interface OrderCarChangeMapper extends BaseMapper<OrderCarChangePO> {
}

View File

@ -0,0 +1,65 @@
package com.sczx.order.po;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 订单车辆变更表
* </p>
*
* @author zhangli
* @since 2025-09-03 23:12:55
*/
@Getter
@Setter
@TableName("zc_order_car_change")
@ApiModel(value = "OrderCarChangePO对象", description = "订单车辆变更表")
public class OrderCarChangePO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("ID主键")
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@ApiModelProperty("关联的订单ID外键")
private Long orderId;
@ApiModelProperty("订单编号")
private String orderNo;
@ApiModelProperty("子订单编号")
private String orderSubNo;
@ApiModelProperty("原车辆ID")
private Long oldVehicleId;
@ApiModelProperty("原车车架号")
private String oldVehicleVin;
@ApiModelProperty("新车辆ID")
private Long newVehicleId;
@ApiModelProperty("新车车架号")
private String newVehicleVin;
@ApiModelProperty("删除标志0代表存在 2代表删除")
private String delFlag;
@ApiModelProperty("创建时间")
private LocalDateTime createTime;
@ApiModelProperty("更新时间")
private LocalDateTime updateTime;
}

View File

@ -0,0 +1,16 @@
package com.sczx.order.repository;
import com.sczx.order.po.OrderCarChangePO;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 订单车辆变更表 服务类
* </p>
*
* @author zhangli
* @since 2025-09-03 23:12:55
*/
public interface OrderCarChangeRepo extends IService<OrderCarChangePO> {
}

View File

@ -0,0 +1,20 @@
package com.sczx.order.repository.impl;
import com.sczx.order.po.OrderCarChangePO;
import com.sczx.order.mapper.OrderCarChangeMapper;
import com.sczx.order.repository.OrderCarChangeRepo;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 订单车辆变更表 服务实现类
* </p>
*
* @author zhangli
* @since 2025-09-03 23:12:55
*/
@Service
public class OrderCarChangeRepoImpl extends ServiceImpl<OrderCarChangeMapper, OrderCarChangePO> implements OrderCarChangeRepo {
}

View File

@ -71,7 +71,11 @@ public interface OrderService {
*/
OrderDetailDTO getCurrentNoEndOrder(Long customerId);
/**
* 驳回租车订单
* @param rejectOrderReq
*/
void rejectRentOrder(RejectOrderReq rejectOrderReq);
/**
* 绑定车辆到订单
@ -80,6 +84,13 @@ public interface OrderService {
*/
OrderDTO bindCarToOrder(BindCarToOrderReq bindCarToOrderReq);
/**
* 修改车辆到订单
* @param bindCarToOrderReq
* @return
*/
OrderDTO changeCarToOrder(BindCarToOrderReq bindCarToOrderReq);
/**
* 申请还车
* @param returnCarReq

View File

@ -11,14 +11,8 @@ import com.sczx.order.convert.OrderSubConvert;
import com.sczx.order.dto.*;
import com.sczx.order.exception.BizException;
import com.sczx.order.exception.InnerException;
import com.sczx.order.po.CarPO;
import com.sczx.order.po.OrderCarImgPO;
import com.sczx.order.po.OrderMainPO;
import com.sczx.order.po.OrderSubPO;
import com.sczx.order.repository.CarRepo;
import com.sczx.order.repository.OrderCarImgRepo;
import com.sczx.order.repository.OrderMainRepo;
import com.sczx.order.repository.OrderSubRepo;
import com.sczx.order.po.*;
import com.sczx.order.repository.*;
import com.sczx.order.service.OrderDistribService;
import com.sczx.order.service.OrderService;
import com.sczx.order.service.PayService;
@ -63,6 +57,9 @@ public class OrderServiceImpl implements OrderService {
@Autowired
private OrderSubRepo orderSubRepo;
@Autowired
private OrderCarChangeRepo orderCarChangeRepo;
@Autowired
private JwtUtil jwtUtil;
@ -730,6 +727,48 @@ public class OrderServiceImpl implements OrderService {
return getOrderDetailByOrderNo(orderMainPO.getOrderNo());
}
@Transactional(rollbackFor = Exception.class)
@Override
public void rejectRentOrder(RejectOrderReq rejectOrderReq) {
OrderMainPO orderMainPO = queryOrderMainPoByOrderNo(rejectOrderReq.getOrderNo(), "0");
if(!orderMainPO.getOrderStatus().equals(OrderStatusEnum.WAIT_PICK.getCode())){
throw new BizException("订单状态异常,非待取车状态,无法驳回");
}
SimpleUserInfoDTO userInfoDTO = jwtUtil.getUserInfoFromToken();
//获取租车子订单
LambdaQueryWrapper<OrderSubPO> orderSubWrapper = new LambdaQueryWrapper<>();
orderSubWrapper.eq(OrderSubPO::getOrderId, orderMainPO.getOrderId())
.eq(OrderSubPO::getDelFlag, "0")
.eq(OrderSubPO::getSuborderType, SubOrderTypeEnum.RENTCAR.getCode())
.eq(OrderSubPO::getPayStatus, PayStatusEnum.SUCCESS).last(" limit 1");
OrderSubPO orderSubPO = orderSubRepo.getOne(orderSubWrapper);
//异步退款订单
ThreadPoolUtils.getThreadPool().execute(() -> {
//变更订单状态,记录结束订单时间,记录订单备注
LambdaUpdateWrapper<OrderMainPO> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(OrderMainPO::getOrderStatus, OrderStatusEnum.MANUAL_END.getCode());
updateWrapper.set(OrderMainPO::getActEndRentTime, LocalDateTime.now());
updateWrapper.eq(OrderMainPO::getOrderNo, rejectOrderReq.getOrderNo());
orderMainRepo.update(updateWrapper);
if (Objects.nonNull(orderSubPO)) {
//退款调用成功则添加退款子订单
String outRefundNo = payService.refundOrder(orderSubPO.getPaymentMethod(), orderMainPO.getOperatorId(), orderSubPO.getPaymentId(), orderMainPO.getOrderAmount(), orderMainPO.getOrderAmount());
if (StringUtils.isNotBlank(outRefundNo)) {
OrderSubPO fdSubOrder = new OrderSubPO();
fdSubOrder.setOrderId(orderMainPO.getOrderId());
fdSubOrder.setSuborderNo(OrderUtil.generateSubOrderNo(OrderUtil.FD_PREFIX));
fdSubOrder.setSuborderType(SubOrderTypeEnum.FD_REJECT.getCode());
fdSubOrder.setAmount(orderMainPO.getOrderAmount());
fdSubOrder.setPaymentMethod(orderSubPO.getPaymentMethod());
fdSubOrder.setPayStatus(PayStatusEnum.REFUNDING.getCode());
fdSubOrder.setRefundId(outRefundNo);
fdSubOrder.setRemark(rejectOrderReq.getRejectReason());
orderSubRepo.save(fdSubOrder);
}
}
});
}
@Transactional(rollbackFor = Exception.class)
@Override
public OrderDTO bindCarToOrder(BindCarToOrderReq bindCarToOrderReq) {
@ -806,7 +845,7 @@ public class OrderServiceImpl implements OrderService {
return getOrderInfoByOrderNo(bindCarToOrderReq.getOrderNo());
} catch (Exception e){
log.warn("绑定车辆失败",e);
throw new InnerException("绑定车辆失败");
throw e;
} finally {
redisUtil.deleteRedisLock(redisLockKey);
}
@ -816,6 +855,94 @@ public class OrderServiceImpl implements OrderService {
}
}
@Override
public OrderDTO changeCarToOrder(BindCarToOrderReq bindCarToOrderReq) {
String redisLockKey = RedisKeyConstants.BIND_CAR_KEY + bindCarToOrderReq.getVin();
if(redisUtil.getRedisLock(redisLockKey, "变更车辆")) {
try {
CarDTO carDTO = carInteg.getCarByCarCondition(CarQueryConditionReq.builder().vin(bindCarToOrderReq.getVin()).build());
if(carDTO==null){
throw new BizException("车辆不存在");
}
if(!CarStatusEnum.NORMAL.getCode().equalsIgnoreCase(carDTO.getBrsStatus())){
throw new BizException("车辆已出租或已下架");
}
LambdaQueryWrapper<OrderMainPO> queryOrderWrapper = new LambdaQueryWrapper<>();
queryOrderWrapper.eq(OrderMainPO::getOrderNo, bindCarToOrderReq.getOrderNo());
OrderMainPO orderMainPO = orderMainRepo.getOne(queryOrderWrapper);
if(orderMainPO==null){
throw new BizException("订单不存在");
}
if(!orderMainPO.getOrderStatus().equals(OrderStatusEnum.RENT_ING.getCode())){
throw new BizException("订单非租车状态,不能变更车辆");
}
LambdaQueryWrapper<OrderSubPO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(OrderSubPO::getOrderId, orderMainPO.getOrderId())
.eq(OrderSubPO::getSuborderType, SubOrderTypeEnum.RENTCAR.getCode())
.isNotNull(OrderSubPO::getVinBatteryNo)
.orderByDesc(OrderSubPO::getCreatedAt)
.last(" limit 1");
OrderSubPO renOrderSubPO = orderSubRepo.getOne(queryWrapper);
if(renOrderSubPO==null){
throw new BizException("租车子订单不存在");
}
//变更车架号
LambdaUpdateWrapper<OrderSubPO> updateSubWrapper = new LambdaUpdateWrapper<>();
updateSubWrapper.set(OrderSubPO::getVinBatteryNo, carDTO.getVin());
updateSubWrapper.eq(OrderSubPO::getSuborderId, renOrderSubPO.getSuborderId());
orderSubRepo.update(updateSubWrapper);
//变更订单的关联车辆
LambdaUpdateWrapper<OrderMainPO> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(OrderMainPO::getVehicleId, carDTO.getId());
updateWrapper.eq(OrderMainPO::getOrderNo, bindCarToOrderReq.getOrderNo());
orderMainRepo.update(updateWrapper);
if(!CollectionUtils.isEmpty(bindCarToOrderReq.getImageList())){
//添加车辆图片
List<OrderCarImgPO> carImagePOList = new ArrayList<>();
for(OrderCarImgDTO image:bindCarToOrderReq.getImageList()){
OrderCarImgPO imgPO = new OrderCarImgPO();
imgPO.setOrderId(orderMainPO.getOrderId());
imgPO.setOrderNo(orderMainPO.getOrderNo());
imgPO.setImgType(image.getImgType());
imgPO.setImgUrl(image.getImgUrl());
carImagePOList.add(imgPO);
}
orderCarImgRepo.saveBatch(carImagePOList);
}
//变更车辆状态
LambdaUpdateWrapper<CarPO> carPOLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
carPOLambdaUpdateWrapper.eq(CarPO::getId, carDTO.getId())
.set(CarPO::getBrsStatus, CarStatusEnum.RENT_ING.getCode());
carRepo.update(carPOLambdaUpdateWrapper);
//记录变更记录
OrderCarChangePO orderCarChangePO = new OrderCarChangePO();
orderCarChangePO.setOrderId(orderMainPO.getOrderId());
orderCarChangePO.setOrderNo(orderMainPO.getOrderNo());
orderCarChangePO.setOrderSubNo(renOrderSubPO.getSuborderNo());
orderCarChangePO.setOldVehicleId(orderMainPO.getVehicleId());
orderCarChangePO.setOldVehicleVin(renOrderSubPO.getVinBatteryNo());
orderCarChangePO.setNewVehicleId(carDTO.getId());
orderCarChangePO.setNewVehicleVin(carDTO.getVin());
orderCarChangeRepo.save(orderCarChangePO);
return getOrderInfoByOrderNo(bindCarToOrderReq.getOrderNo());
} catch (Exception e){
log.warn("变更车辆失败",e);
throw e;
} finally {
redisUtil.deleteRedisLock(redisLockKey);
}
} else {
log.warn("变更车辆失败,锁已被占用");
throw new InnerException("服务器正在处理,请稍后再试");
}
}
@Override
public OrderDTO requestReturnCar(ReturnCarReq returnCarReq) {
LambdaUpdateWrapper<OrderMainPO> updateWrapper = new LambdaUpdateWrapper<>();

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sczx.order.mapper.OrderCarChangeMapper">
</mapper>