"""计提参数数据访问。 本层只 flush 不 commit —— 事务边界由 services 层控制。 时点化解析查询(窗口函数版)留存 db/queries/计提参数.sql。 """ from datetime import date from sqlalchemy import func, select from sqlalchemy.orm import Session from app.models import ParamDefinition, ParamValue # ==================== 读取 ==================== def resolve_values(session: Session, biz_date: date) -> list[tuple[str, str, str]]: """时点化解析:每个 (param_id, dimension_value) 取生效日期 <= 业务日期的最新条目。 排序 (effective_date DESC, id DESC) 保证同日多次变更取最新一条 (不设日期唯一键,同日修正是合法留痕)。仅返回启用状态的参数定义。 返回 (param_code, dimension_value, value_text),供 ParamSnapshot 构造。 """ row_number = ( func.row_number() .over( partition_by=(ParamValue.param_id, ParamValue.dimension_value), order_by=(ParamValue.effective_date.desc(), ParamValue.id.desc()), ) .label("rn") ) subq = ( select( ParamDefinition.param_code.label("param_code"), ParamValue.dimension_value.label("dimension_value"), ParamValue.value_text.label("value_text"), row_number, ) .join(ParamDefinition, ParamDefinition.id == ParamValue.param_id) .where(ParamValue.effective_date <= biz_date, ParamDefinition.status == 1) .subquery() ) stmt = select(subq.c.param_code, subq.c.dimension_value, subq.c.value_text).where( subq.c.rn == 1 ) return [(row.param_code, row.dimension_value, row.value_text) for row in session.execute(stmt)]