
OpenProject 16.0.0 版本详解会议积压、内部评论、自动主题与全新时间跟踪模块【免费下载链接】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 16.0.0发布于 2025-05-21的官方发布说明系统梳理该大版本引入的企业级功能与关键技术变更。你将了解到会议积压Meeting backlogs如何重构会议议程管理、内部评论如何实现工作包内的安全沟通、自动生成的工作包主题如何统一命名规范以及独立时间跟踪模块与强制起止时间如何满足法定工时记录要求同时涵盖 Nextcloud 基于 OIDC/JWT 的无缝会话集成与 APIv3 的 breaking change。文中穿插对应源码实现如modules/meeting/app/models/meeting_section.rb、app/models/journal.rb、modules/costs/app/models/time_entry.rb帮助读者理解功能背后的设计原理。版本概览与重要更新OpenProject 16.0.0 是一个主版本major release包含大量新功能与缺陷修复官方建议所有用户升级到最新版本。本次发布的 Enterprise 计划Basic、Professional、Premium、Corporate也进行了调整每个计划现在包含一组特定的 Enterprise 附加组件add-ons支持级别与定价保持不变。对于现有 Enterprise 客户原有计划继续有效可访问当时已发布的所有 Enterprise 附加组件没有任何功能被移除。但从本版本起新的 Enterprise 附加组件可能只包含在更高档位的计划中——例如下文介绍的「内部评论」功能就属于 Professional 计划。低档位计划用户若想体验高档位计划的新附加组件可以申请新的 Enterprise 试用令牌on-premises 环境或启动新的 Cloud 试用实例。会议积压Meeting backlogs更灵活的议程管理会议组织在 16.0 中变得更加轻松会议积压允许用户更灵活地收集、管理和准备议程事项agenda items既适用于一次性会议也适用于周期性会议系列。一次性会议的 Agenda backlog在一次性会议中新增的Agenda backlog议程积压区用于存放尚未分配到当前会议、但后续可能加入的话题。用户可以随时把积压中的议程事项拖入会议反之若某个议程事项需要推迟也可以从会议移回积压区。周期性会议的 Series backlog在周期性会议中共享的Series backlog系列积压区帮助用户跨所有会议场次追踪未决事项并随着优先级变化在各场次会议之间移动事项。从源码看积压功能建立在会议区块meeting section模型之上MeetingSection模型通过backlog布尔字段标识积压区块并提供了scope :backlog用于查询且积压区块不参与普通区块的位置排序acts_as_list scope: [:meeting_id, { backlog: false }]。积压区块的标题文案也做了区分周期性会议的积压显示为「Series backlog」一次性会议则显示「Agenda backlog」见 modules/meeting/app/models/meeting_section.rb。议程事项MeetingAgendaItem通过acts_as_list scope: :meeting_section在各自区块内排序并关联到work_package这意味着工作包可以直接添加到积压区——即使当前会议没有任何议程事项也能维护一份重要话题的积压清单见 modules/meeting/app/models/meeting_agenda_item.rb。更多细节可参考 一次性会议用户指南 与 周期性会议用户指南。经典会议的终结自 16.0 起创建新会议时不再提供「classic」经典模式选项。随着会议成果meeting outcomes与会议积压功能的发布经典会议被认为已过时。升级过程中不会丢失任何数据唯一的例外是经典会议的Meeting history会议历史。工作包内部评论Enterprise 附加组件Professional 及以上计划用户现在可以在工作包的Activity活动标签页中进行内部沟通。使用该功能的前提是项目管理员先启用内部评论默认情况下内部评论仅对项目管理员角色可见但管理员可以将一组新的权限授予任意数量的角色。拥有相应权限的用户在添加新评论时会看到一个Internal comment内部评论复选框勾选后该评论只有同样拥有这些权限的人可见。内部评论通过不同的背景颜色与普通评论区分。[!TIP] 想确认谁能看到你的内部评论输入即可看到所有具备内部评论查看权限的用户列表。如果某位用户不在此列表中你将无法在内部评论中 提及他。[!NOTE] 自 16.0 起在 Activity 标签页上传的文件不再出现在 Files 标签页。尽管内部评论是这一变化的技术触发点但它对普通评论和内部评论都生效。源码视角内部评论的实现内部评论本质上是一条被标记为「受限」restricted的评论记录。在Journal模型中internal是restricted的别名alias_attribute :internal, :restricted可见性判断则由权限控制评论内容可见性journable.attachments_visible?(user) user.allowed_in_project?(:view_internal_comments, project)评论本身可见性journable.visible?(user) user.allowed_in_project?(:view_internal_comments, project)见 app/models/journal.rb也就是说「谁能看到内部评论」完全由view_internal_comments权限决定这正好解释了管理员可以为多个角色授予内部评论权限的设计。而项目级开关则存储在项目设置中Project模型通过store_attribute :settings, :enabled_internal_comments, :boolean持久化「是否启用内部评论」见 app/models/project.rb。此外internal_mentionable_on_work_package_filter过滤类保证了 提及列表只包含有权限的用户见 app/models/queries/principals/filters/internal_mentionable_on_work_package_filter.rb。完整使用说明见 Activity 用户指南。自动生成的工作包主题Enterprise 附加组件OpenProject 16.0 支持为工作包自动生成主题subject。这一 Professional 计划中的新附加组件允许管理员为每种工作包类型定义主题模式subject pattern。启用后主题字段在创建工作包及后续更新过程中都会被自动填充且不可编辑。该功能尤其适合请假申请、IT 工单、维护报告等需要统一命名规范的结构化流程。主题模式可包含静态文本与动态占位符例如项目名称、工作包类型或自定义字段值。主题模式的常见示例场景模式示例请假申请[Author] [Start date] - [Finish date]候选人面试[Custom Field: Candidate] with [Assignee] on [Start date]供应商发票[Author] Invoice [Creation date] - [Custom Field: Invoice ID]使用方式与注意事项创建或编辑像普通工作包一样填写各项详情唯一例外是主题字段保持为空主题只读主题由系统自动生成无法手动编辑属性变化触发更新任何工作包属性的修改都会触发主题自动更新——即使被修改的属性并未出现在主题模式中锁定主题的含义如果主题字段被锁定说明管理员对该工作包类型启用了自动主题模式但也可能意味着你缺少编辑该特定工作包的权限。属性在主题中的呈现规则主题反映的是管理员配置中引用的属性实际值日期如[Start date]、[Finish date]用户如[Author]、[Assignee]属性如[Priority]、[Category]、[Custom Field: X]项目信息如[Project name]、[Project identifier]两条重要的显示规则若引用的属性不可用主题显示N/A若引用的属性当前无值主题显示[属性名]即方括号中的占位符本身。常见 FAQ主题如何更新当主题模式中引用的属性如日期、自定义字段发生变化时保存工作包后主题自动更新无需额外操作。引用了父工作包或项目属性会怎样这些属性的变化不会立即反映到子工作包的主题上只有更新并保存子工作包后主题才会刷新。官方计划在后续版本改进此行为。为什么出现 N/A表示引用的属性不可用常见原因包括模式引用了父属性但未分配父工作包父工作包存在但引用的属性在该父类型中不可用引用的属性未在当前项目中激活。属性可用并填充后保存工作包即自动刷新主题。例如模式INVOICE: [Custom Field: Invoice ID] - [Start date]当 Invoice ID 不可用时将显示INVOICE: N/A - 2025-01-23。为什么出现 [属性名]表示引用的属性尚未被填充或设置。更详细的介绍见 Automatic subjects 用户指南。独立的时间跟踪模块与日历视图OpenProject 16.0 提供了独立的时间跟踪模块并带有日历视图可从全局视图进入在左侧边栏导航中称为My time tracking我的时间跟踪。用户可以在其中查看和编辑带有开始/结束时间start/end times的已记录工时可在日、周、工作周、月四种视图间切换也可以直接点击日历空白处快速记录新的时间条目。每个日期列都会显示该日记录工时的总和在周视图和月视图中总计时间显示在右下角。管理员激活步骤该模块需要管理员先进行激活导航到管理Administration→ 工时与成本Time and costs→ 默认设置Defaults勾选Allow exact time tracking允许精确时间跟踪以启用开始/结束日期记录。若启用 Allow exact time tracking日历将成为 My time tracking 模块的默认视图若勾选Require exact times要求精确时间用户记录工时必须同时提供开始和结束时间否则列表视图保持为默认视图在日历视图中所有条目显示在对应日期列的顶部。从源码看时间条目模型位于 costs 模块TimeEntry对start_time存在校验逻辑并且spent_on、start_time、comments等字段都被注册为 journal 格式化字段register_journal_formatted_fields comments, spent_on, start_time, formatter_key: :plaintext即开始/结束时间会被纳入活动历史追踪见 modules/costs/app/models/time_entry.rb。同时hours赋值支持字符串转小时的处理value.to_hours为工时录入提供了友好的格式解析见 modules/costs/app/models/time_entry.rb。完整说明见 My time tracking 用户指南。带法定必填字段的时间条目开始时间与结束时间工时报告现在包含明确的开始与结束时间以应对常见的法定记录要求。16.0 之前工时报告只显示记录工时的总时长现在则额外包含开始和结束时间以提高准确性。这一变化适用于所有支持时间跟踪的功能例如新的时间跟踪模块、PDF 时间表timesheet或 My spent time 小组件。PDF 时间表按日、按用户的工时概览导出的 PDF 时间表现在在报告开头以表格视图展示每位用户每天记录的工时概览。如果列表包含超过 5 位用户视图将拆分为多个表格。项目概览页图表面向社区版发布有时某个 Enterprise 附加组件会向免费社区版发布。16.0 中项目概览页的图表graphs现在对所有版本可用——社区版用户可以直接在项目概览页展示图表以可视化重要的项目信息向团队和管理层传达项目状态。工作包图表小组件work package graph widgets展示项目内工作包的信息支持柱状图、饼图等多种展示形式。详见 项目小组件用户指南中的工作包图表小组件章节。其他重要功能改进关系标签页中显示父级关系应众多用户请求现在可以直接在Relations关系标签页的下拉菜单中选择父工作包来建立父级关系。此前的方式点击工作包左上角的Set parent依然有效。两种方式都会让相关的工作包成为当前子工作包的父级。保存工作包导出配置在导出公开或私有的工作包表格时用户可以保存其配置设置例如特定的列顺序与显示、长文本字段等。这节省了重复配置的时间也允许用户与团队共享导出设置例如用于缺陷与审批报告。请注意该设置是全局性的并非个人偏好——保存后会改变该特定格式与类型对所有用户的默认配置。详见 工作包导出用户指南。存储健康状态多项可见检查与下载选项文件存储file storages的 Health check健康检查在 16.0 中得到扩展。管理员现在可以查看多项可见结果分为**基础配置base configuration、认证authentication、自动管理文件夹automatically-managed folders**三组。每组显示简短摘要表明所有检查是否通过、是否存在警告或检测到故障如发现问题会提供指向详细文档的链接。最近的健康检查摘要仍显示在侧边栏中新增选项允许管理员打开完整详细报告以直接查看所有单项检查。此外管理员还可以将完整的健康检查报告下载为文本文件例如附加到支持请求中。项目快速搜索中默认选中收藏项目标签页在项目下拉菜单中选中Favorites收藏标签页后OpenProject 会记住该偏好并在下次打开下拉菜单时默认显示该标签页。这是个人设置直到用户切回All之前一直生效。这一小的可用性改进为经常使用收藏项目的用户节省了时间。重要技术变更Nextcloud 与 OpenProject 用户会话的无缝集成OIDC 与 JWTEnterprise 附加组件16.0 为使用 Enterprise Corporate 计划且同时使用 Nextcloud 与 OpenProject 的客户带来重大改进。通过基于 OpenID ConnectOIDC和 JSON Web TokenJWT的新配置OpenProject 与 Nextcloud 可以无缝集成用户会话而无需在每个应用中分别显示同意consent界面。关键变化在于两者不再互为 OAuth 服务器与客户端而是共同向一个统一的身份提供商IDP进行认证。这使得 OpenProject 可以直接复用用户会话来调用 Nextcloud API——改善了用户体验并降低了日常工作的复杂度。这是 OpenProject 首个支持该 Nextcloud 集成方式的版本由于该功能尚未在大规模安装环境中充分验证官方仍将其视为实验性功能欢迎用户反馈以推动后续增强。Breaking changeOIDC 提供商签发的 API JWT 必须携带 scope在 OpenProject 14.4.0 中OpenProject 引入了通过 OpenID Connect 提供商创建的 JWT 访问 OpenProject API 的能力。当时该能力仅计划用于 APIv3 上下文随着 OpenProject 持续演进官方希望将其扩展到更多上下文。自 16.0.0 起所有令牌在进行 APIv3 的 API 请求时都必须携带名为api_v3的 scope这与 OpenProject 自身签发的其他令牌保持一致。16.0.0 完整变更与缺陷修复清单以下是 16.0.0 中值得关注的功能与缺陷修复条目编号对应官方 community 工作包 ID。重点功能Feature会议与会话Meeting backlogs会议积压[#54751]迁移经典会议功能到动态会议 [#62621]会议模块的权限保持一致 [#62175]向会议添加工作包对话框的会议字段标签修正 [#63692]内部评论与活动引入内部评论 [#60977]移除内部评论功能开关 [#63635]内部评论的 Enterprise/Professional 升级横幅 [#61061]在评论访问点提供内部评论的额外保护 [#62988]取消内部评论复选框但评论框已有内容时显示警告 [#62785]将工作包评论锚点从#activity-journal-sequence调整为#comment-journal-id并向后兼容旧链接 [#60875]移除工作包评论 ID URL 功能开关 [#63646]不在 Files 标签页展示工作包评论的行内附件 [#62356]自动主题在工作包类型设置中定义主题模式 [#59909]防止在创建和更新时编辑主题 [#59910]阻止用户在表格视图中编辑受管工作包主题 [#59911]校验主题模式 [#61692]为主题配置添加 Enterprise 横幅 [#59929]在模式输入框添加前置字符以触发搜索 [#62150]记录「自动主题」的当前限制信息 [#62368]时间跟踪独立的时间跟踪模块带日历视图记录带开始与结束时间的工时 [#59376]在 Log time 对话框中记录开始时间、结束时间与时长 [#59038]在成本报告与导出中添加工时时间 [#59914]在 API 中添加开始与结束时间 [#60633]时间跟踪列表视图 [#63336]在时间跟踪日历与列表的视图选择器中提供「工作周」选项 [#63621]为强制开始/结束时间跟踪引入 Enterprise 横幅 [#62624]PDF 时间表恢复之前的概览表格并添加标题 [#63526]PDF 时间表中按日、按用户展示工时概览 [#61896]Nextcloud / OIDC / 存储Nextcloud 与 OpenProject 用户会话无缝集成OIDC JWT[#52828]Nextcloud 类型文件存储设置允许基于 OIDC 的连接替代 OAuth2 [#55284]扩展 Nextcloud 文件存储以使用 SSO 访问令牌 [#57056]在 OIDC 提供程序上存储令牌交换能力 [#58862]在存储健康状态中支持 OIDC [#60161]允许配置 SSO 认证 双向 OAuth 2 [#61532]Nextcloud Hub 场景的受众audience选择 [#61623]允许通过 API 设置认证方法与存储受众 [#62191]为「带回退的 SSO」隐藏认证方法 [#62192]校验 JWT 的 scope [#62360]存储健康状态多项可见检查 [#61556]下载存储健康状态报告 [#63467]为健康检查结果添加错误码 [#63518]Corporate 计划Nextcloud SSO 认证的 Enterprise 横幅 [#60612]存储设置中链接到新的 OIDC 文档 [#61839]UI 组件与界面在缺失的 Rails 页面中应用标准化的 PageHeaders 与 SubHeaders 组件 [#58155]更新Rails项目页面的 PageHeaders 与 SubHeaders第 2 部分[#59915]表单输入为日期/时间引入更小的输入尺寸 [#61779]Primerize 项目设置 信息表单 [#61889]创建BorderBox::CollapsibleHeader组件 [#62577]创建 CollapsibleSectionComponent [#62754]检查 CollapsibleSectionComponent 与 CollapsibleHeaderComponent 的可访问性 [#63275]创建项目状态组件 [#63482]实现中等横幅组件 [#63525]Primerize 管理 认证设置 [#63567]其他功能引入企业计划Enterprise plans[#62469]将父项添加到关系relations[#38030]在项目快速搜索中默认选中收藏项目标签页 [#55792]保存工作包表格导出配置以供下次导出使用 [#57388]以 Prometheus 格式导出指标 [#60181]触发浏览器确认对话框点击「全部标记为已读」时[#61309]表情反应的 UI 微调 [#61402]实现跨计划升级cross-plan upsale[#62471]在 enterprise-tokens 仓库中支持生成企业计划令牌 [#62548]允许在 SaaS 中预订 Premium 计划 [#62573]将 SaaS 试用计划升级为 Premium [#63532]属性为空时显示属性名而非 N/A [#63660]实现新的首页 Enterprise 横幅样式 [#63727]使用 Chargebee 自定义字段Domain生成新版 5 Enterprise 令牌 [#63845]将 legacy_enterprise 自定义字段与计划名合并 [#63905]沟通自动自我注册automatic self registration的风险 [#63379]项目侧边栏中的存储按钮在所有场景下表现正确 [#62758]在项目概览页发布 Enterprise 附加组件「图表」至社区版 [#63619]缺陷修复Bugfix搜索显示浏览器自动填充 [#57836]用户能够编辑他人的评论 [#58511]Boards 的工作包搜索框过小 [#58702]顶部栏搜索的快速修复 [#58704]搜索中的 All 字符串无法翻译 [#59247]通知铃铛与进行中时间跟踪的红色使用不一致 [#59379]批量编辑工作包时出现 Error 500 [#60580]Primer Dialog 关闭按钮的 ARIA 标签未本地化 [#61631]客户端 ID 含特殊字符时令牌刷新与交换失败 [#61694]缺少空的 audience 翻译 [#61855]SSO 用户在项目存储成员页无法连接存储 [#61880]模式输入框的自动补全下拉缺少默认条目 [#61935]无法通过存储管理视图将存储关联到项目 [#61936]带尖括号的输入保存后消失但实际已保存 [#62040]用户无法认证时通过 SSO 链接项目存储失败 [#62166]项目缺少自定义字段时更新带生成主题的工作包失败 [#62217]即使 audience 配置错误存储仍显示健康 [#62237]PDF 导出未导出所有内嵌截图 [#62293]当没有其他属性是必填字段时无法行内创建带自动生成主题的工作包 [#62318]项目属性列表条目作为筛选条件时未显示 [#62386]主题模式中缺少属性 [#62429]侧边面板中显示错误的会议日期 [#62441]OpenProject 企业密钥的域名检查区分大小写 [#62520]工作包信息行在新标签页中打开 [#62545]将通知标记为已读后自动选中第一条通知 [#62604]长代码块破坏会议成果 [#62689]求和查询∑不显示当前项目外的子项 [#62847]轮询时暴露受限评论 [#62978]会议议程备注与成果之间间距不足 [#63108]自动计时按钮在计时器运行中持续改变宽度 [#63345]Gantt 模块工作包列表仍使用旧术语 follower [#63351]议程事项的下边距不一致 [#63353]拥有特定权限组合的用户更新工作包日期时出错 [#63434]生成主题的缺失属性显示错误 [#63441]多个 CollapsibleSection 垂直排列时缺少间距 [#63442]折叠预览不工作 [#63443]My page 的收藏项目小组件中项目按字母排序 [#63444]在日历中移动单日期工作包时无意添加第二个日期 [#63475]主题模式中缺少父属性 [#63483]无管理会议纪要权限的用户仍看到「添加成果」选项 [#63535]My time tracking 日历视图在暗色模式下显示异常 [#63548]阿拉伯语与拉脱维亚语中 All checks passed 翻译不佳 [#63568]工作包添加到模板时会议标签页出现差异 [#63571]My sessions 页面加载极慢 [#63587]SAML 使用元数据 URL 配置时未填充 IdP 证书 [#63610]SAML 认证即使存在 IdP 证书仍使用过时指纹 [#63612]主题模式不支持布尔自定义字段 [#63641]xls 导出时间字段格式错误应为 10 h 而非 1 d 2h[#63739]添加至 Backlog/meeting 区块时焦点未设置在议程项标题上 [#63784]批量删除相关工作包时 Error 500 [#63831]SaaS 上应隐藏杀毒软件设置 [#64034]致谢与社区贡献本版本特别感谢 Cologne 市、Deutsche Bahn 与 ZenDiS 对已发布或即将发布功能的赞助。同时感谢社区成员在缺陷报告与修复中的贡献特别鸣谢 alex e、Klaas vT、Daniel Elkeles、Marcel Carvalho、Regina Schikora、Çağlar Yeşilyurt 与 Александр Татаринцев。此外还要感谢 Crowdin 上的翻译贡献者本版本特别致谢 Сергей Баранов俄语、Gzyyy简体中文与 rlmpereira葡萄牙语。如果你也愿意参与翻译工作可参阅 翻译指南。【免费下载链接】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),仅供参考