@@ -19,6 +19,7 @@ import com.gxwebsoft.shop.task.OrderAutoCancelTask;
import com.gxwebsoft.shop.entity.ShopOrder ;
import com.gxwebsoft.shop.param.ShopOrderParam ;
import com.gxwebsoft.shop.dto.OrderCreateRequest ;
import com.gxwebsoft.shop.dto.OrderPrepayRequest ;
import com.gxwebsoft.shop.dto.UpdatePaymentStatusRequest ;
import com.gxwebsoft.payment.service.PaymentService ;
import com.gxwebsoft.payment.dto.PaymentResponse ;
@@ -48,6 +49,7 @@ import java.math.BigDecimal;
import java.time.LocalDateTime ;
import java.util.List ;
import java.util.Map ;
import java.util.Objects ;
/**
* 订单控制器
@@ -169,6 +171,92 @@ public class ShopOrderController extends BaseController {
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') " )
@Operation ( summary = " 修改订单 " )
@PutMapping ( )
@@ -178,11 +266,15 @@ public class ShopOrderController extends BaseController {
return fail ( " 订单不存在 " ) ;
}
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 ( ) ) ;
}
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 . setOrderId ( shopOrder . getOrderId ( ) ) ;
shopOrderDelivery . setDeliveryMethod ( 30 ) ;
@@ -196,12 +288,12 @@ public class ShopOrderController extends BaseController {
}
// 退款操作
if ( shopOrder . getOrderStatus ( ) . equals ( 6 ) ) {
if ( Objects . equals ( shopOrder . getOrderStatus ( ) , 6 ) ) {
// 当订单状态更改为6(已退款)时,执行退款操作
try {
// 检查订单是否已支付
if ( ! shopOrder . getPayStatus ( ) ) {
if ( ! Boolean . TRUE . equals ( shopOrderNow . getPayStatus ( ) ) ) {
return fail ( " 订单未支付,无法退款 " ) ;
}