Compare commits
2 Commits
36bf931274
...
51d3a029cc
| Author | SHA1 | Date | |
|---|---|---|---|
| 51d3a029cc | |||
| 30c7e72a80 |
@@ -19,6 +19,7 @@ import com.gxwebsoft.shop.task.OrderAutoCancelTask;
|
|||||||
import com.gxwebsoft.shop.entity.ShopOrder;
|
import com.gxwebsoft.shop.entity.ShopOrder;
|
||||||
import com.gxwebsoft.shop.param.ShopOrderParam;
|
import com.gxwebsoft.shop.param.ShopOrderParam;
|
||||||
import com.gxwebsoft.shop.dto.OrderCreateRequest;
|
import com.gxwebsoft.shop.dto.OrderCreateRequest;
|
||||||
|
import com.gxwebsoft.shop.dto.OrderPrepayRequest;
|
||||||
import com.gxwebsoft.shop.dto.UpdatePaymentStatusRequest;
|
import com.gxwebsoft.shop.dto.UpdatePaymentStatusRequest;
|
||||||
import com.gxwebsoft.payment.service.PaymentService;
|
import com.gxwebsoft.payment.service.PaymentService;
|
||||||
import com.gxwebsoft.payment.dto.PaymentResponse;
|
import com.gxwebsoft.payment.dto.PaymentResponse;
|
||||||
@@ -48,6 +49,7 @@ import java.math.BigDecimal;
|
|||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 订单控制器
|
* 订单控制器
|
||||||
@@ -169,6 +171,92 @@ public class ShopOrderController extends BaseController {
|
|||||||
return fail("添加失败");
|
return fail("添加失败");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Operation(summary = "发起支付/重新支付(兼容 pay/prepay/repay)")
|
||||||
|
@PostMapping({"/pay", "/prepay", "/repay"})
|
||||||
|
public ApiResult<?> prepay(@RequestBody OrderPrepayRequest request) {
|
||||||
|
User loginUser = getLoginUser();
|
||||||
|
if (loginUser == null) {
|
||||||
|
return fail("用户未登录");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 允许从请求显式传 tenantId(兼容一些历史调用),否则优先从请求头/登录态推断
|
||||||
|
Integer tenantId = request != null ? request.getTenantId() : null;
|
||||||
|
if (tenantId == null) {
|
||||||
|
tenantId = ObjectUtil.defaultIfNull(getTenantId(), loginUser.getTenantId());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (request == null || (request.getOrderId() == null && StrUtil.isBlank(request.getOrderNo()))) {
|
||||||
|
return fail("orderId 或 orderNo 不能为空");
|
||||||
|
}
|
||||||
|
|
||||||
|
ShopOrder order;
|
||||||
|
if (request.getOrderId() != null) {
|
||||||
|
order = shopOrderService.getById(request.getOrderId());
|
||||||
|
} else {
|
||||||
|
if (tenantId == null) {
|
||||||
|
return fail("tenantId 不能为空");
|
||||||
|
}
|
||||||
|
order = shopOrderService.getByOrderNo(request.getOrderNo(), tenantId);
|
||||||
|
}
|
||||||
|
if (order == null) {
|
||||||
|
return fail("订单不存在");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 校验租户(避免用别的租户订单号撞库)
|
||||||
|
if (tenantId != null && order.getTenantId() != null && !tenantId.equals(order.getTenantId())) {
|
||||||
|
return fail("订单不存在");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 普通用户只能操作自己的订单;管理员可越权(复用取消权限判断即可)
|
||||||
|
if (!loginUser.getUserId().equals(order.getUserId()) && !hasOrderCancelAuthority()) {
|
||||||
|
return fail("无权限操作此订单");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 业务状态校验:这些错误需要明确返回(code!=0),避免前端误判为接口不支持而降级走创建订单
|
||||||
|
if (Boolean.TRUE.equals(order.getPayStatus())) {
|
||||||
|
return fail("订单已支付");
|
||||||
|
}
|
||||||
|
if (order.getDeleted() != null && order.getDeleted() == 1) {
|
||||||
|
return fail("订单已删除");
|
||||||
|
}
|
||||||
|
if (order.getOrderStatus() != null) {
|
||||||
|
// 2=已取消;6=退款成功;7=客户端申请退款;其他非0状态也视为不可再次发起支付
|
||||||
|
if (!Objects.equals(order.getOrderStatus(), 0)) {
|
||||||
|
return fail("订单状态不允许发起支付");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (order.getExpirationTime() != null && order.getExpirationTime().isBefore(LocalDateTime.now())) {
|
||||||
|
return fail("订单已过期");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 补齐 createWxOrder 所需字段(注意:openid 在 ShopOrder 上是非持久化字段,查询出来为空)
|
||||||
|
Integer payType = request.getPayType() != null ? request.getPayType() : order.getPayType();
|
||||||
|
if (payType == null) {
|
||||||
|
payType = 1;
|
||||||
|
}
|
||||||
|
if (!Objects.equals(payType, 1) && !Objects.equals(payType, 102)) {
|
||||||
|
return fail("该订单不支持发起微信支付");
|
||||||
|
}
|
||||||
|
order.setPayType(payType);
|
||||||
|
order.setPayUserId(loginUser.getUserId());
|
||||||
|
order.setOpenid(loginUser.getOpenid());
|
||||||
|
if (order.getPayPrice() == null) {
|
||||||
|
order.setPayPrice(ObjectUtil.defaultIfNull(order.getTotalPrice(), BigDecimal.ZERO));
|
||||||
|
}
|
||||||
|
if (StrUtil.isBlank(order.getComments())) {
|
||||||
|
order.setComments("订单支付");
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
Map<String, String> wxOrderInfo = shopOrderService.createWxOrder(order);
|
||||||
|
return success(wxOrderInfo);
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error("发起支付失败 - userId={}, orderId={}, orderNo={}",
|
||||||
|
loginUser.getUserId(), order.getOrderId(), order.getOrderNo(), e);
|
||||||
|
return fail("发起支付失败:" + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@PreAuthorize("hasAuthority('shop:shopOrder:update')")
|
@PreAuthorize("hasAuthority('shop:shopOrder:update')")
|
||||||
@Operation(summary = "修改订单")
|
@Operation(summary = "修改订单")
|
||||||
@PutMapping()
|
@PutMapping()
|
||||||
@@ -178,11 +266,15 @@ public class ShopOrderController extends BaseController {
|
|||||||
return fail("订单不存在");
|
return fail("订单不存在");
|
||||||
}
|
}
|
||||||
ShopOrder shopOrderNow = shopOrderService.getById(shopOrder.getOrderId());
|
ShopOrder shopOrderNow = shopOrderService.getById(shopOrder.getOrderId());
|
||||||
|
if (shopOrderNow == null) {
|
||||||
|
return fail("订单不存在");
|
||||||
|
}
|
||||||
// 申请退款
|
// 申请退款
|
||||||
if (shopOrder.getOrderStatus().equals(4)) {
|
if (Objects.equals(shopOrder.getOrderStatus(), 4)) {
|
||||||
shopOrder.setRefundApplyTime(LocalDateTime.now());
|
shopOrder.setRefundApplyTime(LocalDateTime.now());
|
||||||
}
|
}
|
||||||
if (shopOrderNow.getDeliveryStatus().equals(10) && shopOrder.getDeliveryStatus().equals(20)) {
|
// 发货状态从“未发货(10)”变更为“已发货(20)”时,记录发货信息
|
||||||
|
if (Objects.equals(shopOrderNow.getDeliveryStatus(), 10) && Objects.equals(shopOrder.getDeliveryStatus(), 20)) {
|
||||||
ShopOrderDelivery shopOrderDelivery = new ShopOrderDelivery();
|
ShopOrderDelivery shopOrderDelivery = new ShopOrderDelivery();
|
||||||
shopOrderDelivery.setOrderId(shopOrder.getOrderId());
|
shopOrderDelivery.setOrderId(shopOrder.getOrderId());
|
||||||
shopOrderDelivery.setDeliveryMethod(30);
|
shopOrderDelivery.setDeliveryMethod(30);
|
||||||
@@ -196,12 +288,12 @@ public class ShopOrderController extends BaseController {
|
|||||||
|
|
||||||
}
|
}
|
||||||
// 退款操作
|
// 退款操作
|
||||||
if(shopOrder.getOrderStatus().equals(6)){
|
if (Objects.equals(shopOrder.getOrderStatus(), 6)) {
|
||||||
// 当订单状态更改为6(已退款)时,执行退款操作
|
// 当订单状态更改为6(已退款)时,执行退款操作
|
||||||
try {
|
try {
|
||||||
|
|
||||||
// 检查订单是否已支付
|
// 检查订单是否已支付
|
||||||
if (!shopOrder.getPayStatus()) {
|
if (!Boolean.TRUE.equals(shopOrderNow.getPayStatus())) {
|
||||||
return fail("订单未支付,无法退款");
|
return fail("订单未支付,无法退款");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
32
src/main/java/com/gxwebsoft/shop/dto/OrderPrepayRequest.java
Normal file
32
src/main/java/com/gxwebsoft/shop/dto/OrderPrepayRequest.java
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
package com.gxwebsoft.shop.dto;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import javax.validation.constraints.Positive;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 订单重新发起支付请求DTO
|
||||||
|
*
|
||||||
|
* 前端会按 /shop/shop-order/pay -> /prepay -> /repay 依次尝试。
|
||||||
|
* 后端可统一实现为同一套逻辑(多个URL别名),避免出现 404 导致前端误判为不支持接口。
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Schema(name = "OrderPrepayRequest", description = "订单重新发起支付请求")
|
||||||
|
public class OrderPrepayRequest {
|
||||||
|
|
||||||
|
@Schema(description = "订单ID(二选一:orderId 或 orderNo)")
|
||||||
|
@Positive(message = "订单ID必须为正数")
|
||||||
|
private Integer orderId;
|
||||||
|
|
||||||
|
@Schema(description = "订单号(二选一:orderId 或 orderNo)")
|
||||||
|
private String orderNo;
|
||||||
|
|
||||||
|
@Schema(description = "支付方式:1=微信支付,102=微信Native(兼容旧类型)。不传则使用订单原支付方式/默认微信支付")
|
||||||
|
private Integer payType;
|
||||||
|
|
||||||
|
@Schema(description = "租户ID(可选;不传则从当前登录用户/请求头推断)")
|
||||||
|
@Positive(message = "租户ID必须为正数")
|
||||||
|
private Integer tenantId;
|
||||||
|
}
|
||||||
|
|
||||||
Reference in New Issue
Block a user