73 lines
2.6 KiB
Python
73 lines
2.6 KiB
Python
|
|
"""计提公式模板注册表(代码内有限集合)。
|
|||
|
|
|
|||
|
|
一期不引入规则引擎的落地方式:公式骨架固定(本表枚举),变化的是参数值
|
|||
|
|
(系统设置维护)。岗位角色(business_roles.calc_template)绑定模板编码,
|
|||
|
|
新增岗位 = 选模板 + 配参数,无需改代码(需求 #28)。
|
|||
|
|
新增公式形态(如未来「按产品数量计提」)需要新增模板 —— 一期接受,
|
|||
|
|
岗位表单中模板为带说明的受控下拉,避免误以为可自由写公式。
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
from dataclasses import dataclass
|
|||
|
|
|
|||
|
|
|
|||
|
|
@dataclass(frozen=True, slots=True)
|
|||
|
|
class TemplateSpec:
|
|||
|
|
"""公式模板元数据。"""
|
|||
|
|
|
|||
|
|
code: str
|
|||
|
|
name: str
|
|||
|
|
params: tuple[str, ...]
|
|||
|
|
description: str
|
|||
|
|
|
|||
|
|
|
|||
|
|
TEMPLATES: dict[str, TemplateSpec] = {
|
|||
|
|
"TPL_SALESPERSON_DECAY": TemplateSpec(
|
|||
|
|
code="TPL_SALESPERSON_DECAY",
|
|||
|
|
name="业务员个人户·天数线性递减",
|
|||
|
|
params=(
|
|||
|
|
"salesperson.rate.start",
|
|||
|
|
"salesperson.rate.slope",
|
|||
|
|
"salesperson.rate.floor",
|
|||
|
|
"salesperson.days.boundary",
|
|||
|
|
),
|
|||
|
|
description="分段:≤分界天数 = 起始 − 天数×斜率;>分界天数 = 下限",
|
|||
|
|
),
|
|||
|
|
"TPL_MANAGER_SHARE": TemplateSpec(
|
|||
|
|
code="TPL_MANAGER_SHARE",
|
|||
|
|
name="营销经理·团队与全公司分成",
|
|||
|
|
params=("manager.share.team", "manager.share.company"),
|
|||
|
|
description="聚合:∑本团队业务员绩效×12.5% + ∑全公司业务员绩效×5%",
|
|||
|
|
),
|
|||
|
|
"TPL_ENTERPRISE_FIXED": TemplateSpec(
|
|||
|
|
code="TPL_ENTERPRISE_FIXED",
|
|||
|
|
name="企业户·固定计提",
|
|||
|
|
params=("enterprise.rate",),
|
|||
|
|
description="乘法:折算毛利润额 × 计提比例",
|
|||
|
|
),
|
|||
|
|
"TPL_INFO_SALES_FIXED": TemplateSpec(
|
|||
|
|
code="TPL_INFO_SALES_FIXED",
|
|||
|
|
name="信息员·销售额固定比例",
|
|||
|
|
params=("info.rate",),
|
|||
|
|
description="乘法:本人销售额 × 计提比例",
|
|||
|
|
),
|
|||
|
|
"TPL_PREPAY_FIXED": TemplateSpec(
|
|||
|
|
code="TPL_PREPAY_FIXED",
|
|||
|
|
name="预付款·固定计提",
|
|||
|
|
params=("prepay.rate",),
|
|||
|
|
description="乘法:回款额 × 计提比例",
|
|||
|
|
),
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
def get_template(code: str) -> TemplateSpec:
|
|||
|
|
"""取模板元数据。未注册编码属代码缺陷(500),不是用户错误。"""
|
|||
|
|
tpl = TEMPLATES.get(code)
|
|||
|
|
if tpl is None:
|
|||
|
|
raise ValueError(f"公式模板编码未注册:{code}")
|
|||
|
|
return tpl
|
|||
|
|
|
|||
|
|
|
|||
|
|
def required_params(code: str) -> tuple[str, ...]:
|
|||
|
|
"""模板声明的参数编码列表(岗位表单展示与校验用)。"""
|
|||
|
|
return get_template(code).params
|