完成UR46后端任务收口

This commit is contained in:
2026-07-23 15:06:48 +09:00
parent 8d65b26e96
commit cde5369b30
8 changed files with 306 additions and 46 deletions

View File

@@ -92,6 +92,38 @@ func TestCalculate(t *testing.T) {
return []*model.PackageUsage{current, queued}
}(), wantStatus: constants.PackageExpiryEstimateStatusInvalidData,
},
{
name: "已过期退款软删除加油包均排除", usages: func() []*model.PackageUsage {
expired := newUsage(1, constants.PackageUsageStatusExpired, 1)
invalidated := newUsage(2, constants.PackageUsageStatusInvalidated, 2)
refundID := uint(3)
refunded := newUsage(3, constants.PackageUsageStatusActive, 3)
refunded.RefundID = &refundID
deleted := newUsage(4, constants.PackageUsageStatusActive, 4)
deleted.DeletedAt = gorm.DeletedAt{Time: now, Valid: true}
masterID := uint(1)
addon := newUsage(5, constants.PackageUsageStatusActive, 5)
addon.MasterUsageID = &masterID
return []*model.PackageUsage{expired, invalidated, refunded, deleted, addon}
}(), wantStatus: constants.PackageExpiryEstimateStatusNone,
},
{
name: "多个当前套餐为异常数据", usages: func() []*model.PackageUsage {
first := newUsage(1, constants.PackageUsageStatusActive, 1)
first.ExpiresAt = &currentExpiry
second := newUsage(2, constants.PackageUsageStatusDepleted, 2)
second.ExpiresAt = &currentExpiry
return []*model.PackageUsage{first, second}
}(), wantStatus: constants.PackageExpiryEstimateStatusInvalidData,
},
{
name: "已过期当前套餐返回负数自然日", usages: func() []*model.PackageUsage {
expiry := time.Date(2026, 7, 20, 23, 59, 59, 0, location)
u := newUsage(1, constants.PackageUsageStatusActive, 1)
u.ExpiresAt = &expiry
return []*model.PackageUsage{u}
}(), wantStatus: constants.PackageExpiryEstimateStatusExact, wantDays: intPointer(-3),
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
@@ -158,6 +190,25 @@ func TestQueryResolveBatchUsesOneBatchLoad(t *testing.T) {
}
}
// TestQueryIndexesExplainAnalyze 验证开发 PostgreSQL 为两类资产队列查询选择 UR46 部分索引。
func TestQueryIndexesExplainAnalyze(t *testing.T) {
tx := testutil.NewPostgresTransaction(t)
queries := []string{
"EXPLAIN ANALYZE SELECT id FROM tb_package_usage WHERE iot_card_id = 970001 AND master_usage_id IS NULL AND refund_id IS NULL AND status IN (0, 1, 2) ORDER BY priority ASC, created_at ASC, id ASC",
"EXPLAIN ANALYZE SELECT id FROM tb_package_usage WHERE device_id = 970001 AND master_usage_id IS NULL AND refund_id IS NULL AND status IN (0, 1, 2) ORDER BY priority ASC, created_at ASC, id ASC",
}
for _, query := range queries {
var lines []string
if err := tx.Raw(query).Scan(&lines).Error; err != nil {
t.Fatalf("执行 EXPLAIN ANALYZE 失败:%v", err)
}
if len(lines) == 0 {
t.Fatal("EXPLAIN ANALYZE 未返回执行计划")
}
t.Logf("%s", lines)
}
}
func modelBase(id uint, createdAt time.Time) gorm.Model {
return gorm.Model{ID: id, CreatedAt: createdAt}
}