Skip to content

Commit 4f23c4f

Browse files
RaderHaihui.Wang
andauthored
Sort by create_ed or submit_time for query bills (#1251)
Co-authored-by: Haihui.Wang <hh.wang@opencsg.com>
1 parent c438f1a commit 4f23c4f

8 files changed

Lines changed: 139 additions & 25 deletions

File tree

accounting/component/metering_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ func TestMeteringComponent_ListMeteringByUserIDAndDate(t *testing.T) {
6464

6565
req := types.ActStatementsReq{
6666
UserUUID: "test-user-uuid",
67-
Scene: int(types.SceneModelInference),
67+
Scene: types.SceneModelInference,
6868
StartTime: "2024-01-01",
6969
EndTime: "2024-12-31",
7070
Per: 10,

accounting/handler/metering.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ func (mh *MeteringHandler) QueryMeteringStatementByUserID(ctx *gin.Context) {
5151

5252
req := types.ActStatementsReq{
5353
UserUUID: userID,
54-
Scene: scene,
54+
Scene: types.SceneType(scene),
5555
InstanceName: instance_name,
5656
StartTime: startTime,
5757
EndTime: endTime,
@@ -89,7 +89,7 @@ func (mh *MeteringHandler) QueryMeteringStatByDate(ctx *gin.Context) {
8989
}
9090

9191
req := types.ActStatementsReq{
92-
Scene: scene,
92+
Scene: types.SceneType(scene),
9393
StartTime: startDate + " 00:00:00",
9494
EndTime: endDate + " 23:59:59",
9595
}

api/handler/accounting.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ func (ah *AccountingHandler) QueryMeteringStatementByUserID(ctx *gin.Context) {
9595
req := types.ActStatementsReq{
9696
CurrentUser: currentUser,
9797
UserUUID: userUUID,
98-
Scene: scene,
98+
Scene: types.SceneType(scene),
9999
InstanceName: instance_name,
100100
StartTime: startTime,
101101
EndTime: endTime,

builder/store/database/account_bill.go

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -100,17 +100,32 @@ func (s *accountBillStoreImpl) ListByUserIDAndDate(ctx context.Context, req type
100100
ColumnExpr("sum(voucher_value) as voucher_value").
101101
ColumnExpr("sum(cash_value) as cash_value").
102102
ColumnExpr("sum(duration) as duration").
103-
ColumnExpr("sum(count) as count").
104-
ColumnExpr("MIN(bill_date) as bill_date").
105-
Where("bill_date >= ? and bill_date <= ?", req.StartDate, req.EndDate).
106-
Where("user_uuid = ?", req.TargetUUID).
107-
Where("scene = ?", req.Scene)
103+
ColumnExpr("sum(count) as count")
104+
105+
switch req.Scene {
106+
case types.SceneEvaluation:
107+
q = q.ColumnExpr("d.submit_time as created_at")
108+
q = q.Join("LEFT JOIN argo_workflows d ON customer_id = d.task_id")
109+
case types.SceneSpace, types.SceneModelInference, types.SceneModelFinetune:
110+
q = q.ColumnExpr("d.created_at as created_at")
111+
q = q.Join("LEFT JOIN deploys d ON customer_id = d.svc_name")
112+
}
113+
114+
q = q.Where("account_bill.bill_date >= ? and account_bill.bill_date <= ?", req.StartDate, req.EndDate).
115+
Where("account_bill.user_uuid = ?", req.TargetUUID).
116+
Where("account_bill.scene = ?", req.Scene)
108117

109118
if len(req.InstanceName) > 0 {
110119
q = q.Where("LOWER(customer_id) LIKE ?", "%"+strings.ToLower(req.InstanceName)+"%")
111120
}
112-
113-
q = q.Group("customer_id", "data_type", "resolution", "unit_type")
121+
switch req.Scene {
122+
case types.SceneEvaluation:
123+
q = q.Group("customer_id", "data_type", "resolution", "unit_type", "d.submit_time")
124+
case types.SceneSpace, types.SceneModelInference, types.SceneModelFinetune:
125+
q = q.Group("customer_id", "data_type", "resolution", "unit_type", "d.created_at")
126+
default:
127+
q = q.Group("customer_id", "data_type", "resolution", "unit_type")
128+
}
114129

115130
count, err := q.Count(ctx)
116131
if err != nil {
@@ -132,8 +147,14 @@ func (s *accountBillStoreImpl) ListByUserIDAndDate(ctx context.Context, req type
132147
if err != nil {
133148
return AccountBillRes{}, errorx.HandleDBError(err, nil)
134149
}
135-
136-
err = q.Order("bill_date DESC").Order("customer_id").Limit(req.Per).Offset((req.Page-1)*req.Per).Scan(ctx, &res)
150+
switch req.Scene {
151+
case types.SceneEvaluation:
152+
q = q.Order("d.submit_time DESC NULLS LAST")
153+
case types.SceneSpace, types.SceneModelInference, types.SceneModelFinetune:
154+
q = q.Order("d.created_at DESC NULLS LAST")
155+
}
156+
q = q.Order("customer_id")
157+
err = q.Limit(req.Per).Offset((req.Page-1)*req.Per).Scan(ctx, &res)
137158
if err != nil {
138159
return AccountBillRes{}, errorx.HandleDBError(err, nil)
139160
}

builder/store/database/account_bill_test.go

Lines changed: 94 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ func TestAccountBillStore_List(t *testing.T) {
1717
ctx := context.TODO()
1818

1919
dt := time.Date(2022, 11, 22, 3, 0, 0, 0, time.UTC)
20+
2021
bills := []database.AccountBill{
2122
{
2223
// included
@@ -88,13 +89,105 @@ func TestAccountBillStore_List(t *testing.T) {
8889
require.Nil(t, err)
8990
require.Equal(t, 2, len(res.Data))
9091
expectedData := []types.ITEM{
91-
{Consumption: 21, InstanceName: "c2", Value: 20, PromptToken: 0, CompletionToken: 0},
9292
{Consumption: 31, InstanceName: "c1", Value: 28, PromptToken: 0, CompletionToken: 0},
93+
{Consumption: 21, InstanceName: "c2", Value: 20, PromptToken: 0, CompletionToken: 0},
9394
}
9495
require.Equal(t, expectedData, res.Data)
9596

9697
}
9798

99+
func TestAccountBillStore_ListWithDeployJoin(t *testing.T) {
100+
db := tests.InitTestDB()
101+
defer db.Close()
102+
ctx := context.TODO()
103+
104+
dt := time.Date(2022, 11, 22, 3, 0, 0, 0, time.UTC)
105+
106+
deploys := []database.Deploy{
107+
{
108+
SvcName: "c2",
109+
SpaceID: 1,
110+
Status: 1,
111+
GitPath: "path",
112+
GitBranch: "main",
113+
Template: "tpl",
114+
Hardware: "hw",
115+
UserID: 1,
116+
},
117+
{
118+
SvcName: "c1",
119+
SpaceID: 2,
120+
Status: 1,
121+
GitPath: "path",
122+
GitBranch: "main",
123+
Template: "tpl",
124+
Hardware: "hw",
125+
UserID: 2,
126+
},
127+
}
128+
_, err := db.Operator.Core.NewInsert().Model(&deploys).Exec(ctx)
129+
require.Nil(t, err)
130+
131+
// Give deploys distinct created_at values so d.created_at DESC is deterministic
132+
_, err = db.Operator.Core.NewUpdate().
133+
Model((*database.Deploy)(nil)).
134+
Set("created_at = ?", dt.Add(2*24*time.Hour)).
135+
Where("svc_name = 'c2'").
136+
Exec(ctx)
137+
require.Nil(t, err)
138+
_, err = db.Operator.Core.NewUpdate().
139+
Model((*database.Deploy)(nil)).
140+
Set("created_at = ?", dt.Add(1*24*time.Hour)).
141+
Where("svc_name = 'c1'").
142+
Exec(ctx)
143+
require.Nil(t, err)
144+
145+
bills := []database.AccountBill{
146+
{
147+
UserUUID: "foo", Value: 3, Consumption: 4,
148+
BillDate: dt.Add(-3 * 24 * time.Hour), CustomerID: "c1",
149+
Scene: types.SceneSpace,
150+
},
151+
{
152+
UserUUID: "foo", Value: 5, Consumption: 6,
153+
BillDate: dt.Add(-1 * 24 * time.Hour), CustomerID: "c1",
154+
Scene: types.SceneSpace,
155+
},
156+
{
157+
UserUUID: "foo", Value: 20, Consumption: 21,
158+
BillDate: dt.Add(2 * 24 * time.Hour), CustomerID: "c1",
159+
Scene: types.SceneSpace,
160+
},
161+
{
162+
UserUUID: "foo", Value: 20, Consumption: 21,
163+
BillDate: dt.Add(3 * 24 * time.Hour), CustomerID: "c2",
164+
Scene: types.SceneSpace,
165+
},
166+
}
167+
_, err = db.Operator.Core.NewInsert().Model(&bills).Exec(ctx)
168+
require.Nil(t, err)
169+
170+
store := database.NewAccountBillStoreWithDB(db)
171+
res, err := store.ListByUserIDAndDate(ctx, types.AcctBillsReq{
172+
TargetUUID: "foo",
173+
Scene: types.SceneSpace,
174+
StartDate: dt.Add(-5 * 24 * time.Hour).Format(time.RFC3339),
175+
EndDate: dt.Add(5 * 24 * time.Hour).Format(time.RFC3339),
176+
Per: 20,
177+
Page: 1,
178+
})
179+
require.Nil(t, err)
180+
require.Equal(t, 2, len(res.Data))
181+
// c2 deploy has later created_at, so d.created_at DESC puts c2 first
182+
require.Equal(t, "c2", res.Data[0].InstanceName)
183+
require.Equal(t, float64(21), res.Data[0].Consumption)
184+
require.Equal(t, float64(20), res.Data[0].Value)
185+
require.Equal(t, "c1", res.Data[1].InstanceName)
186+
require.Equal(t, float64(31), res.Data[1].Consumption)
187+
require.Equal(t, float64(28), res.Data[1].Value)
188+
189+
}
190+
98191
func TestAccountBillStore_ListBillsDetailByUserID(t *testing.T) {
99192
db := tests.InitTestDB()
100193
defer db.Close()

builder/store/database/account_statement_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,7 @@ func TestAccountStatementStore_ListGroupedByUserAndSku(t *testing.T) {
426426

427427
res, total, err := store.ListStatementByUserAndSku(ctx, types.ActStatementsReq{
428428
UserUUID: "user1",
429-
Scene: int(types.SceneCashCharge),
429+
Scene: types.SceneCashCharge,
430430
InstanceName: "cust1",
431431
StartTime: dt.Add(-time.Hour).Format(time.RFC3339),
432432
EndTime: dt.Add(time.Hour).Format(time.RFC3339),

common/types/accounting.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -248,15 +248,15 @@ type AcctSubscriptionNotify struct {
248248
}
249249

250250
type ActStatementsReq struct {
251-
CurrentUser string `json:"current_user"`
252-
UserUUID string `json:"user_uuid"`
253-
Scene int `json:"scene"`
254-
InstanceName string `json:"instance_name"`
255-
StartTime string `json:"start_time"`
256-
EndTime string `json:"end_time"`
257-
Per int `json:"per"`
258-
Page int `json:"page"`
259-
UserName string `json:"user_name"`
251+
CurrentUser string `json:"current_user"`
252+
UserUUID string `json:"user_uuid"`
253+
Scene SceneType `json:"scene"`
254+
InstanceName string `json:"instance_name"`
255+
StartTime string `json:"start_time"`
256+
EndTime string `json:"end_time"`
257+
Per int `json:"per"`
258+
Page int `json:"page"`
259+
UserName string `json:"user_name"`
260260
}
261261

262262
type AcctBillsReq struct {

component/cluster.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ func (c *clusterComponentImpl) GetDeploys(ctx context.Context, req types.DeployR
180180
continue
181181
}
182182
req2 := types.ActStatementsReq{
183-
Scene: int(scene),
183+
Scene: scene,
184184
UserUUID: deploy.UserUUID,
185185
StartTime: deploy.CreatedAt.Format(time.DateTime),
186186
EndTime: time.Now().Format(time.DateTime),

0 commit comments

Comments
 (0)