-
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 与点中行一致。
-
- create 载荷 sFormId 改写模块 id(与 ERP 原生同构;表单 id 无 SysBillNoSettings 编号规则,执行期重生成单号必撞已用号) - ai_op_queue 停写 sUserId(ERP 执行器已切读 sMakePerson;列暂 不可删——ERP myTodos 仍 COALESCE 引用) - saaslocal 开启 erp.dry-run.enabled(ERP /business/checkBusinessData 已上线,保存前真实校验链 validate-only) 联合 e2e 实测:建报价 BJD202607091(sFormId=模块id、主从落库)→ 审核 success+200 → 重复审核 fail+409 → 改字段 success+200 → 取消 fail+450 → 幂等 success+201;dry-run 保存时真实调用(ERP 日志 时刻对齐)且零落库。
-
…ently bind first — 31 same-name groups in eleproduct alone); deterministic candidate order (sId tiebreak); LIKE wildcard escaping; quote non-FK branch phantom gate; cold-read warm lock vs concurrent double-fill; resolveNameField(+ByFormId) phantom name-column cross-check (55/108 fk tables)
-
…r + shown=resolved record name (WYSIWYG); phantom-column cross-check vs information_schema (resolveColumn/businessFields/skeleton/normalize hard gate); ledger cold-read always warms full window (partial-window rebuild permanently truncated history); CORS origin allowlist (configurable, default localhost) replacing wildcard+credentials; stale 'confirmed' docs
-
…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