From 57266eb535105804de5fe60828c367064f04ecb2 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Tue, 16 Sep 2025 17:21:30 +0800 Subject: [PATCH] =?UTF-8?q?refactor(order):=20=E9=87=8D=E6=9E=84=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E5=88=9B=E5=BB=BA=E5=92=8C=E4=BB=B7=E6=A0=BC=E8=AE=A1?= =?UTF-8?q?=E7=AE=97=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改订单服务中的券码使用逻辑,增加人脸 ID 参数 - 优化价格计算控制器和服务中的预览模式 - 更新券码使用记录,支持人脸 ID 记录 - 修复零金额订单的处理逻辑 - 优化日志输出级别和内容 --- .../order/service/impl/OrderServiceImpl.java | 2 +- .../controller/PriceCalculationController.java | 2 +- .../dto/MobilePriceCalculationRequest.java | 2 +- .../basic/pricing/service/IVoucherService.java | 8 +++++--- .../impl/PriceCalculationServiceImpl.java | 2 +- .../service/impl/VoucherDiscountProvider.java | 2 +- .../service/impl/VoucherServiceImpl.java | 18 +++++++++--------- .../service/pc/impl/OrderServiceImpl.java | 15 +++++++-------- src/main/resources/mapper/OrderMapper.xml | 1 + 9 files changed, 27 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/ycwl/basic/order/service/impl/OrderServiceImpl.java b/src/main/java/com/ycwl/basic/order/service/impl/OrderServiceImpl.java index fa14b0af..11f83a7f 100644 --- a/src/main/java/com/ycwl/basic/order/service/impl/OrderServiceImpl.java +++ b/src/main/java/com/ycwl/basic/order/service/impl/OrderServiceImpl.java @@ -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) { diff --git a/src/main/java/com/ycwl/basic/pricing/controller/PriceCalculationController.java b/src/main/java/com/ycwl/basic/pricing/controller/PriceCalculationController.java index 8b4cd2eb..279d6b62 100644 --- a/src/main/java/com/ycwl/basic/pricing/controller/PriceCalculationController.java +++ b/src/main/java/com/ycwl/basic/pricing/controller/PriceCalculationController.java @@ -28,7 +28,7 @@ public class PriceCalculationController { @PostMapping("/calculate") public ApiResponse 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={}", diff --git a/src/main/java/com/ycwl/basic/pricing/dto/MobilePriceCalculationRequest.java b/src/main/java/com/ycwl/basic/pricing/dto/MobilePriceCalculationRequest.java index d7e49dd7..7d8642ed 100644 --- a/src/main/java/com/ycwl/basic/pricing/dto/MobilePriceCalculationRequest.java +++ b/src/main/java/com/ycwl/basic/pricing/dto/MobilePriceCalculationRequest.java @@ -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; } } \ No newline at end of file diff --git a/src/main/java/com/ycwl/basic/pricing/service/IVoucherService.java b/src/main/java/com/ycwl/basic/pricing/service/IVoucherService.java index ef0f4aa4..4f05658c 100644 --- a/src/main/java/com/ycwl/basic/pricing/service/IVoucherService.java +++ b/src/main/java/com/ycwl/basic/pricing/service/IVoucherService.java @@ -27,14 +27,16 @@ public interface IVoucherService { * @return 可用券码列表 */ List 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 diff --git a/src/main/java/com/ycwl/basic/pricing/service/impl/PriceCalculationServiceImpl.java b/src/main/java/com/ycwl/basic/pricing/service/impl/PriceCalculationServiceImpl.java index 9f64f6e7..cbfee913 100644 --- a/src/main/java/com/ycwl/basic/pricing/service/impl/PriceCalculationServiceImpl.java +++ b/src/main/java/com/ycwl/basic/pricing/service/impl/PriceCalculationServiceImpl.java @@ -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()); } diff --git a/src/main/java/com/ycwl/basic/pricing/service/impl/VoucherDiscountProvider.java b/src/main/java/com/ycwl/basic/pricing/service/impl/VoucherDiscountProvider.java index 250713ba..1e99002b 100644 --- a/src/main/java/com/ycwl/basic/pricing/service/impl/VoucherDiscountProvider.java +++ b/src/main/java/com/ycwl/basic/pricing/service/impl/VoucherDiscountProvider.java @@ -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; } diff --git a/src/main/java/com/ycwl/basic/pricing/service/impl/VoucherServiceImpl.java b/src/main/java/com/ycwl/basic/pricing/service/impl/VoucherServiceImpl.java index fb1a205f..98427849 100644 --- a/src/main/java/com/ycwl/basic/pricing/service/impl/VoucherServiceImpl.java +++ b/src/main/java/com/ycwl/basic/pricing/service/impl/VoucherServiceImpl.java @@ -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 diff --git a/src/main/java/com/ycwl/basic/service/pc/impl/OrderServiceImpl.java b/src/main/java/com/ycwl/basic/service/pc/impl/OrderServiceImpl.java index 7f4c04af..ca11d230 100644 --- a/src/main/java/com/ycwl/basic/service/pc/impl/OrderServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/pc/impl/OrderServiceImpl.java @@ -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 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()); diff --git a/src/main/resources/mapper/OrderMapper.xml b/src/main/resources/mapper/OrderMapper.xml index a62111cd..2e7778de 100644 --- a/src/main/resources/mapper/OrderMapper.xml +++ b/src/main/resources/mapper/OrderMapper.xml @@ -224,6 +224,7 @@ coupon_price = #{couponPrice}, coupon_id = #{couponId}, coupon_record_id = #{couponRecordId}, + price = #{price}, pay_price = `price` - `coupon_price` where id = #{id}