| 
									
										
										
										
											2024-10-15 17:19:23 +08:00
										 |  |  | package model | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"context" | 
					
						
							|  |  |  | 	"database/sql" | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | 	"github.com/zeromicro/go-zero/core/stores/cache" | 
					
						
							|  |  |  | 	"github.com/zeromicro/go-zero/core/stores/sqlx" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var _ RechargeModel = (*customRechargeModel)(nil) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type ( | 
					
						
							|  |  |  | 	// RechargeModel is an interface to be customized, add more methods here, | 
					
						
							|  |  |  | 	// and implement the added methods in customRechargeModel. | 
					
						
							|  |  |  | 	RechargeModel interface { | 
					
						
							|  |  |  | 		rechargeModel | 
					
						
							|  |  |  | 		InsertRechargeTrans(ctx context.Context, data *Recharge, session sqlx.Session) (sql.Result, error) | 
					
						
							|  |  |  | 		FindRechargeListByUserId(ctx context.Context, userId, page, pageSize int64) ([]*Recharge, int64, error) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	customRechargeModel struct { | 
					
						
							|  |  |  | 		*defaultRechargeModel | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // NewRechargeModel returns a model for the database table. | 
					
						
							|  |  |  | func NewRechargeModel(conn sqlx.SqlConn, c cache.CacheConf, opts ...cache.Option) RechargeModel { | 
					
						
							|  |  |  | 	return &customRechargeModel{ | 
					
						
							|  |  |  | 		defaultRechargeModel: newRechargeModel(conn, c, opts...), | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | func (m *customRechargeModel) InsertRechargeTrans(ctx context.Context, data *Recharge, session sqlx.Session) (sql.Result, error) { | 
					
						
							|  |  |  | 	rechargeOutTradeNoKey := fmt.Sprintf("%s%v", cacheRechargeOutTradeNoPrefix, data.OutTradeNo) | 
					
						
							|  |  |  | 	rechargeTransactionIdKey := fmt.Sprintf("%s%v", cacheRechargeTransactionIdPrefix, data.TransactionId) | 
					
						
							| 
									
										
										
										
											2024-10-21 17:07:25 +08:00
										 |  |  | 	query := fmt.Sprintf("INSERT INTO %s (%s) VALUES (?, ?, ?, ?, ?, ?)", m.table, rechargeRowsExpectAutoSet) | 
					
						
							|  |  |  | 	ret, err := session.ExecCtx(ctx, query, data.UserId, data.TransactionId, data.OutTradeNo, data.Amount, data.PaymentMethod, data.Remark) | 
					
						
							| 
									
										
										
										
											2024-10-15 17:19:23 +08:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// 2. 更新缓存,保证所有缓存操作成功 | 
					
						
							|  |  |  | 	cacheKeys := []string{rechargeOutTradeNoKey, rechargeTransactionIdKey} | 
					
						
							|  |  |  | 	cacheErrors := make([]error, len(cacheKeys)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	cacheErrors[0] = m.DelCacheCtx(ctx, rechargeOutTradeNoKey) | 
					
						
							|  |  |  | 	cacheErrors[1] = m.DelCacheCtx(ctx, rechargeTransactionIdKey) | 
					
						
							|  |  |  | 	// 3. 检查缓存操作是否全部成功 | 
					
						
							|  |  |  | 	for _, cacheErr := range cacheErrors { | 
					
						
							|  |  |  | 		if cacheErr != nil { | 
					
						
							|  |  |  | 			return nil, cacheErr // 返回第一个缓存更新失败的错误 | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return ret, err | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | func (m *customRechargeModel) FindRechargeListByUserId(ctx context.Context, userId, page, pageSize int64) ([]*Recharge, int64, error) { | 
					
						
							|  |  |  | 	offset := (page - 1) * pageSize | 
					
						
							|  |  |  | 	query := fmt.Sprintf("SELECT * FROM recharge WHERE user_id = ? ORDER BY created_at DESC LIMIT ? OFFSET ?") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var recharges []*Recharge | 
					
						
							|  |  |  | 	err := m.QueryRowsNoCacheCtx(ctx, &recharges, query, userId, pageSize, offset) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, 0, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// 获取总记录数 | 
					
						
							|  |  |  | 	var total int64 | 
					
						
							|  |  |  | 	countQuery := "SELECT COUNT(1) FROM recharge WHERE user_id = ?" | 
					
						
							|  |  |  | 	err = m.QueryRowNoCacheCtx(ctx, &total, countQuery, userId) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, 0, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return recharges, total, nil | 
					
						
							|  |  |  | } |