feat(customer): 客户列表展示等级徽标并统一等级不落库口径
评级计算器并入客户管理后,列表只有分数看不出档位,本批补上等级徽标: - 抽出 utils/rating.ts 的 resolveGrade(按 sort_order 升序取首个 min_score ≤ 总分的等级,单边判定避免区间边界歧义),列表页与弹窗共用 - 等级映射按需拉取并缓存在内存,等级配置改动后回调父页重拉,避免 「同一分数在弹窗是 B、在列表是 C」的两处口径分歧 - 徽标色调按等级名首字母映射,自定义等级名落回中性灰(等级名可配置, 不能靠写死枚举判语义色) - 悬浮提示给出等级区间与评级时间 同时订正三处与实现不符的注释:rate_customer 实际只写 rating_score 与 rating_time,等级由分数按当前映射实时推导,三处却写成「后端判定并固化等级 名快照」,v13 迁移 docstring 还引用了并不存在的 v14(d5b8f2a46c71)。 纯注释改动,无逻辑变更。 Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
1 parent
61fe5cca98
commit
111ac5425a
7 files changed
+220
-42
No files matched your search
@@ -9,9 +9,9 @@ Create Date: 2026-10-23 10:30:00.000000
|
||||
两列均可空(null = 未评分,历史客户与新客户无需回填),人工维护字段,
|
||||
T+ 同步守则不覆盖(见 TPlusSyncMixin 的同步守则说明)。
|
||||
|
||||
五项评分明细与命中等级不落库:等级映射是可变判定表,回溯「当时命中的
|
||||
等级」需要快照设计,超出档案属性的范围;评级时间已足够回答「这个分是
|
||||
什么时候打的」。
|
||||
五项评分明细与命中等级都不落库:前者是打分过程的中间量,没有下游消费方;
|
||||
后者由分数按当前等级映射实时推导(等级映射是可变判定表,改了配置全部客户
|
||||
的等级随之更新),因此本迁移只落总分与评级时间两列。
|
||||
"""
|
||||
|
||||
from collections.abc import Sequence
|
||||
|
||||
@@ -32,8 +32,9 @@ def list_all(session: Session, *, for_update: bool = False) -> list[CustomerRati
|
||||
def get_by_id(session: Session, grade_id: int) -> CustomerRatingGrade | None:
|
||||
"""按主键查询。
|
||||
|
||||
等级表无下游引用(评级是纯计算器不落评分记录),无需 ``for_update``
|
||||
锁行 —— product_repository 锁行防的是并发引用悬空,此处不存在该风险。
|
||||
等级表无外键引用(客户档案只存总分,等级由分数按当前映射实时推导,
|
||||
不存等级 id),无需 ``for_update`` 锁行 —— product_repository 锁行防的
|
||||
是并发引用悬空,此处不存在该风险:删掉一个等级,只是以后不再判到它。
|
||||
"""
|
||||
return session.get(CustomerRatingGrade, grade_id)
|
||||
|
||||
@@ -60,6 +61,10 @@ def create(session: Session, grade: CustomerRatingGrade) -> CustomerRatingGrade:
|
||||
|
||||
|
||||
def delete(session: Session, grade: CustomerRatingGrade) -> None:
|
||||
"""物理删除等级。等级表无下游引用,调用方无需引用保护校验。"""
|
||||
"""物理删除等级。
|
||||
|
||||
等级表无外键引用(客户档案只存总分,不存等级 id),调用方无需引用保护
|
||||
校验:删掉等级只是「以后不再判到它」,已存的总分不受影响。
|
||||
"""
|
||||
session.delete(grade)
|
||||
session.flush()
|
||||
@@ -280,7 +280,7 @@ def rate_customer(
|
||||
评分是客户档案属性而非审计事件:只存总分与评级时间,五项明细与所用
|
||||
等级配置不落库(对照表 #25 的定位口径)——等级映射是可变判定表,回溯
|
||||
「当时命中的等级」需要快照设计,超出档案属性的范围;评级时间已足够
|
||||
回答「这个分是什么时候打的」。
|
||||
回答「这个分是什么时候打的」。等级由前端按当前映射实时算并展示。
|
||||
|
||||
:raises NotFoundError: 客户不存在
|
||||
"""
|
||||
|
||||
Reference in new issue
Block a user