Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 9 additions & 6 deletions monkeyai/backend/internal/billing/query.sql
Original file line number Diff line number Diff line change
Expand Up @@ -444,21 +444,24 @@ SELECT
COALESCE(t.reserved, 0)::text)
FROM
credit_accounts a
LEFT JOIN LATERAL (
LEFT JOIN (
SELECT
account_id,
sum(credit_delta) balance
FROM
credit_ledger_entries
WHERE
account_id = a.id) l ON TRUE
LEFT JOIN LATERAL (
GROUP BY
account_id) l ON l.account_id = a.id
LEFT JOIN (
SELECT
account_id,
sum(reserve) reserved
FROM
billing_transactions
WHERE
account_id = a.id
AND status NOT IN ('settled', 'released', 'rejected')) t ON TRUE
status NOT IN ('settled', 'released', 'rejected')
GROUP BY
account_id) t ON t.account_id = a.id
WHERE
a.balance <> COALESCE(l.balance, 0)
OR a.frozen <> COALESCE(t.reserved, 0)
Expand Down
51 changes: 51 additions & 0 deletions monkeyai/backend/internal/billing/query_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package billing

import (
"testing"

"github.com/chaitin/MonkeyCode/monkeyai/backend/internal/billing/sqlc"
"github.com/chaitin/MonkeyCode/monkeyai/backend/internal/resource"
)

func TestAccountDifferences(t *testing.T) {
s, user, model := fixture(t)
ctx := t.Context()
query := sqlc.New(s.pool)
account, err := s.Account(ctx, user)
if err != nil {
t.Fatal(err)
}
check := func(want int) []resource.Object {
t.Helper()
differences, err := resource.DecodeObjects(query.AccountDifferences(ctx))
if err != nil {
t.Fatal(err)
}
if len(differences) != want {
t.Fatalf("账户差异数量错误: got=%d want=%d differences=%v", len(differences), want, differences)
}
return differences
}

check(0)
if _, err = s.Begin(ctx, Request{UserID: user, ResourceID: model, Category: "model"}); err != nil {
t.Fatal(err)
}
check(0)

if _, err = s.pool.Exec(ctx, `UPDATE credit_accounts SET frozen = frozen + 1 WHERE id = $1`, account.ID); err != nil {
t.Fatal(err)
}
differences := check(1)
if differences[0].String("account_id") != account.ID || differences[0].String("frozen") == differences[0].String("reserved") {
t.Fatalf("未识别冻结额差异: %v", differences[0])
}

if _, err = s.pool.Exec(ctx, `UPDATE credit_accounts SET frozen = frozen - 1, balance = balance - 1 WHERE id = $1`, account.ID); err != nil {
t.Fatal(err)
}
differences = check(1)
if differences[0].String("balance") == differences[0].String("ledger_balance") {
t.Fatalf("未识别账本余额差异: %v", differences[0])
}
}
15 changes: 9 additions & 6 deletions monkeyai/backend/internal/billing/sqlc/query.sql.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
DROP INDEX CONCURRENTLY IF EXISTS billing_transactions_pending_time_idx;
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
CREATE INDEX CONCURRENTLY billing_transactions_pending_time_idx
ON billing_transactions(started_at, id)
WHERE status NOT IN ('settled', 'released', 'rejected');
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
DROP INDEX CONCURRENTLY IF EXISTS billing_transactions_pending_account_idx;
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
CREATE INDEX CONCURRENTLY billing_transactions_pending_account_idx
ON billing_transactions(account_id)
INCLUDE (reserve)
WHERE status NOT IN ('settled', 'released', 'rejected');
Loading