From b82e78ceb8f52b05203f05eb4b14151b1ab408a2 Mon Sep 17 00:00:00 2001
From: “mitao” <“2763622819@qq.com”>
Date: 星期三, 24 十二月 2025 18:52:23 +0800
Subject: [PATCH] feat:下单功能联调及短信对接
---
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TPhysicalGoodsOrderServiceImpl.java | 72 ++++++++++++++++++++++++++++++++++--
1 files changed, 68 insertions(+), 4 deletions(-)
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TPhysicalGoodsOrderServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TPhysicalGoodsOrderServiceImpl.java
index 0d55c84..2bb3faf 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TPhysicalGoodsOrderServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TPhysicalGoodsOrderServiceImpl.java
@@ -7,17 +7,21 @@
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.system.config.ICBCConfig;
import com.ruoyi.system.dto.PhysicalGoodsPlaceOrderDTO;
+import com.ruoyi.system.enums.PhysicalGoodsOrderStatusEnum;
import com.ruoyi.system.mapper.TPhysicalGoodsMapper;
import com.ruoyi.system.mapper.TPhysicalGoodsOrderMapper;
+import com.ruoyi.system.model.TCompany;
import com.ruoyi.system.model.TPhysicalGoods;
import com.ruoyi.system.model.TPhysicalGoodsOrder;
import com.ruoyi.system.query.BigGiftPackageQuery;
+import com.ruoyi.system.service.TAppUserService;
import com.ruoyi.system.service.TPhysicalGoodsOrderService;
import com.ruoyi.system.utils.ICBCPayUtil;
import com.ruoyi.system.utils.OrderCodeGenerator;
import com.ruoyi.system.vo.PlaceOrderVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -25,6 +29,7 @@
import java.time.LocalDateTime;
import java.util.Collections;
import java.util.List;
+import java.util.concurrent.TimeUnit;
/**
* <p>
@@ -46,6 +51,22 @@
@Autowired
private ICBCConfig icbcConfig;
+
+ @Autowired
+ private RedisTemplate redisTemplate;
+
+ @Autowired
+ private TAppUserService appUserService;
+
+ /**
+ * 实物商品支付参数 Redis Key 前缀
+ */
+ private static final String PHYSICAL_ORDER_PAY_PARAMS_KEY = "physical_order_pay_params:";
+
+ /**
+ * 支付参数缓存过期时间(24小时)
+ */
+ private static final long PAY_PARAMS_EXPIRE_HOURS = 60;
@Override
public Page<TPhysicalGoodsOrder> pageList(BigGiftPackageQuery query) {
@@ -80,25 +101,68 @@
// 支付方式:1=微信
order.setPaymentMethod(1);
// 订单状态:1=待付款
- order.setStatus(1);
+ order.setStatus(PhysicalGoodsOrderStatusEnum.PENDING_PAYMENT.getCode());
order.setDelFlag(0);
+ //查询用户所属公司,获取经销商商户号
+ TCompany company = appUserService.getUserCompany(appUserId);
+ order.setCompanyId(company.getId());
this.save(order);
// 3. 更新商品销量
Integer currentSales = physicalGoods.getSales() == null ? 0 : physicalGoods.getSales();
physicalGoods.setSales(currentSales + 1);
physicalGoodsMapper.updateById(physicalGoods);
-
// 4. 调用工行支付
log.info("实物商品下单,订单号:{},支付金额:{},用户ID:{}", orderCode, physicalGoods.getTotalPrice(), appUserId);
- JSONObject paymentParams = icbcPayUtil.wechatPay(orderCode, physicalGoods.getTotalPrice(), physicalGoods.getName(), openid,icbcConfig.getNotifyUrl()+"/physical/pay-notify");
+ JSONObject paymentParams = icbcPayUtil.wechatPay(orderCode, physicalGoods.getTotalPrice(), physicalGoods.getName(),
+ openid,icbcConfig.getNotifyUrl()+"/physical/pay-notify", company.getMerchantNumber(), company.getMerchantOpenid());
- // 5. 构建返回结果
+ // 5. 缓存支付参数到 Redis(用于立即支付)
+ String redisKey = PHYSICAL_ORDER_PAY_PARAMS_KEY + order.getId();
+ redisTemplate.opsForValue().set(redisKey, paymentParams.toJSONString(), PAY_PARAMS_EXPIRE_HOURS, TimeUnit.MINUTES);
+ log.info("实物商品支付参数已缓存,订单ID:{},Redis Key:{}", order.getId(), redisKey);
+
+ // 6. 构建返回结果
PlaceOrderVO vo = new PlaceOrderVO();
vo.setOrderIds(Collections.singletonList(order.getId()));
vo.setOrderCodes(Collections.singletonList(orderCode));
vo.setPaymentParams(paymentParams);
return vo;
}
+
+ @Override
+ public PlaceOrderVO payNow(Integer orderId, Integer appUserId) {
+ // 1. 查询订单
+ TPhysicalGoodsOrder order = this.getById(orderId);
+ if (order == null) {
+ throw new ServiceException("订单不存在");
+ }
+
+ // 2. 校验订单所属用户
+ if (!order.getAppUserId().equals(appUserId)) {
+ throw new ServiceException("无权操作此订单");
+ }
+
+ // 3. 校验订单状态(必须是待付款)
+ if (!PhysicalGoodsOrderStatusEnum.PENDING_PAYMENT.getCode().equals(order.getStatus())) {
+ throw new ServiceException("订单状态不正确,无法支付");
+ }
+
+ // 4. 从 Redis 获取缓存的支付参数
+ String redisKey = PHYSICAL_ORDER_PAY_PARAMS_KEY + orderId;
+ Object cachedParams = redisTemplate.opsForValue().get(redisKey);
+ if (cachedParams == null) {
+ throw new ServiceException("支付参数已过期,请重新下单");
+ }
+
+ // 5. 构建返回结果
+ PlaceOrderVO vo = new PlaceOrderVO();
+ vo.setOrderIds(Collections.singletonList(order.getId()));
+ vo.setOrderCodes(Collections.singletonList(order.getCode()));
+ vo.setPaymentParams(JSON.parseObject(cachedParams.toString()));
+
+ log.info("实物商品立即支付,订单ID:{},用户ID:{}", orderId, appUserId);
+ return vo;
+ }
}
--
Gitblit v1.7.1