优化商品下单业务、水票解冻业务

This commit is contained in:
2026-05-09 14:56:53 +08:00
parent c6cec21d12
commit bc88f54c24
3 changed files with 33 additions and 36 deletions

View File

@@ -4,18 +4,19 @@ import com.gxwebsoft.common.core.annotation.IgnoreTenant;
import com.gxwebsoft.glt.service.GltUserTicketAutoReleaseService; import com.gxwebsoft.glt.service.GltUserTicketAutoReleaseService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
/** /**
* 冻结水票自动释放任务: * 冻结水票自动释放任务:每月1日凌晨1-3点每2分钟执行一次任务
* - 扫描 glt_user_ticket_release 中到期且待释放status=0的记录 * - 扫描 glt_user_ticket_release 中本月到期且待释放status=0的记录
* - 释放成功:frozen -> available并将 release.status 置为 1 * - 释放成功:
* 1.修改水票释放任务为已释放状态 glt_user_ticket_release
* 2.修改个人水票中:可用数量、冻结数量、已释放数量 glt_user_ticket
* 3.同步生产水票释放记录数据 glt_user_ticket_log
*/ */
@Slf4j @Slf4j
@Component @Component

View File

@@ -5,42 +5,41 @@ import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.gxwebsoft.common.core.config.ConfigProperties;
import com.gxwebsoft.common.core.config.CertificateProperties; import com.gxwebsoft.common.core.config.CertificateProperties;
import com.gxwebsoft.common.core.utils.RedisUtil; import com.gxwebsoft.common.core.config.ConfigProperties;
import com.gxwebsoft.common.core.utils.CertificateLoader; import com.gxwebsoft.common.core.utils.CertificateLoader;
import com.gxwebsoft.common.core.utils.RedisUtil;
import com.gxwebsoft.common.core.utils.WechatCertAutoConfig; import com.gxwebsoft.common.core.utils.WechatCertAutoConfig;
import com.gxwebsoft.common.core.utils.WechatPayConfigValidator; import com.gxwebsoft.common.core.utils.WechatPayConfigValidator;
import com.gxwebsoft.common.core.web.ApiResult;
import com.gxwebsoft.common.core.web.BaseController; import com.gxwebsoft.common.core.web.BaseController;
import com.gxwebsoft.common.core.web.BatchParam;
import com.gxwebsoft.common.core.web.PageResult;
import com.gxwebsoft.common.system.entity.Payment; import com.gxwebsoft.common.system.entity.Payment;
import com.gxwebsoft.common.system.entity.User;
import com.gxwebsoft.glt.service.GltTicketIssueService; import com.gxwebsoft.glt.service.GltTicketIssueService;
import com.gxwebsoft.shop.dto.*;
import com.gxwebsoft.shop.entity.ShopOrderDelivery;
import com.gxwebsoft.shop.entity.ShopUserAddress;
import com.gxwebsoft.shop.service.*;
import com.gxwebsoft.glt.service.GltTicketRevokeService; import com.gxwebsoft.glt.service.GltTicketRevokeService;
import com.gxwebsoft.shop.service.impl.KuaiDi100Impl;
import com.gxwebsoft.shop.task.OrderAutoCancelTask;
import com.gxwebsoft.shop.entity.ShopOrder;
import com.gxwebsoft.shop.param.ShopOrderParam;
import com.gxwebsoft.payment.service.PaymentService;
import com.gxwebsoft.payment.dto.PaymentResponse; import com.gxwebsoft.payment.dto.PaymentResponse;
import com.gxwebsoft.payment.enums.PaymentType; import com.gxwebsoft.payment.enums.PaymentType;
import com.gxwebsoft.common.core.web.ApiResult; import com.gxwebsoft.payment.service.PaymentService;
import com.gxwebsoft.common.core.web.PageResult; import com.gxwebsoft.shop.dto.*;
import com.gxwebsoft.common.core.web.BatchParam; import com.gxwebsoft.shop.entity.ShopOrder;
import com.gxwebsoft.common.system.entity.User; import com.gxwebsoft.shop.entity.ShopOrderDelivery;
import com.gxwebsoft.shop.entity.ShopUserAddress;
import com.gxwebsoft.shop.param.ShopOrderParam;
import com.gxwebsoft.shop.service.*;
import com.gxwebsoft.shop.service.impl.KuaiDi100Impl;
import com.gxwebsoft.shop.task.OrderAutoCancelTask;
import com.wechat.pay.java.core.RSAAutoCertificateConfig;
import com.wechat.pay.java.core.notification.NotificationConfig; import com.wechat.pay.java.core.notification.NotificationConfig;
import com.wechat.pay.java.core.notification.NotificationParser; import com.wechat.pay.java.core.notification.NotificationParser;
import com.wechat.pay.java.core.notification.RequestParam; import com.wechat.pay.java.core.notification.RequestParam;
import com.wechat.pay.java.core.RSAAutoCertificateConfig;
import com.wechat.pay.java.service.payments.model.Transaction; import com.wechat.pay.java.service.payments.model.Transaction;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springdoc.api.annotations.ParameterObject;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;

View File

@@ -86,41 +86,38 @@ public class OrderBusinessService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Map<String, String> createOrder(OrderCreateRequest request, User loginUser) { public Map<String, String> createOrder(OrderCreateRequest request, User loginUser) {
// 1. 参数校验 //1. 参数校验
validateOrderRequest(request, loginUser); validateOrderRequest(request, loginUser);
// 2. 构建订单对象 //2. 构建订单对象
ShopOrder shopOrder = buildShopOrder(request, loginUser); ShopOrder shopOrder = buildShopOrder(request, loginUser);
// 3. 处理收货地址信息 //3. 处理收货地址信息
processDeliveryAddress(shopOrder, request, loginUser); processDeliveryAddress(shopOrder, request, loginUser);
// 3.1 下单时校验配送范围(电子围栏) //4. 下单时校验配送范围(电子围栏)
validateDeliveryFenceIfNeeded(shopOrder, loginUser); validateDeliveryFenceIfNeeded(shopOrder, loginUser);
// 4. 应用业务规则 //5.如果商品仅有一个则更新formId
applyBusinessRules(shopOrder, loginUser);
// 如果商品仅有一个则更新formId
if (request.getGoodsItems().size() == 1) { if (request.getGoodsItems().size() == 1) {
shopOrder.setFormId(request.getGoodsItems().get(0).getGoodsId()); shopOrder.setFormId(request.getGoodsItems().get(0).getGoodsId());
} }
// 5. 保存订单 //6.保存订单
boolean saved = shopOrderService.save(shopOrder); boolean saved = shopOrderService.save(shopOrder);
if (!saved) { if (!saved) {
throw new BusinessException("订单保存失败"); throw new BusinessException("订单保存失败");
} }
// 6. 保存订单商品 //7.保存订单商品
saveOrderGoods(request, shopOrder); saveOrderGoods(request, shopOrder);
// 7. 标记优惠券为已使用 //8.标记优惠券为已使用
if (shopOrder.getCouponId() != null && shopOrder.getCouponId() > 0) { if (shopOrder.getCouponId() != null && shopOrder.getCouponId() > 0) {
markCouponAsUsed(shopOrder.getCouponId(), shopOrder.getOrderId()); markCouponAsUsed(shopOrder.getCouponId(), shopOrder.getOrderId());
} }
// 8. 创建微信支付订单 //9.创建微信支付订单
try { try {
return shopOrderService.createWxOrder(shopOrder); return shopOrderService.createWxOrder(shopOrder);
} catch (Exception e) { } catch (Exception e) {