feat(category): 类目树、属性、属性字典维护,新增系统管理员管理类目数据
This commit is contained in:
@@ -155,7 +155,7 @@
|
||||
| description_category_id | integer | ✅ 是 | 类目 ID |
|
||||
| type_id | integer | ✅ 是 | 商品类型 ID |
|
||||
| language | string | 可选 | 语言代码 |
|
||||
| limit | integer | 可选 | 每页数量,最大 **5000**,默认 1000 |
|
||||
| limit | integer | ✅ 是 | 每页数量,范围 **1–2000**;Atlas 当前首批请求使用 1000 |
|
||||
| last_value_id | integer | 可选 | 分页游标(上一页最后一个值的 `id`),首页传 0 |
|
||||
|
||||
---
|
||||
@@ -209,7 +209,7 @@ async def fetch_all_values(attribute_id, category_id, type_id):
|
||||
"description_category_id": category_id,
|
||||
"type_id": type_id,
|
||||
"language": "RU",
|
||||
"limit": 5000,
|
||||
"limit": 2000,
|
||||
"last_value_id": last_id
|
||||
}
|
||||
)
|
||||
@@ -431,48 +431,9 @@ if missing:
|
||||
|
||||
## 7. 缓存策略
|
||||
|
||||
### 属性列表缓存
|
||||
Ozon 只定义查询参数和分页规则,不规定 Atlas 的 TTL。2026-09-18 的[架构决策](../../architecture/platform-product-reference-catalog.md)将属性定义和字典候选值设为平台级参考数据:同一平台所有门店共用,本阶段不维护门店差异层;此方案尚未实现。当前代码仍以门店、类目和类型为作用域按需同步,用户从 Atlas 本地缓存读取。
|
||||
|
||||
```python
|
||||
# 按 (category_id, type_id) 缓存
|
||||
# TTL 7 天(属性变化极少)
|
||||
|
||||
from functools import lru_cache
|
||||
|
||||
@lru_cache(maxsize=500)
|
||||
async def get_attributes_cached(category_id: int, type_id: int):
|
||||
# 先查数据库
|
||||
cached = await db.query(CategoryAttribute).filter_by(
|
||||
description_category_id=category_id,
|
||||
type_id=type_id
|
||||
).all()
|
||||
|
||||
if cached:
|
||||
return cached
|
||||
|
||||
# 未缓存,调 API
|
||||
attrs = await fetch_category_attributes(category_id, type_id)
|
||||
|
||||
# 写入数据库
|
||||
await save_attributes_to_db(attrs)
|
||||
|
||||
return attrs
|
||||
```
|
||||
|
||||
### 字典值缓存(按需)
|
||||
|
||||
```python
|
||||
# 字典值可能很大(数万条),不全量缓存
|
||||
# 策略:用户映射到某属性时,才拉该属性的字典(且优先用 /search)
|
||||
|
||||
async def get_attribute_values(attr_id, category_id, type_id, keyword=None):
|
||||
if keyword:
|
||||
# 有关键词 → 搜索接口(limit 100)
|
||||
return await search_values(attr_id, category_id, type_id, keyword)
|
||||
else:
|
||||
# 无关键词 → 拉全量(分页,存数据库)
|
||||
return await fetch_all_values(attr_id, category_id, type_id)
|
||||
```
|
||||
目标同步方式:对活跃 `description_category_id + type_id` 的属性定义定期后台复核;字典候选值至少以类目、类型、属性、字典 ID 和语言限定作用域。`category_dependent=false` 可以作为进一步去重的依据,但在跨账号/跨类目验证前不能只以 `dictionary_id` 合并。小字典可完整分页并标记 `complete`;大字典先保存常用页与搜索命中,并明确标记 `partial`。搜索结果不是全集,不能据此清理未命中的旧值。定时和管理员手动同步必须共用异步任务链路,成功后原子切换版本,失败保留上次成功值。
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user