打通 T+ 快照、业务、发货、回款和核算准备链路,保留来源差异并提供待补状态。 新增业务自动接入任务、跨平台读取服务托管、权限复核、来源关联和前端核对页面。 补充迁移、隔离集成测试、浏览器模拟验收及角色授权边界修复。
52 lines
3.0 KiB
Python
52 lines
3.0 KiB
Python
"""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="最小必要来源与差异说明")
|