-
ERP /ai/fieldOptions 已上线(feature/ai @5d4ff83),其返回的 assign 声明了 选中一行后还应带出哪些列。前端在选中时按 assign 收集该行对应值随提交回传, buildCreate/buildQuote 用 applyAssign 合并:只填用户没填过的列、且必须是目标表 真实存在的非系统列——用户已写的备注不会被客户档案的备注覆盖(ERP 回执 4.1 提醒)。 修复 ERP 指出的实际缺陷:我们建的 10 张报价 sCustomerName 全空,而原生单会填。 实测:assign 提交后 sCustomerName/sCustomerNo 落入载荷;用户已填字段不被覆盖。
-
用户在 FK 选择器里点中某一行后,前端把该行 id 随保存回传(form/submit 与 preview/save 均加 boundIds:字段技术名→id),normalize 有 id 时直接绑定、 不按名称反查——候选的权限/租户/级联判定以 ERP 的下拉配置为准。 未经选择、仅凭名称(AI 预填或手打)的路径不变,仍保持同名 fail-closed。 幻影列硬闸在 id 直绑路径上同样生效。 回归锁 +2(FormRenderNormalizeTest 8 例),46 单测绿。 实测:同名产品不给 id → 报同名拒绝;给 id → 精确绑定、ERP 执行 success+200, 落库 BJD202607092 的客户/产品 id 与点中行一致。
-
ErpClient.fieldOptions 调 /ai/fieldOptions(契约见 docs/erp-tasks-field-options.md): ERP 按其控件配置给候选,带行级数据权限、级联过滤(产品限定在已选客户名下)、 联动回填映射——这三样本地直查库都没有。404/异常/mode=none 一律回落到 FormResolverService.fkOptionPage,5 分钟退避避免反复撞未上线的端点。 前端 FK 选择器改传 (formId, 字段, ctx):ctx = 表单上已绑定记录的 id,供级联过滤; ERP 报 need_context 时提示'请先选择客户'而不是给空列表。预览卡新增 formId 与 fk 字段的 boundId,使修改单据时也有初始级联上下文。
-
…expired key; preview save name-keyed + empty=abandon-change; previewId atomic claim; transactional batch queue + column truncation; digest zone token-budgeted; window-orphan tool_result trim; convId length cap; readFormData authoritative moduleId + /form/options permission gate (security audit); WRITE_CLAIM state-statement lookahead
-
…e shared kernel + PreviewService (previewId Redis binding, save-side re-validation, state legality checks) + queue-only OpService (sMakePerson dual-write, status=confirmed); retire ProposeWriteTool/OpController/AuditService/ErpClient writes; preview card frontend; skills/prompt/bench sync; D: checkBusinessData stub behind erp.dry-run.enabled