refactor(business): 编辑出参取校验返回值省重查,submit_change 批量预载
- update_receipt 取 _ensure_shipment_of_business 返回值组装出参 (shipment_id 已赋为 payload 新值,与 get_with_refs 重查同源), 省一次三表 join;update_shipment 同理取锁定行的 business_no - 删 business_repository.count_items(无任何调用的死代码,删除保护 实际走 has_docs) - submit_change 校验段定义与岗位各一条 IN 批量预载(逐条查询在批次 扩大时是写侧 N+1);岗位字典键 casefold 归一保持与单条版 ci 校对 等价的命中语义;旧值留痕保持逐条(窗口函数优化留待 M3 一并设计) Co-Authored-By: Claude Code <noreply@anthropic.com>
这个提交包含在:
1 父节点
5ef48abf47
当前提交
409e26614f
6 个文件已更改
+57
-19
没有与搜索条件相匹配的文件
@@ -218,11 +218,28 @@ def submit_change(
|
||||
if payload.change_type == 2 and effective < date.today():
|
||||
raise BadRequestError("指定生效日期不得早于今日")
|
||||
|
||||
# 先全量校验、再写入:任何一项不合法整批拒绝(不留半批脏数据)
|
||||
# 先全量校验、再写入:任何一项不合法整批拒绝(不留半批脏数据)。
|
||||
# 定义与岗位各一条 IN 批量查询预载(逐条查询在批次扩大时是写侧 N+1);
|
||||
# 岗位预载收集全部非空维度值 —— 集合可能略大于实际所需,但省去按
|
||||
# 维度类型先分类的第二轮遍历,无害多取由校验逻辑自行过滤
|
||||
codes = list({item.param_code for item in payload.items})
|
||||
definitions = param_repository.list_definitions_by_codes(session, codes)
|
||||
dimension_values = list(
|
||||
{item.dimension_value for item in payload.items if item.dimension_value}
|
||||
)
|
||||
# 预载字典键归一为 casefold:单条版 get_by_code 走 SQL ci 校对(大小写
|
||||
# 变形可命中),批量版改字典查找后须自行等价归一,否则变形大小写会
|
||||
# 被误判「不是已存在的岗位」;岗位编码均为 ascii 小写蛇形,casefold 足够
|
||||
roles = {
|
||||
code.casefold(): role
|
||||
for code, role in business_role_repository.list_by_codes(
|
||||
session, dimension_values
|
||||
).items()
|
||||
}
|
||||
normalized: list[tuple[ParamDefinition, str, str]] = []
|
||||
seen: set[tuple[str, str]] = set()
|
||||
for item in payload.items:
|
||||
definition = param_repository.get_definition_by_code(session, item.param_code)
|
||||
definition = definitions.get(item.param_code)
|
||||
if definition is None:
|
||||
# 用户输入先行查库给 400;未注册编码出现在库里属数据与注册表漂移
|
||||
raise BadRequestError(f"参数 {item.param_code} 未在系统中定义")
|
||||
@@ -234,7 +251,7 @@ def submit_change(
|
||||
if spec.dimension_type == "NONE" and dimension != "":
|
||||
raise BadRequestError(f"参数 {item.param_code} 不带维度,维度值须为空")
|
||||
if spec.dimension_type == "BUSINESS_ROLE" and dimension:
|
||||
role = business_role_repository.get_by_code(session, dimension)
|
||||
role = roles.get(dimension.casefold())
|
||||
if role is None:
|
||||
raise BadRequestError(
|
||||
f"参数 {item.param_code} 的维度值 {dimension!r} 不是已存在的岗位"
|
||||
|
||||
在新工单中引用
屏蔽一个用户