feat(核算)!: 添加 T+ 正式核算与采集托管
补齐源快照、资料预演、正式导入及工资核算的依赖链路。 新增版本化输入、逐段 FIFO、生成锁和结构化当月调整, 并提供默认关闭的周期采集、有限重试及 Windows 托管。 原始客户资料、私有配置及首页改动不纳入本次提交。 BREAKING CHANGE: 升级前需应用新增迁移,并通过 PAYROLL_MAKER_USER_ID 绑定实际工资制作人,否则业务只读。 旧单批次核算默认关闭;历史兼容需显式启用 PAYROLL_ALLOW_LEGACY_CALCULATION。生产启用和真实金额待验收。
This commit is contained in:
1 parent
1b074576fe
commit
108bf87225
154 files changed
+9515
-645
No files matched your search
+158
-4
@@ -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;
|
||||
Reference in new issue
Block a user