为什么我无法导出数据或看不到Excel选项?

Frappe 让你几乎可以从任何列表中把记录导出为 Excel 或 CSV。如果你找不到导出操作、在数据导出工具中看不到你需要的文档类型,或者导出的文件打开后只有列标题没有数据行,这几乎总是因为缺少权限或存在生效的筛选条件,而不是 bug。无论你是从销售工作区导出客户列表、从财务导出采购发票列表,还是导出任何其他文档类型,情况都一样。

在哪里找到导出

有两种导出数据的方式。两种都可以选择 CSV 或 Excel。

从列表或报表视图导出

  1. 打开列表,例如客户。
  2. 用复选框选中一条或多条记录(或用表头行的复选框全选)。
  3. 点击操作 → 导出。
  4. 在导出数据对话框中,将文件类型设为 CSV 或 Excel,选择要包含的字段,然后点击导出。

从数据导出工具导出

  1. 进入数据导出(使用搜索栏,或从模块侧边栏选择数据 → 数据导出)。
  2. 在选择文档类型中,选择要导出的文档类型。
  3. 选择 CSV 或 Excel 作为文件类型。
  4. 选择要导出的字段,如有需要可添加筛选条件,然后点击导出。

为什么你可能看不到导出,或者看不到某个文档类型

两种导出方式都检查同一个角色权限:导出。角色需要对该文档类型有读取权限才能访问其记录,还需要导出权限才能下载它们。如果分配给你的任何角色都没有某个文档类型的导出权限:

  • 操作中的导出选项仍然会显示,但导出会因权限错误而失败。
  • 该文档类型根本不会出现在数据导出工具的选择文档类型字段中。该字段只列出你有导出权限的文档类型。

如果你在没有权限的情况下尝试导出,会看到:

You are not allowed to export <doctype> doctype
</doctype>

要从列表的报表视图导出,你的角色还需要对该文档类型有报表权限。没有它,报表视图本身就不可用,因此也就没有东西可以导出。

如何修复

系统管理员可以授予权限:

  1. 进入角色权限管理器。
  2. 选择文档类型,例如客户。
  3. 找到该用户所拥有角色对应的行,例如销售用户。
  4. 勾选导出。如果读取和报表尚未勾选,也一并勾选。
  5. 让用户刷新页面后重试。

如果该角色勾选了“仅限创建者”,用户只能导出自己创建的记录。如果他们还需要导出其他人创建的记录,请取消勾选。

为什么导出的文件只有列标题没有数据

如果下载的文件打开后只有一行标题、没有记录,说明导出执行了,但匹配到零行。这种情况发生在:

  • 列表或导出数据对话框中的筛选条件排除了所有记录。对话框的导出类型可以设为筛选后的记录,这样只会导出列表当前筛选条件匹配的内容。如果这些筛选条件太窄,或者指向不存在的值,就什么都匹配不到。
  • 用户权限对记录的限制比你预期的更严格。对某个关联字段设置的用户权限(例如将用户限制到某一个公司)会像作用于列表一样作用于导出。一条记录可能出现在列表中,但如果限制发生了变化,或者“仅限创建者”把你限制在非你创建的记录之外,它仍可能被排除在导出之外。

例如,如果你把客户列表筛选到一个没有客户的地区,并用筛选后的记录导出,下载的文件就只有 ID 列标题,没有数据行。

要修复它:

  1. 清除列表中的筛选条件,或将导出类型切换为所有记录,然后重新导出。
  2. 如果记录在列表中可见,但导出时仍然缺失,请检查角色权限管理器中你的角色是否勾选了“仅限创建者”,并检查用户权限中是否有针对你的用户的任何限制。

如何预防

  • 在导出大型列表之前,清除你不需要的筛选条件,或确认已应用的筛选条件仍然匹配你期望的记录。
  • 设置新角色时,对它需要导出的每个文档类型同时授予读取、报表和导出权限,这样该角色就不会出现部分记录可见但无法导出的情况。
  • 用户与权限
  • 数据导出
  • 编辑报表的导出/打印权限

移除自己的系统管理员角色后恢复访问权限

如果你从自己的用户账号中移除了系统管理员角色,或者移除了所有角色,你就会失去对用户、角色以及所有需要系统管理员权限的页面的访问权。大多数情况下,你可以自己恢复访问权限,不需要提交工单。

为什么会发生这种情况

Frappe 会在每个页面上检查你的角色。像用户列表、角色和角色权限管理器这样的页面,只有拥有系统管理员角色的用户才能看到。如果你编辑自己的用户记录并取消勾选系统管理员,或者取消勾选所有角色,那么你接下来打开的页面就是你已经无法看到的页面了。Frappe 不会在你保存一个会把自己锁在外面的更改之前提醒你。

例如,Bluepeak Technologies 的 Ayesha Khan 打开了自己的用户记录,想清理掉一些不再需要的角色,结果把系统管理员也一起取消勾选了。

roles-tab-uncheck-system-manager.png

在 dev16.localhost 上实时截取:Ayesha Khan 的用户表单的角色与权限选项卡,角色列表底部的系统管理员复选框已被清除,表单显示“未保存”。已端到端验证:取消勾选此框并保存会重现锁定问题,该账号的用户列表从 16 行降到 0 行。

她保存后,设置工作区从她的侧边栏消失了。如果她直接打开用户列表,列表加载出来没有任何行。如果她打开一个需要系统管理员权限的页面,比如角色权限管理器,她会看到:

错误

Not permitted to view Role Permission Manager

Administrator 用户是唯一的例外:无论“拥有角色”表中显示什么角色,Frappe 始终授予它所有权限。下面的每个选项都直接或间接地利用这一点来恢复你的访问权限。

自己修复

使用下面第一个适用于你的选项。

另一个用户仍然拥有系统管理员角色

请该用户执行以下操作:

  1. 前往用户列表并打开你的用户记录。
  2. 打开角色与权限选项卡。
  3. 勾选系统管理员。
  4. 点击保存。

注销后重新登录以应用更改。

从 bench 控制台重新添加角色

终端

bench --site yoursite.com console

在 In [1]: 提示符下,运行:

Python

user = frappe.get_doc("User", "your-email@example.com")
user.add_roles("System Manager")

从站点注销并重新登录。

如果你不想动自己的用户记录,也可以改为从命令行创建一个临时的第二个系统管理员用户,然后用它通过界面修复你的主账号:

终端

bench --site yoursite.com add-system-manager temp-admin@example.com \
  --first-name Temp --password "a-strong-password"

通过 SSH 进入 bench 组

SSH 访问需要先创建一个私有的 bench 组并添加你的 SSH 密钥。参见 SSH 访问。一旦你能通过 SSH 登录,运行与选项 2 中相同的 bench --site yoursite.com console 命令和 user.add_roles("System Manager"),然后从你的站点注销并重新登录。

使用数据库访问

前往站点仪表盘 → 操作 → 访问站点数据库,如果你之前没用过,点击启用访问。使用显示的凭据通过 MariaDB 命令行客户端连接,然后运行:

SQL

INSERT INTO `tabHas Role`
  (name, creation, modified, modified_by, owner, docstatus,
   idx, parent, parentfield, parenttype, role)
VALUES
  (UUID(), NOW(), NOW(), 'Administrator', 'Administrator', 0,
   1, 'your-email@example.com', 'roles', 'User', 'System Manager');

通过这种方式所做的更改会跳过 Frappe 的正常保存步骤,因此对已经打开的会话不会生效。从你的站点注销并重新登录,角色才会生效。(已验证:直接在数据库中添加的角色只有在重新登录后才会出现——在那之前,正在运行的会话会一直保留旧的角色列表。)

重置 Administrator 密码

这在自托管环境中有效,或者在 Frappe Cloud 上,只要你像选项 2 或 3 那样拥有控制台或 SSH 访问权限也有效:

终端

bench --site yoursite.com set-admin-password "a-strong-new-password"

使用用户名 Administrator 和你刚设置的密码登录。Administrator 始终拥有完全访问权限,所以你现在可以打开自己的用户记录,并通过正常的角色与权限选项卡重新勾选系统管理员。

user-list-access-restored.png

在 dev16.localhost 上实时截取:Ayesha Khan 账号的系统管理员角色恢复后、她重新登录时的用户列表——列表再次显示全部 16 个用户(锁定期间为 0),右上角的+ 添加按钮也回来了。

如果这些都不适用于你

如果你的站点在共享的 Frappe Cloud bench 上,你没有数据库访问权限、没有其他系统管理员用户,也没有保存的 Administrator 密码,请在 support.frappe.io 上提交工单。支持人员会要求你从 Frappe Cloud 仪表盘(侧边菜单中的访问请求)批准一个站点访问请求,然后他们才能恢复你的角色。

如何预防

  • 在每个站点上保留第二个拥有系统管理员角色的用户,作为常备的备用管理员。如果你把一个账号锁在外面,你可以在不到一分钟内从另一个账号修复它。
  • 在从您自己的用户中移除角色之前,请检查它是否是最后一个系统管理员账户。
  • 创建站点时,请将管理员密码保存在安全的地方。即使其他所有系统管理员账户都不在了,它也是您的备用方案。
  • 用户和权限
  • 权限类型
  • SSH 访问
  • 数据库访问

S3文件存储

我可以把文件存到 S3、GCS 或 Google Drive,而不是服务器上吗?

不能直接这样做。Frappe 没有内置的设置可以把新上传的附件发送到
Amazon S3、Google Cloud Storage (GCS) 或 Google Drive。用户通过附件对话框上传的每个文件
都会保存到站点的本地文件存储中,而不是外部对象存储。

提出这个问题最多的,通常是附件增长很快的团队,比如扫描的收据、客户上传的视频或产品图片,
他们希望在站点磁盘空间用完之前把这些文件转移出去。

为什么没有这个功能

Frappe 的文件存储出于速度和简洁性的考虑,设计上就是直接写入本地磁盘。要把新上传的文件
发送到外部对象存储,需要改变 Frappe 读写文件的方式,而不仅仅是一个设置,所以目前没有
受支持的方法来实现这一点。

Frappe Framework 中的 Google Drive 集成经常被误认为是这个功能。其实不是一回事:
它只能让你浏览自己的 Google Drive,并为那里已经存在的文件附加一个链接。
它不会改变用户新上传文件的存储位置,也不会把站点已有的文件移到 Drive 中。

最接近的办法

如果文件已经存在于 Frappe 之外

如果文件已经托管在 S3、GCS、Google Drive 或任何其他服务上,可以附加一个链接,
而不是上传一份副本:

  1. 打开文档,在侧边栏中进入 附件。
  2. 点击 +,然后选择 链接。
  3. 把文件的 URL 粘贴到 附加网页链接 中,然后点击 上传。

Frappe 存储的是链接而不是文件,所以这个附件不占用站点的任何存储空间。

如果你希望新上传的文件自动存到 S3

有一个社区维护的应用市场应用 Frappe S3 Attachment,可以把新上传的文件重定向到 S3
存储桶。它不是由 Frappe 开发或维护的:

  • Frappe 支持团队无法排查该应用中的问题,也无法保证它能与你的站点版本兼容。
    安装前请查看该应用自己的页面,了解它目前支持哪些 Frappe 版本。
  • 它是针对 AWS S3 开发和测试的。像 Oracle Object Storage 或 MinIO 这样的 S3 兼容服务商
    可能可以用相同的存储桶名称、访问密钥、密钥、区域和自定义端点 URL 来运行,
    但这并未得到确认,出现的任何问题都需要你自己解决。

这个变通方法的局限

  • 两种方案都不能自动生成文件夹结构,比如按文档类型、客户或日期分类。
    这需要通过 Frappe 合作伙伴或你自己的团队进行定制开发。
  • 网页链接方案只适用于你已经托管在别处的文件。它不会减少已经上传到 Frappe 的文件
    所占用的空间。
  • 如果团队很在意把文件存储从服务器上移走,可以在 GitHub 上提交功能请求,
    或者在社区论坛中询问是否已有其他开发者构建了可以复用的东西。
  • 附件
  • Google Drive
  • 将备份上传到 Amazon S3

从工作区或侧边栏移除不用的链接

你可以移除用户不需要的 DocType 链接,比如 Buying 中的 Material Request。你可以在设置里完成这个操作,不需要修改任何代码。

开始之前

  • 你需要 Workspace Manager 角色才能为所有用户修改工作区或侧边栏。System Manager 角色不包含这个权限。请在 User → Roles 下添加它。
  • 以下步骤适用于 Frappe v16。

一个 DocType 链接可以在模块中的两个地方显示:

  • 左侧边栏。 它是一个独立的记录,名为 Workspace Sidebar。每个模块都有一个,比如 Buying。
  • 工作区上的卡片。 这是模块的主页面,比如 Reports & Masters 下的 Buying 卡片。

每个地方都有自己的链接列表。如果你从一个地方移除了链接,它还会保留在另一个地方。要彻底移除它,需要按照两组步骤都操作一遍。

移除链接只是把它隐藏起来,并不会删除 DocType、它的记录或用户权限。用户仍然可以通过搜索栏或 URL 打开列表。如果要阻止用户打开它,请参阅“仅对部分用户隐藏”。

观看操作步骤:

  1. 打开模块,比如 Buying。
  2. 在右上角点击 ···,然后点击 Edit。工作区会进入编辑模式。
  3. 指向包含该链接的卡片,比如 Buying。点击卡片上的铅笔图标。Edit Links 对话框会打开。
  4. 在 Card Links 下,点击该链接所在行的铅笔图标,比如 Material Request。Editing Row 对话框会打开。
  5. 点击 Delete。该行会从 Card Links 中移除。
  6. 用保存按钮关闭 Edit Links 对话框。
  7. 在右上角点击 Save。

卡片上不再显示该链接。

  • Workspace
  • Users and permissions

为什么我的估值率或库存价值为负或异常高?

负值或异常高的估值率几乎总是由某一笔错误的库存交易引起的,而不是估值方法本身的 bug。请在库存分类账中找到那笔交易,修正它,然后运行重新计算库存估值,这样之后的所有分录都会被重新计算。

你可能遇到了以下症状之一:

  • 库存余额显示余额价值为负,而数量却是正数。
  • 某个物料的估值率突然跳到正常成本的 10 倍或 1000 倍。
  • 交货单或销售发票上的销货成本高得离谱,或者是负数。
  • 物料清单或库存分录为某个原材料取到了一个意外的费率。

常见原因

估值率等于余额价值除以余额数量。所以当一笔价值以错误的费率入账,而剩余数量又很少时,费率就会被推得偏离很远。

原因 出了什么问题 你在库存分类账中看到什么
负库存 在库存设置中开启了允许负库存时,库存在收到之前就被发出了。出库分录使用了猜测的或旧的费率。当收货到达时,其费率不同,差额就留在了余额价值中。 余额数量降到零以下,然后一笔收货之后平均费率(余额库存)出现跳变,或者余额价值变为负数。
零费率收货 采购收货、物料收货或库存对账在保存时费率为 0(通常勾选了允许零估值率)。这会把平均值拉低。之后以旧费率出库时,取走的价值可能超过剩余的价值。 收货上的入库费率为 0,随后费率下降,之后余额价值变为负数。
倒填日期的分录 在已有分录之前过账的交易会改变之后每一笔分录的费率。如果重新计算还在排队或已失败,之后的分录会保留旧值。 倒填日期之后的分录对不上。该物料的重新计算库存估值记录显示为排队中或失败。
序列号物料 每个序列号都带有它收货时的费率。如果某个序列号以错误的费率(或 0)入库,那么它的每次转移和交货都会带着那个错误的费率。 物料转移或交货单上的入库费率与该物料的通常成本相差很大。
错误的计量单位换算 物料以一种计量单位采购(例如箱),但以另一种计量单位(个)入库。错误的计量单位换算系数会把金额分摊到过少或过多的单位上。 单据上的入库数量看起来不对,入库费率是预期费率的倍数(例如 12 倍)。

找到费率出错的那笔分录

库存分类账报表按顺序列出该物料的每一次移动,因此你可以看到费率出问题的确切凭证。

  1. 转到库存 > 报表 > 库存分类账。
  2. 设置公司、物料和仓库。将起始日期设置得足够早,以覆盖费率看起来正常的最后时间。
  3. 从上到下阅读以下列:
  • 入库费率 —— 每笔收货的费率。查找 0,或远高于正常成本的费率。
  • 余额数量 —— 查找任何降到零以下的行。
  • 平均费率(余额库存) —— 每笔分录之后的估值率。找到第一次跳变或变为负数的行。
  • 余额价值 —— 这应该接近余额数量 x 平均费率。数量为正而价值为负就标志着问题所在。
  1. 打开第一个错误行上凭证号对应的凭证,以及它前面的那笔收货。其中之一就是你的源头分录。

一次检查一个仓库。每个仓库都有自己的估值率,所以一个仓库的问题可能看起来像是转移到另一个仓库时的突然跳变。

要一次性找到所有受影响的物料,请使用库存分类账不变量检查和错误库存价值报表报表。同时检查重新计算库存估值列表中状态为失败的记录。

修正源头分录,然后重新计算

先修正源头分录。仅重新计算只会再次运行同样的错误数字。

1. 修正源头分录

如果原因是 这样做
负库存 过账缺失的收货,其过账日期和时间要早于第一次出库,这样库存就不会降到零以下。
零费率收货 取消并以正确的费率修改该收货。对于库存对账,以正确的估值率修改它。
采购收货上的错误费率 取消并修改它。如果只是缺少运费或关税,请改用到岸成本凭证。
错误的计量单位换算 修正物料计量单位表中的换算系数。然后取消并修改受影响的单据。
序列号以错误的费率入库 取消并修改该序列号的原始入库单。后续的调拨和发货在重新过账后会采用修正后的费率。

2. 运行库存重新估值

取消或修改倒填日期的分录通常会自动生成一次重新过账。如果没有生成,或者之前的重新过账失败了,就手动创建一次。

  1. 转到库存重新估值 > 新建。
  2. 设置基于:
  • 物料和仓库 — 输入物料编码、仓库,以及源分录的过账日期和过账时间(或稍早一点的时间)。
  • 交易 — 输入源分录的凭证类型和凭证编号。
  1. 保存并提交。重新过账会在后台运行。其状态会从排队中变为进行中,再到已完成。
  2. 如果状态为失败,请查看错误日志字段。它通常会指出一行你仍需修复的负库存记录。修复后点击重新开始。
  3. 再次运行库存台账,确认平均费率(结存库存)现在已恢复正常。

重新过账还会更新总账,因此库存和账目价值会再次匹配。可以在库存重新过账设置中将重新过账限制在特定时间段;如果没有任何反应,请检查那里的时间段设置。

为什么物料清单或销售发票的费率可能与库存台账不同

物料清单和销售发票中的费率是在不同的时间、或从不同的地方获取的,与库存台账不同。出现差异并不总是错误。

单据 其费率来源 为什么会有差异
物料清单 物料费率基于:估值费率、最近采购费率或价格表。使用估值费率时,它取各仓库的平均值(如果设置了源仓库,则取源仓库的值)。 成本在保存物料清单时就固定了。只有当你点击更新成本时,或者在制造设置中开启了自动更新物料清单成本时,它才会变化。而库存台账是按仓库、实时更新的。
销售发票 费率是来自价格表或定价规则的销售价格,不是成本。 销货成本由送货单入账,或者仅在勾选了更新库存时由发票入账。它使用过账日期和时间对应的估值费率。
送货单 / 库存分录 源仓库中过账日期和时间对应的估值费率。 之后倒填日期的分录会在单据提交后改变这个费率。重新过账会更新它,但打印副本仍保留旧值。

如果物料清单显示原材料成本有误,请先修正原材料的估值(见上文)。然后打开物料清单并点击更新成本。

预防措施

一旦关闭负库存并且每笔入库都带有真实费率,大多数这类问题就会消失。

  • 保持负库存禁用。在库存设置中,不要勾选允许负库存。这样用户就无法在收货之前发出库存。
  • 为每笔入库设置估值费率。除非物料确实是免费的(例如免费样品),否则不要勾选允许零估值费率。在物料主数据中为期初库存和免费物料设置估值费率。
  • 在新计量单位首次采购之前,检查物料主数据上的计量单位换算系数。
  • 限制倒填日期的分录。使用库存设置中的允许创建/编辑倒填日期交易的角色,这样只有少数用户才能过账这类分录。
  • 关注重新过账队列。每周检查库存重新估值列表中的失败记录。在更多分录堆积之前逐一修复。

还需要帮助?

如果重新过账完成后费率仍然错误,请在 support.frappe.io 上提交工单。请附上:

  • 物料编码和仓库
  • 覆盖费率出错期间的库存台账导出文件
  • 库存重新估值记录的名称,以及失败时的错误日志

中国企业ERPNext电子设备制造业MES增强项目建议

ERPNext MES增强与NX、Teamcenter数据衔接

一、需求理解与建设建议

根据贵方提出的需求,本项目拟在ERPNext基础上增强制造执行能力,以Siemens Opcenter Execution Discrete(EX DS)的相关业务能力为参考,并逐步建立与NX、Teamcenter的工程数据衔接,实现设计资料向生产现场的有效传递。

结合电子设备制造场景及首期建设需求,建议采用“单线试点、分期建设”的方式:首期优先解决生产过程记录、工序执行、关键部件追溯和基础质量管理问题,形成可上线的业务闭环;后续根据试点效果推进自动接口及高级制造管理功能。

首期实施服务报价为20万元(含税),预计10–12周完成一条代表性产线的基础MES试点。

首期参照Opcenter EX DS中的相关业务场景建设,验收以本方案约定的功能为依据,不包含全面达到该产品的功能覆盖、性能及成熟度。NX、Teamcenter首期采用受控文件交换,自动接口联调作为第二阶段单独评估。

二、建设目标

  1. 生产进度透明: 记录工单和工序完成情况,便于管理人员了解现场进度。
  2. 执行过程可查: 记录产品序列号、操作工序、人员、时间及执行结果。
  3. 关键部件可追溯: 建立整机与板卡等关键部件的关联,支持正反向查询。
  4. 基础质量闭环: 记录检验、异常、复测和批准放行,控制不合格产品流转。
  5. 工程资料衔接: 将客户确认的Teamcenter来源物料、BOM及作业资料用于试点生产。

首期以电子设备整机装配为重点;如涉及自有SMT/PCBA产线,应另行评估卷料、料站、拼板及设备数据需求。

三、首期实施范围

3.1 试点规模

项目 首期范围
工厂与系统 单工厂、一个可用ERPNext站点
产线与产品 一条整机装配产线、一类代表产品,最多5个型号
工艺流程 一套主流程,最多10道工序
用户与终端 最多10个业务账号、5个同时在线工位终端
初始数据 最多200个物料、5份BOM,一次正式导入
关键部件 每台整机最多5类关键部件,按序列号或批次绑定
工程数据 一种物料模板、一种BOM模板及一套代表性来源数据验证
报表 工单进度、基础质量统计、序列号追溯,共3项

3.2 功能与交付内容

模块 建设内容
生产工单 复用ERPNext标准工单、BOM及工序任务卡,配置试点流程
扫码报工 通过浏览器和扫码枪记录工单、整机序列号、工序、人员、时间及结果
工序校验 检查固定顺序中前一道必需工序是否完成,防止重复提交
部件绑定 登记整机与指定关键部件的关联,按整机或部件查询
质量记录 人工录入合格/不合格、异常说明、复测结果及批准放行记录
作业资料 展示客户批准的PDF作业文件,并登记版本标识
工程数据导入 校验并导入约定格式的物料及BOM文件,输出错误清单
生产看板 展示工单进度、报工数量和基础质量结果

扫码报工与ERPNext工单完成数量按双方确认的流程关联,避免重复累计。库存扣料及完工入库复用ERPNext标准流程,由授权人员确认。

四、NX、Teamcenter数据衔接

4.1 首期方式:受控文件交换

NX设计成果 → 客户既有Teamcenter管理及审批流程
                         ↓ 客户导出并确认数据
                物料/BOM文件及PDF作业资料
                         ↓ 校验、人工导入
                  ERPNext基础MES试点

客户负责提供合法可用的导出数据,确认工程资料的批准状态,并将工程BOM整理为可用于生产的BOM。实施方负责模板定义、字段映射、格式校验、导入及异常清单。

双方使用一套真实样例,核对NX/Teamcenter来源数据与ERPNext导入结果。该项属于文件交换验证,不属于自动接口联调。已投产工单的版本变更由客户按人工审批流程处置。

4.2 后续方式:有限自动接口

首期验收后,建议优先评估“NX → Teamcenter → 集成服务 → ERPNext”的自动数据流。拟定范围为一套Teamcenter环境、批准物料及BOM的单向同步,最多两个业务用例,并包含同步日志、失败重试、重复报文处理及对账。

第二阶段增量服务费用初步估算为7–15万元,追加周期8–12周。 与首期合计实施服务费约27–35万元,不含第二阶段新增采购及授权费用。

此估算以接口可用为前提。客户需提供对应版本接口文档、合法授权、测试环境和管理员支持。NX直接插件、双向工程变更、复杂BOM转换及需另购的集成组件须单独评估,不能默认纳入上述范围。

五、实施方式与计划

本项目采用专职开发人员搭配AI辅助开发交付,通过复用ERPNext标准能力、控制定制范围和分阶段验证提高实施效率。开发人员负责设计、代码审核、测试、部署及交付;生产使用不依赖AI实时运行。

客户安排项目负责人统一需求与验收,工艺、生产、质量、IT及工程数据管理员按需配合。每周进行一次进度沟通和功能演示。

阶段 时间 主要成果
需求确认与数据验证 第1–2周 试点流程、数据模板、功能清单及验收用例确认
基础配置与扫码开发 第3–4周 工单配置、扫码页面及报工演示
追溯、质量与看板 第5–7周 关键部件绑定、工序校验、质量记录及看板
联合测试与上线准备 第8–9周 文件导入、数量对账、异常及权限验证
用户验收与培训 第10周 验收测试、操作培训及小范围上线
试运行与移交 第11–12周 两周试运行、缺陷修复、恢复演练及资料移交

周期从合同范围确认、环境可用及样例数据到位后起算。数据整改、客户确认、供应商支持或现场窗口等待可能顺延计划。

六、投资预算与服务安排

6.1 首期实施服务报价

首期实施服务报价为人民币200,000元(含税),拟议费用分配如下,正式价格及开票事项以双方合同为准。

项目 金额(万元) 内容
需求确认与数据验证 2.0 流程确认、环境检查、模板及验收清单
工单配置、扫码及工序校验 5.0 标准制造配置、扫码页面及基础校验
关键部件追溯与质量记录 4.0 部件绑定、追溯、质量及放行记录
工程文件导入与作业资料 2.0 物料/BOM导入、错误清单及PDF资料展示
生产看板与查询 1.5 约定的3项报表及查询
测试、部署、培训及试运行 3.5 联合测试、上线、培训及两周试运行
文档、移交及缺陷修复 2.0 源码与资料移交、约定缺陷修复
实施服务报价合计 20.0 含税,不包含第二阶段自动接口建设

报价已包含实施期间开发工具及AI使用费用。现有首期功能范围、数量上限及10–12周实施周期保持本方案约定。

本报价不包含新增服务器、终端、扫码设备、NX/Teamcenter及集成授权、长期驻场、差旅和年度托管维护。相关采购及费用如有需要,应单独列明并经客户确认,因此首期实际总支出为20万元实施服务费加经批准的外部费用。

本方案以客户已有合法软件、可用ERPNext及基础网络环境为前提。超出本方案范围的新增需求,双方须确认交付内容、验收标准及增量报价后实施。

6.2 付款与后续支持建议

  • 合同及范围确认后支付实施服务费的30%,即60,000元。
  • 约定试点功能演示通过后支付40%,即80,000元。
  • 验收及资料移交完成后支付30%,即60,000元。

建议验收后提供90天约定范围内的缺陷修复,包含于实施服务费;新功能和客户环境变化另行评估。可选基础维护预算为1–2万元/年,提供工作日远程支持,服务时段及工时以合同约定为准,不强制购买,不包含于20万元首期实施服务报价。

七、验收与项目交付

验收项目 主要要求
工单与报工 代表性产品按约定工序完成报工,人员、时间及结果可查询
工序约束 未完成前一道必需工序时阻止后续报工;重复提交不重复计数
关键部件追溯 必填部件完整,符合约定唯一性规则,支持整机及部件双向查询
质量控制 不合格产品不得按约定流程完工放行,保留复测及批准记录
工程文件导入 合法样例正确导入,无效数据返回错误清单,有效BOM未经确认不得覆盖
数量及权限 报工与工单数量按约定口径一致,操作权限符合岗位要求
基础性能 在确认硬件网络、5并发终端及1万条报工样例下,常用扫码响应P95目标不超过3秒,测试口径在范围确认时约定
试运行与恢复 完成一次备份恢复演练,两周试运行结束无阻断生产的未修复缺陷

交付成果包括定制源码、配置及安装说明、数据模板、操作手册、测试与验收记录、备份恢复说明及一次远程培训。源码权利、定制成果使用权及第三方组件许可在合同中明确。

上线采用单线小范围试点,提前确认切换、对账、人工补录与回退方案。首期不承诺高可用、离线生产或7×24保障。

八、项目边界与客户配合

首期不包含完整SMT/PCBA管理、设备自动采集、复杂返修路线、多工厂、高级排程、三维模型交互、NX插件、Teamcenter自动同步及全面ERP实施。

客户需提供:

  1. 可用ERPNext环境、合法访问权限及现有终端网络。
  2. 代表性产品、工艺流程和按模板整理的物料/BOM数据。
  3. NX、Teamcenter版本、合法导出能力、来源样例及批准作业资料。
  4. 负责需求确认、质量放行、数据批准及验收的人员。
  5. 联合测试、培训和上线窗口。

需求新增或超出约定数量时,实施方应提交影响说明及增量报价,经客户确认后实施。客户敏感资料的AI处理遵守双方约定,未经授权不上传外部AI服务。

九、建议启动安排

建议双方先确认一条代表性产线、产品范围及首期文件交换方式,再以本方案签署功能与验收清单,启动首期建设。

首期完成后,根据现场使用效果决定是否推进Teamcenter自动接口、设备接入及更深入的MES能力。如果自动联调必须首期交付,应先完成接口验证并调整预算及范围,再作交付承诺。

原始打印和网络打印

大多数打印都会经过浏览器的打印对话框。还有两种方式可以跳过它:

  • 网络打印通过打印服务器(CUPS)将 PDF 直接发送到网络上的打印机。
  • 原始打印通过用户电脑上的 QZ Tray 向热敏打印机和标签打印机发送 ESC/POS 命令。

适用于 Frappe v16 及更高版本。

网络打印

开始之前

  • 一个 Frappe 服务器可以访问的 CUPS 打印服务器。
  • Frappe 服务器上的 pycups Python 包和 CUPS 系统库。使用系统的包管理器安装该库,然后在 bench 目录下运行 bench pip install pycups。

设置步骤

  1. 在打印设置中,开启启用打印服务器。
  2. 打开网络打印机设置列表,添加一台打印机,填写服务器的服务器 IP、端口和打印机名称。
  3. 在打印页面上,打开⋯ > 选择网络打印机并选择它。

现在点击打印会按照你选择的格式和样式将文档发送到该打印机。

原始打印

开始之前

  • 在每台需要打印的电脑上安装 QZ Tray。
  • 一个勾选了自定义格式和原始打印的打印格式,并在原始命令中填写打印机命令。你可以在命令中使用 Jinja。

设置步骤

  1. 在打印设置中,开启启用原始打印。
  2. 在打印页面上,选择原始格式。
  3. 打开⋯ > 原始打印设置,将该格式映射到 QZ Tray 找到的打印机。
  4. 点击打印。

原始格式的打印页面不会显示预览。

  • 打印设置
  • 打印文档

地区会计科目表

ERPNext 提供标准的会计科目表,这些科目表根据国家或地区预先配置好,让用户可以快速上手使用。

‎

以下是可用的各地区会计科目表:

地区名称 地区代码
阿尔及利亚 DZ
阿根廷 AR
澳大利亚 AU
贝宁 # BJ
巴西 BR
布基纳法索 # BF
喀麦隆 # CM
加拿大 CA
中非共和国 # CF
乍得 # TD
哥伦比亚 CO
科摩罗 # KM
刚果 # CG
科特迪瓦 # CI
刚果民主共和国 # CD
萨尔瓦多 SV
赤道几内亚 # GQ
法国 FR
加蓬 # GA
德国 DE
危地马拉 GT
几内亚 # GN
几内亚比绍 # GW
匈牙利 HU
印度 IN
印度尼西亚 ID
马里 # ML
墨西哥 MX
荷兰 NL
尼加拉瓜 NI
尼日尔 # NE
葡萄牙 PT
塞内加尔 # SN
新加坡 SG
瑞典 SE
瑞士 CH
台湾 TW
多哥 # TG
土耳其 TR
阿拉伯联合酋长国 AE

PDF生成

Frappe 使用三种引擎之一将打印格式转换为 PDF。

适用于 Frappe v16 及更高版本。

引擎 用途 说明
Chromium 在编辑器中创建的格式(默认)、标准格式,以及当打印设置中指定为 chrome 时的 HTML 格式 能正确渲染现代 HTML 和 CSS。首次需要时会自动下载到 bench 的 chromium 文件夹中,也可以提前通过 bench setup-chrome 下载。
Typst 在编辑器中创建的格式,且 PDF 渲染器 设置为 Typst(快速) 实验性功能。速度更快,适合批量打印。仅支持部分功能。
wkhtmltopdf 当打印设置中指定为 wkhtmltopdf 时的 HTML 格式 已不再维护。无法渲染多列或 flexbox 布局。仅为兼容旧版 HTML 格式而保留。

注意:wkhtmltopdf 在版本 17 中已被移除。所有 PDF 均由 Chromium 生成,设置为 wkhtmltopdf 的格式在迁移时会自动切换为 Chromium。

哪种引擎负责打印格式

  1. 在编辑器中创建的格式使用其自身的 PDF 渲染器 设置:Chromium 或 Typst。
  2. 其他格式如果设置了自身的 PDF 生成器,则使用该设置。
  3. 否则,使用打印设置中的 PDF 生成器。

Typst 无法打印的内容

在你选择 Typst 之前,编辑器会检查格式,并列出所有阻碍项:

  • 自定义 HTML 块和字段模板;
  • 格式或字段上的自定义 CSS,且使用了 Typst 无法转换的属性;
  • 除二维码以外的条形码;
  • 从网址加载的图片;
  • 非十六进制颜色值;
  • 带有自定义 CSS、HTML 或网络图片的信头。

如果使用 Typst 的格式之后出现了上述任一情况,打印会失败并给出明确的错误提示,而不会静默切换引擎。

故障排查

问题 需要检查的内容
PDF 中列堆叠在一起 该格式是用 wkhtmltopdf 打印的。请在打印设置中将 PDF 生成器 设为 chrome。
第一个 PDF 耗时很长 正在下载 Chromium。之后的 PDF 会很快。
在没有网络的服务器上 PDF 生成失败 无法下载 Chromium。请在有网络的地方运行 bench setup-chrome,或在 common_site_config.json 中将 chromium_path 设置为已安装的 Chromium。
PDF 中字体看起来不一样 在格式的 字体 中使用 Google Font 名称,以便 PDF 引擎能够加载它。
  • 打印格式编辑器
  • 打印设置

HTML打印格式

HTML 打印格式是通过 HTML 和 Jinja 手工编写的。当打印格式编辑器无法生成你需要的布局时,就可以使用它。对于大多数格式来说,用编辑器更快,也更容易维护。

适用于 Frappe v16 及更高版本。

开始之前

你需要:

  • 创建打印格式的权限;
  • 熟练使用 HTML、CSS 和 Jinja 模板。

创建 HTML 格式

  1. 打开打印格式列表,点击添加打印格式。
  2. 选择文档类型并输入名称。
  3. 将起始方式设为HTML,然后点击创建。
  4. 在 HTML 中编写模板并保存。

如果你想随应用一起发布某个格式,请开启开发者模式并勾选标准。这样该格式就会作为文件保存在应用中,并由 git 跟踪。

编写模板

文档可通过 doc 获取:

<h2>{{ doc.select_print_heading or _("Sales Invoice") }}</h2>
<p>{{ doc.customer_name }}</p>

<table class="table table-bordered">

<tr><th>{{ _("Item") }}</th>
<th class="text-right">{{ _("Amount") }}</th></tr>
    {% for row in doc.items %}

<tr>

<td>{{ row.item_name }}</td>
        <td class="text-right">{{ row.get_formatted("amount", doc) }}</td>
    </tr>
    {% endfor %}
</table>
  • _("text") 将文本翻译为打印语言。
  • doc.get_formatted("fieldname") 按照表单显示的方式格式化值,包括货币和日期格式。
  • frappe.get_doc、frappe.db.get_value 以及其他辅助函数均可使用。请参阅 Jinja API。
  • 在该格式的自定义 CSS字段中添加样式。

脚本报表和查询报表可以有自己的打印格式,使用 JavaScript 模板编写。请参阅报表的打印格式。

PDF 引擎

HTML 格式使用打印设置中设置的PDF 生成器。wkhtmltopdf 无法排版 flexbox 等现代 CSS,而且已不再维护,因此除非某个格式依赖 wkhtmltopdf,否则请使用 chrome。

  • Jinja API
  • 从其他文档获取信息
  • PDF 生成