feat(tplus): 新增同步暂存与任务管理迁移和环境配置

This commit is contained in:
liuwenxin committed 2026-10-28 11:41:38 +08:00
1 parent 823d9f02ec
commit 78bef43c06
29 files changed
+1326 -5

No files matched your search

@@ -1,4 +1,4 @@
-- V10: 客户评级落库(2026-10-23)
-- V13: 客户评级落库(2026-10-23,原文件误标为 V10)
-- 评级计算器从独立工具页并入客户管理(行内弹窗),评分保存为客户档案属性;
-- 两列可空(null=未评分,存量客户无需回填),人工维护字段,T+ 同步不覆盖。
-- 对应迁移:alembic/versions/c3a9e1d7b2f4_v13_客户评级落库.py
@@ -8,3 +8,5 @@ ALTER TABLE `customers`
ADD COLUMN `rating_score` TINYINT COMMENT '评级总分(0-100,评级计算器保存;null=未评分;人工维护字段,T+ 同步不覆盖)' AFTER `remark`;
ALTER TABLE `customers`
ADD COLUMN `rating_time` DATETIME COMMENT '最近评级时间(评级计算器保存评分时刷新;人工维护字段)' AFTER `rating_score`;
UPDATE alembic_version SET version_num='c3a9e1d7b2f4' WHERE version_num='7f4f7b918bc4';
+83
View File
@@ -0,0 +1,83 @@
-- V14: T+ 只读同步批次、错误、staging 和增量水位。
-- 对应 Alembic:backend/alembic/versions/d4e5f6a7b8c9_tplus_sync_staging.py
ALTER TABLE personnel ADD COLUMN source_updated_at DATETIME COMMENT 'T+ 源数据更新时间(未确认时可为空)' AFTER synced_at;
ALTER TABLE products ADD COLUMN source_updated_at DATETIME COMMENT 'T+ 源数据更新时间(未确认时可为空)' AFTER synced_at;
ALTER TABLE customers ADD COLUMN source_updated_at DATETIME COMMENT 'T+ 源数据更新时间(未确认时可为空)' AFTER synced_at;
ALTER TABLE businesses ADD COLUMN source_updated_at DATETIME COMMENT 'T+ 源数据更新时间(未确认时可为空)' AFTER synced_at;
ALTER TABLE shipments ADD COLUMN source_updated_at DATETIME COMMENT 'T+ 源数据更新时间(未确认时可为空)' AFTER synced_at;
ALTER TABLE receipts ADD COLUMN source_updated_at DATETIME COMMENT 'T+ 源数据更新时间(未确认时可为空)' AFTER synced_at;
CREATE TABLE tplus_sync_batches (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
batch_no VARCHAR(32) NOT NULL COMMENT '同步批次号',
sync_mode VARCHAR(16) NOT NULL COMMENT '同步模式:FULL全量 INCREMENTAL增量',
status VARCHAR(16) NOT NULL COMMENT '状态:RUNNING/SUCCEEDED/PARTIAL/FAILED',
source_database VARCHAR(128) COMMENT 'T+ 源数据库名',
started_at DATETIME NOT NULL COMMENT '开始读取时间',
finished_at DATETIME COMMENT '结束时间',
watermark_from DATETIME COMMENT '增量起始水位',
watermark_to DATETIME COMMENT '本批次结束水位',
source_record_count INT NOT NULL DEFAULT 0 COMMENT '源记录数',
staged_record_count INT NOT NULL DEFAULT 0 COMMENT '写入 staging 的记录数',
failed_record_count INT NOT NULL DEFAULT 0 COMMENT '失败记录数',
error_message TEXT COMMENT '批次错误摘要',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
CONSTRAINT pk_tplus_sync_batches PRIMARY KEY (id),
CONSTRAINT uk_tplus_sync_batches_batch_no UNIQUE (batch_no)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='T+ 同步批次表(记录读取范围、结果和对账统计)';
CREATE INDEX idx_tplus_sync_batches_status ON tplus_sync_batches (status);
CREATE INDEX idx_tplus_sync_batches_started_at ON tplus_sync_batches (started_at);
CREATE TABLE tplus_sync_errors (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
batch_no VARCHAR(32) NOT NULL COMMENT '同步批次号',
entity_type VARCHAR(32) NOT NULL COMMENT '业务实体类型',
source_table VARCHAR(128) NOT NULL COMMENT 'T+ 源表',
source_id VARCHAR(64) COMMENT 'T+ 源主键',
source_line_no VARCHAR(64) COMMENT 'T+ 明细行号或明细主键',
error_code VARCHAR(32) NOT NULL COMMENT '错误编码',
error_message TEXT NOT NULL COMMENT '错误说明',
retry_count INT NOT NULL DEFAULT 0 COMMENT '已重试次数',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
CONSTRAINT pk_tplus_sync_errors PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='T+ 同步错误表(记录失败行和重试信息)';
CREATE INDEX idx_tplus_sync_errors_batch_no ON tplus_sync_errors (batch_no);
CREATE INDEX idx_tplus_sync_errors_entity_type ON tplus_sync_errors (entity_type);
CREATE TABLE tplus_sync_records (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
batch_no VARCHAR(32) NOT NULL COMMENT '同步批次号',
entity_type VARCHAR(32) NOT NULL COMMENT '业务实体类型',
source_table VARCHAR(128) NOT NULL COMMENT 'T+ 源表',
source_id VARCHAR(64) NOT NULL COMMENT 'T+ 源主键',
source_no VARCHAR(64) COMMENT 'T+ 原始编号',
source_line_no VARCHAR(64) COMMENT 'T+ 明细行号或明细主键',
source_updated_at DATETIME COMMENT 'T+ 源数据更新时间',
row_hash VARCHAR(64) NOT NULL COMMENT '原始行 SHA-256',
state VARCHAR(16) NOT NULL DEFAULT 'PENDING' COMMENT '状态:PENDING/APPLIED/SKIPPED/ERROR',
payload_json JSON NOT NULL COMMENT '原始行 JSON',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
CONSTRAINT pk_tplus_sync_records PRIMARY KEY (id),
CONSTRAINT uk_tplus_sync_records_entity_source_hash UNIQUE (entity_type, source_id, row_hash)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='T+ 原始同步 staging 表(映射确认前只保存原始行,不直接改业务表)';
CREATE INDEX idx_tplus_sync_records_batch_no ON tplus_sync_records (batch_no);
CREATE INDEX idx_tplus_sync_records_source_no ON tplus_sync_records (source_no);
CREATE INDEX idx_tplus_sync_records_state ON tplus_sync_records (state);
CREATE TABLE tplus_sync_watermarks (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
entity_type VARCHAR(32) NOT NULL COMMENT '业务实体类型',
last_source_updated_at DATETIME COMMENT '最近源更新时间',
last_source_id VARCHAR(64) COMMENT '同一时间点的最后源主键',
status VARCHAR(16) NOT NULL DEFAULT 'READY' COMMENT '状态:READY/BLOCKED',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
CONSTRAINT pk_tplus_sync_watermarks PRIMARY KEY (id),
CONSTRAINT uk_tplus_sync_watermarks_entity_type UNIQUE (entity_type)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='T+ 增量同步水位表';
UPDATE alembic_version SET version_num='d4e5f6a7b8c9' WHERE alembic_version.version_num = 'c3a9e1d7b2f4';
@@ -0,0 +1,14 @@
-- T+ 任务管理扩展;对应 e5f607a8b9c0,不修改工资业务数据。
ALTER TABLE tplus_sync_batches ADD COLUMN entity_types_json JSON COMMENT '请求读取的实体类型;历史批次可为空';
ALTER TABLE tplus_sync_batches ADD COLUMN skipped_record_count INT NOT NULL DEFAULT 0 COMMENT '重复快照跳过条数';
ALTER TABLE tplus_sync_batches ADD COLUMN parent_batch_no VARCHAR(32) COMMENT '重试来源批次号,保留原批次记录';
ALTER TABLE tplus_sync_batches ADD COLUMN request_key VARCHAR(36) COMMENT '请求幂等键,空值用于历史和直接CLI任务';
ALTER TABLE tplus_sync_batches ADD COLUMN requested_by BIGINT UNSIGNED COMMENT '请求用户ID,CLI任务为空,无物理外键';
ALTER TABLE tplus_sync_batches ADD COLUMN audit_result_json JSON COMMENT '关联核验结果,只含系统字典和汇总';
ALTER TABLE tplus_sync_batches MODIFY COLUMN started_at DATETIME NULL COMMENT '开始执行时间(排队时为空)';
ALTER TABLE tplus_sync_batches MODIFY COLUMN sync_mode VARCHAR(16) NOT NULL COMMENT '任务方式:FULL全量 AUDIT关联核验 INCREMENTAL预留';
ALTER TABLE tplus_sync_batches MODIFY COLUMN status VARCHAR(16) NOT NULL COMMENT '状态:QUEUED/RUNNING/SUCCEEDED/PARTIAL/FAILED';
ALTER TABLE tplus_sync_batches ADD CONSTRAINT uk_tplus_sync_batches_request_key UNIQUE (request_key);
CREATE INDEX idx_tplus_sync_batches_parent_status ON tplus_sync_batches (parent_batch_no, status);
UPDATE tplus_sync_batches SET skipped_record_count=GREATEST(0, source_record_count-staged_record_count-failed_record_count) WHERE status='SUCCEEDED' AND sync_mode='FULL';
UPDATE alembic_version SET version_num='e5f607a8b9c0' WHERE version_num='d4e5f6a7b8c9';