车辆临时锁车

This commit is contained in:
yanglei 2026-02-25 17:10:24 +08:00
parent c434fc9321
commit 7c945c1efd
7 changed files with 126 additions and 0 deletions

View File

@ -4,6 +4,7 @@ import com.cdzy.common.enums.Code;
import com.cdzy.common.ex.EbikeException;
import com.cdzy.common.model.request.PageParam;
import com.cdzy.common.model.response.JsonResult;
import com.cdzy.user.model.dto.EbikeTempLockDto;
import com.cdzy.user.model.dto.EbikeUserCyclingDto;
import com.cdzy.user.model.dto.EbikeUserCyclingEndDto;
import com.cdzy.user.model.entity.EbikeOrder;
@ -184,4 +185,16 @@ public class EbikeOrderController {
ebikeOrderService.updateOrderAmount(paymentAmountDto);
return JsonResult.success();
}
/**
* 临时锁车
*
* @param tempLockDto 临时锁车参数
*/
@PostMapping("/tempLock")
public JsonResult<?> tempLock(@RequestBody @Validated EbikeTempLockDto tempLockDto) {
ebikeOrderService.tempLock(tempLockDto);
return JsonResult.success();
}
}

View File

@ -0,0 +1,21 @@
package com.cdzy.user.enums;
/**
* 锁车状态
*
* @author yanglei
* @since 2026-02-25 16:26
*/
public interface EbikeTempLockStatus {
/**
* 0-临时解锁
*/
int OPEN = 0;
/**
* 1-临时锁车
*/
int LOCK = 1;
}

View File

@ -0,0 +1,45 @@
package com.cdzy.user.model.dto;
import com.cdzy.user.handler.PointDeserializer;
import com.cdzy.user.handler.PointSerializer;
import com.cdzy.user.handler.PointTypeHandler;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.mybatisflex.annotation.Column;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.locationtech.jts.geom.Point;
/**
* @author yanglei
* @since 2026-02-25 16:02
*/
@Data
public class EbikeTempLockDto {
/**
* 锁车状态 0-开锁 1-临时锁车
*/
@NotNull(message = "开锁状态不能为空")
private Integer lockStatus;
/**
* 订单id
*/
@NotNull(message = "订单id不能为空")
private Long orderId;
/**
* 车辆编号
*/
@NotNull(message = "车辆编号不能为空")
private String bikeCode;
/**
* 当前位置
*/
@Column(typeHandler = PointTypeHandler.class)
@JsonSerialize(using = PointSerializer.class)
@JsonDeserialize(using = PointDeserializer.class)
private Point location;
}

View File

@ -195,4 +195,9 @@ public class EbikeOrder implements Serializable {
* 是否免费订单 true-免费 false-收费
*/
private Boolean isFreeOrder;
/**
* 临时锁车 0-未临时锁车 1-临时锁车
*/
private Integer tempLock;
}

View File

@ -1,6 +1,7 @@
package com.cdzy.user.service;
import com.cdzy.common.model.request.PageParam;
import com.cdzy.user.model.dto.EbikeTempLockDto;
import com.cdzy.user.model.dto.EbikeUserCyclingDto;
import com.cdzy.user.model.dto.EbikeUserCyclingEndDto;
import com.cdzy.user.model.entity.EbikeOrder;
@ -142,4 +143,11 @@ public interface EbikeOrderService extends IService<EbikeOrder> {
* @param paymentAmountDto 车辆编号
*/
void updateOrderAmount(FeignEbikePaymentAmountDto paymentAmountDto);
/**
* 临时锁车
*
* @param tempLockDto 临时锁车参数
*/
void tempLock(EbikeTempLockDto tempLockDto);
}

View File

@ -8,11 +8,13 @@ import com.cdzy.common.model.response.JsonResult;
import com.cdzy.user.enums.EbikeOrderDetailType;
import com.cdzy.user.enums.EbikePaymentMethod;
import com.cdzy.user.enums.EbikePaymentTradeStatus;
import com.cdzy.user.enums.EbikeTempLockStatus;
import com.cdzy.user.enums.OrderStatus;
import com.cdzy.user.enums.OrderType;
import com.cdzy.user.enums.TimeRangeEnum;
import com.cdzy.user.mapper.EbikeOrderMapper;
import com.cdzy.user.model.dto.EbikeCostDetailDto;
import com.cdzy.user.model.dto.EbikeTempLockDto;
import com.cdzy.user.model.dto.EbikeUserCyclingDto;
import com.cdzy.user.model.dto.EbikeUserCyclingEndDto;
import com.cdzy.user.model.entity.EbikeOrder;
@ -434,6 +436,36 @@ public class EbikeOrderServiceImpl extends ServiceImpl<EbikeOrderMapper, EbikeOr
ebikePaymentService.updateCostPrice(ebikeOrder.getOrderId(), paymentAmountDto.getPrice());
}
@Transactional
@Override
public void tempLock(EbikeTempLockDto tempLockDto) {
QueryWrapper queryWrapper = QueryWrapper.create()
.select(EBIKE_ORDER.ALL_COLUMNS)
.where(EBIKE_ORDER.ORDER_ID.eq(tempLockDto.getOrderId()));
EbikeOrder ebikeOrder = this.mapper.selectOneByQuery(queryWrapper);
// 临时锁车
if (tempLockDto.getLockStatus().equals(EbikeTempLockStatus.LOCK)) {
if (Objects.isNull(tempLockDto.getLocation())) {
throw new EbikeException("关锁时车辆位置不能为空");
}
EbikeLockVo ebikeLockVo = new EbikeLockVo();
ebikeLockVo.setBikeCode(tempLockDto.getBikeCode());
ebikeLockVo.setPoint(tempLockDto.getLocation());
JsonResult<FeignEbikeUserLockDto> jsonResult = operationsFeignClient.lock(ebikeLockVo);
if (jsonResult.getCode() != Code.SUCCESS) {
throw new EbikeException("临时关锁失败:" + jsonResult.getMessage());
}
} else if (tempLockDto.getLockStatus().equals(EbikeTempLockStatus.OPEN)) {
// 开锁
JsonResult<?> jsonResult = operationsFeignClient.openLock(tempLockDto.getBikeCode());
if (jsonResult.getCode() != Code.SUCCESS) {
throw new EbikeException("开锁失败:" + jsonResult.getMessage());
}
}
ebikeOrder.setTempLock(tempLockDto.getLockStatus());
this.mapper.update(ebikeOrder);
}
/**
* 计算增长率并格式化为百分比字符串
*

View File

@ -201,6 +201,7 @@ CREATE TABLE "public"."ebike_order" (
"helmet_management_fee" numeric(10,2),
"start_location" geometry(POINT, 4326),
"end_location" geometry(POINT, 4326),
"temp_lock" int2 DEFAULT 0 NOT NULL,
"create_by" int8,
"create_time" timestamp(6) DEFAULT CURRENT_TIMESTAMP,
"update_by" int8,
@ -232,6 +233,7 @@ COMMENT ON COLUMN "public"."ebike_order"."max_fee_amount" IS '封顶金额(元
COMMENT ON COLUMN "public"."ebike_order"."helmet_management_fee" IS '头盔管理费(元)';
COMMENT ON COLUMN "public"."ebike_order"."start_location" IS '骑行初始点';
COMMENT ON COLUMN "public"."ebike_order"."end_location" IS '骑行还车点';
COMMENT ON COLUMN "public"."ebike_order"."temp_lock" IS '临时锁车 0-未临时锁车 1-临时锁车';
COMMENT ON COLUMN "public"."ebike_order"."create_by" IS '创建人ID';
COMMENT ON COLUMN "public"."ebike_order"."create_time" IS '创建时间';
COMMENT ON COLUMN "public"."ebike_order"."update_by" IS '最后修改人ID';