feat(migration): V8 业务答复口径落实——审批开关默认开启、撤试用期统一参数、经理基数开关、台账分摊唯一键
- #5/#7 答复默认开启:两审批开关 default 翻 1,插 10-19 生效行保时点历史 - #16 答复逐人维护:撤 probation.salary.basic(无业务消费点,月结已读 personnel.salary_standard) - #12 答复参数化:新增 manager.personal.included(默认 0=不计入聚合基数) - #1 答复分配绩效铺路:台账 uk 扩为 (receipt_id, calc_version, personnel_id) 支持分摊拆行 - schema_sync 解析器过滤 ADD CONSTRAINT 误捕获 Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
1 parent
238a38c356
commit
0e8c5713fa
8 files changed
+282
-45
No files matched your search
@@ -0,0 +1,193 @@
|
||||
"""V8:业务答复口径落实(2026-10-19 回执)。
|
||||
|
||||
四件事,全部源于《待澄清问题清单》2026-10-19 答复:
|
||||
|
||||
1. 审批开关默认值翻转(#5/#7 答复「默认开启」):param_definitions 的
|
||||
default_value 更新为 '1';param_values **插入生效日 2026-10-19 的新行**
|
||||
而非改历史行——参数体系时点化(按业务日期回溯),直接改种子行会篡改
|
||||
10-19 之前的口径历史。
|
||||
2. 撤销试用期统一工资参数(#16 答复「按人员档案逐人维护」):删除
|
||||
probation.salary.basic 的定义与版本行;月结基本工资已直接读
|
||||
personnel.salary_standard(该参数自 M3 ④ 实现起即无业务消费点)。
|
||||
3. 新增经理个人户聚合基数开关(#12 答复「作为参数配置,手动调整是否
|
||||
纳入」):manager.personal.included,默认 0=不计入(维持暂口径)。
|
||||
4. 绩效台账唯一键加 personnel_id(二次分配分摊铺路,澄清 #1 答复
|
||||
「分配绩效」):分摊后同一回款同版本按人各落一行(负责人余额行 +
|
||||
参与人比例行),uk(receipt_id, calc_version) 会撞;扩为三列后聚合行
|
||||
(receipt_id NULL)依旧不受 MySQL 唯一索引约束。
|
||||
|
||||
迁移 downgrade 只保留 drop_table/行级种子反向 DELETE(V6 教训:逐个
|
||||
drop_index 会撞外键支撑索引 errno 1553)。
|
||||
"""
|
||||
|
||||
from datetime import date
|
||||
|
||||
import sqlalchemy as sa
|
||||
from alembic import op
|
||||
|
||||
revision = "c7d2e5a81f30"
|
||||
down_revision = "3bca400421c6"
|
||||
branch_labels = None
|
||||
depends_on = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
"""种子行级变更 + 台账唯一键扩展(无表结构新增/删除)。"""
|
||||
# 1. 审批开关默认值翻转(#5/#7:默认开启,业务可关闭)
|
||||
op.execute(
|
||||
"UPDATE param_definitions SET default_value = '1' "
|
||||
"WHERE id IN (17, 18)"
|
||||
)
|
||||
# 时点化生效行:插新行不改历史(10-19 前仍按 0 解析)
|
||||
op.bulk_insert(
|
||||
sa.table(
|
||||
"param_values",
|
||||
sa.column("id", sa.BigInteger),
|
||||
sa.column("param_id", sa.BigInteger),
|
||||
sa.column("dimension_value", sa.String),
|
||||
sa.column("effective_date", sa.Date),
|
||||
sa.column("value_text", sa.String),
|
||||
sa.column("batch_id", sa.BigInteger),
|
||||
),
|
||||
[
|
||||
{
|
||||
"id": 23,
|
||||
"param_id": 17,
|
||||
"dimension_value": "",
|
||||
"effective_date": date(2026, 10, 19),
|
||||
"value_text": "1",
|
||||
"batch_id": 1,
|
||||
},
|
||||
{
|
||||
"id": 24,
|
||||
"param_id": 18,
|
||||
"dimension_value": "",
|
||||
"effective_date": date(2026, 10, 19),
|
||||
"value_text": "1",
|
||||
"batch_id": 1,
|
||||
},
|
||||
],
|
||||
)
|
||||
|
||||
# 2. 撤销试用期统一工资参数(#16:按人员档案 personnel.salary_standard 逐人维护)
|
||||
op.execute("DELETE FROM param_values WHERE id = 19")
|
||||
op.execute("DELETE FROM param_definitions WHERE id = 16")
|
||||
|
||||
# 3. 经理个人户聚合基数开关(#12:参数化,默认不计入)
|
||||
op.bulk_insert(
|
||||
sa.table(
|
||||
"param_definitions",
|
||||
sa.column("id", sa.BigInteger),
|
||||
sa.column("param_code", sa.String),
|
||||
sa.column("param_name", sa.String),
|
||||
sa.column("param_group", sa.String),
|
||||
sa.column("value_type", sa.String),
|
||||
sa.column("unit", sa.String),
|
||||
sa.column("dimension_type", sa.String),
|
||||
sa.column("options_text", sa.String),
|
||||
sa.column("default_value", sa.String),
|
||||
sa.column("value_min", sa.String),
|
||||
sa.column("value_max", sa.String),
|
||||
sa.column("description", sa.String),
|
||||
sa.column("sort_order", sa.Integer),
|
||||
sa.column("status", sa.Integer),
|
||||
),
|
||||
[
|
||||
{
|
||||
"id": 20,
|
||||
"param_code": "manager.personal.included",
|
||||
"param_name": "经理个人户计入聚合基数",
|
||||
"param_group": "经理分成",
|
||||
"value_type": "BOOL",
|
||||
"unit": None,
|
||||
"dimension_type": "NONE",
|
||||
"options_text": None,
|
||||
"default_value": "0",
|
||||
"value_min": None,
|
||||
"value_max": None,
|
||||
"description": (
|
||||
"经理 12.5%+5% 聚合时是否计入经理本人名下经理个人户业绩(澄清 #12 "
|
||||
"业务答复 2026-10-19:作为参数配置、手动调整是否纳入):"
|
||||
"0=不计入(默认,暂口径) 1=计入"
|
||||
),
|
||||
"sort_order": 20,
|
||||
"status": 1,
|
||||
}
|
||||
],
|
||||
)
|
||||
op.bulk_insert(
|
||||
sa.table(
|
||||
"param_values",
|
||||
sa.column("id", sa.BigInteger),
|
||||
sa.column("param_id", sa.BigInteger),
|
||||
sa.column("dimension_value", sa.String),
|
||||
sa.column("effective_date", sa.Date),
|
||||
sa.column("value_text", sa.String),
|
||||
sa.column("batch_id", sa.BigInteger),
|
||||
),
|
||||
[
|
||||
{
|
||||
"id": 25,
|
||||
"param_id": 20,
|
||||
"dimension_value": "",
|
||||
"effective_date": date(2026, 1, 1),
|
||||
"value_text": "0",
|
||||
"batch_id": 1,
|
||||
}
|
||||
],
|
||||
)
|
||||
|
||||
# 4. 台账唯一键扩为三列(分摊拆行:同回款同版本按人一行)
|
||||
# 顺序要紧:旧 uk 是 fk_performance_ledgers_receipt_id 的唯一支撑索引,
|
||||
# 先删会撞 errno 1553(外键无支撑索引);先建新键(receipt_id 仍居最左)
|
||||
# 再做替换,两键短暂并存无冲突。
|
||||
op.create_unique_constraint(
|
||||
"uk_performance_ledgers_receipt_id_calc_version_personnel",
|
||||
"performance_ledgers",
|
||||
["receipt_id", "calc_version", "personnel_id"],
|
||||
)
|
||||
op.drop_constraint(
|
||||
"uk_performance_ledgers_receipt_id_calc_version",
|
||||
"performance_ledgers",
|
||||
type_="unique",
|
||||
)
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
"""反向:唯一键复原 + 种子行级回退(顺序与 upgrade 相反)。
|
||||
|
||||
试用期参数(definitions 16 / values 19)的原始种子在 V3,按 V6 downgrade
|
||||
的行级反向惯例显式重插,保证可重放。
|
||||
"""
|
||||
# 与 upgrade 同因的顺序:先建回旧键再删新键(旧键支撑 receipts 外键)
|
||||
op.create_unique_constraint(
|
||||
"uk_performance_ledgers_receipt_id_calc_version",
|
||||
"performance_ledgers",
|
||||
["receipt_id", "calc_version"],
|
||||
)
|
||||
op.drop_constraint(
|
||||
"uk_performance_ledgers_receipt_id_calc_version_personnel",
|
||||
"performance_ledgers",
|
||||
type_="unique",
|
||||
)
|
||||
|
||||
op.execute("DELETE FROM param_values WHERE id = 25")
|
||||
op.execute("DELETE FROM param_definitions WHERE id = 20")
|
||||
|
||||
op.execute(
|
||||
"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 "
|
||||
"(16, 'probation.salary.basic', '试用期基本工资标准', '月工资口径', 'DECIMAL', "
|
||||
"'元', 'NONE', NULL, '3000', '0', NULL, "
|
||||
"'试用期仅发基本工资、不发放绩效(归属待 M2 复核)', 16, 1)"
|
||||
)
|
||||
op.execute(
|
||||
"INSERT INTO param_values (id, param_id, dimension_value, effective_date, "
|
||||
"value_text, batch_id) VALUES (19, 16, '', '2026-01-01', '3000', 1)"
|
||||
)
|
||||
|
||||
op.execute("DELETE FROM param_values WHERE id IN (23, 24)")
|
||||
op.execute(
|
||||
"UPDATE param_definitions SET default_value = '0' WHERE id IN (17, 18)"
|
||||
)
|
||||
Reference in new issue
Block a user