OpenProject 工作包日期与工期设置指南:手动/自动排程、日期选择器与工作日规则 📅 发布时间:2026/9/18 14:57:31 👁 浏览次数: 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/openprojectOpenProject 为工作包提供手动Manual与自动Automatic两种排程模式并配套一个功能完整的日期选择器Date Picker用于设置开始日期、结束日期与工期。本文以官方用户指南为基础结合仓库中的控制器、服务与模型源码系统讲解如何在 OpenProject 中打开日期选择器、理解两种排程模式的差异、处理工作日与非工作日以及工期与日期的自动推导规则帮助你完成可靠的、可自动响应的项目排程。两种排程模式概览OpenProject 15.4 起引入了新的自动排程模式与既有的手动排程并存模式行为适用场景手动排程开始/结束日期由你自由设定不受前置任务、后续任务或父子关系影响依赖关系不确定、尚未定义或需要固定日期的场景自动排程日期由前置任务或子任务的日期自动推导已有明确依赖链、希望排程随计划变更自动调整的场景[!NOTE] OpenProject 15.4 引入新的自动排程模式默认情况下所有新建工作包都会被设置为手动排程。从源码看这一设计对应工作包模型上的schedule_manually字段app/models/work_package/scheduling_rules.rb中schedule_automatically?即为!schedule_manually?。日期选择器控制器 date_picker_controller.rb 保存时接收的参数白名单为schedule_manually、ignore_non_working_days、start_date、due_date、duration五个字段排程模式本质上就是这组字段的联动结果。如何打开日期选择器你可以从以下任一位置打开工作包的日期选择器点击工作包详情视图中的日期字段点击分屏视图中的日期字段可从任意其他视图进入包括通知中心、团队规划器、看板等点击表格视图中的开始日期、结束日期或工期字段。日期选择器的渲染由WorkPackages::DatePickerController提供new用于新建工作包时的初始表单edit用于已有工作包preview用于值变化后的实时重渲染update通过WorkPackages::UpdateService持久化变更见 date_picker_controller.rb。前端通过 Turbo Frame 以模态框形式加载日期选择器内容见 wp-date-picker.modal.html。日期选择器界面构成打开日期选择器后你会看到以下元素信息横幅位于日期选择器顶部说明当前选择的排程模式以及因既有工作包关系可能产生的日期约束。横幅内容会随排程模式和关系情况而变化且仅对有关系的相关工作包显示。显示关系按钮横幅上的按钮点击后打开甘特图视图总览所有直接相关工作包。关系标签页列出当前工作包的相关关系前置任务、后续任务或子任务。排程模式开关在手动与自动模式之间切换。仅工作日开关切换工期统计只算工作日还是包含所有日历日。开始日期、结束日期、工期输入字段。迷你日历用于日期范围的预览。保存 / 取消按钮。信息横幅与警告横幅日期选择器顶部的横幅为有关系的相关工作包提供重要的上下文信息。信息横幅蓝色或黄色背景展示有帮助但非关键的信息警告横幅橙色背景展示关键信息可能对项目排程产生较大影响。横幅提供如下排程细节自动排程模式下是哪个相关工作包前置任务或子任务在决定当前工作包的日期手动模式下前置任务与当前工作包之间存在日期间隔gap手动模式下前置任务与当前工作包日期存在重叠。[!NOTE] 当信息横幅与警告横幅同时适用时只显示更重要的警告横幅。日期选择器的关系标签页除默认的日期标签页外日期选择器还包含以下与关系相关的标签页前置任务Predecessors显示所有前置任务工作包。前置任务是指必须在其完成后当前工作包才能开始的任务。在自动模式下当前工作包日期所依据的最近前置任务会带有“closest”标签。后续任务Successors显示所有后续任务工作包。后续任务是在当前工作包结束后才开始的任务。在自动模式下后续任务的开始日期受当前工作包结束日期影响。子任务Children显示所有子任务工作包。子任务是当前工作包下的子项。如果一个工作包有子任务它将默认使用自动排程模式父工作包的开始与结束日期会覆盖所有子工作包的日期范围。[!TIP] 标签名旁的数字表示现存相关工作包的数量。从实现层面看“父日期覆盖子日期”由UpdateAncestorsService支撑当子任务日期变化时自动排程的祖先会被重新计算日期update_ancestors_service.rb而手动排程的祖先则被跳过return if work_package.schedule_automatically?与return if ancestor.schedule_manually分支这正是“父日期不随子日期调整”的代码依据。排程模式详解手动排程Manual scheduling手动排程适用于需要固定日期的场景例如依赖关系不确定或尚未定义时。启用手动排程即对该工作包激活手动排程模式此时可以任意设置开始与结束日期忽略follows/proceeds前置/后续或子任务等依赖关系。在日期选择器的Scheduling mode开关中点击Manual即可启用。[!TIP] 随着 OpenProject 15.4 引入新的自动模式手动排程成为新建工作包的默认排程模式。手动模式下父工作包与子工作包在排程上不再联动父日期不会随子日期调整子任务可以被排程在父范围之外。这些关系在甘特图视图中仍然可见但不会影响排程除非切回自动模式。当从自动切换到手动排程时会出现一条警告横幅提示follows/precedes与parent/child关系现在会被忽略。这允许不受限制地选择日期并防止该工作包影响其他工作包尽管关系仍然存在。自动排程Automatic scheduling自动排程适用于存在既有依赖关系、希望自动排程的工作包。一个工作包只有在有前置任务或子任务时才能处于自动排程模式。一个自动排程且有前置任务的工作包会在最近前置任务结束日期的下一个工作日自动开始。你可以通过以下两种方式调整后续任务的日期修改其工期duration或调整其结束日期可以直接输入新日期或点击日期选择器中的新日期。注意自动推导出的开始日期之前的日期是不可用的即结束日期必须设置在开始日期当天或之后。这种时间关系在前置任务日期变化时依然保持例如前置任务因结束日期或工期变化而在时间轴上前后移动自动排程的工作包也会随之改变开始日期使其在新日期后的第二天开始。这使得可以创建一条可靠、可自动响应计划变更的自动排程工作包链。从手动切换到自动排程时会有一条警告横幅提示日期现在由前置任务或子任务工作包决定允许基于既有关系自动设置日期。自动排程的底层实现依赖图与递归查询自动排程并非前端装饰仓库中有一套完整后端调度链支撑WorkPackages::ScheduleDependency当一批工作包日期被移动后它负责计算排程顺序——in_schedule_order保证“后续任务在前置任务之后、祖先在子孙之后”地遍历依赖图并预加载所有相关数据移动的、受影响的、未移动但影响计算的工作包。for_scheduling scope使用 SQL 递归 CTE 一次性找出所有直接或间接通过 follows/hierarchy 关系相连、且需要重新评估排程的工作包。递归路径遇到“自身手动排程”或“所有子孙都手动排程”的工作包即停止而如果手动排程的子任务恰是本次重新排程的起始工作包其父级仍会参与重排。scheduling_rules.rbsoonest_start计算不违反 precedes 关系的最早开始日期前置任务max(finish date, start date) lag的最大值并通过WorkPackages::Shared::Days将其推进到下一个工作日。used_for_scheduling_of只取“自动排程祖先链”上的 follows 关系参与计算一旦某个父级手动排程其前置任务就不再参与当前工作包的排程推导。因此“自动排程的工作包自动在前置任务结束后一个工作日开始”这一行为最终是由soonest_start与工作日计算共同决定的而不是简单的1 天。单日期模式与区间模式OpenProject 15.4 引入新的自动模式后日期选择器有两种日期模式单日期single-date与区间range模式。单日期模式默认情况下新建工作包以单日期模式开始只有结束日期Finish date字段是激活的方便快速为任务设定截止日期。如果想添加开始日期点击 Start date按钮并选择日期即可。工作包将进入区间模式同时拥有开始与结束日期。你也可以移除结束日期让日期选择器回到单日期模式——但此时唯一的日期变为开始日期。如果管理员开启了“将当前日期作为新建工作包的开始日期”设置则开始日期始终会被设置并成为激活的日期。这种情况下你可以通过点击 Finish date按钮来添加结束日期。该设置对应配置常量work_package_startdate_is_adddate默认值为false见 config/constants/settings/definition.rb。单日事件One-day events只有开始日期或只有结束日期的工作包会被自动视为单日事件。如果你希望工作包例如里程碑 Milestone在同一天开始并结束只需在同一个日期上点击两次。从源码看控制器对里程碑做了专门处理handle_milestone_dates会把开始日期同步写入结束日期避免SetAttributesService因两字段不一致而报错见 date_picker_controller.rb。区间模式区间模式是指工作包同时具有开始与结束日期、因此也具有工期的排程模式。使用日期选择器你可以通过在开始与结束日期字段中直接输入日期来设定。[!NOTE] 输入的日期必须是标准 ISO 8601 格式YYYY-MM-DD例如 2022 年 10 月 12 日写作2022-10-12。显示时仍会按你期望的格式通常取决于区域或语言。要快速设置今天的日期点击日期字段下方的Today链接。你也可以使用迷你日历设置开始与结束日期日历默认展示两个月以便查看。操作流程先点击一个开始日期该日期会被填入开始字段并在迷你日历上用深色标记随后焦点移到结束日期字段在不同结束日期上悬停可预览工作包的日期范围确定后点击结束日期该日期被填入并在日历上用深色标记中间的日期以浅色高亮。点击Save确认选择会出现绿色的成功提示。要清空某个日期字段点击该字段中的清除图标×即可。日期变更会被记录在工作包的活动Activity中。高级功能日期选择器允许反向选择开始与结束日期先点击一个开始日期再向前点击更早的日期那么先点的日期成为结束日期后点的更早日期成为开始日期。对于已有开始与结束日期的工作包可以只调整结束日期点击结束日期字段再点击新日期只要该日期晚于开始日期结束日期即被更新。如果所选的日期早于开始日期原开始日期会被清空再次点击第二个日期将定义新范围的另一端。也可以只设置两个日期中的一个在区间模式下清空另一个日期并保存日期选择器将进入单日期模式。[!NOTE] precedes-follows 关系会约束或影响工作包的日期更多信息见移动相关工作包。显示关系按钮信息横幅和警告横幅还带有Show Relations显示关系按钮。点击后会在新标签页中以甘特图层级模式显示当前工作包的所有直接关系。[!NOTE] 该预览旨在快速总览可能影响当前工作包排程的直接关系不显示二级及以上的关系。如需完整总览请使用项目工作包表格视图或甘特图视图并配合所需的筛选/视图配置。工作日与工期你可以手动输入工作包的工期并决定工期只统计工作日还是包含所有日历日。[!NOTE] 工作日由 OpenProject 实例的管理员定义。默认是周一至周五周六和周日为非工作日。管理员请参阅工作日与工时管理指南。工作日仅工作日Working days only开关默认开启日期选择器在排程与推导工期时会跳过周末或管理员定义的非工作日。此模式下非工作日以较深颜色标记且不可点击工作包不能在非工作日开始或结束这些天数也不计入工期。关闭仅工作日后之前禁用的非工作日会变为普通工作日并可用于排程工期将把这些天数计算在内。在仓库中工作日配置由设置项working_days定义其允许值为 1 到 71周一7周日默认值为Array(1..5)即周一至周五为工作日见 config/constants/settings/definition.rb。工作包模型上的ignore_non_working_days字段则对应“仅工作日”开关的关闭状态。工期工期始终以天为单位是开始与结束日期之间的总天数含首尾。工期字段与开始、结束日期直接相关但并不要求必须同时存在——改变其中一项会联动改变其他项。工期可以自动从日期推导也可以手动输入。当工期字段获得焦点时你只需输入对应天数即可无需输入“天”字或其他语言对应词系统会自动补全。[!TIP] 底层实现中duration与duration_in_hoursduration * 24在 work_package.rb 中有明确定义工期以天为单位存储小时值由天数换算。同时存在开始与结束日期时当设置了开始与结束日期后工期会被自动推导。例如开始日期为2022 年 10 月 12 日周三、结束日期为2022 年 10 月 14 日周五则推导出 3 天工期。当开始与结束日期都已设置时修改工期会更新结束日期。继续上面的例子如果把工期改为 4 天则可能发生以下两种情况之一若仅工作日开关为开结束日期自动设置为2022 年 10 月 17 日周一周六、周日不是工作日若仅工作日开关为关结束日期自动设置为2022 年 10 月 15 日周六所有日历日都计入。只有一个日期时一个工作包不能只拥有一个日期_并且_拥有工期在区间模式下另一个日期会被自动推导而在单日期模式下工期字段不可用。例如在区间模式下设置开始日期为10 月 12 日周三并输入工期 3 天则自动推导出结束日期为10 月 14 日周五。反之如果设置结束日期为10 月 14 日周五再输入工期 3 天日期选择器会向前推算推导出开始日期为10 月 12 日周三。只有工期、没有开始与结束日期时工作包可以只有工期而没有设置任何开始或结束日期。[!NOTE] 如果给带工期的工作包添加了其中一个日期另一个日期会被自动推导无法只保留一个日期开始_或_结束同时设置工期。另外如果只有工期的工作包通过关系推导出开始日期那么结束日期也会被推导出来。只设置工期、不设置开始与结束日期在以下场景特别有用你已经对项目各个任务或阶段的大致耗时有了估计但还没有确切的日期。[!TIP] 该特性使得可以为整个项目自动推导出估算的开始或结束日期。做法是创建一系列表示项目主要阶段的工作包为每个阶段设置大致工期并用 follow/precedes 关系将它们全部串联。之后只要在系列中的第一个工作包上设置开始日期其余所有工作包的开始与结束日期都会被推导出来。总结如何选择排程模式排程目标推荐模式操作要点固定日期、不受关系影响手动在排程模式开关中点击 Manual依赖链清晰、计划常变自动确保有前置任务或子任务点击 Automatic顶层规划、子任务后补手动 自动组合父级手动、子级自动同一项目内两种模式可混用只知道耗时、日期未定仅设置工期先输入天数日期由关系推导里程碑/单日事件单日期模式同一日期点击两次或只设一个日期两种排程模式是 OpenProject 排程能力的基础手动模式保障了计划的确定性与可控性自动模式则通过 ScheduleDependency、递归 CTEfor_scheduling.rb与soonest_startscheduling_rules.rb等后端机制让整个工作包链随计划变更自动调整。搭配“仅工作日”开关与工期推导规则即可在同一个项目中实现自上而下手动与自下而上自动的混合排程。相关控制器行为与边界情况可参考其测试用例 date_picker_controller_spec.rb其中覆盖了单日期/区间模式、自动排程父级日期继承、权限校验与只读错误等场景。【免费下载链接】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),仅供参考