文档

带收藏、标签、搜索和 AI 提取的共享文件库;AI 提取可读取 PDF 并为你填写表单。

文档浏览器是用于已上传文件的扁平、可搜索库。文件可以独立存在,也可以附加到记录(例如生产订单、采购订单或 RFQ)。附加文件会同时出现在记录和浏览器中。文件库支持个人固定和标签、按名称和说明搜索,以及读取受支持 PDF 并预填表单的 AI 提取。

从侧边栏的文档打开浏览器。它默认显示 All Documents(全部文档)视图(useDocumentsSubmodules.tsx:15-45)。

浏览器

表格列出可访问的文件,固定的文件在前(documents.service.ts:86-88)。每行显示名称、链接的来源单据、个人标签、大小、类型、扩展名以及创建和更新时间(DocumentsTable.tsx:174-405)。

左侧标签栏切换五个视图来限定列表(useDocumentsSubmodules.tsx:15-45):

字段类型
你有读取权限的公司内所有活动文件。
你上传的文件(createdBy = 你)。
按最后活动排序——最新的查看、下载、标签或编辑在前。
只显示你固定的文件。
已软删除的文件,等待恢复或清除。

类型是推导的,不是选择的。文件上传时,Carbon 读取其名称并分类到十个桶之一:Archive、Document、Presentation、PDF、Spreadsheet、Text、Image、Video、Audio 或 Other(20230423023136_documents.sql:1-12)。扩展名列由数据库从文件名本身(最后一个点之后的文本)计算,因此始终与实际文件一致(20230423023136_documents.sql:20)。

NOTE

回收站是软删除,不是清除

"Move to Trash(移到回收站)"只把文件的 active 标志翻为 false——行和存储的文件都保留,"Restore from Trash(从回收站恢复)"会翻回(documents.service.ts:124-152)。要真正移除文件,请从行菜单使用 Permanently Delete(永久删除);该操作无法撤销(DocumentsTable.tsx:461-471)。

上传

Upload(上传)接受任何文件。浏览器把它上传到私有存储的 {companyId}/{random}.{ext},然后创建带路径、名称和大小的文档行(DocumentCreateForm.tsx:22-69)。上传、下载、编辑、收藏和标签更改会创建活动交易,驱动最近视图(useDocument.ts:44-57,20230423023136_documents.sql:117-146)。

谁可以查看文件

可见性取决于用户组成员关系和权限。只有当用户属于文档的某个 readGroups 且具有 documents 查看权限时才能查看。编辑或删除还需要属于 writeGroups 条目并具有相应权限(20230423023136_documents.sql:40-66,useDocument.ts:22-42)。私有存储应用相同的读取组规则,因此未授权链接无法解析(20230423023136_documents.sql:68-119)。

NOTE

组是 Carbon 的公司组

读取和写入组来自你的公司集团成员关系,与其他地方用于范围限定的组相同。编辑文档属性时设置它们;对用户没有匹配读取组的文件对其不可见。

固定与标签

两个个人组织器位于共享库之上,都是按用户的——你固定或标记的内容只属于你,而不是整个公司。

  • 固定(显示为图钉,行菜单中称为「收藏」)把文件浮动到列表顶部并驱动已固定视图。切换会写入或移除以你为键的 documentFavorite 行(useDocument.ts:113-130,documents.service.ts:199-219)。
  • 标签是你附加到文件的自由文本标记。在行的标签弹窗中输入以复用现有标签或即时创建新标签;点击标签可把列表筛选到它(DocumentsTable.tsx:239-296,useDocument.ts:142-164)。标签按用户存储,因此你的「Q3 审计」标签不会干扰同事的视图(20230423023136_documents.sql:186-215)。

搜索

搜索对名称和说明执行不区分大小写的子串匹配,而不是文件内容(documents.service.ts:72-76)。可以把搜索与来源单据、标签、类型、扩展名或创建者筛选以及视图标签组合。Download CSV 导出当前结果集,并为每行提供签名下载链接(search.tsx,DocumentsTable.tsx:393-405)。

文档如何附加到记录

文档可以指回其所属记录。行的 Source Document(来源单据) 列显示该链接并直接跳到父记录(DocumentsTable.tsx:207-237)。文档可附加的记录类型是固定的(documents.models.ts:9-23):

字段类型
报价单、询价请求、销售订单、销售发票、销售退货订单、发货单。
采购订单、采购发票、采购退货订单、采购询价请求、供应商报价。
生产订单、量具校准记录、问题。
部件、原材料、工具、耗材、服务。
供应商、客户。这些是主记录而非交易,用于属于往来方本身的文件。

附件在文件上存储为 sourceDocument(类型)加 sourceDocumentId(记录 ID)(documents.service.ts:154-183)。由于文件也存在于共享浏览器中,你可以通过打开记录或在库中搜索找到它。各记录展示文件的位置参见销售订单、采购订单和生产订单参考,往来方级文档标签页参见供应商与客户。

AI 提取

在受支持的工作流中,Carbon 可以从 PDF 提取字段并预填表单。支持两种单据类型(document-extraction.ts:9-13,documents.models.ts:126):

  • 销售侧的询价请求 PDF,以及
  • 采购侧的采购发票 PDF。

逐步说明

当你把 PDF 拖入这些流程时,Carbon 创建一行 documentExtraction(初始状态 pending)并排队后台任务(documents.service.ts:248-296,20260609001724_add-document-extraction.sql:4-30)。任务随后(extract-document.ts:26-232):

  1. 把行翻为 processing;
  2. 从私有存储下载 PDF 并用 PDF 解析器提取其文本(这是文本提取,不是图像 OCR——仅扫描图像的 PDF 不会产生文本);
  3. 加载公司的候选记录,使模型能自行把名称解析为真实 ID——发票的供应商和付款条件,RFQ 的客户(extract-document.ts:84-140);
  4. 把文本和这些候选列表发送给 AI 模型,模型把每个字段返回为 { value, confidence } 对(schemas.ts:1-88);
  5. 按置信度筛选:低于阈值(默认 0.85)的字段降为 null,因此低置信度猜测绝不会进入表单(extract-document.ts:184-224,packages/env/src/index.ts:173-178);
  6. 把日期规范化为 YYYY-MM-DD,并把原始输出和筛选结果都保存在行上,状态 completed(extract-document.ts:184-232)。

表单随后读取筛选后的值并预填自身,尽可能把提取的联系人和地址匹配到客户或供应商的现有记录(documents.models.ts:168-255)。

NOTE

它为你解析 ID,而不是编造

模型会收到你实际的供应商、付款条件或客户列表,并被要求返回单个最佳匹配的 ID 或 null——绝不编造(extract-document.ts:141-152)。因此 supplierId / customerId / paymentTermId 要么返回你已有的真实记录,要么为空,表单自身的匹配会填补其余部分。

提取哪些内容

对于采购发票,提取目标为供应商(名称、联系人、地址和解析后的 supplierId)、发票抬头(编号、发票和到期日期、付款条件和解析后的 paymentTermId、引用的 PO 号、货币)、金额(小计、税、运费、合计)以及行项目(部件号、说明、数量、单价、行合计)(schemas.ts:20-54)。

对于询价请求,目标为客户(名称、解析后的 customerId,以及单独的采购和工程联系人及客户地址)、RFQ 抬头(编号、RFQ 日期、到期日、要求交付日)以及行项目(部件号、说明、数量)(schemas.ts:63-86)。

HEADS UP

提取是草稿,不是提交

documentExtraction 行只是暂存区——它本身绝不创建发票或 RFQ。提取的值预填常规表单,真实记录在你保存时通过通常的权限把关路由动作创建(20260609001724_add-document-extraction.sql:37-39)。如果后台任务无法入队或解析失败,该行标记为 failed 并带错误,你只需手工填写表单(documents.service.ts:272-295,extract-document.ts:225-231)。

提取质量取决于 PDF 是否为文本型以及部署是否配置了 AI 密钥;没有它们流程仍可用,你只需自己输入字段。

NOTE

不是文档模板定制器

本页讲的是文件库。独立的文档模板功能——用于 Carbon 生成的 PDF(报价单、订单确认、发票)的拖放定制器——是另一个子系统,不在此覆盖。