Skip to content

docs(guides): import-and-export 按实测改写——导入向导在列表视图而非 Setup → Data,Salesforce 迁移标注未落地 (#763) - #797

Merged
yinlianghui merged 2 commits into
mainfrom
claude/issue-763-import-export-docs
Aug 5, 2026
Merged

yinlianghui merged 2 commits into
mainfrom
claude/issue-763-import-export-docs

Conversation

@yinlianghui

@yinlianghui yinlianghui commented Aug 5, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #763

前提核实(对 origin/main 实测)——部分不成立,已如实改写

issue 的主干成立,但其中一条被证伪,而那一条恰恰改变了本页该怎么写。

成立的部分

Setup → Data 分组根本不存在。 Setup 是真实存在的平台管理应用(@objectstack/setup,SETUP_APP 来自 @objectstack/platform-objects/apps),但它的导航分组只有九个:

Overview / Apps / People & Organization / Access Control /
Approvals / Configuration / Diagnostics / Integrations / Advanced

没有 Data 分组,也没有 Privacy 分组。所以本页原先的 Setup → Data → Import Wizard、→ Migrate from Salesforce、→ Migrate from HubSpot、→ Scheduled Exports、以及 Setup → Privacy → Data Subject Requests —— 五条路径全部指向不存在的界面。

Salesforce 迁移向导确实不存在。 src/ 全树 14 处 salesforce(不分大小写)命中,逐条看过,没有一处是能力:全是把 Salesforce 当业界设计参照引用的注释(forecast.object.ts:22 预测分类阶梯、case.object.ts:182 FirstResponseDateTime、pages/*.page.ts Lightning 版面、mappings/_shared.ts:10 恰恰在说「外部导出会写、而 HotCRM 没有对应选项的词」)。没有连接器、没有向导、没有读 Salesforce 的 action。

没有对外 OAuth。 grep -rni oauth src/ objectstack.config.ts 零命中。Setup 的 Advanced → OAuth Applications(sys_oauth_application,描述为 "Registered OAuth/OIDC client applications")登记的是调用进入 ObjectStack 的客户端 —— 方向正好相反,不能拿来向别人的 Salesforce org 取得授权。这一处比 issue 的「没有 OAuth 授权面」更精确,本 PR 按精确版写。

「完成后发邮件」不存在。 REST 导入作业路径上没有任何 sendMail / notify;plugin-email 未配 provider 时回落 LogTransport("mail will NOT be sent",#755 已实测)。

被证伪的一条:Import Wizard 存在,只是不在 Setup 里

issue 写「src/apps/ 与 src/pages/ 下没有 Import Wizard / Migrate 页面」—— 前提正确(应用侧确实没有),结论过宽:向导由平台 Console 随附,入口在对象自己的列表视图工具栏。

实测链路:

  • @objectstack/console 的 objectView i18n 带 import: "Import" / importTitle: "Import from CSV",按钮打开 plugin-grid 懒加载的 ImportWizard;
  • 三步 Upload / Mapping / Preview,支持拖放 CSV/Excel 或从表格粘贴、Download template、按表头自动匹配并给置信度;
  • Import options 的写入模式恰好三档:Always create new / Update existing (skip if no match) / Update if matched, else create,外加 Match on 选匹配字段;
  • Validate data("Check every row against the server before importing.")= 试运行;大文件转后台作业并显示 Importing {{processed}} of {{total}} rows;History + Undo import("Records it created will be deleted and records it updated will be restored to their previous values.")。

关键的一处对账:向导通过 dataSource.listImportMappings(object) → client.meta.getItems('mapping') 拉取元数据里全部 mapping 项,再按 targetObject 等于当前对象过滤 —— 也就是本应用自己的具名映射。因此 crm_account_import / crm_contact_import / crm_lead_import 会出现在 Accounts / Contacts / Leads 列表视图的导入向导里 —— 和 importing-your-data.mdx 的 curl 路线是同一条服务端通路的两端。issue 说「两页各说各话」,真正的修法不是删掉一页,而是把它们接成一件事的两个入口。本 PR 按此改写,两页互链(对侧的回链本来就有,未动该文件)。

因此本页导入段落不是标注未落地,而是改写为实测的真实步骤;标注未落地的是 Salesforce/HubSpot 迁移、定时导出、数据主体请求。

同页其余断言的实测校正

原文 实测
单次上传上限 50 MB 没有这个限制;真实上限是每作业 50,000 行(SDK:for large files (up to 50,000 rows))
「仅更新 —— 如果未找到则失败」 实为 Update existing (**skip** if no match)
匹配「按 Email / External ID」 实为 Match on 由你选字段;三个随附映射各自的 upsertKey 是 Account Name / Email / Email
「加 external_id 列并标记为匹配键」 HotCRM 没有任何对象带 external_id 字段;且具名映射是严格投影,未声明的列在写入前即被丢弃 —— 这条建议完全空转。改写为「业务键」,并保留其承诺的幂等性(那部分是真的)
「多选用分号分隔」 src/objects/ 无任何 multiselect 字段,删除而非臆测
导出「从任何列表视图或报表」 声明 exportOptions: ['csv','xlsx'] 的只有 account / contact / lead / opportunity 四个视图
「受用户权限和 FLS 约束」 更准:allowExport 是 17.0 起的选择性开启硬门,未设即拒,viewAllRecords / modifyAllRecords 都不替代;本 PR 按 src/profiles/ 逐个角色列表
计划导出 / S3 / Parquet / 审计证书 / 匿名化操作 src/ 与平台能力清单均无;audit 与 reports 都不在本应用 requires(automation, triggers, analytics, auth, ui, approvals, sharing + 平台常开的 queue, job, cache, settings, email, storage, sms, sharing, messaging, analytics)

一处如实点破而非粉饰:工单(crm_case)在五个角色里都拿到 allowExport,但没有任何工单列表视图声明 exportOptions —— 那条授权面向的是报表导出,而 reports 能力不在 requires。页面按 #762 处理 webhooks 的姿态写成「部署侧的事实」,并另行立单(见下)。

一处状态分层:Salesforce 迁移不在路线图上,而 HubSpot 导入在(路线图原文 "More connectors — Slack, Microsoft Teams, Google Workspace, HubSpot import")。两者不是同一种「未落地」,页面分别写明。

关于反向验证

本页的散文断言没有门禁覆盖(docs-object-coverage 只保证每个 crm_* 对象有一页文档),所以不存在「改前红、改后绿」可展示,这里不编造。能拿到的真实反向验证是三语一致那条,方向按预测为红:临时删掉 zh-Hans 页的一个 callout 后 test/docs-drift.test.ts 按预期变红并点名本页 ——

content/docs/guides/import-and-export.zh-Hans.mdx: 1 callout(s),
  but content/docs/guides/import-and-export.mdx has 2
Test Files  1 failed (1) | Tests  1 failed | 30 passed (31)

恢复后 docs-drift + docs-object-coverage 2 files / 53 passed。说明守卫读的是新页,不是空过。

验证

文件面

content/docs/guides/import-and-export.mdx + zh-Hans / zh-Hant + 一个 changeset(docs, patch)。未动 src/**、未动 importing-your-data.mdx(对账基准)、未新建守卫、未动 content/docs/releases/。

越界发现另行立单(见下方 issue 链接),均不带 label、不 assign。

…force 迁移标注未落地 (#763)

`Setup → Data` 分组根本不存在(Setup 应用只有 Overview/Apps/People &
Organization/Access Control/Approvals/Configuration/Diagnostics/Integrations/
Advanced 九组),因此本页几乎每一步指向的都是不存在的界面。

但 issue「Import Wizard 不存在」这一条不成立:Console 的 object grid 确实
随附导入向导,入口在对象列表视图工具栏的 Import,并通过
`listImportMappings` → `meta.getItems('mapping')` 按 targetObject 列出本应用
自己的三个具名映射——与 importing-your-data.mdx 的 API 路线是同一条服务端
通路的两端。已按此改写,两页互链。

未落地的部分(Salesforce 迁移向导、OAuth、定时导出、数据主体请求)按
#755/#756 先例标注「尚未落地」并保留设计意图;能落地的部分对着
exportOptions、allowExport 授权与真实向导步骤重写。三语同改。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VHrPAGEgFDoHjphqYG4BMa
@vercel

vercel Bot commented Aug 5, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
hotcrm Ignored Ignored Aug 5, 2026 8:29pm

Request Review

CI 的 link-check(gaurav-nelson/github-action-markdown-link-check)扫描面是
`.md`,`.changeset/*.md` 在内;它把 `[...](...)` 里的路径当 URL 校验,而
`/docs/guides/importing-your-data` 这样的站内根相对路径无法解析 →
Status: 400 / ERROR: 1 dead links found!。config 的 ignorePatterns 也没有
覆盖根相对路径。

本地首轮只核了 .mdx 页,因此没撞上这条。改为反引号纯文本;三个 mdx 页里的
站内链接不受影响(那些是 .mdx,不在该 action 的扫描面内)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VHrPAGEgFDoHjphqYG4BMa

Copy link
Copy Markdown
Collaborator Author

越界发现,均已单独立单(不带 label 的两条留给 PM 定级,第三条按观察项打 finding):

另:CI 的 link-check 首轮红了,root cause 在 changeset 而非文档页——该 action 的扫描面是 .md(含 .changeset/),它把 [...](/docs/...) 里的站内根相对路径当 URL 校验 → 400。已改为纯文本(004d2d7)。本地首轮核链只走了 .mdx 页,漏了这条扫描面差异,已把本地检查脚本扩到与 CI 同面。


Generated by Claude Code

@yinlianghui
yinlianghui marked this pull request as ready for review August 5, 2026 20:33
@yinlianghui
yinlianghui added this pull request to the merge queue Aug 5, 2026
Merged via the queue into main with commit 131daf9 Aug 5, 2026
9 checks passed
This was referenced Aug 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

同一缺陷类:guides/import-and-export.mdx 声称随箱提供 Salesforce 迁移向导与「Setup → Data → Import Wizard」,两者都不存在

2 participants