• ERP /ai/fieldOptions 已上线(feature/ai @5d4ff83),其返回的 assign 声明了
    选中一行后还应带出哪些列。前端在选中时按 assign 收集该行对应值随提交回传,
    buildCreate/buildQuote 用 applyAssign 合并:只填用户没填过的列、且必须是目标表
    真实存在的非系统列——用户已写的备注不会被客户档案的备注覆盖(ERP 回执 4.1 提醒)。
    
    修复 ERP 指出的实际缺陷:我们建的 10 张报价 sCustomerName 全空,而原生单会填。
    实测:assign 提交后 sCustomerName/sCustomerNo 落入载荷;用户已填字段不被覆盖。
    zichun authored
     
    Browse Code »
  • 用户在 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 与点中行一致。
    zichun authored
     
    Browse Code »
  • 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,使修改单据时也有初始级联上下文。
    zichun authored
     
    Browse Code »
  • …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
    zichun authored
     
    Browse Code »
  • …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
    zichun authored
     
    Browse Code »