OpenProject 15.4.2 补丁版本解析:自动调度、PDF 导出与优先级管理的修复全景
【免费下载链接】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 15.4.2 是 15.4 系列的一个维护补丁版本,于 2025 年 3 月 26 日发布,聚焦于修复 15.4.0 引入的**自动调度模式(automatic scheduling)**周边的一系列缺陷,同时覆盖 PDF 导出、工作包优先级管理等模块的稳定性问题。本文以官方 Release Notes 为骨架,结合仓库源码与测试用例,逐条拆解这 7 项 Bugfix 的成因、修复逻辑与用户可感知的行为变化,帮助你理解升级到 15.4.2 后应当验证哪些关键流程。
版本背景:为什么 15.4.2 值得关注
15.4.0(2025-03-19 发布)是一次功能密集的大版本,其核心亮点是引入了自动调度模式:用户可以选择手动调度或自动调度工作包,自动调度模式下工作包"尽可能早地开始",日期由前置任务(predecessor)与子任务(children)关系自动推导(详见 15.4.0 发布说明)。
新功能带来新问题。15.4.2 作为一个紧接其后的补丁版本,7 项修复中有 4 项直接与自动调度相关(#61960、#62190、#62479、#62487),说明 15.4 系列在调度模式切换、里程碑类型转换、后台迁移任务重试、父任务日期联动等方面存在一批"边角"缺陷。官方在发布说明中明确建议:尽快升级到最新版本。
[!NOTE] 本次发布还公开感谢了社区成员 Robb E. 对缺陷报告与定位的贡献(见 Release Notes 原文 的 Contributions 部分)。
修复清单总览
| 缺陷编号 | 影响模块 | 问题描述 |
|---|---|---|
| #61960 | 工作包创建表单 | 在 WP 创建表单中切换到自动模式时行为不一致 |
| #62190 | 自动调度 / 里程碑 | 已自动调度的工作包无法转换为里程碑(Milestone) |
| #62249 | 工作包界面 | 填充数据后大量 WP 字段视觉上错位 |
| #62316 | PDF 报表导出 | 使用查询默认列时导出的 PDF 报表不含任何属性 |
| #62459 | 工作包优先级 | 更新"优先级(Priorities)"的名称、颜色标签或状态时返回 500 错误 |
| #62479 | 数据迁移任务 | WorkPackages::AutomaticMode::MigrateValuesJob迁移任务未能正确重试 |
| #62487 | 父子关系 / 调度 | 从工作包列表创建子任务时父任务的日期未正确更新 |
下面按主题分组深入解读。
自动调度模式:4 项关键修复
修复一:创建表单中切换自动模式的行为不一致(#61960)
15.4 引入了schedule_manually这一数据库字段(布尔型,默认值为true,即新建工作包默认手动调度,见 db/migrate/tables/work_packages.rb 中的t.boolean :schedule_manually, default: true, null: false以及对应的部分索引)。
问题出现在工作包创建表单:在创建流程中切换调度模式时,界面行为与详情视图中的日期选择器不一致,例如切换后日期字段的可用/禁用状态、工作天数复选框的显隐可能出现偏差。该修复统一了创建表单与日期选择器(date picker)的自动模式判定逻辑,使"新建即设置调度模式"的体验与编辑已有工作包一致。
从测试侧看,仓库中的 automatic_scheduling_logic_spec.rb 覆盖了大量调度模式切换场景,例如 Scenario 25 验证:当工作包没有前置任务也没有子任务时,无法切换到自动模式——日期选择器中的保存按钮会被禁用。这解释了自动模式的存在前提:一个工作包只有在存在前置任务或子任务时才能进入自动调度。
修复二:自动调度的工作包无法转为里程碑(#62190)
里程碑(Milestone)在 OpenProject 中是只有单一日期(开始=完成)的工作包类型。在 15.4.2 之前,如果一个工作包处于自动调度状态,尝试将其类型转换为里程碑会失败或产生异常。
根源在于调度逻辑的日期推导假设:自动模式基于前置任务推导出最早开始日期(soonest_start),再结合工期(duration)计算完成日期;而里程碑没有"开始+完成"的区间概念,其日期推导路径不同。从源码 app/models/work_package/scheduling_rules.rb 可以看到核心判定schedule_automatically?(即!schedule_manually?),以及soonest_start基于Relation.used_for_scheduling_of(self)计算"不违反前置关系的最早日期"。类型转换需要在此推导链路中正确处理里程碑的单日期语义。
升级后的验证建议:对一个处于自动调度、且存在前置任务的工作包,执行"更改类型为里程碑",确认能够成功保存且日期推导符合预期。
修复三:迁移任务未正确重试(#62479)
15.4 升级过程会运行数据迁移,将既有工作包的调度模式按规则批量初始化。迁移任务WorkPackages::AutomaticMode::MigrateValuesJob在出现瞬时失败(例如数据库锁竞争、连接超时)时,未能正确进入重试队列,导致部分工作包在升级后调度模式未被正确设置。
这类后台任务在 OpenProject 中由app/workers目录下的 ActiveJob 承载。此修复保证了迁移任务的可重试性,避免升级过程中因一次性失败造成数据不一致。对于运维人员而言,升级 15.4.2 时应关注后台任务队列日志,确认MigrateValuesJob正常完成。
修复四:从列表创建子任务时父任务日期未联动(#62487)
在自动调度体系中,父任务的日期由所有子任务的日期区间覆盖(取所有子任务的最早开始与最晚完成)。修复前,从工作包列表(table view)的行内操作直接创建子任务时,父任务的开始/完成日期没有随之更新;而通过详情页"关系"标签添加子任务时行为却正常——这正是 #62487 描述的"未正确更新"。
底层负责联动的是 app/services/work_packages/update_ancestors_service.rb:它在子任务变更后向上遍历祖先链,用update_current_and_former_ancestors重算父级日期并写入 journal。修复后,无论从哪个入口创建子任务,都会触发祖先更新服务,保证父任务日期与子任务区间一致。测试中对应场景(如 Scenario 28/29)验证了:为手动调度的父任务添加子任务后,父任务会自动切换到自动模式,日期取子任务的并集。
[!NOTE] 切换调度模式(手动↔自动)会在工作包的**活动(Activity)**中新增一条 journal 记录:"Scheduling mode set to: [...]"。如果你在工作包列表中以
updated at字段排序,请注意 15.4 系列升级后最活跃记录的刷新行为(详见 15.4.0 发布说明 中的说明)。lib/open_project/journal_formatter/schedule_manually.rb 正是这一 journal 条目的格式化器。
界面与导出修复
PDF 报表导出:默认列导致属性丢失(#62316)
PDF 报表导出(PDF Report Export)为项目生成包含标题页、可点击目录、逐条工作包属性表与长文本字段的文档。修复前,当导出使用查询(query)的默认列时,生成报表的属性表为空——没有任何属性被导出。
原因在于导出配置对"默认列"的处理路径存在缺陷:默认列场景下属性列集合未能正确初始化。根据 PDF 报表导出文档 的说明,属性表中的列对应导出时选定的列(默认预选工作包表格查询中的列),长文本字段(描述与长文本自定义字段)默认全部选中、可单独增删。修复后默认列场景同样能正确生成属性表。
升级后的验证建议:直接使用未保存的自定义查询(即默认列)导出一次 PDF 报表,确认属性表完整包含各列;再对保存过的视图重复验证。
工作包优先级:编辑触发 500 错误(#62459)
自 15.4.0 起,OpenProject 重构了管理后台,将原"枚举值(enumerations)"页面拆分:工作包优先级迁移至Administration → Work packages → Priorities(详见 15.4.0 发布说明)。修复前,在该页面更新优先级的名称、颜色标签或状态时会抛出 HTTP 500 错误。
从数据模型看,IssuePriority继承自Enumeration,并belongs_to :color(见 app/models/issue_priority.rb),其colored?返回true,表明优先级支持颜色标签。管理入口由 app/controllers/admin/settings/work_package_priorities_controller.rb 提供,它继承EnumerationsControllerBase并声明enumeration_class为IssuePriority。500 错误的根源在于颜色关联与枚举更新流程在重构后的控制器中处理不当。修复后,名称、颜色、状态均可正常编辑。
[!TIP] 若你的实例升级自旧版本且曾自定义过优先级颜色,升级后请进入Administration → Work packages → Priorities逐一保存各优先级,验证颜色标签持久化正常。
工作包字段视觉错位(#62249)
这是一项纯前端(CSS/布局)修复:当工作包字段填充大量数据时,多个字段在表单中出现视觉错位。此类问题不涉及数据逻辑,但对日常录入体验影响直接。15.4.2 通过调整表单布局样式解决,升级后建议抽查详情视图、分割视图中的字段排版。
升级与验证清单
综合本次 7 项修复,建议在升级到 15.4.2 后按以下清单回归验证:
- 创建流程:新建工作包时切换手动/自动模式,确认日期字段状态与详情页一致(#61960);
- 类型转换:将自动调度的工作包转为里程碑,确认可保存(#62190);
- 子任务联动:从工作包列表行内创建子任务,确认父任务日期自动更新并切换为自动模式(#62487);
- PDF 导出:用默认列与自定义列分别导出 PDF 报表,确认属性表完整(#62316);
- 优先级管理:在Administration → Work packages → Priorities中编辑名称、颜色、状态,确认不再出现 500(#62459);
- 后台任务:确认
WorkPackages::AutomaticMode::MigrateValuesJob正常执行完毕、无卡死或失败重试堆积(#62479)。
深入阅读
- 自动调度模式的完整用户指南:Set and change dates and duration of work packages(含单日期模式、工作天数、工期推导等)
- 自动调度逻辑的端到端测试:automatic_scheduling_logic_spec.rb(覆盖 30+ 场景,含前置任务、lag、子任务、模式切换)
- 最早开始日期推导实现:app/models/work_package/scheduling_rules.rb
- 父任务日期联动服务:app/services/work_packages/update_ancestors_service.rb
- PDF 报表导出配置:docs/user-guide/work-packages/exporting/pdf-report/README.md
- 15.4.0 功能引入背景:docs/release-notes/15/15-4-0/README.md
【免费下载链接】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),仅供参考