chore: stabilize lint and verify builds

This commit is contained in:
2026-02-06 11:51:32 +08:00
parent edede17880
commit 1782f64417
114 changed files with 3032 additions and 1345 deletions

View File

@@ -51,6 +51,7 @@ func (s *order) ListUserOrders(ctx context.Context, tenantID, userID int64, stat
if err != nil {
return nil, err
}
return data, nil
}
@@ -75,6 +76,7 @@ func (s *order) GetUserOrder(ctx context.Context, tenantID, userID, id int64) (*
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, errorx.ErrRecordNotFound
}
return nil, errorx.ErrDatabaseError.WithCause(err)
}
@@ -82,6 +84,7 @@ func (s *order) GetUserOrder(ctx context.Context, tenantID, userID, id int64) (*
if err != nil {
return nil, err
}
return &dto, nil
}
@@ -204,6 +207,7 @@ func (s *order) Create(
if _, ok := err.(*errorx.AppError); ok {
return nil, err
}
return nil, errorx.ErrDatabaseError.WithCause(err)
}
@@ -241,55 +245,38 @@ func (s *order) Pay(
switch form.Method {
case "balance":
return s.payWithBalance(ctx, o)
case "alipay", "external":
// mock external: 标记已支付,避免前端卡住
if err := s.settleOrder(ctx, o, "external", ""); err != nil {
if _, ok := err.(*errorx.AppError); ok {
return nil, err
}
return nil, errorx.ErrDatabaseError.WithCause(err)
}
return &transaction_dto.OrderPayResponse{PayParams: "mock_pay_params"}, nil
default:
return nil, errorx.ErrBadRequest.WithMsg("unsupported payment method")
}
}
// ProcessExternalPayment handles callback from payment gateway
func (s *order) ProcessExternalPayment(ctx context.Context, tenantID, orderID int64, externalID string) error {
o, err := models.OrderQuery.WithContext(ctx).Where(models.OrderQuery.ID.Eq(orderID)).First()
if err != nil {
return errorx.ErrRecordNotFound
}
if tenantID > 0 && o.TenantID > 0 && o.TenantID != tenantID {
return errorx.ErrForbidden.WithMsg("租户不匹配")
}
if o.Status != consts.OrderStatusCreated {
return nil // Already processed idempotency
}
return s.settleOrder(ctx, o, "external", externalID)
}
func (s *order) payWithBalance(ctx context.Context, o *models.Order) (*transaction_dto.OrderPayResponse, error) {
err := s.settleOrder(ctx, o, "balance", "")
err := s.settleOrder(ctx, o, "balance")
if err != nil {
if _, ok := err.(*errorx.AppError); ok {
return nil, err
}
return nil, errorx.ErrDatabaseError.WithCause(err)
}
return &transaction_dto.OrderPayResponse{
PayParams: "balance_paid",
}, nil
return &transaction_dto.OrderPayResponse{Status: string(consts.OrderStatusPaid)}, nil
}
func (s *order) settleOrder(ctx context.Context, o *models.Order, method, externalID string) error {
func (s *order) settleRechargeOrder(ctx context.Context, order *models.Order) error {
if order == nil {
return errorx.ErrInvalidParameter.WithMsg("充值订单不存在")
}
return s.settleOrder(ctx, order, "recharge")
}
func (s *order) settleOrder(ctx context.Context, o *models.Order, method string) error {
var tenantOwnerID int64
// 关键结算事务:遇到数据库冲突/死锁时短暂退避重试,避免支付状态卡死。
err := retryCriticalWrite(ctx, func() error {
tenantOwnerID = 0
return models.Q.Transaction(func(tx *models.Query) error {
// 1. Handle Balance Updates
if o.Type == consts.OrderTypeRecharge {
@@ -320,7 +307,6 @@ func (s *order) settleOrder(ctx context.Context, o *models.Order, method, extern
PaidAt: now,
UpdatedAt: now,
})
if err != nil {
return err
}
@@ -409,6 +395,7 @@ func (s *order) settleOrder(ctx context.Context, o *models.Order, method, extern
_ = Notification.Send(ctx, o.TenantID, tenantOwnerID, "order", "新的订单", "您的店铺有新的订单,收入已入账。")
}
}
return nil
}
@@ -418,6 +405,7 @@ func (s *order) Status(ctx context.Context, tenantID, userID, id int64) (*transa
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, errorx.ErrRecordNotFound
}
return nil, errorx.ErrDatabaseError.WithCause(err)
}
if userID > 0 && o.UserID != userID {
@@ -476,6 +464,7 @@ func (s *order) composeOrderDTO(ctx context.Context, o *models.Order) (user_dto.
for _, asset := range c.ContentAssets {
if asset.Role == consts.ContentAssetRoleCover && asset.Asset != nil {
ci.Cover = Common.GetAssetURL(asset.Asset.ObjectKey)
break
}
}
@@ -591,6 +580,7 @@ func (s *order) composeOrderListDTO(ctx context.Context, orders []*models.Order)
for _, asset := range c.ContentAssets {
if asset.Role == consts.ContentAssetRoleCover && asset.Asset != nil {
ci.Cover = Common.GetAssetURL(asset.Asset.ObjectKey)
break
}
}