feat(tplus): 新增同步暂存与任务管理迁移和环境配置
This commit is contained in:
1 parent
823d9f02ec
commit
78bef43c06
29 files changed
+1326
-5
No files matched your search
+95
-1
@@ -16,6 +16,10 @@
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
-- 删除顺序遵循外键依赖:先删子表
|
||||
DROP TABLE IF EXISTS `tplus_sync_watermarks`;
|
||||
DROP TABLE IF EXISTS `tplus_sync_records`;
|
||||
DROP TABLE IF EXISTS `tplus_sync_errors`;
|
||||
DROP TABLE IF EXISTS `tplus_sync_batches`;
|
||||
DROP TABLE IF EXISTS `performance_ledgers`;
|
||||
DROP TABLE IF EXISTS `settlement_items`;
|
||||
DROP TABLE IF EXISTS `adjustment_orders`;
|
||||
@@ -282,6 +286,7 @@ CREATE TABLE personnel (
|
||||
t_plus_id VARCHAR(64) COMMENT 'T+ 系统内部标识',
|
||||
sync_batch_no VARCHAR(32) COMMENT '同步批次号(同步模块写入)',
|
||||
synced_at DATETIME COMMENT '最近同步时间',
|
||||
source_updated_at DATETIME COMMENT 'T+ 源数据更新时间(未确认时可为空)',
|
||||
CONSTRAINT pk_personnel PRIMARY KEY (id),
|
||||
CONSTRAINT fk_personnel_business_role_id FOREIGN KEY(business_role_id) REFERENCES business_roles (id) ON DELETE RESTRICT,
|
||||
CONSTRAINT fk_personnel_manager_id FOREIGN KEY(manager_id) REFERENCES personnel (id) ON DELETE RESTRICT
|
||||
@@ -346,6 +351,7 @@ CREATE TABLE products (
|
||||
t_plus_id VARCHAR(64) COMMENT 'T+ 系统内部标识',
|
||||
sync_batch_no VARCHAR(32) COMMENT '同步批次号(同步模块写入)',
|
||||
synced_at DATETIME COMMENT '最近同步时间',
|
||||
source_updated_at DATETIME COMMENT 'T+ 源数据更新时间(未确认时可为空)',
|
||||
CONSTRAINT pk_products PRIMARY KEY (id),
|
||||
CONSTRAINT uk_products_name_spec UNIQUE (product_name, spec_model)
|
||||
)CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='产品表(类别锚定折算阈值参数;T+同步不覆盖产品类别)' COLLATE utf8mb4_general_ci;
|
||||
@@ -374,6 +380,7 @@ CREATE TABLE customers (
|
||||
t_plus_id VARCHAR(64) COMMENT 'T+ 系统内部标识',
|
||||
sync_batch_no VARCHAR(32) COMMENT '同步批次号(同步模块写入)',
|
||||
synced_at DATETIME COMMENT '最近同步时间',
|
||||
source_updated_at DATETIME COMMENT 'T+ 源数据更新时间(未确认时可为空)',
|
||||
CONSTRAINT pk_customers PRIMARY KEY (id),
|
||||
CONSTRAINT uk_customers_company_owner UNIQUE (company_name, owner_name),
|
||||
CONSTRAINT fk_customers_owner_personnel_id FOREIGN KEY(owner_personnel_id) REFERENCES personnel (id) ON DELETE RESTRICT
|
||||
@@ -518,6 +525,7 @@ CREATE TABLE businesses (
|
||||
t_plus_id VARCHAR(64) COMMENT 'T+ 系统内部标识',
|
||||
sync_batch_no VARCHAR(32) COMMENT '同步批次号(同步模块写入)',
|
||||
synced_at DATETIME COMMENT '最近同步时间',
|
||||
source_updated_at DATETIME COMMENT 'T+ 源数据更新时间(未确认时可为空)',
|
||||
CONSTRAINT pk_businesses PRIMARY KEY (id),
|
||||
CONSTRAINT uk_businesses_business_no UNIQUE (business_no),
|
||||
CONSTRAINT fk_businesses_customer_id FOREIGN KEY(customer_id) REFERENCES customers (id) ON DELETE RESTRICT,
|
||||
@@ -602,6 +610,7 @@ CREATE TABLE shipments (
|
||||
t_plus_id VARCHAR(64) COMMENT 'T+ 系统内部标识',
|
||||
sync_batch_no VARCHAR(32) COMMENT '同步批次号(同步模块写入)',
|
||||
synced_at DATETIME COMMENT '最近同步时间',
|
||||
source_updated_at DATETIME COMMENT 'T+ 源数据更新时间(未确认时可为空)',
|
||||
CONSTRAINT pk_shipments PRIMARY KEY (id),
|
||||
CONSTRAINT uk_shipments_shipment_no UNIQUE (shipment_no),
|
||||
CONSTRAINT fk_shipments_business_id FOREIGN KEY(business_id) REFERENCES businesses (id) ON DELETE RESTRICT
|
||||
@@ -656,6 +665,7 @@ CREATE TABLE receipts (
|
||||
t_plus_id VARCHAR(64) COMMENT 'T+ 系统内部标识',
|
||||
sync_batch_no VARCHAR(32) COMMENT '同步批次号(同步模块写入)',
|
||||
synced_at DATETIME COMMENT '最近同步时间',
|
||||
source_updated_at DATETIME COMMENT 'T+ 源数据更新时间(未确认时可为空)',
|
||||
CONSTRAINT pk_receipts PRIMARY KEY (id),
|
||||
CONSTRAINT uk_receipts_receipt_batch_no UNIQUE (receipt_batch_no),
|
||||
CONSTRAINT fk_receipts_business_id FOREIGN KEY(business_id) REFERENCES businesses (id) ON DELETE RESTRICT,
|
||||
@@ -880,6 +890,90 @@ CREATE INDEX idx_performance_ledgers_month_personnel_type ON performance_ledgers
|
||||
|
||||
CREATE INDEX idx_performance_ledgers_personnel_id ON performance_ledgers (personnel_id);
|
||||
|
||||
-- ---------------------------------------------------------------------------
|
||||
-- T+ 同步批次、错误、原始 staging 与增量水位表(V14)
|
||||
-- ---------------------------------------------------------------------------
|
||||
CREATE TABLE tplus_sync_batches (
|
||||
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
|
||||
batch_no VARCHAR(32) NOT NULL COMMENT '同步批次号',
|
||||
sync_mode VARCHAR(16) NOT NULL COMMENT '任务方式:FULL全量 AUDIT关联核验 INCREMENTAL预留',
|
||||
status VARCHAR(16) NOT NULL COMMENT '状态:QUEUED/RUNNING/SUCCEEDED/PARTIAL/FAILED',
|
||||
source_database VARCHAR(128) COMMENT 'T+ 源数据库名',
|
||||
started_at DATETIME 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 '批次错误摘要',
|
||||
entity_types_json JSON COMMENT '请求读取的实体类型;历史批次可为空',
|
||||
skipped_record_count INT NOT NULL DEFAULT 0 COMMENT '重复快照跳过条数',
|
||||
parent_batch_no VARCHAR(32) COMMENT '重试来源批次号,保留原批次记录',
|
||||
request_key VARCHAR(36) COMMENT '请求幂等键,空值用于历史和直接CLI任务',
|
||||
requested_by BIGINT UNSIGNED COMMENT '请求用户ID,CLI任务为空,无物理外键',
|
||||
audit_result_json JSON 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),
|
||||
CONSTRAINT uk_tplus_sync_batches_request_key UNIQUE (request_key)
|
||||
)CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='T+ 同步批次表(记录读取范围、结果和对账统计)' COLLATE=utf8mb4_general_ci;
|
||||
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 INDEX idx_tplus_sync_batches_parent_status ON tplus_sync_batches (parent_batch_no, status);
|
||||
|
||||
CREATE TABLE tplus_sync_errors (
|
||||
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
|
||||
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)
|
||||
)CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='T+ 同步错误表(记录失败行和重试信息)' COLLATE=utf8mb4_general_ci;
|
||||
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 COMMENT '主键ID' AUTO_INCREMENT,
|
||||
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)
|
||||
)CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='T+ 原始同步 staging 表(映射确认前只保存原始行,不直接改业务表)' COLLATE=utf8mb4_general_ci;
|
||||
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 COMMENT '主键ID' AUTO_INCREMENT,
|
||||
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)
|
||||
)CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='T+ 增量同步水位表' COLLATE=utf8mb4_general_ci;
|
||||
|
||||
ALTER TABLE approval_orders MODIFY order_type TINYINT NOT NULL COMMENT '审批对象类型:1二次分配方案 2月度结算 3调整单';
|
||||
|
||||
-- 公司信息单行(system_settings 恒为一行,id=1 由迁移保底)
|
||||
@@ -893,4 +987,4 @@ CREATE TABLE alembic_version (
|
||||
CONSTRAINT alembic_version_pkc PRIMARY KEY (version_num)
|
||||
)CHARSET=utf8mb4 ENGINE=InnoDB COLLATE utf8mb4_general_ci;
|
||||
|
||||
INSERT INTO alembic_version (version_num) VALUES ('c3a9e1d7b2f4');
|
||||
INSERT INTO alembic_version (version_num) VALUES ('e5f607a8b9c0');
|
||||
+3
-1
@@ -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';
|
||||
@@ -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';
|
||||
@@ -0,0 +1,68 @@
|
||||
-- 关联核验固定查询,全部只读;源库仍按 SQL Server 2008 R2 语法编写。
|
||||
-- @query source_version
|
||||
SELECT CONVERT(varchar(80), SERVERPROPERTY('ProductVersion')) AS source_version;
|
||||
|
||||
-- @query voucher_types
|
||||
SELECT ID AS id, code, name FROM dbo.SM_VoucherType ORDER BY ID;
|
||||
|
||||
-- @query state_enums
|
||||
SELECT i.ID AS id, i.Code AS code, i.Name AS name, e.Name AS enum_name
|
||||
FROM dbo.eap_EnumItem AS i
|
||||
LEFT JOIN dbo.eap_Enum AS e ON e.id = i.idEnum
|
||||
WHERE i.ID IN (
|
||||
SELECT voucherstate FROM dbo.ARAP_ReceivePayment
|
||||
UNION SELECT cancelState FROM dbo.ARAP_ReceivePayment
|
||||
)
|
||||
ORDER BY i.ID;
|
||||
|
||||
-- @query receipt_kinds
|
||||
SELECT CASE h.isReceiveFlag WHEN 1 THEN 'RECEIVE' WHEN 0 THEN 'PAYMENT' ELSE 'UNKNOWN' END AS voucher_type_code,
|
||||
CASE h.isReceiveFlag WHEN 1 THEN N'收款' WHEN 0 THEN N'付款' ELSE N'未知方向' END AS voucher_type_name,
|
||||
h.isReceiveFlag AS receive_flag, COUNT_BIG(*) AS row_count
|
||||
FROM dbo.ARAP_ReceivePayment AS h
|
||||
GROUP BY h.isReceiveFlag;
|
||||
|
||||
-- @query receipt_line_kinds
|
||||
SELECT b.idvouchertype AS voucher_type_id, v.name AS voucher_type_name,
|
||||
h.isReceiveFlag AS receive_flag, COUNT_BIG(*) AS row_count
|
||||
FROM dbo.ARAP_ReceivePayment_b AS b
|
||||
LEFT JOIN dbo.SM_VoucherType AS v ON v.ID = b.idvouchertype
|
||||
LEFT JOIN dbo.ARAP_ReceivePayment AS h ON h.ID = b.idArapReceivePaymentDTO
|
||||
GROUP BY b.idvouchertype, v.name, h.isReceiveFlag;
|
||||
|
||||
-- @query sales_links
|
||||
SELECT COUNT_BIG(*) AS row_count,
|
||||
COALESCE(SUM(CASE WHEN h.ID IS NOT NULL THEN 1 ELSE 0 END), 0) AS delivery_matches,
|
||||
COALESCE(SUM(CASE WHEN d.ID IS NOT NULL THEN 1 ELSE 0 END), 0) AS detail_matches,
|
||||
COALESCE(SUM(CASE WHEN o.ID IS NOT NULL THEN 1 ELSE 0 END), 0) AS direct_order_matches,
|
||||
COALESCE(SUM(CASE WHEN detail_order.ID IS NOT NULL THEN 1 ELSE 0 END), 0) AS detail_order_matches,
|
||||
COALESCE(SUM(CASE WHEN (o.ID IS NOT NULL OR detail_order.ID IS NOT NULL)
|
||||
AND NOT (b.saleorderid > 0 AND d.saleOrderId > 0 AND b.saleorderid <> d.saleOrderId)
|
||||
THEN 1 ELSE 0 END), 0) AS unambiguous_order_matches,
|
||||
COALESCE(SUM(CASE WHEN b.saleorderid > 0 AND o.ID IS NULL THEN 1 ELSE 0 END), 0) AS invalid_order_ids,
|
||||
COALESCE(SUM(CASE WHEN b.saleorderid > 0 AND d.saleOrderId > 0
|
||||
AND b.saleorderid <> d.saleOrderId THEN 1 ELSE 0 END), 0) AS conflicting_order_ids
|
||||
FROM dbo.ARAP_ReceivePayment_b AS b
|
||||
JOIN dbo.ARAP_ReceivePayment AS p ON p.ID = b.idArapReceivePaymentDTO
|
||||
LEFT JOIN dbo.SA_SaleDelivery AS h ON h.ID = b.voucherID
|
||||
LEFT JOIN dbo.SA_SaleDelivery_b AS d ON d.ID = b.voucherDetailID
|
||||
AND d.idSaleDeliveryDTO = b.voucherID
|
||||
LEFT JOIN dbo.SA_SaleOrder AS o ON o.ID = b.saleorderid
|
||||
LEFT JOIN dbo.SA_SaleOrder AS detail_order ON detail_order.ID = d.saleOrderId
|
||||
WHERE b.idvouchertype = :sale_delivery_type_id AND p.isReceiveFlag = :receive_flag;
|
||||
|
||||
-- @query order_coverage
|
||||
WITH delivery_orders AS (
|
||||
SELECT idSaleDeliveryDTO, COUNT(DISTINCT saleOrderId) AS order_count
|
||||
FROM dbo.SA_SaleDelivery_b
|
||||
WHERE saleOrderId > 0
|
||||
GROUP BY idSaleDeliveryDTO
|
||||
)
|
||||
SELECT COUNT_BIG(*) AS row_count,
|
||||
COALESCE(SUM(CASE WHEN d.order_count IS NULL THEN 1 ELSE 0 END), 0) AS without_order,
|
||||
COALESCE(SUM(CASE WHEN d.order_count = 1 THEN 1 ELSE 0 END), 0) AS single_order,
|
||||
COALESCE(SUM(CASE WHEN d.order_count > 1 THEN 1 ELSE 0 END), 0) AS multiple_orders
|
||||
FROM dbo.ARAP_ReceivePayment_b AS b
|
||||
JOIN dbo.ARAP_ReceivePayment AS p ON p.ID = b.idArapReceivePaymentDTO
|
||||
LEFT JOIN delivery_orders AS d ON d.idSaleDeliveryDTO = b.voucherID
|
||||
WHERE b.idvouchertype = :sale_delivery_type_id AND p.isReceiveFlag = :receive_flag;
|
||||
@@ -0,0 +1,21 @@
|
||||
-- 已在客户备份核对列结构;业务语义仍待确认。
|
||||
-- SQL Server 2008 R2 语法;主键游标分页,时间水位尚未启用。
|
||||
SELECT TOP (:batch_size)
|
||||
b.id AS id,
|
||||
b.code AS code,
|
||||
b.id AS line_no,
|
||||
b.idSaleOrderDTO AS source_parent_id,
|
||||
b.idinventory,
|
||||
b.quantity,
|
||||
b.baseQuantity,
|
||||
b.price,
|
||||
b.taxPrice,
|
||||
b.taxAmount,
|
||||
b.discountAmount,
|
||||
b.LatestCost,
|
||||
b.IsClose,
|
||||
b.updated AS source_updated_at,
|
||||
b.ts AS source_rowversion
|
||||
FROM dbo.SA_SaleOrder_b AS b
|
||||
WHERE b.id > :after_id
|
||||
ORDER BY b.id;
|
||||
@@ -0,0 +1,18 @@
|
||||
-- 已在客户备份核对列结构;业务语义仍待确认。
|
||||
-- SQL Server 2008 R2 语法;主键游标分页,时间水位尚未启用。
|
||||
SELECT TOP (:batch_size)
|
||||
h.ID AS id,
|
||||
h.code AS code,
|
||||
h.voucherdate,
|
||||
h.idcustomer,
|
||||
h.idclerk,
|
||||
h.idbusinesstype,
|
||||
h.amount,
|
||||
h.taxAmount,
|
||||
h.voucherState,
|
||||
h.isCancel,
|
||||
h.updated AS source_updated_at,
|
||||
h.ts AS source_rowversion
|
||||
FROM dbo.SA_SaleOrder AS h
|
||||
WHERE h.id > :after_id
|
||||
ORDER BY h.id;
|
||||
@@ -0,0 +1,16 @@
|
||||
-- 已在客户备份核对列结构;业务语义仍待确认。
|
||||
-- SQL Server 2008 R2 语法;主键游标分页,时间水位尚未启用。
|
||||
SELECT TOP (:batch_size)
|
||||
p.id AS id,
|
||||
p.code AS code,
|
||||
p.name,
|
||||
p.Contact,
|
||||
p.representative,
|
||||
p.disabled,
|
||||
p.idsaleman,
|
||||
p.partnerType,
|
||||
p.updated AS source_updated_at,
|
||||
p.ts AS source_rowversion
|
||||
FROM dbo.AA_Partner AS p
|
||||
WHERE p.id > :after_id
|
||||
ORDER BY p.id;
|
||||
@@ -0,0 +1,16 @@
|
||||
-- 已在客户备份核对列结构;业务语义仍待确认。
|
||||
-- SQL Server 2008 R2 语法;主键游标分页,时间水位尚未启用。
|
||||
SELECT TOP (:batch_size)
|
||||
p.id AS id,
|
||||
p.code AS code,
|
||||
p.name,
|
||||
p.disabled,
|
||||
p.mobilePhoneNo,
|
||||
p.officePhoneNo,
|
||||
p.iddepartment,
|
||||
p.isSalesman,
|
||||
p.updated AS source_updated_at,
|
||||
p.ts AS source_rowversion
|
||||
FROM dbo.AA_Person AS p
|
||||
WHERE p.id > :after_id
|
||||
ORDER BY p.id;
|
||||
@@ -0,0 +1,16 @@
|
||||
-- 已在客户备份核对列结构;业务语义仍待确认。
|
||||
-- SQL Server 2008 R2 语法;主键游标分页,时间水位尚未启用。
|
||||
SELECT TOP (:batch_size)
|
||||
i.id AS id,
|
||||
i.code AS code,
|
||||
i.name,
|
||||
i.specification,
|
||||
i.idunit,
|
||||
i.idinventoryclass,
|
||||
i.disabled,
|
||||
i.invSCost,
|
||||
i.updated AS source_updated_at,
|
||||
i.ts AS source_rowversion
|
||||
FROM dbo.AA_Inventory AS i
|
||||
WHERE i.id > :after_id
|
||||
ORDER BY i.id;
|
||||
@@ -0,0 +1,24 @@
|
||||
-- 已在客户备份核对列结构;业务语义仍待确认。
|
||||
-- SQL Server 2008 R2 语法;主键游标分页,时间水位尚未启用。
|
||||
SELECT TOP (:batch_size)
|
||||
b.id AS id,
|
||||
b.code AS code,
|
||||
b.id AS line_no,
|
||||
b.idArapReceivePaymentDTO AS source_parent_id,
|
||||
b.voucherID,
|
||||
b.voucherDetailID,
|
||||
b.saleorderid,
|
||||
b.saleordercode,
|
||||
b.sourceorderid,
|
||||
b.idsourceordertype,
|
||||
b.idvouchertype,
|
||||
b.voucherDate,
|
||||
b.arrivalDate,
|
||||
b.currentAmount,
|
||||
b.Amount,
|
||||
b.VoucherAmount,
|
||||
CAST(NULL AS datetime) AS source_updated_at,
|
||||
b.ts AS source_rowversion
|
||||
FROM dbo.ARAP_ReceivePayment_b AS b
|
||||
WHERE b.id > :after_id
|
||||
ORDER BY b.id;
|
||||
@@ -0,0 +1,24 @@
|
||||
-- 已在客户备份核对列结构;业务语义仍待确认。
|
||||
-- SQL Server 2008 R2 语法;主键游标分页,时间水位尚未启用。
|
||||
SELECT TOP (:batch_size)
|
||||
h.ID AS id,
|
||||
h.code AS code,
|
||||
h.voucherDate,
|
||||
h.auditedDate,
|
||||
h.createdTime,
|
||||
h.SaleOrderCode,
|
||||
h.SaleOrderID,
|
||||
h.idpartner,
|
||||
h.idperson,
|
||||
h.IdSettleStyle,
|
||||
h.idvouchertype,
|
||||
h.isReceiveFlag,
|
||||
h.cancelState,
|
||||
h.voucherstate,
|
||||
h.amount,
|
||||
h.paymentAmount,
|
||||
CAST(NULL AS datetime) AS source_updated_at,
|
||||
h.ts AS source_rowversion
|
||||
FROM dbo.ARAP_ReceivePayment AS h
|
||||
WHERE h.id > :after_id
|
||||
ORDER BY h.id;
|
||||
@@ -0,0 +1,26 @@
|
||||
-- 已在客户备份核对列结构;业务语义仍待确认。
|
||||
-- SQL Server 2008 R2 语法;主键游标分页,时间水位尚未启用。
|
||||
SELECT TOP (:batch_size)
|
||||
b.ID AS id,
|
||||
b.code AS code,
|
||||
b.ID AS line_no,
|
||||
b.idSaleDeliveryDTO AS source_parent_id,
|
||||
b.idinventory,
|
||||
b.saleOrderId,
|
||||
b.saleOrderDetailId,
|
||||
b.quantity,
|
||||
b.baseQuantity,
|
||||
b.price,
|
||||
b.taxPrice,
|
||||
b.taxAmount,
|
||||
b.costPrice,
|
||||
b.costAmount,
|
||||
b.CostPriceGetType,
|
||||
b.returnQuntity,
|
||||
b.backSentQuantity,
|
||||
b.isCancel,
|
||||
b.updated AS source_updated_at,
|
||||
b.ts AS source_rowversion
|
||||
FROM dbo.SA_SaleDelivery_b AS b
|
||||
WHERE b.id > :after_id
|
||||
ORDER BY b.id;
|
||||
@@ -0,0 +1,23 @@
|
||||
-- 已在客户备份核对列结构;业务语义仍待确认。
|
||||
-- SQL Server 2008 R2 语法;主键游标分页,时间水位尚未启用。
|
||||
SELECT TOP (:batch_size)
|
||||
h.ID AS id,
|
||||
h.code AS code,
|
||||
h.voucherdate,
|
||||
h.SendDate,
|
||||
h.deliveryDate,
|
||||
h.auditeddate,
|
||||
h.SourceVoucherCode,
|
||||
h.SaleOrderCode,
|
||||
h.idcustomer,
|
||||
h.idclerk,
|
||||
h.amount,
|
||||
h.taxAmount,
|
||||
h.voucherState,
|
||||
h.isCancel,
|
||||
h.isCounteractDelivery,
|
||||
h.updated AS source_updated_at,
|
||||
h.ts AS source_rowversion
|
||||
FROM dbo.SA_SaleDelivery AS h
|
||||
WHERE h.id > :after_id
|
||||
ORDER BY h.id;
|
||||
Reference in new issue
Block a user