feat(核算)!: 添加 T+ 正式核算与采集托管

补齐源快照、资料预演、正式导入及工资核算的依赖链路。
新增版本化输入、逐段 FIFO、生成锁和结构化当月调整,
并提供默认关闭的周期采集、有限重试及 Windows 托管。

原始客户资料、私有配置及首页改动不纳入本次提交。

BREAKING CHANGE: 升级前需应用新增迁移,并通过
PAYROLL_MAKER_USER_ID 绑定实际工资制作人,否则业务只读。
旧单批次核算默认关闭;历史兼容需显式启用
PAYROLL_ALLOW_LEGACY_CALCULATION。生产启用和真实金额待验收。
This commit is contained in:
liuwenxin committed 2026-11-02 09:42:53 +08:00
1 parent 1b074576fe
commit 108bf87225
154 files changed
+9515 -645

No files matched your search

+158 -4
View File
@@ -824,6 +824,9 @@ CREATE TABLE settlement_items (
)CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='月结明细表(按人固化;支持负数工资;锁定后只读)' COLLATE utf8mb4_general_ci;
CREATE TABLE adjustment_orders (
adjustment_type VARCHAR(32) NOT NULL DEFAULT 'GENERAL' COMMENT '调整类型:GENERAL普通 ALLOCATION分配差额',
source_ledger_id BIGINT UNSIGNED NULL COMMENT '分配差额对应的原台账ID',
attribution_json JSON NULL COMMENT '原台账业务与分管归属快照',
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
order_no VARCHAR(32) NOT NULL COMMENT '调整单号,自动生成 TZ{YYYYMMDD}-{4位当日序号}',
settlement_month VARCHAR(7) NOT NULL COMMENT '调整月份(YYYY-MM;跨月规则待澄清 #9 前不限制)',
@@ -846,6 +849,7 @@ CREATE TABLE adjustment_orders (
CREATE TABLE performance_ledgers (
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
receipt_id BIGINT UNSIGNED COMMENT '回款ID(receipts.id;聚合行可为 NULL)',
allocation_key VARCHAR(64) NOT NULL DEFAULT '' COMMENT '正式FIFO事件键;历史单笔核算为空串',
calc_version TINYINT NOT NULL COMMENT '核算版本(重算+1,旧行 is_active=0)' DEFAULT '1',
is_active TINYINT NOT NULL COMMENT '生效标记:1当前生效 0已被重算替代(重算受控 UPDATE 例外)' DEFAULT '1',
calc_type TINYINT NOT NULL COMMENT '核算类型:1单笔回款 2经理团队聚合(月度)' DEFAULT '1',
@@ -876,7 +880,8 @@ CREATE TABLE performance_ledgers (
create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT pk_performance_ledgers PRIMARY KEY (id),
CONSTRAINT uk_performance_ledgers_receipt_id_calc_version_personnel UNIQUE (receipt_id, calc_version, personnel_id),
INDEX idx_performance_ledgers_receipt_id (receipt_id),
CONSTRAINT uk_performance_ledgers_receipt_id_calc_version_personnel UNIQUE (receipt_id, calc_version, personnel_id, allocation_key),
CONSTRAINT fk_performance_ledgers_settlement_id FOREIGN KEY(settlement_id) REFERENCES monthly_settlements (id) ON DELETE RESTRICT,
CONSTRAINT fk_performance_ledgers_personnel_id FOREIGN KEY(personnel_id) REFERENCES personnel (id) ON DELETE RESTRICT,
CONSTRAINT fk_performance_ledgers_receipt_id FOREIGN KEY(receipt_id) REFERENCES receipts (id) ON DELETE RESTRICT
@@ -894,6 +899,8 @@ CREATE INDEX idx_performance_ledgers_personnel_id ON performance_ledgers (person
-- T+ 同步批次、错误、原始 staging 与增量水位表(V14)
-- ---------------------------------------------------------------------------
CREATE TABLE tplus_sync_batches (
trigger_type VARCHAR(16) NOT NULL DEFAULT 'MANUAL' COMMENT '触发来源:MANUAL/SCHEDULED/AUTO_RETRY',
automatic_attempt INTEGER NOT NULL DEFAULT 0 COMMENT '自动重试序号(0为原始任务)',
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预留',
@@ -907,14 +914,15 @@ CREATE TABLE tplus_sync_batches (
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 '更新时间',
-- 以下 6 列对应 V15 的 ADD COLUMN:物理列序须与迁移终态一致(表尾追加)。
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)
@@ -982,9 +990,155 @@ INSERT INTO system_settings (id, company_name, logo_path) VALUES (1, '衍水集
-- ---------------------------------------------------------------------------
-- 迁移版本记录:须等于当前 head,使 alembic upgrade head 成为空操作
-- ---------------------------------------------------------------------------
-- V16:基础导入与核算预演的隔离工作区;无正式工资写入。
CREATE TABLE tplus_source_heads (
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
source_database VARCHAR(128) NOT NULL COMMENT '源账套',
entity_type VARCHAR(32) NOT NULL COMMENT '实体类型',
source_id VARCHAR(64) NOT NULL COMMENT '源内部ID',
record_id BIGINT UNSIGNED NOT NULL COMMENT '原始快照ID',
batch_no VARCHAR(32) NOT NULL COMMENT '最后观察批次',
CONSTRAINT pk_tplus_source_heads PRIMARY KEY (id),
CONSTRAINT uk_tplus_source_heads_source_entity_id UNIQUE (source_database, entity_type, source_id)
)ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='T+ 源当前快照指针(按成功全量批次读取,删除不自动回写业务表)' COLLATE utf8mb4_general_ci;
CREATE INDEX idx_tplus_source_heads_batch_entity ON tplus_source_heads (batch_no, entity_type);
CREATE TABLE tplus_facts (
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
source_database VARCHAR(128) NOT NULL COMMENT '源账套',
kind VARCHAR(32) NOT NULL COMMENT '事实类别',
fact_key VARCHAR(128) NOT NULL COMMENT '事实业务键',
version INTEGER NOT NULL COMMENT '版本号',
data_json JSON NOT NULL COMMENT '经校验的事实内容',
evidence VARCHAR(500) NOT NULL COMMENT '依据和修改原因',
requested_by BIGINT UNSIGNED NOT NULL COMMENT '操作者ID',
create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT pk_tplus_facts PRIMARY KEY (id),
CONSTRAINT uk_tplus_facts_source_kind_key_version UNIQUE (source_database, kind, fact_key, version)
)ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='T+ 人工补充事实版本表' COLLATE utf8mb4_general_ci;
CREATE TABLE tplus_source_links (
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
source_database VARCHAR(128) NOT NULL COMMENT '源账套',
entity_type VARCHAR(32) NOT NULL COMMENT '实体类型',
source_id VARCHAR(64) NOT NULL COMMENT '源内部ID',
target_id BIGINT UNSIGNED NOT NULL COMMENT '业务目标ID',
create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT pk_tplus_source_links PRIMARY KEY (id),
CONSTRAINT uk_tplus_source_links_source_entity_id UNIQUE (source_database, entity_type, source_id),
CONSTRAINT uk_tplus_source_links_entity_target UNIQUE (entity_type, target_id)
)ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='T+ 基础数据源目标关联' COLLATE utf8mb4_general_ci;
CREATE TABLE tplus_work_runs (
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
run_no VARCHAR(32) NOT NULL COMMENT '运行编号',
request_key VARCHAR(36) NOT NULL COMMENT '请求幂等键',
kind VARCHAR(32) NOT NULL COMMENT 'MASTER_PREVIEW/MASTER_APPLY/CALC_PREVIEW',
status VARCHAR(16) NOT NULL COMMENT '运行状态',
source_database VARCHAR(128) NOT NULL COMMENT '固定源账套',
requested_by BIGINT UNSIGNED NOT NULL COMMENT '操作者ID',
input_json JSON NOT NULL COMMENT '请求输入',
snapshot_json JSON COMMENT '规则和补充资料的固定快照',
snapshot_hash VARCHAR(64) COMMENT '输入指纹',
summary_json JSON COMMENT '结果汇总',
error_code VARCHAR(64) COMMENT '固定错误编码',
started_at DATETIME COMMENT '开始时间',
finished_at DATETIME COMMENT '结束时间',
create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT pk_tplus_work_runs PRIMARY KEY (id),
CONSTRAINT uk_tplus_work_runs_run_no UNIQUE (run_no),
CONSTRAINT uk_tplus_work_runs_request_key UNIQUE (request_key)
)ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='T+ 导入与预演运行表' COLLATE utf8mb4_general_ci;
CREATE INDEX idx_tplus_work_runs_status_id ON tplus_work_runs (status, id);
CREATE TABLE tplus_work_lines (
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
run_no VARCHAR(32) NOT NULL COMMENT '运行编号',
line_no INTEGER NOT NULL COMMENT '稳定行序号',
entity_type VARCHAR(32) NOT NULL COMMENT '实体或分组类型',
source_id VARCHAR(128) NOT NULL COMMENT '源ID或平账组',
action VARCHAR(32) NOT NULL COMMENT '新增/更新/跳过/待补/冲突/分配',
reason VARCHAR(128) COMMENT '固定原因编码',
data_json JSON NOT NULL COMMENT '最小必要的业务明细',
CONSTRAINT pk_tplus_work_lines PRIMARY KEY (id),
CONSTRAINT uk_tplus_work_lines_run_line UNIQUE (run_no, line_no)
)ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='T+ 导入预览与核算预演明细' COLLATE utf8mb4_general_ci;
CREATE TABLE alembic_version (
version_num VARCHAR(32) NOT NULL,
CONSTRAINT alembic_version_pkc PRIMARY KEY (version_num)
)CHARSET=utf8mb4 ENGINE=InnoDB COLLATE utf8mb4_general_ci;
INSERT INTO alembic_version (version_num) VALUES ('e5f607a8b9c0');
INSERT INTO alembic_version (version_num) VALUES ('21f2a3b4c5d6');
-- 正式工资输入、FIFO过程及生成锁定;新增表,不改写历史结果。
CREATE TABLE payroll_months (
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
month VARCHAR(7) NOT NULL COMMENT '工资月份',
maker_id BIGINT UNSIGNED NOT NULL COMMENT '实际工资制作人账号ID',
maker_name VARCHAR(64) NOT NULL COMMENT '制作人用户名快照',
generated_at DATETIME COMMENT '首次成功生成时间(不可解锁)',
create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT pk_payroll_months PRIMARY KEY (id),
CONSTRAINT uk_payroll_months_month UNIQUE (month)
)ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='工资月份控制表(首次生成即锁定分配,审批不解锁)' COLLATE utf8mb4_general_ci;
CREATE TABLE payroll_inputs (
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
business_id BIGINT UNSIGNED NOT NULL COMMENT '正式业务ID',
version INTEGER NOT NULL COMMENT '输入版本',
source_database VARCHAR(128) NOT NULL COMMENT '源账套或人工来源',
group_key VARCHAR(128) NOT NULL COMMENT '独立业务平账组',
fingerprint VARCHAR(64) NOT NULL COMMENT '来源及事实指纹',
data_json JSON NOT NULL COMMENT '经核实的源数据及人工事实快照',
requested_by BIGINT UNSIGNED NOT NULL COMMENT '录入人账号ID',
create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT pk_payroll_inputs PRIMARY KEY (id),
CONSTRAINT uk_payroll_inputs_business_version UNIQUE (business_id, version)
)ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='正式工资输入版本表' COLLATE utf8mb4_general_ci;
CREATE INDEX idx_payroll_inputs_source_group ON payroll_inputs (source_database, group_key);
CREATE TABLE payroll_allocations (
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
ledger_id BIGINT UNSIGNED NOT NULL COMMENT '所属正式台账ID',
business_id BIGINT UNSIGNED NOT NULL COMMENT '正式业务ID',
line_no INTEGER NOT NULL COMMENT '本台账稳定明细序号',
input_id BIGINT UNSIGNED NOT NULL COMMENT '所用输入版本ID',
amount NUMERIC(14, 2) NOT NULL COMMENT '分配回款金额',
data_json JSON NOT NULL COMMENT '单据、成本、归属、参数和逐段计算依据',
create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT pk_payroll_allocations PRIMARY KEY (id),
CONSTRAINT uk_payroll_allocations_ledger_line UNIQUE (ledger_id, line_no)
)ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='正式FIFO分配明细表' COLLATE utf8mb4_general_ci;
CREATE INDEX idx_payroll_allocations_business_id ON payroll_allocations (business_id);
CREATE TABLE tplus_automation_states (
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
source_key VARCHAR(64) NOT NULL COMMENT '源连接身份摘要(不含凭据)',
source_database VARCHAR(128) NOT NULL COMMENT '源账套',
scheduled_period VARCHAR(16) COMMENT '最近已排队ISO周',
root_batch_no VARCHAR(32) COMMENT '本周期原始采集批次',
current_batch_no VARCHAR(32) COMMENT '当前原始或重试批次',
retry_attempts INTEGER NOT NULL COMMENT '本周期自动重试次数' DEFAULT '0',
next_retry_at DATETIME COMMENT '下一次自动重试时间',
last_success_at DATETIME COMMENT '最近成功采集时间',
maintenance_at DATETIME COMMENT '最近周期检查时间',
heartbeat_at DATETIME COMMENT '独立进程心跳时间',
worker_owner VARCHAR(36) COMMENT '当前持锁进程身份',
worker_phase VARCHAR(16) NOT NULL COMMENT '进程状态:IDLE/RUNNING/STOPPED' DEFAULT 'STOPPED',
create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT pk_tplus_automation_states PRIMARY KEY (id),
CONSTRAINT uk_tplus_automation_states_source_key UNIQUE (source_key)
)ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='T+自动采集周期与进程状态(不自动导入正式业务)' COLLATE utf8mb4_general_ci;
+78
View File
@@ -0,0 +1,78 @@
-- V16:基础导入与核算预演的隔离工作区;无正式工资写入。
CREATE TABLE tplus_source_heads (
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
source_database VARCHAR(128) NOT NULL COMMENT '源账套',
entity_type VARCHAR(32) NOT NULL COMMENT '实体类型',
source_id VARCHAR(64) NOT NULL COMMENT '源内部ID',
record_id BIGINT UNSIGNED NOT NULL COMMENT '原始快照ID',
batch_no VARCHAR(32) NOT NULL COMMENT '最后观察批次',
CONSTRAINT pk_tplus_source_heads PRIMARY KEY (id),
CONSTRAINT uk_tplus_heads_source_entity_id UNIQUE (source_database, entity_type, source_id)
)ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='T+ 源当前快照指针(按成功全量批次读取,删除不自动回写业务表)' COLLATE utf8mb4_general_ci;
CREATE INDEX idx_tplus_heads_batch_entity ON tplus_source_heads (batch_no, entity_type);
CREATE TABLE tplus_facts (
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
source_database VARCHAR(128) NOT NULL COMMENT '源账套',
kind VARCHAR(32) NOT NULL COMMENT '事实类别',
fact_key VARCHAR(128) NOT NULL COMMENT '事实业务键',
version INTEGER NOT NULL COMMENT '版本号',
data_json JSON NOT NULL COMMENT '经校验的事实内容',
evidence VARCHAR(500) NOT NULL COMMENT '依据和修改原因',
requested_by BIGINT UNSIGNED NOT NULL COMMENT '操作者ID',
create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT pk_tplus_facts PRIMARY KEY (id),
CONSTRAINT uk_tplus_facts_source_kind_key_version UNIQUE (source_database, kind, fact_key, version)
)ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='T+ 人工补充事实版本表' COLLATE utf8mb4_general_ci;
CREATE TABLE tplus_source_links (
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
source_database VARCHAR(128) NOT NULL COMMENT '源账套',
entity_type VARCHAR(32) NOT NULL COMMENT '实体类型',
source_id VARCHAR(64) NOT NULL COMMENT '源内部ID',
target_id BIGINT UNSIGNED NOT NULL COMMENT '业务目标ID',
create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT pk_tplus_source_links PRIMARY KEY (id),
CONSTRAINT uk_tplus_links_source_entity_id UNIQUE (source_database, entity_type, source_id),
CONSTRAINT uk_tplus_links_entity_target UNIQUE (entity_type, target_id)
)ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='T+ 基础数据源目标关联' COLLATE utf8mb4_general_ci;
CREATE TABLE tplus_work_runs (
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
run_no VARCHAR(32) NOT NULL COMMENT '运行编号',
request_key VARCHAR(36) NOT NULL COMMENT '请求幂等键',
kind VARCHAR(32) NOT NULL COMMENT 'MASTER_PREVIEW/MASTER_APPLY/CALC_PREVIEW',
status VARCHAR(16) NOT NULL COMMENT '运行状态',
source_database VARCHAR(128) NOT NULL COMMENT '固定源账套',
requested_by BIGINT UNSIGNED NOT NULL COMMENT '操作者ID',
input_json JSON NOT NULL COMMENT '请求输入',
snapshot_json JSON COMMENT '规则和补充资料的固定快照',
snapshot_hash VARCHAR(64) COMMENT '输入指纹',
summary_json JSON COMMENT '结果汇总',
error_code VARCHAR(64) COMMENT '固定错误编码',
started_at DATETIME COMMENT '开始时间',
finished_at DATETIME COMMENT '结束时间',
create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT pk_tplus_work_runs PRIMARY KEY (id),
CONSTRAINT uk_tplus_work_runs_run_no UNIQUE (run_no),
CONSTRAINT uk_tplus_work_runs_request_key UNIQUE (request_key)
)ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='T+ 导入与预演运行表' COLLATE utf8mb4_general_ci;
CREATE INDEX idx_tplus_work_runs_status_id ON tplus_work_runs (status, id);
CREATE TABLE tplus_work_lines (
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
run_no VARCHAR(32) NOT NULL COMMENT '运行编号',
line_no INTEGER NOT NULL COMMENT '稳定行序号',
entity_type VARCHAR(32) NOT NULL COMMENT '实体或分组类型',
source_id VARCHAR(128) NOT NULL COMMENT '源ID或平账组',
action VARCHAR(32) NOT NULL COMMENT '新增/更新/跳过/待补/冲突/分配',
reason VARCHAR(128) COMMENT '固定原因编码',
data_json JSON NOT NULL COMMENT '最小必要的业务明细',
CONSTRAINT pk_tplus_work_lines PRIMARY KEY (id),
CONSTRAINT uk_tplus_work_lines_run_line UNIQUE (run_no, line_no)
)ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='T+ 导入预览与核算预演明细' COLLATE utf8mb4_general_ci;
+5
View File
@@ -0,0 +1,5 @@
-- 仅重命名 V16 固定索引,不改变数据。
ALTER TABLE tplus_source_heads RENAME INDEX uk_tplus_heads_source_entity_id TO uk_tplus_source_heads_source_entity_id;
ALTER TABLE tplus_source_heads RENAME INDEX idx_tplus_heads_batch_entity TO idx_tplus_source_heads_batch_entity;
ALTER TABLE tplus_source_links RENAME INDEX uk_tplus_links_source_entity_id TO uk_tplus_source_links_source_entity_id;
ALTER TABLE tplus_source_links RENAME INDEX uk_tplus_links_entity_target TO uk_tplus_source_links_entity_target;
+51
View File
@@ -0,0 +1,51 @@
-- 正式工资输入、FIFO过程及生成锁定;新增表,不改写历史结果。
CREATE TABLE payroll_months (
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
month VARCHAR(7) NOT NULL COMMENT '工资月份',
maker_id BIGINT UNSIGNED NOT NULL COMMENT '实际工资制作人账号ID',
maker_name VARCHAR(64) NOT NULL COMMENT '制作人用户名快照',
generated_at DATETIME COMMENT '首次成功生成时间(不可解锁)',
create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT pk_payroll_months PRIMARY KEY (id),
CONSTRAINT uk_payroll_months_month UNIQUE (month)
)ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='工资月份控制表(首次生成即锁定分配,审批不解锁)' COLLATE utf8mb4_general_ci;
CREATE TABLE payroll_inputs (
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
business_id BIGINT UNSIGNED NOT NULL COMMENT '正式业务ID',
version INTEGER NOT NULL COMMENT '输入版本',
source_database VARCHAR(128) NOT NULL COMMENT '源账套或人工来源',
group_key VARCHAR(128) NOT NULL COMMENT '独立业务平账组',
fingerprint VARCHAR(64) NOT NULL COMMENT '来源及事实指纹',
data_json JSON NOT NULL COMMENT '经核实的源数据及人工事实快照',
requested_by BIGINT UNSIGNED NOT NULL COMMENT '录入人账号ID',
create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT pk_payroll_inputs PRIMARY KEY (id),
CONSTRAINT uk_payroll_inputs_business_version UNIQUE (business_id, version)
)ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='正式工资输入版本表' COLLATE utf8mb4_general_ci;
CREATE INDEX idx_payroll_inputs_source_group ON payroll_inputs (source_database, group_key);
CREATE TABLE payroll_allocations (
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
ledger_id BIGINT UNSIGNED NOT NULL COMMENT '所属正式台账ID',
business_id BIGINT UNSIGNED NOT NULL COMMENT '正式业务ID',
line_no INTEGER NOT NULL COMMENT '本台账稳定明细序号',
input_id BIGINT UNSIGNED NOT NULL COMMENT '所用输入版本ID',
amount NUMERIC(14, 2) NOT NULL COMMENT '分配回款金额',
data_json JSON NOT NULL COMMENT '单据、成本、归属、参数和逐段计算依据',
create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT pk_payroll_allocations PRIMARY KEY (id),
CONSTRAINT uk_payroll_allocations_ledger_line UNIQUE (ledger_id, line_no)
)ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='正式FIFO分配明细表' COLLATE utf8mb4_general_ci;
CREATE INDEX idx_payroll_allocations_business_id ON payroll_allocations (business_id);
CREATE INDEX idx_performance_ledgers_receipt_id ON performance_ledgers (receipt_id);
ALTER TABLE performance_ledgers ADD COLUMN allocation_key VARCHAR(64) NOT NULL DEFAULT '' COMMENT '正式FIFO事件键;历史单笔核算为空串';
ALTER TABLE performance_ledgers DROP INDEX uk_performance_ledgers_receipt_id_calc_version_personnel;
ALTER TABLE performance_ledgers ADD CONSTRAINT uk_performance_ledgers_receipt_id_calc_version_personnel UNIQUE (receipt_id, calc_version, personnel_id, allocation_key);
@@ -0,0 +1,4 @@
-- 分配调整固化原台账与业务分管;普通调整也统一计生成当月。
ALTER TABLE adjustment_orders ADD COLUMN adjustment_type VARCHAR(32) NOT NULL DEFAULT 'GENERAL' COMMENT '调整类型:GENERAL普通 ALLOCATION分配差额';
ALTER TABLE adjustment_orders ADD COLUMN source_ledger_id BIGINT UNSIGNED NULL COMMENT '分配差额对应的原台账ID';
ALTER TABLE adjustment_orders ADD COLUMN attribution_json JSON NULL COMMENT '原台账业务与分管归属快照';
+25
View File
@@ -0,0 +1,25 @@
-- 自动采集状态;不自动应用业务或生成工资。
CREATE TABLE tplus_automation_states (
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
source_key VARCHAR(64) NOT NULL COMMENT '源连接身份摘要(不含凭据)',
source_database VARCHAR(128) NOT NULL COMMENT '源账套',
scheduled_period VARCHAR(16) COMMENT '最近已排队ISO周',
root_batch_no VARCHAR(32) COMMENT '本周期原始采集批次',
current_batch_no VARCHAR(32) COMMENT '当前原始或重试批次',
retry_attempts INTEGER NOT NULL COMMENT '本周期自动重试次数' DEFAULT '0',
next_retry_at DATETIME COMMENT '下一次自动重试时间',
last_success_at DATETIME COMMENT '最近成功采集时间',
maintenance_at DATETIME COMMENT '最近周期检查时间',
heartbeat_at DATETIME COMMENT '独立进程心跳时间',
worker_owner VARCHAR(36) COMMENT '当前持锁进程身份',
worker_phase VARCHAR(16) NOT NULL COMMENT '进程状态:IDLE/RUNNING/STOPPED' DEFAULT '''STOPPED''',
create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT pk_tplus_automation_states PRIMARY KEY (id),
CONSTRAINT uk_tplus_automation_states_source_key UNIQUE (source_key)
)ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='T+自动采集周期与进程状态(不自动导入正式业务)' COLLATE utf8mb4_general_ci;
ALTER TABLE tplus_sync_batches ADD COLUMN trigger_type VARCHAR(16) NOT NULL DEFAULT 'MANUAL' COMMENT '触发来源:MANUAL/SCHEDULED/AUTO_RETRY';
ALTER TABLE tplus_sync_batches ADD COLUMN automatic_attempt INTEGER NOT NULL DEFAULT 0 COMMENT '自动重试序号(0为原始任务)';
@@ -0,0 +1,3 @@
-- 修正V20状态默认值的额外引号;不改历史业务、工资或核算数据。
ALTER TABLE tplus_automation_states ALTER COLUMN worker_phase SET DEFAULT 'STOPPED';
UPDATE tplus_automation_states SET worker_phase='STOPPED' WHERE worker_phase='''STOPPED''';
+1
View File
@@ -9,6 +9,7 @@ SELECT TOP (:batch_size)
p.disabled,
p.idsaleman,
p.partnerType,
p.customerType,
p.updated AS source_updated_at,
p.ts AS source_rowversion
FROM dbo.AA_Partner AS p
+2
View File
@@ -0,0 +1,2 @@
SELECT id,code,name,partnerType,customerType,idsaleman,disabled
FROM dbo.AA_Partner WHERE id=:customer_id;
+4
View File
@@ -0,0 +1,4 @@
SELECT TOP (201) d.idsaledelivery,d.idsaledeliverydetail,d.amount,
d.idSaleExpenseAllocationDTO,d.SourceVoucherCode
FROM dbo.SA_SaleExpenseAllocationDetail d JOIN dbo.SA_SaleDelivery h ON h.id=d.idsaledelivery
WHERE h.idcustomer=:customer_id AND h.voucherdate<:until ORDER BY h.id,d.id;
+6
View File
@@ -0,0 +1,6 @@
SELECT d.idvouchertype,t.name AS voucher_type,d.flag,d.prepayFlag,
COUNT(*) AS row_count,SUM(d.amount) AS amount,SUM(d.settleAmount) AS settled_amount,
MIN(d.voucherDate) AS first_date,MAX(d.voucherDate) AS last_date
FROM dbo.ARAP_Detail d LEFT JOIN dbo.SM_VoucherType t ON t.id=d.idvouchertype
WHERE d.idpartner=:customer_id AND d.voucherDate<:cutoff AND d.isArFlag=1
GROUP BY d.idvouchertype,t.name,d.flag,d.prepayFlag;
+8
View File
@@ -0,0 +1,8 @@
SELECT TOP (201) b.id,b.idSaleDeliveryDTO,b.idinventory,i.code AS product_code,
i.name AS product_name,i.specification,cl.name AS source_class,
b.quantity,b.taxPrice,b.taxAmount,b.expenseAmount,b.costPrice,b.costAmount
FROM dbo.SA_SaleDelivery_b b JOIN dbo.SA_SaleDelivery h ON h.id=b.idSaleDeliveryDTO
LEFT JOIN dbo.AA_Inventory i ON i.id=b.idinventory
LEFT JOIN dbo.AA_InventoryClass cl ON cl.id=i.idinventoryclass
WHERE h.idcustomer=:customer_id AND h.voucherdate<:until
ORDER BY h.voucherdate,h.id,b.id;
+2
View File
@@ -0,0 +1,2 @@
SELECT TOP (201) id,idpartner,origDate,amount,balanceAmount,prepayAmount,totalAmount
FROM dbo.ARAP_OriginalAmount_ArDetail WHERE idpartner=:customer_id ORDER BY origDate,id;
+10
View File
@@ -0,0 +1,10 @@
SELECT TOP (201) h.id,h.code,h.voucherDate,h.idperson,p.code AS personnel_code,
h.amount,h.isReceiveFlag,h.voucherstate,
doc.code AS accounting_voucher_code,doc.isinvalidate,st.Code AS accounting_state
FROM dbo.ARAP_ReceivePayment h LEFT JOIN dbo.AA_Person p ON p.id=h.idperson
LEFT JOIN dbo.SM_VoucherType typ ON typ.Code='ARAP01'
LEFT JOIN dbo.GL_SrcVoucherInfo src ON src.srcvoucherid=h.id AND src.idSrcVoucherType=typ.id
LEFT JOIN dbo.GL_Doc doc ON doc.id=src.idDocDTO
LEFT JOIN dbo.eap_EnumItem st ON st.id=doc.makeErrorState
WHERE h.idpartner=:customer_id AND h.voucherDate<:until
ORDER BY h.voucherDate,h.id,doc.id;
+5
View File
@@ -0,0 +1,5 @@
SELECT TOP (201) h.id,h.code,h.voucherdate,h.idclerk,p.code AS personnel_code,
h.SaleOrderCode,h.taxAmount,h.voucherState,h.isCounteractDelivery
FROM dbo.SA_SaleDelivery h LEFT JOIN dbo.AA_Person p ON p.id=h.idclerk
WHERE h.idcustomer=:customer_id AND h.voucherdate<:until
ORDER BY h.voucherdate,h.id;
+2
View File
@@ -6,11 +6,13 @@ SELECT TOP (:batch_size)
i.name,
i.specification,
i.idunit,
u.name AS unit_name,
i.idinventoryclass,
i.disabled,
i.invSCost,
i.updated AS source_updated_at,
i.ts AS source_rowversion
FROM dbo.AA_Inventory AS i
LEFT JOIN dbo.AA_Unit AS u ON u.id = i.idunit
WHERE i.id > :after_id
ORDER BY i.id;
+21 -1
View File
@@ -1,4 +1,5 @@
-- 已在客户备份核对列结构;业务语义仍待确认。
-- 已核实生成凭证路径:来源单据类型 ARAP01 → GL_SrcVoucherInfo → GL_Doc。
-- “未审”的总账凭证也可能已经生成,不能用单据已审核/已核销替代本关联。
-- SQL Server 2008 R2 语法;主键游标分页,时间水位尚未启用。
SELECT TOP (:batch_size)
h.ID AS id,
@@ -17,8 +18,27 @@ SELECT TOP (:batch_size)
h.voucherstate,
h.amount,
h.paymentAmount,
ISNULL(accounting.accounting_voucher_count, 0) AS accounting_voucher_count,
ISNULL(accounting.valid_accounting_voucher_count, 0) AS valid_accounting_voucher_count,
accounting.accounting_voucher_id,
accounting_doc.code AS accounting_voucher_code,
CAST(NULL AS datetime) AS source_updated_at,
h.ts AS source_rowversion
FROM dbo.ARAP_ReceivePayment AS h
LEFT JOIN (
SELECT src.srcvoucherid,
COUNT(*) AS accounting_voucher_count,
SUM(CASE WHEN doc.id IS NOT NULL AND doc.isinvalidate = 0
AND make_state.Code = 'Ringht' THEN 1 ELSE 0 END) AS valid_accounting_voucher_count,
MIN(CASE WHEN doc.id IS NOT NULL AND doc.isinvalidate = 0
AND make_state.Code = 'Ringht' THEN doc.id ELSE NULL END) AS accounting_voucher_id
FROM dbo.GL_SrcVoucherInfo AS src
INNER JOIN dbo.SM_VoucherType AS source_type ON source_type.ID = src.idSrcVoucherType
LEFT JOIN dbo.GL_Doc AS doc ON doc.id = src.idDocDTO
LEFT JOIN dbo.eap_EnumItem AS make_state ON make_state.ID = doc.makeErrorState
WHERE source_type.Code = 'ARAP01'
GROUP BY src.srcvoucherid
) AS accounting ON accounting.srcvoucherid = h.ID
LEFT JOIN dbo.GL_Doc AS accounting_doc ON accounting_doc.id = accounting.accounting_voucher_id
WHERE h.id > :after_id
ORDER BY h.id;