按 2026-11-02 需求补齐计划交付后端能力: - 角色授权:权限目录化,接口统一准入校验,未登记默认拒绝; 管理员判断改为按数据库角色重新判定,防止权限码持有者绕过 - 系统监控:单进程采集资源、请求与异常指标,分钟级聚合, 阈值配置化;敏感配置增加 repr 保护,Redis 密码 URL 转义 - 试用期计提:按回款日判定并写入快照,年度结清与调整单联动; 人员模型补试用期、离职日期与工资版本历史字段 - 计提模板:公式骨架受控,页面维护名称与参数绑定 - T+ 采集:自动化配置表与进度查询 内置角色禁停用保护对齐模块注释;核算规则版本提为常量并 补充批量核算失败堆栈日志。 影响范围:后端全部模块、数据库迁移 V22-V28 验证:uv run ruff check 通过;922 个单元测试全部通过; 集成测试因本机 MySQL 数据卷被其他容器锁定暂未运行
82 lines
3.6 KiB
Python
82 lines
3.6 KiB
Python
"""试用期缓发与结清记录,引用固化台账,不使用人员当前开关重写历史。"""
|
||
|
||
from datetime import datetime
|
||
from decimal import Decimal
|
||
|
||
from sqlalchemy import JSON, DateTime, ForeignKey, Index, Numeric, String, UniqueConstraint, text
|
||
from sqlalchemy.orm import Mapped, mapped_column
|
||
|
||
from app.models.base import BIGINT_UNSIGNED, Base, mysql_table_args
|
||
|
||
|
||
class ProbationDeferral(Base):
|
||
__tablename__ = "probation_deferrals"
|
||
__table_args__ = mysql_table_args(
|
||
"试用期缓发台账(每个正式台账版本一条)",
|
||
UniqueConstraint("ledger_id", name="uk_probation_deferrals_ledger_id"),
|
||
Index("idx_probation_deferrals_personnel_id_year", "personnel_id", "year"),
|
||
)
|
||
id: Mapped[int] = mapped_column(
|
||
BIGINT_UNSIGNED, primary_key=True, autoincrement=True, comment="主键ID"
|
||
)
|
||
ledger_id: Mapped[int] = mapped_column(
|
||
BIGINT_UNSIGNED,
|
||
ForeignKey("performance_ledgers.id", ondelete="RESTRICT"),
|
||
nullable=False,
|
||
comment="原核算台账版本ID",
|
||
)
|
||
personnel_id: Mapped[int] = mapped_column(BIGINT_UNSIGNED, nullable=False, comment="归属人员ID")
|
||
year: Mapped[str] = mapped_column(String(4), nullable=False, comment="原计提年度")
|
||
month: Mapped[str] = mapped_column(String(7), nullable=False, comment="本次计提或应付变化月份")
|
||
accrued: Mapped[Decimal] = mapped_column(
|
||
Numeric(14, 2), nullable=False, comment="本次试用期计提额,可负"
|
||
)
|
||
eligible: Mapped[Decimal] = mapped_column(
|
||
Numeric(14, 2), nullable=False, comment="满足起付及权重的本次应付差额,可负"
|
||
)
|
||
create_time: Mapped[datetime] = mapped_column(
|
||
DateTime, server_default=text("CURRENT_TIMESTAMP"), nullable=False, comment="创建时间"
|
||
)
|
||
|
||
|
||
class ProbationPayment(Base):
|
||
__tablename__ = "probation_payments"
|
||
__table_args__ = mysql_table_args(
|
||
"试用期年终及后续结清记录(工资生成事务内固化)",
|
||
UniqueConstraint(
|
||
"settlement_id",
|
||
"personnel_id",
|
||
"year",
|
||
name="uk_probation_payments_settlement_person_year",
|
||
),
|
||
UniqueConstraint("adjustment_order_id", name="uk_probation_payments_adjustment_order_id"),
|
||
Index("idx_probation_payments_personnel_id_year", "personnel_id", "year"),
|
||
)
|
||
id: Mapped[int] = mapped_column(
|
||
BIGINT_UNSIGNED, primary_key=True, autoincrement=True, comment="主键ID"
|
||
)
|
||
settlement_id: Mapped[int | None] = mapped_column(
|
||
BIGINT_UNSIGNED,
|
||
ForeignKey("monthly_settlements.id", ondelete="CASCADE"),
|
||
nullable=True,
|
||
comment="月结ID(当月调整单结清时为空)",
|
||
)
|
||
adjustment_order_id: Mapped[int | None] = mapped_column(
|
||
BIGINT_UNSIGNED,
|
||
ForeignKey("adjustment_orders.id", ondelete="RESTRICT"),
|
||
nullable=True,
|
||
comment="已生成工资后的结清调整单ID",
|
||
)
|
||
personnel_id: Mapped[int] = mapped_column(BIGINT_UNSIGNED, nullable=False, comment="归属人员ID")
|
||
year: Mapped[str] = mapped_column(String(4), nullable=False, comment="原累计年度")
|
||
month: Mapped[str] = mapped_column(String(7), nullable=False, comment="本次实际支付月份")
|
||
amount: Mapped[Decimal] = mapped_column(
|
||
Numeric(14, 2), nullable=False, comment="本次补发或扣回金额"
|
||
)
|
||
snapshot_json: Mapped[dict] = mapped_column(
|
||
JSON, nullable=False, comment="计提、起付权重、门槛及历史补发依据"
|
||
)
|
||
create_time: Mapped[datetime] = mapped_column(
|
||
DateTime, server_default=text("CURRENT_TIMESTAMP"), nullable=False, comment="创建时间"
|
||
)
|