You've already forked FrameTour-BE
refactor(order): 重构订单创建和价格计算逻辑
- 修改订单服务中的券码使用逻辑,增加人脸 ID 参数 - 优化价格计算控制器和服务中的预览模式 - 更新券码使用记录,支持人脸 ID 记录 - 修复零金额订单的处理逻辑 - 优化日志输出级别和内容
This commit is contained in:
@@ -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) {
|
||||
|
@@ -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={}",
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -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
|
||||
|
@@ -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());
|
||||
}
|
||||
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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
|
||||
|
@@ -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());
|
||||
|
@@ -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>
|
||||
|
Reference in New Issue
Block a user