refactor(order): 重构订单创建和价格计算逻辑

- 修改订单服务中的券码使用逻辑,增加人脸 ID 参数
- 优化价格计算控制器和服务中的预览模式
- 更新券码使用记录,支持人脸 ID 记录
- 修复零金额订单的处理逻辑
- 优化日志输出级别和内容
This commit is contained in:
2025-09-16 17:21:30 +08:00
parent 7cfcc44531
commit 57266eb535
9 changed files with 27 additions and 25 deletions

View File

@@ -193,7 +193,7 @@ public class OrderServiceImpl implements IOrderService {
// 标记券码为已使用
try {
String remark = "订单使用,订单号:" + orderNo;
voucherService.markVoucherAsUsed(voucherInfo.getVoucherCode(), remark);
voucherService.markVoucherAsUsed(voucherInfo.getVoucherCode(), remark, String.valueOf(orderId), order.getDiscountAmount(), order.getFaceId());
log.info("券码状态更新成功: voucherCode={}, orderId={}",
voucherInfo.getVoucherCode(), orderNo);
} catch (Exception e) {

View File

@@ -28,7 +28,7 @@ public class PriceCalculationController {
@PostMapping("/calculate")
public ApiResponse<PriceCalculationResult> calculatePrice(@RequestBody PriceCalculationRequest request) {
log.info("价格计算请求: userId={}, products={}", request.getUserId(), request.getProducts().size());
request.setPreviewOnly(true);
PriceCalculationResult result = priceCalculationService.calculatePrice(request);
log.info("价格计算完成: originalAmount={}, finalAmount={}, usedCoupon={}",

View File

@@ -56,7 +56,7 @@ public class MobilePriceCalculationRequest {
request.setAutoUseCoupon(this.autoUseCoupon);
request.setVoucherCode(this.voucherCode);
request.setAutoUseVoucher(this.autoUseVoucher);
request.setPreviewOnly(this.previewOnly);
request.setPreviewOnly(true);
return request;
}
}

View File

@@ -27,14 +27,16 @@ public interface IVoucherService {
* @return 可用券码列表
*/
List<VoucherInfo> getAvailableVouchers(Long faceId, Long scenicId);
/**
* 标记券码为已使用
* @param voucherCode 券码
* @param remark 使用备注
* @param faceId 人脸ID
*/
void markVoucherAsUsed(String voucherCode, String remark);
void markVoucherAsUsed(String voucherCode, String remark, Long faceId);
void markVoucherAsUsed(String voucherCode, String remark, String orderId, BigDecimal discountAmount, Long faceId);
/**
* 检查用户是否可以在指定景区领取券码
* @param faceId 用户faceId

View File

@@ -387,7 +387,7 @@ public class PriceCalculationServiceImpl implements IPriceCalculationService {
// 标记券码为已使用
if (result.getUsedVoucher() != null && result.getUsedVoucher().getVoucherCode() != null) {
String remark = String.format("价格计算使用 - 订单金额: %s", result.getFinalAmount());
voucherService.markVoucherAsUsed(result.getUsedVoucher().getVoucherCode(), remark);
voucherService.markVoucherAsUsed(result.getUsedVoucher().getVoucherCode(), remark, request.getFaceId());
log.info("已标记券码为使用: {}", result.getUsedVoucher().getVoucherCode());
}

View File

@@ -217,7 +217,7 @@ public class VoucherDiscountProvider implements IDiscountProvider {
if (productConfig != null) {
if (!Boolean.TRUE.equals(productConfig.getCanUseVoucher())) {
log.debug("商品配置不允许使用券码: productType={}, productId={}",
log.info("商品配置不允许使用券码: productType={}, productId={}",
product.getProductType().getCode(), productId);
return false;
}

View File

@@ -20,11 +20,9 @@ import org.springframework.util.StringUtils;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.concurrent.TimeUnit;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
@@ -125,10 +123,10 @@ public class VoucherServiceImpl implements IVoucherService {
return voucherInfos;
}
@Override
public void markVoucherAsUsed(String voucherCode, String remark) {
markVoucherAsUsed(voucherCode, remark, null, null);
public void markVoucherAsUsed(String voucherCode, String remark, Long faceId) {
markVoucherAsUsed(voucherCode, remark, null, null, faceId);
}
/**
@@ -138,8 +136,10 @@ public class VoucherServiceImpl implements IVoucherService {
* @param remark 使用备注
* @param orderId 订单ID
* @param discountAmount 优惠金额
* @param faceId 人脸ID
*/
public void markVoucherAsUsed(String voucherCode, String remark, String orderId, BigDecimal discountAmount) {
@Override
public void markVoucherAsUsed(String voucherCode, String remark, String orderId, BigDecimal discountAmount, Long faceId) {
if (!StringUtils.hasText(voucherCode)) {
return;
}
@@ -162,7 +162,7 @@ public class VoucherServiceImpl implements IVoucherService {
PriceVoucherUsageRecord usageRecord = new PriceVoucherUsageRecord();
usageRecord.setVoucherCodeId(voucherCodeEntity.getId());
usageRecord.setVoucherCode(voucherCode);
usageRecord.setFaceId(voucherCodeEntity.getFaceId());
usageRecord.setFaceId(faceId != null ? faceId : voucherCodeEntity.getFaceId());
usageRecord.setScenicId(voucherCodeEntity.getScenicId());
usageRecord.setBatchId(voucherCodeEntity.getBatchId());
usageRecord.setUseTime(now);
@@ -198,8 +198,8 @@ public class VoucherServiceImpl implements IVoucherService {
// 更新批次统计(使用记录数,不是使用券码数)
voucherBatchConfigMapper.updateUsedCount(voucherCodeEntity.getBatchId(), 1);
log.info("券码使用记录已创建: code={}, useCount={}, maxUseCount={}",
voucherCode, currentUseCount, maxUseCount);
log.info("券码使用记录已创建: code={}, useCount={}, maxUseCount={}, faceId={}",
voucherCode, currentUseCount, maxUseCount, faceId);
}
@Override

View File

@@ -876,13 +876,12 @@ public class OrderServiceImpl implements OrderService {
MemberRespVO member = memberMapper.getById(userId);
order.setOpenId(member.getOpenId());
order.setScenicId(face.getScenicId());
order.setSlashPrice(cachedResult.getOriginalAmount());
order.setPrice(cachedResult.getFinalAmount());
// promo code
order.setPayPrice(cachedResult.getFinalAmount());
}
if (order.getPayPrice().equals(BigDecimal.ZERO)) {
order.setSlashPrice(cachedResult.getOriginalAmount());
order.setPrice(cachedResult.getFinalAmount());
// promo code
order.setPayPrice(cachedResult.getFinalAmount());
if (order.getPayPrice().compareTo(BigDecimal.ZERO) <= 0) {
order.setStatus(OrderStateEnum.PAID.getState());
order.setPayAt(new Date());
} else {
@@ -909,7 +908,7 @@ public class OrderServiceImpl implements OrderService {
if (cachedResult.getUsedVoucher() != null) {
order.setBrokerId(cachedResult.getUsedVoucher().getBrokerId());
order.setPromoCode(cachedResult.getUsedVoucher().getVoucherCode());
iVoucherService.markVoucherAsUsed(cachedResult.getUsedVoucher().getVoucherCode(), order.getId().toString());
iVoucherService.markVoucherAsUsed(cachedResult.getUsedVoucher().getVoucherCode(), "用户下单", order.getId().toString(), cachedResult.getUsedVoucher().getDiscountValue(), face.getId());
}
List<OrderItemEntity> orderItems = new ArrayList<>();
OrderItemEntity orderItem = new OrderItemEntity();
@@ -932,7 +931,7 @@ public class OrderServiceImpl implements OrderService {
OrderEntity order = orderMapper.get(orderId);
// 检查订单金额是否为0
if (order.getPayPrice() == null || order.getPayPrice().compareTo(BigDecimal.ZERO) == 0) {
if (order.getPayPrice() == null || order.getPayPrice().compareTo(BigDecimal.ZERO) <= 0) {
// 零金额订单:设置needPay为false,直接标记为已支付
order.setStatus(1); // 1表示已支付
order.setPayAt(new Date());

View File

@@ -224,6 +224,7 @@
coupon_price = #{couponPrice},
coupon_id = #{couponId},
coupon_record_id = #{couponRecordId},
price = #{price},
pay_price = `price` - `coupon_price`
where id = #{id}
</update>