diff --git a/builder/store/database/account_metering.go b/builder/store/database/account_metering.go index 9a77d0a58..1f0b4789e 100644 --- a/builder/store/database/account_metering.go +++ b/builder/store/database/account_metering.go @@ -63,16 +63,20 @@ func (am *accountMeteringStoreImpl) Create(ctx context.Context, input AccountMet func (am *accountMeteringStoreImpl) ListByUserIDAndTime(ctx context.Context, req types.ActStatementsReq) ([]AccountMetering, int, error) { var accountMeters []AccountMetering - q := am.db.Operator.Core.NewSelect().Model(&accountMeters).Where("user_uuid = ? and scene = ? and customer_id = ? and recorded_at >= ? and recorded_at <= ?", req.UserUUID, req.Scene, req.InstanceName, req.StartTime, req.EndTime) + q := am.db.Operator.Core.NewSelect().Model(&accountMeters).Where("user_uuid = ? and scene = ?", req.UserUUID, req.Scene) + if len(req.InstanceName) > 0 { + q = q.Where("customer_id = ?", req.InstanceName) + } + q = q.Where("recorded_at >= ? and recorded_at <= ?", req.StartTime, req.EndTime) count, err := q.Count(ctx) if err != nil { - return nil, 0, fmt.Errorf("failed to counting recorders, error: %w", err) + return nil, 0, fmt.Errorf("failed to counting metering recorders, error: %w", err) } _, err = q.Order("id DESC").Limit(req.Per).Offset((req.Page-1)*req.Per).Exec(ctx, &accountMeters) if err != nil { - return nil, 0, fmt.Errorf("list all meters, error: %w", err) + return nil, 0, fmt.Errorf("list all metering recorders, error: %w", err) } return accountMeters, count, nil } diff --git a/builder/store/database/account_metering_test.go b/builder/store/database/account_metering_test.go index 861878cad..de411f838 100644 --- a/builder/store/database/account_metering_test.go +++ b/builder/store/database/account_metering_test.go @@ -91,7 +91,7 @@ func TestAccountMeteringStore_ListByUserIDAndTime(t *testing.T) { }, { UserUUID: "foo", Value: 12.34, ValueType: 1, - ResourceName: "r10", Scene: types.ScenePayOrder, CustomerID: "barz", + ResourceName: "r10", Scene: types.ScenePayOrder, CustomerID: "", RecordedAt: dt.Add(-1 * time.Hour), EventUUID: uuid.New(), }, } @@ -115,6 +115,21 @@ func TestAccountMeteringStore_ListByUserIDAndTime(t *testing.T) { names = append(names, am.ResourceName) } require.Equal(t, []string{"r5", "r4", "r3", "r2", "r1"}, names) + + ams, total, err = store.ListByUserIDAndTime(ctx, types.ActStatementsReq{ + UserUUID: "foo", + Scene: 2, + InstanceName: "", + StartTime: dt.Add(-5 * time.Hour).Format(time.RFC3339), + EndTime: dt.Add(5 * time.Hour).Format(time.RFC3339), + }) + require.Nil(t, err) + require.Equal(t, 6, total) + names = []string{} + for _, am := range ams { + names = append(names, am.ResourceName) + } + require.Equal(t, []string{"r10", "r5", "r4", "r3", "r2", "r1"}, names) } func TestAccountMeteringStore_GetStatByDate(t *testing.T) { diff --git a/builder/store/database/migrations/20251225065249_add_index_user_scene_record_to_account_metering.down.sql b/builder/store/database/migrations/20251225065249_add_index_user_scene_record_to_account_metering.down.sql new file mode 100644 index 000000000..76049ded4 --- /dev/null +++ b/builder/store/database/migrations/20251225065249_add_index_user_scene_record_to_account_metering.down.sql @@ -0,0 +1,5 @@ +SET statement_timeout = 0; + +--bun:split + +DROP INDEX IF EXISTS idx_account_meter_user_scene_recordat; diff --git a/builder/store/database/migrations/20251225065249_add_index_user_scene_record_to_account_metering.up.sql b/builder/store/database/migrations/20251225065249_add_index_user_scene_record_to_account_metering.up.sql new file mode 100644 index 000000000..8c8e11f98 --- /dev/null +++ b/builder/store/database/migrations/20251225065249_add_index_user_scene_record_to_account_metering.up.sql @@ -0,0 +1,5 @@ +SET statement_timeout = 0; + +--bun:split + +CREATE INDEX IF NOT EXISTS idx_account_meter_user_scene_recordat ON account_meterings (user_uuid, scene, recorded_at);