OpenProject 工作包 FAQ 实战指南:从基础操作到过滤器、进度跟踪与 Backlogs 常见问题全解
2026/9/18 8:51:31 网站建设 项目流程

OpenProject 工作包 FAQ 实战指南:从基础操作到过滤器、进度跟踪与 Backlogs 常见问题全解

【免费下载链接】openprojectOpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, issue tracking, roadmaps, Gantt charts, time tracking, collaboration features, and more. Available on premises or in the cloud. ⭐ Star us on GitHub项目地址: https://gitcode.com/GitHub_Trending/op/openproject

导读:本文以 OpenProject 官方《Work packages FAQ》文档为主体骨架,围绕日常使用中最高频的 30+ 个问题,系统讲解工作包的属性与表单配置、表格过滤器与视图保存、状态与类型(Type/Workflow)设计、移动与批量复制、自定义字段、跨项目共享、XLS/PDF 导出,以及版本与 Backlogs 模块的经典坑点。每个问题不仅给出可立即上手的操作步骤,还结合 app/models/work_package.rb、app/services/work_packages/update_ancestors_service.rb 等仓库源码,讲清背后的计算逻辑与设计约束,让你既能"照方抓药"排障,也能理解 OpenProject 为什么这样设计。

目录速览

主题内容
工作包基础操作工作包属性、表单配置、关系
过滤器与查询工作包表格、保存与修改过滤器及视图
状态与类型工作包状态(Status)与类型(Type)
移动与复制移动与复制工作包
自定义字段附加字段、自定义属性与取值
共享工作包跨项目共享工作包
导出导出、打印、外部保存
版本与 Backlogs版本在工作包中的应用、与 Backlogs 模块的关系

一、Working with work packages:工作包基础操作

1.1 如何在工作包表单中嵌入一张"子工作包表格"?

OpenProject 允许你在某个工作包类型的表单配置里直接插入一张子工作包(children)表格,让团队在创建/编辑该类型工作包时即可看到其子项。

操作路径:管理(Administration)→ 工作包 → 类型(Types),选择目标工作包类型,进入表单配置(Form configuration),点击+ Group插入一个"工作包表格"分组,最后务必点击保存(Save)。配置完成后,新建该类型工作包时,表单中就会渲染出这张子工作包表格。

补充说明:表单配置相关的完整能力可参考 form configuration 管理指南。

1.2 如何把"没有账号的用户"指派给工作包?

如果你希望一个人管理项目、不需要通知其他团队成员,官方推荐使用**占位用户(Placeholder users)**特性:管理员创建占位用户后,即可像普通用户一样将其设置为工作包的 Assignee,但占位用户不会收到通知、也没有登录凭据。详见 占位用户管理指南。

1.3 非项目成员如何给工作包添加附件?

这是允许的,但需要系统管理员预先配置:进入角色管理,给Non member(非成员)角色勾选Add attachments(添加附件)权限。配置后,未加入项目的用户即可为工作包添加附件。

1.4 如何设置工作量(Workload)、截止日期(Deadline)与工期(Duration)?

对应三个字段:

  • Workload(工作量):使用Work(工作)字段(旧称 "Estimated time" 预计时间);
  • Deadline(截止日期):使用Finish date(完成日期)字段;
  • Duration(工期):使用Duration(工期)字段。

在源码层面,WorkRemaining work字段会经过统一的时长换算逻辑,例如 app/models/work_package.rb 中的estimated_hours=remaining_hours=都通过convert_duration_to_hours将 "2h 30m"、"6d 0h" 这类人类可读输入转换成小时数。管理员还可设置计量单位是"小时"还是"天与小时",默认每个工作日为 8 小时,详见 进度跟踪文档。

1.5 如何查看"通过组间接分配给我"的工作包?

在工作包表格中把Assignee(负责人)过滤器切换为"Assignee and belonging group(负责人及其所属组)",即可看到直接分配给你、以及通过组(如 "Marketing team")间接分配给​你的所有工作包。

在源码中,这一过滤器由 app/models/queries/work_packages/filter/assignee_or_group_filter.rb 实现(人类可读名称来自query_fields.assignee_or_group翻译键),它同时匹配"用户本人"与"用户所属的组"。筛选完成后,可通过 保存视图 将其留存以便随时调用。

1.6 如何跟踪单个工作包的进度?

工作包的进度由% Complete(完成百分比)字段体现。它的计算有两种全局模式(由管理员在实例级别选择):

  • 基于工作(Work-based):根据WorkRemaining work自动推导;
  • 基于状态(Status-based):每个状态绑定一个固定的 % Complete 值,改状态即改进度。

源码中这两种模式的判定清晰可见:app/models/work_package.rb 定义了status_based_mode?(对应Setting.work_package_done_ratio == "status")、work_based_mode?(对应== "field")与work_weighted_average_mode?。在基于状态模式下,done_ratio直接取当前状态绑定的default_done_ratio(见 app/models/work_package.rb)。完整的进度上报模式说明请阅读 progress tracking 文档。

1.7 如何跟踪"带子工作包"的父工作包进度?

OpenProject自动计算带子工作包(有 children)的父工作包进度:它把所有子工作包的进度按 Work(旧称 Estimated time)加权求和;若某个子工作包的Work字段为空,则按默认值1 小时参与计算。

⚠️ 关键提示:当你把进度条(progress bar)加入工作包层级视图时,务必同时加入 Work 列,否则无法理解百分比是如何算出来的。另外,手动给带有子工作包的工作包填写 Work 会被忽略——该值由子项自动汇总而来。

从源码可以验证这一逻辑:app/services/work_packages/update_ancestors_service.rb 中的compute_derived_done_ratio根据实例模式分派到两条计算路径:

  • calculate_work_weighted_average_percent_complete(按工作加权平均):progress = (derived_estimated_hours - derived_remaining_hours) / derived_estimated_hours * 100,即"已做工作量 ÷ 总工作量";
  • calculate_simple_average_percent_complete(简单平均):取所有子项 done ratio 的算术平均值,且children_done_ratio_values只统计included_in_totals_calculation?的子项(状态被排除的会被跳过)。

此外,层级汇总(Hierarchy totals)还支持通过状态设置"排除出汇总计算",详见 进度跟踪文档。

1.8 一个工作包可以有多个父级吗?

**不可以。**OpenProject 的工作包层级是严格的树形结构,一个工作包只能有一个父级(parent)。

1.9 为什么我无法在工作包中记工时(log time)?

需要先在项目设置中激活Time and costs(时间与成本)模块。该模块未启用时,工作包页面不会提供记工时入口。

1.10 报错 "Subject can't be blank" 是怎么回事?

常见原因之一:当你新建工作包时报此错误,可检查该工作包类型的状态配置。进入管理 → 工作包 → 状态(Status),找到出问题的状态(例如 "New"),取消勾选 "Work package read-only(工作包只读)"选项。若该选项被勾选,会导致项目属性无法被修改,从而触发 "subject can't be blank" 之类的校验失败。

1.11 如何调整工作包 Activity(活动/评论)标签页中条目的排序?

个人账户设置中修改评论显示顺序,具体见 账户设置界面文档。

1.12 为什么"由子工作包触发的父工作包变更"没有被聚合(aggregated)进活动记录?

OpenProject 只有在同时满足以下条件时才聚合工作包活动:

  • 活动发生在规定的时间窗口内
  • 同一个用户触发;
  • 聚合中至多包含一条评论(因为很难合并两段正文)。

而由子工作包变化引发的继承性变更总是带有一条评论("Updated automatically by...(由……自动更新)"),因此这类变更无法被聚合。

这一点在源码中有直接佐证:app/services/work_packages/update_ancestors_service.rb 的set_journal_note会为每个被自动更新的祖先工作包写入I18n.t("work_package.updated_automatically_by_child_changes", child: "##{initiator_work_package.id}")这条 journal 备注,正是 FAQ 中所说"总是带评论"的来源。

1.13 如何填充/维护工作包的 Position(位置)字段?

Position属性由Backlogs 模块提供,反映工作包在 backlog 桶(bucket)、Inbox backlog 或 sprint 中的位置。该值在 Backlogs 模块中对工作包进行重排或移动时自动维护,无需手工填写。

1.14 已删除的工作包能恢复吗?

**没有简单的方式恢复已删除的工作包。**常规做法是依靠你自己创建的备份(backup)进行还原。OpenProject 官方建议在删除前做好备份策略。


二、Filters and queries:过滤器与查询

2.1 如何保留我对工作包表格修改过的列或过滤器?

点击工作包表格右上角的三个点图标,选择保存(Save)另存为(Save as...)。保存后,视图名称会出现在左侧菜单栏中。

⚠️ 注意:默认视图 "All open" 无法被修改,对它点击 Save 不会产生任何效果。你必须用Save as...另存为一个新视图。

2.2 如何把表格的过滤器/列设置分享给同事?

保存视图时勾选 "Public(公开)"复选框。建议同时勾选"Favorited(收藏)",这样视图会进入"收藏视图"菜单,方便同事快速找到。公开视图会显示在项目工作包菜单的公共视图(Public views)区,详见 保存工作包视图。

2.3 如何移除或修改预置的 "open" 过滤器?

目前无法直接修改预置的 "open" 过滤器,但你可以自行配置并保存另一个视图来替代它。官方在 feature request 提交指南 中记录了相关需求线索。

2.4 我排好序的表格,回来一看又乱了,为什么?

最可能的原因是:排序后你没有保存视图。排序属于视图配置的一部分,请通过右上角菜单Save as...Save保存。同样地,该规则不适用于默认的 "All open" 视图(参见 工作包表格配置)。

2.5 全局工作包表格中,为什么不是所有自定义字段都能作为过滤器?

在全局工作包表格中,只有**设置了对所有项目生效("for all projects")**的自定义字段才会出现在过滤器区。原因有二:

  1. 性能与可用性:若各项目大量使用自定义字段,全局过滤器列表会非常冗长,损害可用性,极端情况下影响性能;
  2. 信息安全:过滤器区的取值对所有用户可见,可能把仅属于某个项目的敏感信息(字段名及其取值)暴露给无权访问该项目的人。

2.6 父工作包下有多个子工作包,表格里却看不到全部子项,为什么?怎么改?

请管理员在管理 → 系统设置 → 常规设置(General settings)提高每页显示的工作包数量(默认分页限制)。这是 OpenProject 的已知行为(与分页机制有关),提高每页数量可降低出现该现象的概率。参见 general system settings。


三、Status and type:状态与类型

3.1 新建工作包时默认总是 "Task",怎么修改默认类型?

进入管理 → 工作包 → 类型(Types)列表顶部的类型就是默认类型:使用右侧的箭头把希望作为默认值的类型(如 "User Story")移到列表顶部即可。

3.2 我新建了工作包类型,为什么看不到?

首先请确认已在项目设置中激活该工作包类型。如果已激活但仍看不到(例如在 Boards 模块中),请升级 OpenProject 到最新发布版本。

3.3 切换工作包类型后,不属于新类型的属性值会丢失吗?

不会丢失。当把工作包切换为另一类型时,不属于新类型的属性只是被隐藏(hidden),其值会被保留。若之后切回原类型,这些属性会重新显示,并恢复之前的值。

3.4 我创建了新状态,为什么无法选择它?

需要先把新状态加入工作流(Workflow)。进入管理 → 工作包 → 工作流,为要使用该状态的工作包类型配置状态转换,具体步骤见 工作流配置指南。另外,配置时请取消勾选顶部的 "Only display statuses that are used by this type(仅显示该类型使用的状态)",否则新状态可能不会出现在列表中。

3.5 能否修改/重命名状态列表(可用状态)?

完全可以。第一步:在管理 → 工作包 → 状态(Status)中创建新状态;第二步:把新状态分配给工作流。这样即可构建自己的状态体系。

3.6 如何让不同部门拥有各自不同的状态取值?

关键在于:用户可选择的"下一状态"由(工作包类型 × 用户角色)共同决定。要让同一个类型(如 Task)在不同部门显示不同的状态集,需要为每个部门创建独立角色

  1. 管理 → 工作包 → 状态(Status)中创建各部门所需的状态;
  2. 进入管理 → 工作包 → 工作流(Workflow),选择"类型 + 角色"组合,例如创建角色 "Marketing – Member",与类型 "Task" 组合;
  3. 取消勾选 "Only display statuses that are used by this type",点击编辑(Edit),勾选允许的状态转换;
  4. 为其他部门角色(如 "IT – Member")重复此步骤。

这样每个部门可拥有不同的状态转换图(默认状态如 "New" 是共享的)。请注意:如果某个工作包先被 A 部门更新了状态,B 部门的成员可能因工作流不支持该状态转换而无法再更新它


四、Move and duplicate:移动与复制

[!TIP] 自 OpenProject 14.5 起,术语更新:Copy a work package → Duplicate a work packageChange project → Move to another project

4.1 把工作包从一个项目移到另一个项目,需要哪些权限?

必须同时满足:

  • 用户能访问两个项目
  • 用户在两个项目中至少拥有以下权限:
    • Display work packages(查看工作包)
    • Move work packages(移动工作包)

4.2 如何复制"带层级关系"的工作包?

可以创建带层级(父/子工作包)的工作包模板,然后连同关系一起复制:

  1. 进入工作包表格;
  2. 按住Ctrl键,多选要复制的(层级内的)所有工作包;
  3. 右键点击选中的工作包,打开上下文菜单;
  4. 选择Bulk duplicate(批量复制),即可复制所选工作包及其关系。

随后在出现的表单中,可以调整被复制工作包的其他属性,最后点击Duplicate确认。

4.3 如何把工作包移动到另一个项目?

  • 表格视图:右键点击工作包 → 选择Move to another project
  • 详情视图:点击右上角More(三个点)Move to another project

[!TIP] 如果被移动的工作包带有子工作包,子工作包也会一并移动到目标项目。关于移动的更多细节(目标项目类型缺失警告等)见 duplicate/move/delete 指南。

4.4 能否把任务放入"文件夹"分组?

OpenProject没有文件夹概念。要分组任务,官方推荐以下替代方案:

  • 使用过滤器与分组选项并保存过滤器/视图;
  • 把所有相关工作包设为同一父工作包(如某个 phase)的子项:在表格中**右键 → Indent hierarchy(缩进层级)**即可将其变为子项,层级会同步显示在甘特图中;
  • 使用工作包分类(Categories)或自定义字段进行过滤与分组;
  • 也可以创建多个项目来按主题分组。

五、Custom fields:自定义字段

5.1 如何给工作包添加额外字段(如 "Department")?

创建一个自定义字段(Custom field)并加入工作包表单即可。完整步骤请参考自定义字段管理指南。

5.2 "long text(长文本)"类型的自定义字段会出现在工作包表格导出中吗?

不会。由于"长文本"类型无法作为表格列添加,因此也无法通过整页导出(页面级导出)输出。但单个工作包可以导出:使用PDF 下载,或(更推荐)使用浏览器打印功能。

5.3 自定义字段可以求和吗?

可以。在工作包表格的显示设置中勾选Sum(求和)选项,表格底部会显示 Work、Remaining work、% Complete 以及Integer/Float 类型自定义字段的和;若表格按属性分组,还会按组显示小计

跨不同属性的求和(例如 "预计时间 + 实际工时")是不支持的。


六、Sharing work packages:共享工作包

6.1 能否把工作包共享给项目之外的用户?

可以。OpenProject 13.1起,你可以把工作包共享给项目外部用户,甚至可以共享给尚未在你实例上注册账号的用户(对方需注册后才能查看)。

共享入口:打开工作包的详情视图 → 点击Share按钮 → 在对话框中选择已有用户/组,或直接输入邮箱邀请新用户。被共享用户默认获得Work Package Viewer角色,并不会自动成为项目成员;你也可以随时把权限调整为Edit / Comment / View。该功能属于 Enterprise 附加组件(work_package_sharing),且共享者需要具备全局角色create users权限,详见 共享工作包文档。

附:若要查看所有已共享的工作包,可在全局模块的 Work Packages 中选择Shared with users过滤器。


七、Export:导出

7.1 能否把"带甘特图的工作包总览"导出为 PDF?

可以借助浏览器打印功能(官方建议使用 Google Chrome)。打印甘特图的技巧请参考甘特图文档。

7.2 XLS 导出超过 10 分钟还没完成,为什么?怎么处理?

工作包导出是后台任务(background job)(与"复制项目"等任务同类),因此可能产生延迟。影响导出时长的因素:

  • 要导出的工作包数量
  • 选择的导出类型(例如XLS with relations(带关系的 XLS)可能要做更多计算);
  • 导出列的数量(影响相对较小)。

诊断方法:在实例 URL 后追加/health_checks/full(例如myopenprojectinstance.com/health_checks/full),页面会给出worker_backed_up指标,即过去 5 分钟内未能及时运行的后台任务数量。若该值多次出现,通常说明需要增加 web worker 数量,操作说明见运营文档中 "Scaling the number of web workers" 一节。

从源码看,工作包导出确实运行在后台队列中:app/workers/work_packages/export_job.rb 继承自Exports::ExportJob,它在prepare!阶段重建查询(set_query_props通过Queries::WorkPackages::FilterSerializer还原过滤器),随后由后台 worker 执行真正的文件生成——这印证了"导出可能被排队、延迟"的行为。


八、Versions and backlog:版本与 Backlogs

8.1 无法修改父/子工作包的版本(Version)

最快的解决办法:在任务所在的项目中停用 Backlogs 模块,通常能立刻解除"无法更新任务"的限制。

如果你确实在使用 Backlogs 模块,可以:

  • 把父级 Epic 从父项目移动到任务所在的项目
  • 或把任务类型 "Task" 改为其他类型(如 "User Story")。

背景原理:Backlogs 页面可切换到Task board(任务板),它展示分配给某个 sprint 的工作包(如 Epic、User Story)及其关联任务。但 Task board只能显示与(父级)工作包位于同一项目中的任务。因此,为了避免显示不完整的数据,任务与其父工作包必须在同一项目、并分配到同一版本

8.2 报错 "Parent is invalid because the work package (...) is a backlog task and therefore cannot have a parent outside of the current project" 是什么意思?

该错误出现在:Backlogs 模块已激活,而你试图把属于项目 A 的工作包设置为属于项目 B 的工作包的子项。

在 Backlogs 模块中,工作包只能拥有同一版本、同一项目内的子项。这是为了避免 backlog 与 boards 视图展示不同信息而设计的硬性限制。解决办法:停用 Backlogs 模块,或修改目标工作包的项目(必要时连同版本)


结语:FAQ 背后的设计哲学

通读这份 FAQ 会发现,许多"限制"背后都有明确的设计意图:

  • 父子层级禁止多父,保证了进度汇总与甘特图的结构一致性;
  • 父工作包进度强制按子项加权自动计算(update_ancestors_service.rb 中的calculate_work_weighted_average_percent_complete/calculate_simple_average_percent_complete),避免了手工维护与数据不一致;
  • 继承性变更不聚合,源于"聚合最多一条评论"的规则,配合set_journal_note的自动备注("Updated automatically by...")保证审计可追溯;
  • 全局过滤器只暴露"对所有项目生效"的自定义字段,兼顾性能与信息隔离;
  • Backlogs 强制同项目同版本,保证任务板与 backlog 视图数据一致。

理解这些约束后,无论是配置表单、设计状态机,还是排查导出延迟、层级进度异常,你都能更快定位原因并给出符合 OpenProject 设计预期的解决方案。如需继续深入,推荐阅读工作包表格配置、进度跟踪与共享工作包三份配套文档。

【免费下载链接】openprojectOpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, issue tracking, roadmaps, Gantt charts, time tracking, collaboration features, and more. Available on premises or in the cloud. ⭐ Star us on GitHub项目地址: https://gitcode.com/GitHub_Trending/op/openproject

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询