"""T+ 业务自动接入:源级开关与单据差异账本,不承载核算结果。""" from datetime import date from sqlalchemy import JSON, Date, Integer, String, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column from app.models.base import BIGINT_UNSIGNED, TINYINT_TYPE, Base, TimestampMixin, mysql_table_args class TPlusBusinessSyncConfig(Base, TimestampMixin): """每个源账套一条设置;启用后才按起点自动排队接入。""" __tablename__ = "tplus_business_sync_configs" __table_args__ = mysql_table_args( "T+业务自动接入设置", UniqueConstraint("source_database", name="uk_tplus_business_sync_configs_source"), ) id: Mapped[int] = mapped_column(BIGINT_UNSIGNED, primary_key=True, autoincrement=True, comment="主键ID") source_database: Mapped[str] = mapped_column(String(128), comment="源账套") enabled: Mapped[int] = mapped_column(TINYINT_TYPE, server_default="0", comment="自动接入是否启用:1启用0关闭") start_date: Mapped[date] = mapped_column(Date, comment="业务接入起点") version: Mapped[int] = mapped_column(Integer, server_default="0", comment="配置乐观版本") updated_by: Mapped[int] = mapped_column(BIGINT_UNSIGNED, comment="授权启用账号") last_error: Mapped[str | None] = mapped_column(String(64), comment="后台接入暂停原因") class TPlusBusinessDocument(Base, TimestampMixin): """源单线与正式单据的对应关系与差异结论;重复同步只更新本表。""" __tablename__ = "tplus_business_documents" __table_args__ = mysql_table_args( "T+业务单据接入与差异账本", UniqueConstraint( "source_database", "entity_type", "source_id", name="uk_tplus_business_documents_source_entity_id", ), ) id: Mapped[int] = mapped_column(BIGINT_UNSIGNED, primary_key=True, autoincrement=True, comment="主键ID") source_database: Mapped[str] = mapped_column(String(128), comment="源账套") entity_type: Mapped[str] = mapped_column(String(32), comment="源实体") source_id: Mapped[str] = mapped_column(String(64), comment="源单据或明细ID") source_no: Mapped[str | None] = mapped_column(String(128), comment="原始单号") record_id: Mapped[int] = mapped_column(BIGINT_UNSIGNED, comment="当前观察到的源快照ID") applied_record_id: Mapped[int | None] = mapped_column(BIGINT_UNSIGNED, comment="已接入的源快照ID") fingerprint: Mapped[str | None] = mapped_column(String(64), comment="已应用的业务字段指纹") business_id: Mapped[int | None] = mapped_column(BIGINT_UNSIGNED, comment="关联业务ID") target_id: Mapped[int | None] = mapped_column(BIGINT_UNSIGNED, comment="正式单据或明细ID") status: Mapped[str] = mapped_column(String(24), default="PENDING", comment="APPLIED/PENDING/CONFLICT/EXCLUDED") reason: Mapped[str | None] = mapped_column(String(128), comment="固定待补或差异编码") data_json: Mapped[dict] = mapped_column(JSON, comment="最小必要来源与差异说明")