"""计提公式模板定义模型。 把一期代码内注册表升级为数据库配置:模板名称、说明、参数绑定可在页面维护, 公式执行骨架仍是受控枚举(formula_type),不允许自由表达式,避免注入与算错。 岗位角色 `business_roles.calc_template` 绑定模板编码,编码创建后不可修改。 """ from sqlalchemy import JSON, Integer, String from sqlalchemy.orm import Mapped, mapped_column from app.models.base import BIGINT_UNSIGNED, TINYINT_TYPE, Base, TimestampMixin, mysql_table_args class CalcTemplateDefinition(Base, TimestampMixin): """计提公式模板定义表。内置模板随迁移初始化,页面可新增自定义模板。""" __tablename__ = "calc_template_definitions" __table_args__ = mysql_table_args("计提公式模板定义表(页面可维护,骨架受控)") id: Mapped[int] = mapped_column( BIGINT_UNSIGNED, primary_key=True, autoincrement=True, comment="主键ID" ) template_code: Mapped[str] = mapped_column( String(32), nullable=False, unique=True, comment="模板编码,创建后不可修改;岗位表 business_roles.calc_template 引用", ) template_name: Mapped[str] = mapped_column(String(64), nullable=False, comment="模板名称") formula_type: Mapped[str] = mapped_column( String(32), nullable=False, comment="公式骨架类型:linear_decay/fixed_profit/fixed_sales/manager_share/prepay_fixed,创建后不可修改", ) params_json: Mapped[dict] = mapped_column( JSON, nullable=False, comment="骨架参数角色到参数编码的 JSON 映射,如 {start:..., slope:...}", ) description: Mapped[str | None] = mapped_column(String(255), comment="模板说明") sort_order: Mapped[int] = mapped_column( Integer, nullable=False, server_default="0", comment="显示排序" ) status: Mapped[int] = mapped_column( TINYINT_TYPE, nullable=False, server_default="1", comment="状态:1启用 0停用" ) is_system: Mapped[int] = mapped_column( TINYINT_TYPE, nullable=False, server_default="0", comment="是否系统模板:1内置(禁删、骨架与编码锁定) 0自定义", )