文件
PayrollManagementSystem/db/queries/计提参数.sql
T
liuwenxin和Claude Code bc019cadf5 feat(system): 新增岗位角色与计提参数四表及 V3 迁移
- business_roles/param_definitions/param_change_batches/param_values 四表 + 种子(3 内置岗位/16 参数定义/19 版本条目/初始批次 P20260101-00)
- 双轨迁移:Alembic bfbda9c3191d + db/migration/V3 导出 + init-dev.sql 同步(schema_sync 校验通过)
- 参数值以 Fraction 可解析字符串存储(4/360 禁 0.011111);企业户 2‰→3‰ 双种子支持按到账日回溯

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-12 16:13:13 +08:00

59 行
2.3 KiB
SQL

-- ============================================================================
-- 计提参数查询留档(M1 参数体系)
--
-- 时点化取值核心规则:按 (param_id, dimension_value) 分组,取
-- effective_date <= :biz_date 的 ORDER BY effective_date DESC, id DESC 首条
-- (同日多次变更取最新一条,不设唯一键以保证完整留痕)。
-- 参数总量约百行级,全量快照一次取回后在应用层按覆盖链
-- (角色维度 > 产品类别维度 > 默认行)选择,无需在 SQL 层做维度回退。
-- ============================================================================
-- 1. 全量快照:某业务日期下每个(参数, 维度值)的最新生效值
-- 窗口函数版(MySQL 8.0+),供 param_repository.resolve_values 使用
SELECT t.param_code, t.dimension_value, t.value_text, t.effective_date
FROM (
SELECT pd.param_code,
pv.dimension_value,
pv.value_text,
pv.effective_date,
ROW_NUMBER() OVER (
PARTITION BY pv.param_id, pv.dimension_value
ORDER BY pv.effective_date DESC, pv.id DESC
) AS rn
FROM param_values pv
JOIN param_definitions pd ON pd.id = pv.param_id
WHERE pv.effective_date <= :biz_date
AND pd.status = 1
) t
WHERE t.rn = 1;
-- 2. 单参数版本历史(变更留痕,供参数历史接口与导出)
SELECT pv.effective_date,
pv.dimension_value,
pv.old_value_text,
pv.value_text,
b.version_no,
b.operator_name,
b.create_time
FROM param_values pv
JOIN param_change_batches b ON b.id = pv.batch_id
WHERE pv.param_id = :param_id
ORDER BY pv.effective_date DESC, pv.id DESC;
-- 3. 区间变更条目(对比视图辅助:应用层对两日期各执行查询 1 后逐项 diff,
-- 本查询列出区间内实际发生过的变更,供变更记录分页与导出)
SELECT pd.param_code,
pd.param_name,
pv.dimension_value,
pv.old_value_text,
pv.value_text,
pv.effective_date,
b.version_no,
b.operator_name
FROM param_values pv
JOIN param_definitions pd ON pd.id = pv.param_id
JOIN param_change_batches b ON b.id = pv.batch_id
WHERE pv.effective_date > :from_date
AND pv.effective_date <= :to_date
ORDER BY pv.effective_date, pv.id;