package component_report import ( "net/http" "github.com/gin-gonic/gin" "go.uber.org/zap" finance_entities "tyapi-server/internal/domains/finance/entities" ) // CheckPaymentStatusFixed 修复版检查支付状态方法 func (h *ComponentReportHandler) CheckPaymentStatusFixed(c *gin.Context) { userID := c.GetString("user_id") if userID == "" { c.JSON(http.StatusUnauthorized, gin.H{ "code": 401, "message": "用户未登录", }) return } orderID := c.Param("orderId") if orderID == "" { c.JSON(http.StatusBadRequest, gin.H{ "code": 400, "message": "订单ID不能为空", }) return } // 根据订单ID查询下载记录 download, err := h.componentReportRepo.GetDownloadByID(c.Request.Context(), orderID) if err != nil { h.logger.Error("查询下载记录失败", zap.Error(err), zap.String("order_id", orderID)) c.JSON(http.StatusNotFound, gin.H{ "code": 404, "message": "订单不存在", }) return } // 验证订单是否属于当前用户 if download.UserID != userID { c.JSON(http.StatusForbidden, gin.H{ "code": 403, "message": "无权访问此订单", }) return } // 使用购买订单状态来判断支付状态 var paymentStatus string var canDownload bool // 优先使用OrderID查询购买订单状态 if download.OrderID != nil { // 查询购买订单状态 purchaseOrder, err := h.purchaseOrderRepo.GetByID(c.Request.Context(), *download.OrderID) if err != nil { h.logger.Error("查询购买订单失败", zap.Error(err), zap.String("order_id", *download.OrderID)) paymentStatus = "unknown" } else { // 根据购买订单状态设置支付状态 switch purchaseOrder.Status { case finance_entities.PurchaseOrderStatusPaid: paymentStatus = "success" canDownload = true case finance_entities.PurchaseOrderStatusCreated: paymentStatus = "pending" canDownload = false case finance_entities.PurchaseOrderStatusCancelled: paymentStatus = "cancelled" canDownload = false case finance_entities.PurchaseOrderStatusFailed: paymentStatus = "failed" canDownload = false default: paymentStatus = "unknown" canDownload = false } } } else if download.OrderNumber != nil { // 兼容旧的支付订单逻辑 paymentStatus = "success" // 简化处理,有支付订单号就认为已支付 canDownload = true } else { paymentStatus = "pending" canDownload = false } // 检查是否过期 if download.IsExpired() { canDownload = false } c.JSON(http.StatusOK, CheckPaymentStatusResponse{ OrderID: download.ID, PaymentStatus: paymentStatus, CanDownload: canDownload, }) }