-f
This commit is contained in:
@@ -565,13 +565,14 @@ func (s *ComponentReportOrderService) createFreeOrder(
|
|||||||
|
|
||||||
// 创建下载记录
|
// 创建下载记录
|
||||||
download := &productEntities.ComponentReportDownload{
|
download := &productEntities.ComponentReportDownload{
|
||||||
UserID: req.UserID,
|
UserID: req.UserID,
|
||||||
ProductID: req.ProductID,
|
ProductID: req.ProductID,
|
||||||
ProductCode: product.Code,
|
ProductCode: product.Code,
|
||||||
ProductName: product.Name,
|
ProductName: product.Name,
|
||||||
OrderID: &createdPurchaseOrder.ID, // 关联购买订单ID
|
OrderID: &createdPurchaseOrder.ID, // 关联购买订单ID
|
||||||
OrderNumber: &createdPurchaseOrder.OrderNo, // 外部订单号
|
OrderNumber: &createdPurchaseOrder.OrderNo, // 外部订单号
|
||||||
ExpiresAt: calculateExpiryTime(), // 30天后过期
|
DownloadPrice: finalPrice, // 设置下载价格
|
||||||
|
ExpiresAt: calculateExpiryTime(), // 30天后过期
|
||||||
}
|
}
|
||||||
|
|
||||||
err = s.componentReportRepo.Create(ctx, download)
|
err = s.componentReportRepo.Create(ctx, download)
|
||||||
@@ -779,13 +780,14 @@ func (s *ComponentReportOrderService) DownloadFile(ctx context.Context, orderID
|
|||||||
|
|
||||||
// 创建新的下载记录
|
// 创建新的下载记录
|
||||||
newDownload := &productEntities.ComponentReportDownload{
|
newDownload := &productEntities.ComponentReportDownload{
|
||||||
UserID: purchaseOrder.UserID,
|
UserID: purchaseOrder.UserID,
|
||||||
ProductID: purchaseOrder.ProductID,
|
ProductID: purchaseOrder.ProductID,
|
||||||
ProductCode: product.Code,
|
ProductCode: product.Code,
|
||||||
ProductName: product.Name,
|
ProductName: product.Name,
|
||||||
OrderID: &purchaseOrder.ID,
|
OrderID: &purchaseOrder.ID,
|
||||||
OrderNumber: &purchaseOrder.OrderNo,
|
OrderNumber: &purchaseOrder.OrderNo,
|
||||||
ExpiresAt: calculateExpiryTime(),
|
DownloadPrice: purchaseOrder.Amount, // 设置下载价格(从订单获取)
|
||||||
|
ExpiresAt: calculateExpiryTime(),
|
||||||
}
|
}
|
||||||
|
|
||||||
// 保存下载记录
|
// 保存下载记录
|
||||||
@@ -918,13 +920,14 @@ func (s *ComponentReportOrderService) createDownloadRecordForPaidOrder(ctx conte
|
|||||||
|
|
||||||
// 创建新的下载记录
|
// 创建新的下载记录
|
||||||
download := &productEntities.ComponentReportDownload{
|
download := &productEntities.ComponentReportDownload{
|
||||||
UserID: purchaseOrder.UserID,
|
UserID: purchaseOrder.UserID,
|
||||||
ProductID: purchaseOrder.ProductID,
|
ProductID: purchaseOrder.ProductID,
|
||||||
ProductCode: product.Code,
|
ProductCode: product.Code,
|
||||||
ProductName: product.Name,
|
ProductName: product.Name,
|
||||||
OrderID: &purchaseOrder.ID,
|
OrderID: &purchaseOrder.ID,
|
||||||
OrderNumber: &purchaseOrder.OrderNo,
|
OrderNumber: &purchaseOrder.OrderNo,
|
||||||
ExpiresAt: calculateExpiryTime(), // 30天后过期
|
DownloadPrice: purchaseOrder.Amount, // 设置下载价格(从订单获取)
|
||||||
|
ExpiresAt: calculateExpiryTime(), // 30天后过期
|
||||||
}
|
}
|
||||||
|
|
||||||
// 保存下载记录
|
// 保存下载记录
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
|
"github.com/shopspring/decimal"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -22,6 +23,9 @@ type ComponentReportDownload struct {
|
|||||||
SubProductIDs string `gorm:"type:text" comment:"子产品ID列表(JSON数组,组合包使用)"`
|
SubProductIDs string `gorm:"type:text" comment:"子产品ID列表(JSON数组,组合包使用)"`
|
||||||
SubProductCodes string `gorm:"type:text" comment:"子产品编号列表(JSON数组)"`
|
SubProductCodes string `gorm:"type:text" comment:"子产品编号列表(JSON数组)"`
|
||||||
|
|
||||||
|
// 价格相关字段
|
||||||
|
DownloadPrice decimal.Decimal `gorm:"type:decimal(10,2);not null" comment:"实际支付价格"`
|
||||||
|
|
||||||
// 下载相关信息
|
// 下载相关信息
|
||||||
FilePath *string `gorm:"type:varchar(500)" comment:"生成的ZIP文件路径(用于二次下载)"`
|
FilePath *string `gorm:"type:varchar(500)" comment:"生成的ZIP文件路径(用于二次下载)"`
|
||||||
FileHash *string `gorm:"type:varchar(64)" comment:"文件哈希值(用于缓存验证)"`
|
FileHash *string `gorm:"type:varchar(64)" comment:"文件哈希值(用于缓存验证)"`
|
||||||
|
|||||||
@@ -397,9 +397,14 @@ func (h *ComponentReportHandler) GenerateAndDownloadZip(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
// 创建带超时的上下文,避免ZIP生成时间过长导致网关超时
|
||||||
|
// 设置超时时间为 25 秒,略小于服务器的 write_timeout (30秒)
|
||||||
|
ctx, cancel := context.WithTimeout(c.Request.Context(), 25*time.Second)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
// 生成ZIP文件
|
// 生成ZIP文件
|
||||||
zipPath, err := h.zipGenerator.GenerateZipFile(
|
zipPath, err := h.zipGenerator.GenerateZipFile(
|
||||||
c.Request.Context(),
|
ctx,
|
||||||
req.ProductID,
|
req.ProductID,
|
||||||
req.SubProductCodes,
|
req.SubProductCodes,
|
||||||
h.exampleJSONGenerator,
|
h.exampleJSONGenerator,
|
||||||
@@ -407,6 +412,18 @@ func (h *ComponentReportHandler) GenerateAndDownloadZip(c *gin.Context) {
|
|||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
h.logger.Error("生成ZIP文件失败", zap.Error(err), zap.String("product_id", req.ProductID))
|
h.logger.Error("生成ZIP文件失败", zap.Error(err), zap.String("product_id", req.ProductID))
|
||||||
|
|
||||||
|
// 检查是否是超时错误
|
||||||
|
if ctx.Err() == context.DeadlineExceeded {
|
||||||
|
h.logger.Error("ZIP文件生成超时", zap.String("product_id", req.ProductID))
|
||||||
|
c.JSON(http.StatusRequestTimeout, gin.H{
|
||||||
|
"code": 504,
|
||||||
|
"message": "文件生成超时,请稍后重试",
|
||||||
|
"error": "请求处理时间过长",
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
c.JSON(http.StatusInternalServerError, gin.H{
|
c.JSON(http.StatusInternalServerError, gin.H{
|
||||||
"code": 500,
|
"code": 500,
|
||||||
"message": "生成ZIP文件失败",
|
"message": "生成ZIP文件失败",
|
||||||
@@ -987,8 +1004,9 @@ func (h *ComponentReportHandler) CreatePaymentOrder(c *gin.Context) {
|
|||||||
SubProductIDs: string(subProductIDsJSON),
|
SubProductIDs: string(subProductIDsJSON),
|
||||||
SubProductCodes: string(subProductCodesJSON),
|
SubProductCodes: string(subProductCodesJSON),
|
||||||
// 关联购买订单ID
|
// 关联购买订单ID
|
||||||
OrderID: &createdPurchaseOrder.ID,
|
OrderID: &createdPurchaseOrder.ID,
|
||||||
OrderNumber: &outTradeNo,
|
OrderNumber: &outTradeNo,
|
||||||
|
DownloadPrice: finalPrice, // 设置下载价格
|
||||||
}
|
}
|
||||||
|
|
||||||
// 记录创建前的详细信息用于调试
|
// 记录创建前的详细信息用于调试
|
||||||
@@ -1384,13 +1402,14 @@ func (h *ComponentReportHandler) createDownloadRecordIfEligible(ctx context.Cont
|
|||||||
|
|
||||||
// 3. 创建下载记录
|
// 3. 创建下载记录
|
||||||
download := &entities.ComponentReportDownload{
|
download := &entities.ComponentReportDownload{
|
||||||
UserID: userID,
|
UserID: userID,
|
||||||
ProductID: productID,
|
ProductID: productID,
|
||||||
ProductCode: product.Code,
|
ProductCode: product.Code,
|
||||||
ProductName: product.Name,
|
ProductName: product.Name,
|
||||||
OrderID: &validOrder.ID, // 添加OrderID字段
|
OrderID: &validOrder.ID, // 添加OrderID字段
|
||||||
OrderNumber: &validOrder.OrderNo, // 使用OrderNumber字段
|
OrderNumber: &validOrder.OrderNo, // 使用OrderNumber字段
|
||||||
ExpiresAt: calculateExpiryTime(), // 从创建日起30天
|
DownloadPrice: validOrder.Amount, // 设置下载价格(从订单获取)
|
||||||
|
ExpiresAt: calculateExpiryTime(), // 从创建日起30天
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4. 如果是组合包,获取子产品信息
|
// 4. 如果是组合包,获取子产品信息
|
||||||
@@ -1562,13 +1581,14 @@ func (h *ComponentReportHandler) createDownloadRecordForPaidOrder(ctx context.Co
|
|||||||
|
|
||||||
// 创建下载记录
|
// 创建下载记录
|
||||||
download := &entities.ComponentReportDownload{
|
download := &entities.ComponentReportDownload{
|
||||||
UserID: order.UserID,
|
UserID: order.UserID,
|
||||||
ProductID: order.ProductID,
|
ProductID: order.ProductID,
|
||||||
ProductCode: order.ProductCode,
|
ProductCode: order.ProductCode,
|
||||||
ProductName: order.ProductName,
|
ProductName: order.ProductName,
|
||||||
OrderID: &order.ID,
|
OrderID: &order.ID,
|
||||||
OrderNumber: &order.OrderNo,
|
OrderNumber: &order.OrderNo,
|
||||||
ExpiresAt: calculateExpiryTime(),
|
DownloadPrice: order.Amount, // 设置下载价格(从订单获取)
|
||||||
|
ExpiresAt: calculateExpiryTime(),
|
||||||
}
|
}
|
||||||
|
|
||||||
// 如果是组合包,获取子产品信息
|
// 如果是组合包,获取子产品信息
|
||||||
|
|||||||
Reference in New Issue
Block a user