-- Running upgrade 79bcc5aa98d4 -> 3bca400421c6 CREATE TABLE monthly_settlements ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, settlement_month VARCHAR(7) NOT NULL COMMENT '结算月份(YYYY-MM;全表唯一)', status TINYINT NOT NULL COMMENT '状态:1草稿 2待审批 3已审定(终态=已锁定)4已驳回(回草稿)' DEFAULT '1', total_performance NUMERIC(14, 2) COMMENT '绩效金额合计(可负)', total_payable NUMERIC(14, 2) COMMENT '应付绩效合计(可负)', person_count TINYINT NOT NULL COMMENT '结算人数' DEFAULT '0', snapshot_json JSON COMMENT '月度总览快照(生成时刻的确认回款口径说明与汇总参数)', approval_order_no VARCHAR(32) COMMENT '关联审批单号(冗余固化;开关关闭自动通过时也有单)', submitter_id BIGINT UNSIGNED COMMENT '提交人ID(账号删除后置空)', submitter_name VARCHAR(64) NOT NULL COMMENT '提交人用户名(冗余固化)', locked_at DATETIME COMMENT '锁定时间(status=3 时回填)', locked_by VARCHAR(64) 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_monthly_settlements PRIMARY KEY (id), CONSTRAINT fk_monthly_settlements_submitter_id FOREIGN KEY(submitter_id) REFERENCES users (id) ON DELETE SET NULL, CONSTRAINT uk_monthly_settlements_settlement_month UNIQUE (settlement_month) )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='月度结算表(按月一行;通过即锁定,锁定后走调整单)' COLLATE utf8mb4_general_ci; CREATE TABLE adjustment_orders ( 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 前不限制)', personnel_id BIGINT UNSIGNED NOT NULL COMMENT '调整人员ID(personnel.id)', personnel_name VARCHAR(64) NOT NULL COMMENT '调整人员姓名(冗余固化)', direction TINYINT NOT NULL COMMENT '方向:1补发 2扣减', amount NUMERIC(14, 2) NOT NULL COMMENT '调整金额(恒正,方向表达语义)', reason VARCHAR(255) NOT NULL COMMENT '扣补说明(必填,审批与追溯锚点)', status TINYINT NOT NULL COMMENT '状态:1待审批 2已生效 3已驳回 4已撤回' DEFAULT '1', submitter_id BIGINT UNSIGNED COMMENT '提交人ID(账号删除后置空)', submitter_name VARCHAR(64) 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_adjustment_orders PRIMARY KEY (id), CONSTRAINT fk_adjustment_orders_personnel_id FOREIGN KEY(personnel_id) REFERENCES personnel (id) ON DELETE RESTRICT, CONSTRAINT fk_adjustment_orders_submitter_id FOREIGN KEY(submitter_id) REFERENCES users (id) ON DELETE SET NULL, CONSTRAINT uk_adjustment_orders_order_no UNIQUE (order_no) )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='调整单表(已锁定月份的补发/扣减;走审批;生效后不回写月结快照)' COLLATE utf8mb4_general_ci; CREATE TABLE settlement_items ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, settlement_id BIGINT UNSIGNED NOT NULL COMMENT '月结ID(monthly_settlements.id;头删明细随删)', personnel_id BIGINT UNSIGNED NOT NULL COMMENT '结算人员ID(personnel.id)', personnel_name VARCHAR(64) NOT NULL COMMENT '结算人员姓名(冗余固化)', role_code VARCHAR(32) NOT NULL COMMENT '岗位编码(主岗,聚合锚点)', calc_type TINYINT NOT NULL COMMENT '核算类型:1单笔回款 2经理团队聚合', performance_sum NUMERIC(14, 2) NOT NULL COMMENT '绩效金额合计(可负;聚合行排除经理个人户业绩,#12 暂口径)', payable_sum NUMERIC(14, 2) NOT NULL COMMENT '应付绩效合计(可负)', basic_amount NUMERIC(14, 2) COMMENT '月工资标准(personnel.salary_standard 当月快照)', salary_mode VARCHAR(16) COMMENT '月工资口径快照:INCLUDE/DEDUCT/EXCLUDE', net_amount NUMERIC(14, 2) COMMENT '净工资 = 绩效±基本工资(按口径;试用期 0)', is_probation TINYINT NOT NULL COMMENT '试用期:1绩效照算不发放(net=0,超年累计记 note)0否' DEFAULT '0', probation_note VARCHAR(255) COMMENT '试用期说明(年累计超阈值部分年底一次性结算)', snapshot_json JSON COMMENT '个人明细快照(台账行引用列表)', CONSTRAINT pk_settlement_items PRIMARY KEY (id), CONSTRAINT fk_settlement_items_personnel_id FOREIGN KEY(personnel_id) REFERENCES personnel (id) ON DELETE RESTRICT, CONSTRAINT fk_settlement_items_settlement_id FOREIGN KEY(settlement_id) REFERENCES monthly_settlements (id) ON DELETE CASCADE )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='月结明细表(按人固化;支持负数工资;锁定后只读)' COLLATE utf8mb4_general_ci; CREATE TABLE performance_ledgers ( id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT, receipt_id BIGINT UNSIGNED COMMENT '回款ID(receipts.id;聚合行可为 NULL)', 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', business_id BIGINT UNSIGNED NOT NULL COMMENT '业务ID(固化无外键;聚合行为该经理名下首行业务ID,报表下钻锚点)', business_no VARCHAR(32) NOT NULL COMMENT '业务编号(冗余固化,列表免联查)', personnel_id BIGINT UNSIGNED NOT NULL COMMENT '归属营销人员ID(personnel.id;核算归属锚点)', personnel_name VARCHAR(64) NOT NULL COMMENT '归属营销人员姓名(冗余固化)', role_code VARCHAR(32) NOT NULL COMMENT '岗位编码(business_roles.role_code,计提公式锚点)', customer_type VARCHAR(32) NOT NULL COMMENT '客户分类:personal/manager_personal/enterprise', product_category VARCHAR(32) NOT NULL COMMENT '产品类别:municipal_water/rail_transit/mixed(混合业务,行级明细入 snapshot_json)', ship_date DATE COMMENT '发货日期(回款天数基准)', receipt_date DATE NOT NULL COMMENT '回款日期(参数版本匹配日,裁决 #11)', payment_days INTEGER COMMENT '回款天数(发货日首日计第 1 天;未指定批次为 NULL;先款后货照实负值)', rate_text VARCHAR(32) NOT NULL COMMENT '计提比例原文(如 4/360,防 Fraction 截断;聚合行存 12.5%/5% 结构说明)', converted_profit NUMERIC(14, 2) COMMENT '折算毛利润额(可负;混合业务为各行汇总)', performance_amount NUMERIC(14, 2) COMMENT '绩效金额(可负,裁决:负绩效照算不归零)', barter_applied TINYINT NOT NULL COMMENT '以物抵顶折算:1已按 80% 折算 0否' DEFAULT '0', weight_r INTEGER COMMENT '支付权重 R(回款占销售额百分比向下取整)', payment_weight NUMERIC(7, 6) COMMENT '支付权重系数 R×R(展示用)', payable_amount NUMERIC(14, 2) COMMENT '当期应付绩效(绩效 × 支付权重;聚合行为当月汇总)', settlement_month VARCHAR(7) NOT NULL COMMENT '归属月(回款日期所在月,YYYY-MM;月结与报表维度)', is_probation TINYINT NOT NULL COMMENT '试用期:1照算不发放 0否' DEFAULT '0', missing_cost TINYINT NOT NULL COMMENT '成本缺失:1有明细行缺成本(该行毛利按 0 计)0否' DEFAULT '0', snapshot_json JSON COMMENT '计算快照(所用参数版本与行级折算明细,重算可回溯)', settlement_id BIGINT UNSIGNED COMMENT '所属月结ID(月结生成时回填;NULL=未入结)', calc_reason VARCHAR(255) COMMENT '核算/重算原因(重算必填留痕)', remark VARCHAR(255) 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_performance_ledgers PRIMARY KEY (id), 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, CONSTRAINT fk_performance_ledgers_settlement_id FOREIGN KEY(settlement_id) REFERENCES monthly_settlements (id) ON DELETE RESTRICT, CONSTRAINT uk_performance_ledgers_receipt_id_calc_version UNIQUE (receipt_id, calc_version) )CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='绩效核算台账表(append-only 版本行;重算插新版本旧行仅翻 is_active)' COLLATE utf8mb4_general_ci; CREATE INDEX idx_performance_ledgers_business_id ON performance_ledgers (business_id); CREATE INDEX idx_performance_ledgers_month_active ON performance_ledgers (settlement_month, is_active); CREATE INDEX idx_performance_ledgers_month_personnel_type ON performance_ledgers (settlement_month, personnel_id, calc_type); CREATE INDEX idx_performance_ledgers_personnel_id ON performance_ledgers (personnel_id); ALTER TABLE approval_orders MODIFY order_type TINYINT NOT NULL COMMENT '审批对象类型:1二次分配方案 2月度结算 3调整单'; INSERT INTO param_definitions (id, param_code, param_name, param_group, value_type, unit, dimension_type, options_text, default_value, value_min, value_max, description, sort_order, status) VALUES (19, 'approval.adjustment.enabled', '调整单审批开关', '审批开关', 'BOOL', NULL, 'NONE', NULL, '0', NULL, NULL, '0=调整单提交即生效(系统自动通过留痕);1=走财务复核→领导审核审批流。调整单是已锁定月份补发/扣减的唯一通道', 19, 1); INSERT INTO param_values (id, param_id, dimension_value, effective_date, value_text, batch_id) VALUES (22, 19, '', '2026-01-01', '0', 1); UPDATE alembic_version SET version_num='3bca400421c6' WHERE alembic_version.version_num = '79bcc5aa98d4';