perf: 优化租户OSS总计存储逻辑

This commit is contained in:
2026-03-18 14:26:15 +08:00
parent 63681c3a91
commit 8e2ea0bde1
2 changed files with 18 additions and 32 deletions

View File

@@ -19,34 +19,20 @@ type tenantOssTotal struct{}
// SaveOrUpdate 增加或更新 // SaveOrUpdate 增加或更新
func (d *tenantOssTotal) SaveOrUpdate(ctx context.Context, updateData []*dto.UpdateUsedOssReq) (err error) { func (d *tenantOssTotal) SaveOrUpdate(ctx context.Context, updateData []*dto.UpdateUsedOssReq) (err error) {
if !g.IsEmpty(updateData) { if !g.IsEmpty(updateData) {
data := make([]gdb.Map, 0, len(updateData))
for _, v := range updateData { for _, v := range updateData {
model := gfdb.DB(ctx).Model(ctx, consts.TenantOssTotalCollection).Where(gdb.Map{"tenant_id": v.TenantId}) data = append(data, gdb.Map{
// 检查是否存在 entity.TenantOssCol.Bid: guid.S(),
count, err := model.Count() entity.TenantOssCol.TenantId: v.TenantId,
if err != nil { entity.TenantOssCol.UsedOssSize: v.UsedOssSize,
return err entity.TenantOssCol.TotalOssSize: v.TotalOssSize,
} entity.TenantOssCol.Creator: v.Updater,
if count > 0 { entity.TenantOssCol.Updater: v.Updater,
// 更新 })
_, err = model.Data(gdb.Map{ }
"used_oss_size": v.UsedOssSize, _, err = gfdb.DB(ctx).Model(ctx, consts.TenantOssTotalCollection).Data(data).OnConflict(entity.TenantOssCol.TenantId).Save()
"total_oss_size": v.TotalOssSize, if err != nil {
"updater": v.Updater, return err
}).Update()
} else {
// 插入
_, err = gfdb.DB(ctx).Model(ctx, consts.TenantOssTotalCollection).Data(gdb.Map{
"bid": guid.S(),
"tenant_id": v.TenantId,
"used_oss_size": v.UsedOssSize,
"total_oss_size": v.TotalOssSize,
"creator": v.Updater,
"updater": v.Updater,
}).Insert()
}
if err != nil {
return err
}
} }
} }
return return

View File

@@ -44,11 +44,10 @@ COMMENT ON COLUMN file.file_size IS '文件大小(字节)';
--------------------pgsql创建tenant_oss_total表语句--------------------------- --------------------pgsql创建tenant_oss_total表语句---------------------------
-- 租户存储服务总计表 -- 租户存储服务总计表
CREATE TABLE IF NOT EXISTS tenant_oss_total ( CREATE TABLE IF NOT EXISTS tenant_oss_total (
-- 基础字段 -- 基础字段
id BIGSERIAL PRIMARY KEY, id BIGSERIAL PRIMARY KEY, -- 保留id作为主键
bid VARCHAR(64) NOT NULL, bid VARCHAR(64) NOT NULL,
creator VARCHAR(64) NOT NULL, creator VARCHAR(64) NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
@@ -62,9 +61,10 @@ CREATE TABLE IF NOT EXISTS tenant_oss_total (
used_oss_size INT NOT NULL DEFAULT 0, used_oss_size INT NOT NULL DEFAULT 0,
total_oss_size INT NOT NULL DEFAULT 0, total_oss_size INT NOT NULL DEFAULT 0,
-- 唯一索引 & 普通索引 -- 唯一索引仅约束tenant_id唯一性不替代主键
CONSTRAINT uk_tenant_oss_total_tenant_id UNIQUE (tenant_id) CONSTRAINT uk_tenant_oss_total_tenant_id UNIQUE (tenant_id)
); );
-- 为租户存储表添加索引 -- 为租户存储表添加索引
CREATE INDEX idx_tenant_oss_total_used_size ON tenant_oss_total(used_oss_size); CREATE INDEX idx_tenant_oss_total_used_size ON tenant_oss_total(used_oss_size);
CREATE INDEX idx_tenant_oss_total_total_size ON tenant_oss_total(total_oss_size); CREATE INDEX idx_tenant_oss_total_total_size ON tenant_oss_total(total_oss_size);
@@ -79,7 +79,7 @@ COMMENT ON COLUMN tenant_oss_total.updater IS '更新人';
COMMENT ON COLUMN tenant_oss_total.updated_at IS '更新时间'; COMMENT ON COLUMN tenant_oss_total.updated_at IS '更新时间';
COMMENT ON COLUMN tenant_oss_total.deleter IS '删除人(软删)'; COMMENT ON COLUMN tenant_oss_total.deleter IS '删除人(软删)';
COMMENT ON COLUMN tenant_oss_total.deleted_at IS '删除时间(软删)'; COMMENT ON COLUMN tenant_oss_total.deleted_at IS '删除时间(软删)';
COMMENT ON COLUMN tenant_oss_total.tenant_id IS '租户ID'; COMMENT ON COLUMN tenant_oss_total.tenant_id IS '租户ID(唯一)';
COMMENT ON COLUMN tenant_oss_total.used_oss_size IS '已使用存储大小(字节)'; COMMENT ON COLUMN tenant_oss_total.used_oss_size IS '已使用存储大小(字节)';
COMMENT ON COLUMN tenant_oss_total.total_oss_size IS '总存储大小(字节)'; COMMENT ON COLUMN tenant_oss_total.total_oss_size IS '总存储大小(字节)';