现象
POST /data/:object 与 PATCH /data/:object/:id 回包里的 record 不含任何 formula 字段(键整个缺失),而同一记录随后的 GET / LIST 都有值 —— read-your-write 不一致。
复现步骤
POST /api/v1/data/crm_account {"name":"PatchEcho"}
# → 201,record.display_title === undefined(键缺失)
GET /api/v1/data/crm_account/<id>
# → display_title = "ACC-000016 - PatchEcho" ✅
PATCH /api/v1/data/crm_account/<id> {"segment":"growth"}
# → 200,record.display_title 仍缺失
多公式对象更明显 —— crm_forecast 的 POST 回包 expected_amount / attainment_pct / coverage_ratio 全部缺失,GET/LIST 均正常求值(30000 / 10 / 0.556)。两次独立运行、多个对象(crm_account、crm_forecast、crm_opportunity_line_item)均复现。
期望 vs 实际
- 期望:写操作回包的
record 与紧接着的 GET 等价(回包自称是 record,消费方会直接拿来渲染);
- 实际:回包是入库文档本身,formula(虚拟列)一个都没有,客户端必须额外再 GET 一次。
落点分析
packages/objectql/src/engine.ts:applyFormulaPlan 只有两个调用点 ——
- L4651(
find 结果)
- L4783(
findOne 结果)
insert / update 的返回路径不经过 formula plan,REST 层(packages/rest/src/rest-server.ts POST/PATCH handler → protocol.createData/updateData)也原样透传。
影响
- 对
nameField 指向 formula 的对象(HotCRM 里 account/product/case/campaign/quote/knowledge_article/forecast/lead/contact 全是),create 后直接用回包渲染记录标题会得到空;
- 集成方在写后需要多一次往返才能拿到派生值,且这种缺失是静默的(键不存在,不是 null),容易被当成「字段没配」误排查。
体验/一致性问题,p2 量级。
环境
hotcrm@0899b4f + @objectstack 17.0.0-rc.2(REST 验收,admin token,file:SQLite)
查重:搜过 formula create response、write response record formula、formula fields missing/undefined/hydrate,两仓 open+closed 无既有单(#1979 是把 context 穿进 applyFormulaPlan 的读路径工作项,#1530/#3306 是求值本身的缺陷,均不覆盖「写回包不水合」)。
现象
POST /data/:object与PATCH /data/:object/:id回包里的record不含任何 formula 字段(键整个缺失),而同一记录随后的 GET / LIST 都有值 —— read-your-write 不一致。复现步骤
POST /api/v1/data/crm_account {"name":"PatchEcho"} # → 201,record.display_title === undefined(键缺失) GET /api/v1/data/crm_account/<id> # → display_title = "ACC-000016 - PatchEcho" ✅ PATCH /api/v1/data/crm_account/<id> {"segment":"growth"} # → 200,record.display_title 仍缺失多公式对象更明显 ——
crm_forecast的 POST 回包expected_amount/attainment_pct/coverage_ratio全部缺失,GET/LIST 均正常求值(30000 / 10 / 0.556)。两次独立运行、多个对象(crm_account、crm_forecast、crm_opportunity_line_item)均复现。期望 vs 实际
record与紧接着的 GET 等价(回包自称是 record,消费方会直接拿来渲染);落点分析
packages/objectql/src/engine.ts:applyFormulaPlan只有两个调用点 ——find结果)findOne结果)insert / update 的返回路径不经过 formula plan,REST 层(
packages/rest/src/rest-server.tsPOST/PATCH handler →protocol.createData/updateData)也原样透传。影响
nameField指向 formula 的对象(HotCRM 里 account/product/case/campaign/quote/knowledge_article/forecast/lead/contact 全是),create 后直接用回包渲染记录标题会得到空;体验/一致性问题,p2 量级。
环境
hotcrm@0899b4f + @objectstack 17.0.0-rc.2(REST 验收,admin token,file:SQLite)查重:搜过
formula create response、write response record formula、formula fields missing/undefined/hydrate,两仓 open+closed 无既有单(#1979 是把 context 穿进 applyFormulaPlan 的读路径工作项,#1530/#3306 是求值本身的缺陷,均不覆盖「写回包不水合」)。