Outlook 循环日程+选择时区的同步能力对齐 PRD

来源:Outlook循环日程同步能力对齐_PRD_20260618.md

Outlook 循环日程+选择时区的同步能力对齐 PRD

版本:v1.0 | 创建日期:2026-06-18

需求来源:需求池 + 用户沟通 + 系统截图 + 本地代码 + Microsoft 官方文档

优先级:P1

文档状态:草稿


需求变更记录

变更日期变更人变更内容
2026-06-18孙浩 / AI生成需求方案初稿,补充纷享本地循环日程编辑、作废现状,以及 Outlook 官方循环能力依据

依赖需求 Story 列表

ID需求描述涉及端与开发人员是否有依赖项备注
待确认Outlook 日程同步循环能力改造待确认是依赖 Office 365 连接器 / Outlook 同步链路支持循环系列识别、创建和更新

一、需求概述

1.1 客户反馈

客户反馈结论: 当前纷享与 Outlook 的循环日程同步能力不完整。纷享侧创建需要同步到 Outlook 的第三方日程时无法选择循环日程;Outlook 侧创建循环日程同步到纷享后,纷享侧当前仅呈现一条日程,无法还原完整循环系列。

需求编号反馈客户客户级别反馈人业务场景
2026-06-11-24638fs 国际业务部kaiyi用户使用 Outlook / Office 365 连接器同步日程,希望周期性会议、周期性客户拜访、例会等循环日程能在纷享和 Outlook 之间完整同步

补充关联反馈:该需求下新增 3 条客户反馈,主要补充“按年循环/周年日提醒”场景,进一步支撑本期需要补齐年重复能力。

反馈编号反馈客户服务等级核心场景
fb_2026-05-18_063674武汉启明泰和软件服务有限公司标准每月 30 日在 2 月无法触发,希望支持按年提醒。
fb_2023-12-07_040295北京仁宇通达供应链管理有限公司重要/VIP管理员每年有固定付款提醒,希望日程支持按年循环提醒。
fb_2023-11-05_039479江西中科农牧动物保健品有限公司小微希望每年固定日期提醒关键事项,例如双十一策划启动提醒。

1.2 系统现状

  1. 纷享创建 Outlook 同步日程时,当前不支持循环日程。 用户创建第三方 Outlook 同步日程时,选择循环日程会被系统拦截,提示“第三方日程不支持创建循环日程”。代码依据:ScheduleAddAction.java、ScheduleEditAction.java、ScheduleError.java。
  2. Outlook 创建循环日程同步到纷享后,当前只呈现一条日程。 当前问题不是“纷享侧生成多个日程实例”,而是 Outlook 循环系列没有被完整还原为纷享循环日程,导致纷享侧只看到一条日程。
  3. 一期未放开循环日程同步,主要有两个原因。
    • 集成平台连接器当前更适合“一个内部对象对应一个外部对象”的同步流程;纷享日程和循环日程在代码中拆分为 ScheduleObj 和 ScheduleRepeatObj 两类对象,循环日程不适配当前连接器的单对象同步流程。
    • 纷享与 Outlook 的循环日程能力未对齐。Outlook 产品界面可见的年重复、相对月、每 N 周等能力,纷享当前未完整支持,直接放开同步会导致循环规则丢失或异常。
  4. 纷享本地已有循环日程基础能力。 纷享本地循环日程支持每日、每周、每两周、每月重复;编辑循环日程时支持选择“仅此次日程”或“此次及后续未发生日程”;作废循环日程时支持选择“仅此次日程”或“此次及后续日程”。同时,纷享支持通过调整循环结束时间停止未来重复,并支持删除整个循环系列。代码依据:RepeatTypeEnum.java、feed-body-schedule.js、ScheduleInvalidAction.java、ScheduleStopLoopAction.java、feed-foot-del-schedule.js。
  5. 纷享日程当前未保存日程自身的时区语义。 现有开始时间、结束时间以时间值参与展示与校验,但无法完整承接 Outlook 事件独立的开始时区、结束时区。若仅同步 UTC 时间而不保存时区,跨夏令时循环时无法稳定保持用户设置的当地钟表时间。

1.3 循环日程现状及竞品截图

截图现状结论
纷享逍客设置循环日程纷享创建本地循环日程时,支持选择重复设置。
纷享逍客设置循环日程周纷享周循环支持选择具体重复星期。
纷享逍客设置循环日程月纷享支持月循环设置
但每月仅支持按照绝对的日期,进行循环,不支持按照星期的维度进行循环
纷享编辑循环日程_选择范围纷享编辑循环日程时,用户需要选择编辑范围:仅此次日程,或此次及后续未发生日程。
纷享作废循环日程_选择范围纷享作废循环日程时,用户需要选择作废范围:仅此次日程,或此次及后续日程。
Outlook设置循环日程日-取消循环时间Outlook 周循环支持通过间隔值表达“每 N 周”,并可删除/选择结束日期。
Outlook 设置循环日程-周Outlook 产品界面支持按周设置循环,以及循环间隔最大值为 99
Outlook设置循环日程-月Outlook 产品界面支持按月设置循环。循环数最大间隔 99
Outlook 设置循环日程年Outlook 产品界面支持按年设置循环。可以设置按日期的绝对循环和按照星期周的相对循环
Outlook循环日程_编辑Outlook 循环日程编辑入口以编辑事件/系列为主;支持此事件/此事件及后续事件/该系列的所有事件
Outlook 循环日程作废Outlook 循环日程删除/取消入口用于处理单次或系列删除/取消。
一期未做循环同步原因_集成平台对象限制一期未做循环日程同步的原因之一是集成平台连接器按单对象同步,而纷享日程和循环日程拆分为ScheduleObj 与 ScheduleRepeatObj。
Outlook循环日程开始结束不同时区Outlook 允许循环日程分别设置开始时区和结束时区;循环规则仍以开始日期、开始时间和开始时区为基准。
纷享查看参与人时间现状当前“查看参与人时间”直接按日程表单中的时间范围在统一时间轴中展示;新增日程时区后,需要先换算为当前操作人的个人时区再展示。

1.4 竞品现状

竞品竞品分类竞品现状来源
Outlook / Microsoft Graph第三方日历 / API支持 recurring event,并通过 recurrence pattern + recurrence range 描述循环规则https://learn.microsoft.com/en-us/graph/outlook-schedule-recurring-events
Outlook / Microsoft Graph第三方日历 / APIrecurrencePattern 可用于解释 Outlook 循环规则模型,但本期产品范围以 Outlook 产品界面可见能力为准https://learn.microsoft.com/en-us/graph/api/resources/recurrencepattern?view=graph-rest-1.0
Outlook / Microsoft Graph第三方日历 / APIevent 类型包含 seriesMaster、occurrence、exception、singleInstance,可区分循环系列、单次实例和例外实例https://learn.microsoft.com/en-us/graph/api/resources/event?view=graph-rest-1.0
Outlook / Microsoft Graph第三方日历 / APIevent 的 start、end 分别包含日期时间与时区;循环范围的 startDate 与系列开始日期一致,recurrenceTimeZone 用于解释循环范围https://learn.microsoft.com/en-us/graph/api/resources/event?view=graph-rest-1.0;https://learn.microsoft.com/en-us/graph/api/resources/recurrencerange?view=graph-rest-1.0
Outlook / Microsoft Graph第三方日历 / API支持按时间范围获取循环系列下的实例https://learn.microsoft.com/en-us/graph/api/event-list-instances?view=graph-rest-1.0
Outlook产品能力支持编辑日程、会议或事件;循环日程可按单次、系列或当前及后续等范围处理,具体入口以 Outlook 客户端实际表现为准https://support.microsoft.com/en-gb/office/change-an-appointment-meeting-or-event-in-outlook-29b44f7a-8938-4b99-b98d-3efcf45f7613

补充说明:本文产品范围以 Outlook 产品界面可见能力为准。Microsoft Graph/API 层支持但 Outlook 产品体验中未暴露的能力,本期不纳入产品方案。Outlook 侧未看到独立的“结束循环”按钮,停止未来循环应按“编辑循环系列结束日期”理解。

1.4.1 时区展示竞品截图依据

竞品截图来源图中证明不能证明对本需求的意义
Outlook查看态按个人时区展示用户于 2026-08-09 实际操作 Outlook Web日程自身按 UTC+10 创建,但当前用户日历按 UTC+8 展示为前一日 22:00;查看态以当前用户时区呈现。不能单独证明全部客户端、全日程和夏令时边界。纷享详情页、日历视图等查看态按当前用户个人时区展示。
Google编辑按日程时区日历按个人时区用户于 2026-08-09 实际操作 Google Calendar Web编辑表单保留日程所属时区与当地时间,日历网格按当前用户时区展示换算后的时间。不能单独证明 Google 所有终端的显示规则。采用“编辑按日程时区、查看按个人时区”的主规则。
飞书编辑态双时区展示用户于 2026-08-09 实际操作飞书日历编辑页主时间按当前用户时区展示,并补充日程时区时间作为辅助信息。不能证明该方式适用于纷享现有表单结构。作为备选参考;本期不采用双层时间文案,避免编辑时含义不清。

1.5 产品价值

  1. 支持周期性客户会议、周期性拜访、例会等高频日程在纷享和 Outlook 之间同步。
  2. 避免 Outlook 循环日程同步到纷享后只出现一条,导致用户漏看后续日程。
  3. 避免用户在纷享创建 Outlook 同步日程时无法使用循环能力。
  4. 明确编辑、作废/删除、修改循环结束时间、删除系列等操作的同步规则,降低两端数据不一致风险。

1.6 需求目标

  1. 对齐纷享与 Outlook 在循环日程上的产品能力差异,优先补齐 Outlook 产品界面可见且业务必要的循环规则能力。
  2. 在双方循环能力对齐后,支持纷享创建循环日程并同步为 Outlook 循环日程;支持 Outlook 创建循环日程后同步为纷享循环日程,而不是只同步一条普通日程。
  3. 明确循环日程在编辑、作废/删除、修改循环结束时间、删除系列等场景下的双向同步规则;对暂未纳入的循环规则给出明确提示或同步异常,不静默降级为一条普通日程。
  4. 补齐日程开始时区、结束时区的选择、保存和同步能力,使单次日程与循环日程均可完整承接 Outlook 的时区语义。

1.7 范围与非目标

类型内容
本期范围日程开始/结束时区能力;循环日程基础能力对齐;补齐 Outlook 产品界面可见且业务必要的差异能力;在能力对齐基础上实现纷享与 Outlook 循环日程创建、编辑、作废/删除、修改循环结束时间的同步
非目标范围Outlook 产品界面未暴露、仅 API 支持的循环能力暂不纳入;普通日程同步能力不在本期重构范围内

二、产品方案

2.1 整体产品方案

设计方案:

[www.figma.com/design/ubQUP0PZNqSjbZhutMfIsu/%E5%8D%8F%E5%90%8C%E6%95%8F%E6%8D%B7%E5%BC%80%E5%8F%91-%E5%91%A8?node-id=5-2](https://www.figma.com/design/ubQUP0PZNqSjbZhutMfIsu/%E5%8D%8F%E5%90%8C%E6%95%8F%E6%8D%B7%E5%BC%80%E5%8F%91-%E5%91%A8?node-id=5-2)

产品方案:分三部分推进

第一部分是 日程设置时区能力对齐,支持日程设置开始时区和结束时区;默认二者相同,也允许用户分别设置。时区属于日程本身的业务语义,不能只依赖当前操作人的个人时区。

第二部分是 循环日程基础能力对齐,先梳理纷享与 Outlook 在循环周期、重复间隔、重复日期选择、结束方式、编辑范围、作废/删除范围上的能力差异;对于 Outlook 产品界面可见且业务必要的差异能力,优先补齐纷享能力,而不是只按纷享现有能力做同步。

第三部分是在能力对齐基础上做同步能力对齐,系统在同步时应识别循环系列,而不是把循环日程当作一条普通日程处理;对补齐后的对齐能力范围内的循环日程,需要支持创建、更新、修改循环结束时间、删除等同步规则。

2.2 具体方案说明

2.2.1 日程时区能力

时区能力统一按以下五项决策执行:

序号决策规则例外/影响对象
1日程所属时区非全天日程可以设置开始时区和结束时区;默认相同,允许分别设置。全天日程不使用时区。
2新建/编辑展示按日程所属时区展示和编辑当地日期、时间。开始、结束时区不同时,两端分别展示。
3查看态展示按当前查看人的个人时区换算后展示。全天日程保持自然日期,不换算。
4查看参与人时间时间轴、选中范围、参与人忙闲统一按当前操作人的个人时区展示。回填后不改变日程所属时区。
5循环生成循环规则只按开始日期、开始时间和开始时区生成。结束时区仅计算每次实例的结束时刻。
2.2.1.1 字段与默认规则
  1. 日程新增“开始时区”和“结束时区”两个业务值,分别与开始时间、结束时间关联。
  2. 新建日程时,开始时区和结束时区默认取创建人当前个人时区,默认保持一致。
  3. 用户可开启“分别设置日程开始、结束时区”,为两端选择不同时区;单次日程和循环日程均支持。
  4. 时区选项保存标准时区标识,GMT 偏移仅用于当时展示,不能作为固定存储值。
2.2.1.2 时区修改规则

用户在新建或编辑表单中主动修改时区时,采用以下固定规则:

  1. 保持当前输入的当地日期和时间不变。
  2. 按新选择的时区重新计算并保存对应 UTC 时间。
  3. 修改公共时区时,同时作用于开始时间和结束时间。
  4. 分别设置时区时,只重算被修改一端的 UTC 时间,另一端保持不变。
  5. 校验规则:保存前按换算后的 UTC 时间校验,结束时间必须晚于开始时间;不能只比较页面上的日期和时间文本。

示例:开始时间为 2026-08-07 00:00 UTC+08:00,结束时间为 2026-08-07 02:00 UTC+11:00,两者换算后对应同一 UTC 时刻,不满足“结束晚于开始”,不可保存。

2.2.1.3 循环日程与双时区规则

循环日程允许开始、结束使用不同时区,规则拆分如下:

  1. 循环生成基准: 循环周期、星期、月份、日期和每次开始时刻,均以“开始日期 + 开始时间 + 开始时区”为基准生成。
  2. 循环范围基准: 循环开始日期与系列开始日期一致;循环结束日期按开始时区解释。
  3. 实例结束计算: 每次实例的结束日期和结束时刻按结束时区计算,再与该次开始时刻换算为 UTC 后确定实际持续时间。
  4. 同步规则: 纷享同步 Outlook 时分别传递开始、结束日期时间及时区;Outlook 同步纷享时分别保留,不合并为单一时区。
  5. 夏令时边界: 当开始时区和结束时区在不同日期切换夏令时,系列中各实例的当地开始、结束钟表时间保持规则值,但换算后的实际持续时间可能变化,属于双时区循环的正常结果。

换句话说:循环“哪一天、几点开始”只跟开始时间和开始时区有关;结束时间和结束时区不参与决定循环落在哪一天,只负责确定每次实例何时结束。

2.2.1.4 交互方案

Web 端:

  1. 在时间字段后增加时区入口;默认设置公共时区,可在浮层中开启分别设置。
  2. 时区浮层支持选择开始时区和结束时区;未开启分别设置时,结束时区跟随开始时区。

P1 Web日程时区交互

移动端:

  1. 在开始时间、结束时间后展示对应时区。
  2. 用户进入时间选择面板后,可继续进入时区选择列表;列表支持搜索并展示 GMT 偏移、时区名称和标准时区标识。
  3. 不从日程主表单直接弹出通用时区列表。

P2 移动端日程时区交互

2.2.1.5 全天日程规则
  1. 用户勾选“全天”后,隐藏选择时区的入口,包括 web段和移动端的时区展示
  2. 全天日程只表达开始自然日期和结束自然日期,不进行时区换算;不同地区用户查看时,日期保持一致。
  3. 全天日程同步时按双方全日事件规则传递日期,不传递或消费定时日程的时区语义。
  4. 同一次新建/编辑尚未保存时,从非全天日程切换为全天日程后再切回,可恢复切换前的时间及时区;保存为全天日程后,时区不再作为该日程的有效业务值。
  5. 全天日程循环按自然日期、星期和循环规则生成,不受夏令时影响。
2.2.1.6 新建、编辑与查看态展示规则
  1. 新建日程: 按创建人的个人时区初始化日程所属时区,输入的日期和时间按该时区解释。
  2. 编辑日程: 按日程自身所属的开始时区、结束时区展示日程日期和时间;无需换算成编辑人的个人时区。
  3. 查看日程: 详情页、日历视图及其他只读时间摘要统一按当前查看人的个人时区展示。查看人的个人时区与日程时区不同时,允许跨到前一天或后一天。
  4. 个人时区变化: 用户修改个人时区后,查看态立即按新时区重新展示,但不修改日程保存的 UTC 时刻和所属时区。
  5. 时区来源: 当前查看人的个人时区以账号个人设置为准;未配置时沿用现有多时区能力的默认时区,不直接以浏览器或设备临时时区覆盖。

示例:日程为 2026-08-10 00:00-00:30 UTC+10,东八区用户查看时显示为 2026-08-09 22:00-22:30;进入编辑态后,仍回填 2026-08-10 00:00-00:30 UTC+10。

2.2.1.7 查看参与人时间规则
  1. 时间轴以当前操作人的个人时区为唯一展示基准,不按日程所属时区或每个参与人的时区分别绘制。
  2. 打开“查看参与人时间”时,将日程开始、结束时刻换算为操作人个人时区,并在时间轴中标出对应范围;跨时区后可能落在前一天或后一天。
  3. 参与人的忙闲日程,统一换算到操作人个人时区,与当前日程范围在同一时间轴比较。
  4. 操作人在时间轴中选择新范围并确认后,系统保存该范围对应的 UTC 时刻,再按日程原开始、结束时区回填表单;不因使用时间助手而改变日程所属时区。
  5. 操作人修改日程所属时区或开始、结束时间后,已打开的参与人时间页需要重新换算,避免继续展示旧范围。
  6. 换算到操作人个人时区后跨越自然日时,时间轴必须展示完整起止日期和时间。若本期仍沿用现有单日选时组件,则允许查看跨日忙闲,但不允许从该面板确认新的跨日时段,避免错误回填。
2.2.1.8 其他时间边界
  1. 提醒与通知: 非全天日程按实际 UTC 时刻计算提醒,不因接收人的展示时区不同而提前、延后或重复触发;消息中的时间按接收人的个人时区展示。
  2. 跨日展示: 开始、结束换算到查看人时区后允许跨日,日期和时间必须一起展示,不能只换算钟点。
  3. 夏令时: 使用标准时区规则按日程发生日期计算偏移;不能把创建时的 GMT 偏移长期固定使用。
  4. 夏令时异常时间: 当用户选择的当地时间在夏令时切换日不存在或存在两次时,禁止静默换算,需提示用户重新选择有效时间;具体提示文案由评审确认。
  5. 第三方同步: 第三方日程进入纷享后,查看态仍按纷享当前用户个人时区展示;再次编辑时恢复第三方日程原始所属时区。
2.2.1.9 验收场景
场景验收结果
开始、结束使用同一时区按公共时区保存和展示,开始、结束 UTC 时间正确。
开始、结束使用不同时区两端分别保存时区和当地时间,换算后结束 UTC 时间晚于开始 UTC 时间。
循环日程使用不同开始、结束时区每次循环的发生日期和开始时刻按开始时区生成;每次结束时刻按结束时区计算。
主动修改时区当地日期和时间不变,按新时区重新计算 UTC 时间。
两端换算后结束时刻等于或早于开始时刻禁止保存,提示调整开始/结束时间或时区。
Outlook 双时区日程同步到纷享分别保留开始、结束时区,不降级为单一时区。
勾选全天日程隐藏时区入口;不同个人时区查看时自然日期不变化。
查看人与日程所属时区不同查看态按查看人个人时区展示,编辑态按日程所属时区回填。
查看参与人时间时间轴、选中范围和忙闲日程均按当前操作人个人时区展示。
从参与人时间页选择新时段更新实际 UTC 时刻,但不改变日程原开始、结束时区。
参与人时间换算后跨越自然日展示完整起止日期和时间;单日选时组件不得确认跨日新时段。
查看人修改个人时区仅更新查看态展示,不改写日程 UTC 时刻和所属时区。

2.2.2 循环日程能力对齐范围

本节只列需要评审决策的核心差异。目标不是逐项罗列所有循环设置,而是明确“差异在哪里、会造成什么同步问题、产品需要往哪个方向补齐”。

序号能力场景当前表现差异产品目标/方案评审决议
1第三方同步入口未支持循环日程1. 纷享创建 Outlook 同步日程时,选择循环会被拦截。
2. Outlook 循环日程同步到纷享后,仅同步第一条。
1. 纷享无法发起同步到 Outlook 的循环日程。
2. Outlook 循环系列无法还原为纷享循环日程。
1. 放开纷享创建 Outlook 同步日程的循环入口。
2. Outlook 循环日程同步到纷享时,还原为纷享循环日程。
2循环日程对象模型与连接器模型不匹配1. 连接器当前偏“一个内部对象对应一个外部对象”。
2. 纷享普通日程与循环日程拆分为 ScheduleObj 和 ScheduleRepeatObj。
1. 普通日程同步模型无法直接承接循环日程。
2. 容易导致只同步第一条或循环规则丢失。
1. 明确 Office 365 连接器对循环日程的处理方式,是由连接器支持 1 对 多的集成;还是需要改造目前循环日程的对象存储方式
3循环周期类型不一致1. 纷享支持每日、每周、每两周、每月。
2. Outlook 支持日、周、月、年。
1. Outlook 年重复在纷享侧没有等价能力承接。
2. 同时不支持间隔
1。去掉【每两周】的循环维度,合并到间隔中
2。 增加基于【年】的循环能力。
4重复间隔能力不完整1. Outlook 在日、周、月、年循环中均可设置重复间隔。
2. 纷享当前主要是固定周期,例如每日、每周、每两周、每月。
1. 纷享缺少统一的“每 N 日 / 每 N 周 / 每 N 月 / 每 N 年”能力。
2. Outlook 非固定间隔规则无法完整同步到纷享。
1. 将重复间隔作为通用循环能力补齐。
2. 各周期的间隔范围最大为 99
5按日期序 / 按星期序重复能力不完整1. Outlook 在月重复、年重复中,会根据开始日期生成不同的循环规则选项。
2. 纷享当前主要按固定日期循环,缺少按星期序、最后一个星期序等相对规则。
1. 纷享无法完整承接 Outlook 的相对日期循环。
2. 不同开始日期会生成不同规则,不能只按“第几个星期几”单一规则处理。
1. 补齐按日期序、按星期序、最后一个星期序能力。
2. 覆盖月重复和年重复,规则详见下方矩阵。
3。 具体细节在下面补充
6循环结束规则不一致1. 纷享要求设置终止日期。
2. 纷享存在最长一年限制。
3. Outlook 支持选择结束日期,也可取消/删除结束日期。
1. Outlook 无结束日期循环无法等价同步到纷享。
2. Outlook 超过一年周期的循环可能无法承接。
1。 可取消终止日期
2。 不限制可选的结束日期
评审是否补齐无结束日期 / 清空结束日期能力。
评审纷享最长一年限制是否保留。
7编辑循环日程的处理范围需要对齐1. 纷享支持“仅此次日程”和“此次及后续未发生日程”。
2. Outlook 支持单次、当前及后续、整个系列。
1784108358690
双方编辑范围不完全一致,可能导致改错范围或后续日程不同步。1. 包括仅此次日程、此次及后续未发生日程之外,增加【整个系列】。
2。 点击【整个系列】后,此次循环规则产生的历史日程以及当前日程和未来日程均受到本次编辑的影响。
8作废/删除循环日程的处理范围需要对齐1. 纷享支持“仅此次日程”和“此次及后续日程”。
2. Outlook 支持单次、当前及后续、整个系列。
1784108393575
双方作废范围不完全一致,可能导致两端系列状态不一致。1。包括仅此次日程、此次及后续未发生日程之外,增加【整个系列】。
2。 点击【整个系列】后,此次循环规则产生的历史日程以及当前日程和未来日程均被作废掉。

核心结论:

  1. 第 1、2 条是同步链路层面的前置问题,决定循环日程能不能进入 Office 365 连接器。
  2. 第 3 到 6 条是循环规则能力差异,决定纷享能不能承接 Outlook 的循环规则。
  3. 第 7、8 条是循环生命周期规则差异,决定循环日程创建后,两端编辑、作废、删除能不能保持一致。

循环设置交互规则:

  1. Web 端将“重复”统一调整为“循环”,循环开关和规则设置位于时间字段区域。
  2. 循环单位统一为日、周、月、年;重复间隔范围为 1-99。“每两周”不再作为独立分类,等价为“间隔 2 + 周”。
  3. 周循环支持多选星期;月、年循环按开始日期生成可选规则;循环结束时间为空时不拦截保存。
  4. 移动端通过独立“日程循环”页面完成开关、间隔、单位、星期/类型和结束日期设置。

P3 Web循环基础设置

P4 Web月年循环规则

P5 移动端循环设置

2.2.2.1 按日期 / 按星期 / 按最后一个星期的展示规则

本节补充第 5 条能力差异。产品交互不直接展示 Outlook 的“第几个星期几”复杂文案,只提供三个固定选项值:

  1. 按日期
  2. 按星期
  3. 按最后一个星期

系统根据用户选择的开始日期自动判断可展示选项,并在用户选择后生成对应循环规则。用户不需要手动选择“第几个”和“星期几”。

展示规则:

序号适用周期开始日期判断条件展示选项规则生成口径
1每月 / 每年开始日期是当月第 1-3 个相同星期几按日期;
按星期
按日期:固定当前日;
按星期:按开始日期自动推导为第 N 个星期 X。
2每月 / 每年开始日期是当月第 4 个相同星期几按日期;
按星期;
按最后一个星期
按日期:固定当前日;
按星期:固定为第 4 个星期 X;
按最后一个星期:固定为最后一个星期 X。
3每月 / 每年开始日期是当月第 5 个相同星期几按日期;
按最后一个星期
按日期:固定当前日;
按最后一个星期:固定为最后一个星期 X。
本期不提供“第 5 个星期 X”独立规则。

判断方法:

  1. 先取开始日期的星期值,例如星期二。
  2. 计算该开始日期是当月第几个相同星期几的日期,例如第三个星期二。
  3. 若为第 1-3 个相同星期几,展示“按日期 / 按星期”。
  4. 若为第 4 个相同星期几,固定展示“按日期 / 按星期 / 按最后一个星期”,不再判断该日期是否已经是当月最后一个相同星期几。
  5. 若为第 5 个相同星期几,展示“按日期 / 按最后一个星期”,不展示“按星期”,避免生成 Outlook 无法承接的“第 5 个星期 X”规则。

补充说明:“按最后一个星期”是用户要生成的循环规则选项,不要求当前开始日期本身已经是当月最后一个相同星期几。例如从 2026-07-22 创建日程时,用户仍可选择“按最后一个星期”,生成每月最后一个星期三的循环规则。此时开始日期是规则生效起点,首个循环实例为生效起点之后首个符合规则的日期,即 2026-07-29。

示例:

开始日期日期判断展示选项规则说明
2026-07-077 月第 1 个星期二按日期;按星期可生成“每月 7 日”或“每月第 1 个星期二”。
2026-07-217 月第 3 个星期二按日期;按星期可生成“每月 21 日”或“每月第 3 个星期二”。
2026-07-287 月第 4 个星期二按日期;按星期;按最后一个星期可生成“每月 28 日”“每月第 4 个星期二”或“每月最后一个星期二”。
2026-07-297 月第 5 个星期三按日期;按最后一个星期可生成“每月 29 日”或“每月最后一个星期三”;

月重复和年重复使用同一套判断逻辑:

  1. 月重复:生成“每月 X 日 / 每月第 N 个星期 X / 每月最后一个星期 X”。
  2. 年重复:在月重复规则基础上固定月份,生成“每年 M 月 D 日 / 每年 M 月第 N 个星期 X / 每年 M 月最后一个星期 X”。
2.2.2.2 详情页循环设置回填文案规则

用户保存循环日程后,详情页“循环设置”字段需要回填为一句可读摘要,用于说明当前日程按什么规则重复、什么时候结束。

文案结构:

重复周期 + 重复规则 + 结束规则

现状规则:

现状场景当前详情页文案是否沿用
每日重复每日重复,{YYYY年MM月DD日}结束沿用
每周重复每周重复:{星期列表},{YYYY年MM月DD日}结束沿用
每两周重复每两周重复:{星期列表},{YYYY年MM月DD日}结束历史数据沿用;新建入口合并为“每 2 周重复”。
每月重复每月重复,{YYYY年MM月DD日}结束需要增强。现状没有展示“按日期 / 按星期 / 按最后一个星期”的具体规则。

本期新增规则:

方案 A:分段式摘要(当前方案)

新增场景详情页文案规则示例
每 N 日重复每 {N} 日重复,{结束规则}每 2 日重复,2026年07月31日结束
每 N 周重复每 {N} 周重复:{星期列表},{结束规则}每 2 周重复:周一、周二、周三,2026年07月16日结束
每月-按日期每月重复:每月 {D} 日,{结束规则};若间隔大于 1,展示为 每 {N} 月重复:每月 {D} 日,{结束规则}每月重复:每月 9 日,2027年07月09日结束
每月-按星期每月重复:每月第 {N} 个星期{X},{结束规则}每月重复:每月第 2 个星期四,2027年07月09日结束
每月-按最后一个星期每月重复:每月最后一个星期{X},{结束规则}每月重复:每月最后一个星期四,2027年07月09日结束
每年-按日期每年重复:每年 {M} 月 {D} 日,{结束规则};若间隔大于 1,展示为 每 {N} 年重复:每年 {M} 月 {D} 日,{结束规则}每年重复:每年 7 月 9 日,2027年07月09日结束
每年-按星期每年重复:每年 {M} 月第 {N} 个星期{X},{结束规则}每年重复:每年 7 月第 2 个星期四,2027年07月09日结束
每年-按最后一个星期每年重复:每年 {M} 月最后一个星期{X},{结束规则}每年重复:每年 7 月最后一个星期四,2027年07月09日结束

方案 B:合并式自然语言(评审备选)

将“循环周期”和“具体规则”合并为一句话,避免出现“每月重复:每月……”的重复表达。例如,将“每月重复:每月第 2 个星期四”展示为“每月第二个星期四重复”。本方案只调整详情页摘要,不改变循环规则、保存数据和同步结果。

场景间隔为 1 时文案间隔大于 1 时文案示例
日重复每日重复,{结束规则}每 {N} 日重复,{结束规则}每 2 日重复,2026年07月31日结束
周重复每周{星期列表}重复,{结束规则}每 {N} 周的{星期列表}重复,{结束规则}每 2 周的周一、周二、周三重复,2026年07月16日结束
月重复-按日期每月 {D} 日重复,{结束规则}每 {N} 个月的 {D} 日重复,{结束规则}每月 9 日重复,2027年07月09日结束
月重复-按星期每月{中文序数}个星期{X}重复,{结束规则}每 {N} 个月的{中文序数}个星期{X}重复,{结束规则}每月第二个星期四重复,2027年07月09日结束
月重复-最后一个星期每月最后一个星期{X}重复,{结束规则}每 {N} 个月的最后一个星期{X}重复,{结束规则}每月最后一个星期四重复,2027年07月09日结束
年重复-按日期每年 {M} 月 {D} 日重复,{结束规则}每 {N} 年的 {M} 月 {D} 日重复,{结束规则}每年 7 月 9 日重复,2027年07月09日结束
年重复-按星期每年 {M} 月{中文序数}个星期{X}重复,{结束规则}每 {N} 年的 {M} 月{中文序数}个星期{X}重复,{结束规则}每年 7 月第二个星期四重复,2027年07月09日结束
年重复-最后一个星期每年 {M} 月最后一个星期{X}重复,{结束规则}每 {N} 年的 {M} 月最后一个星期{X}重复,{结束规则}每年 7 月最后一个星期四重复,2027年07月09日结束

方案 B 展示规则:

  1. {中文序数}按保存值转换为“第一、第二、第三、第四”,不在详情页重新推导。
  2. 星期列表仍按周一到周日排序,多个星期之间使用、分隔。
  3. 技术评审确认现有摘要组件可以支持条件拼接和序数转换后,再决定是否以方案 B 替换方案 A。

方案 A 的整体规则:

循环周期间隔为 1 时间隔大于 1 时重复规则展示
日每日重复每 {N} 日重复不展示额外重复规则。
周每周重复:{星期列表}每 {N} 周重复:{星期列表}展示选择的星期列表,按周一到周日排序。
月每月重复:{月规则}每 {N} 月重复:{月规则}月规则根据用户保存的规则展示为“每月 {D} 日 / 每月第 {N} 个星期{X} / 每月最后一个星期{X}”。
例如:每 2 个月重复:每月第 3 个星期三,2027年07月09日结束
年每年重复:{年规则}每 {N} 年重复:{年规则}年规则根据用户保存的规则展示为“每年 {M} 月 {D} 日 / 每年 {M} 月第 {N} 个星期{X} / 每年 {M} 月最后一个星期{X}”。

结束规则:

  1. 有结束日期:展示为 {YYYY年MM月DD日}结束。
  2. 无结束日期:展示为 无结束日期。

展示原则:

  1. 详情页文案必须来自保存后的循环规则,不根据当前日期重新推导,避免展示与实际同步规则不一致。
  2. 详情页需要区分“按日期 / 按星期 / 按最后一个星期”,不能只展示“每月重复”或“每年重复”,否则用户无法判断循环规则。
  3. 星期列表按周一到周日排序,多个星期之间用 、 分隔。
  4. 当前线上详情页已有基础摘要拼接能力,前端代码中会按 repeatType + repeatData + repeatEndTime 拼接摘要;本期需在此基础上补充年重复、间隔、按星期、按最后一个星期和无结束日期的展示口径。代码依据:feed-body-schedule.js、repeat_setting.js。

2.2.3 循环日程同步能力对齐

在完成循环日程基础能力对齐后,双方同步能力按对齐后的循环规则执行:

  • 纷享创建循环日程同步到 Outlook 时,应创建 Outlook 循环系列。
  • Outlook 创建循环日程同步到纷享时,应还原为纷享循环日程,而不是只同步第一条。
  • 循环规则及循环范围按开始时间和开始时区生成;每次实例的结束时间按结束时间和结束时区计算。
  • 开始、结束时区不同时,双向同步必须分别保留,不得强制合并或只保留 UTC 偏移。
  • 编辑、作废、删除等后续操作按照双方已确认的处理范围进行映射。
  • 对评审决议中暂未纳入的循环规则,系统不得静默降级为普通单条日程,应提示同步异常或记录失败原因。

2.2.4 历史数据兼容规则

本期新增循环日程同步能力后,历史数据默认不做批量改写,避免误合并、重复生成或误删除。

场景兼容规则
纷享历史本地循环日程保持原有循环规则继续执行,不强制迁移为新规则;用户后续编辑时,可按新规则承接。
历史“每两周”循环日程历史数据继续展示和执行;编辑时可映射为“每 2 周”。
历史 Outlook 同步过来的单条日程不自动批量转换为循环日程,避免误合并或重复生成。
Outlook 历史循环系列后续再次同步能识别同一 Outlook 循环系列时,按新规则承接;无法确认系列归属时,不静默合并。
已作废、已删除、已结束的历史循环不重新生成历史实例,不恢复已作废或已删除数据。
清空结束日期 / 无结束日期能力仅对新建或编辑后的循环日程生效,不自动清空历史循环结束日期。
整个系列编辑 / 作废原则上作用于该循环系列下全部实例;历史已单独编辑、已作废、已删除的例外实例是否覆盖,需评审确认。
历史日程无明确时区不批量回填。继续按现有多时区规则展示;首次进入编辑态时,以当前显示时区初始化开始、结束时区,并保持原 UTC 时刻不变。只有用户主动修改时区时,才按新时区重算 UTC。
历史循环日程无明确时区不重算历史实例。原循环继续按旧规则执行;用户编辑并保存新循环规则后,从本次生效范围起写入明确的开始、结束时区。

兼容原则:新增能力默认向前生效;历史数据不批量改写;只有当系统能稳定识别同一循环系列时,才进入新同步规则。


三、规范检查项

3.1 业务文案多语言 Key

待确认。若新增“不支持循环规则”“同步异常原因”等用户可见文案,需要补充中英文文案和多语言 Key。

3.2 需求埋点

无明确产品埋点要求。若后续需要评估循环日程同步使用情况,可单独补充创建循环同步、同步失败、规则不支持等埋点。

3.3 沙盒/更改集能力

不涉及。

3.4 PaaS 国际化兼容检查

ID多语接入事项是否需要注意事项
1接入翻译工作台否本需求不新增可配置多语资源
2CRM提醒待确认如果同步失败通过 CRM 提醒通知用户,需要补充提醒文案
3企信消息提醒待确认如果同步失败通过企信消息通知用户,需要补充消息文案
4修改记录待确认循环日程编辑/作废是否新增修改记录口径需确认
5审计日志待确认删除系列、作废后续、修改循环结束时间是否记录审计需确认
6支持快捷翻译能力否不涉及
7支持数据多语能力否不涉及
8预置配置多语否不涉及
9预置示例数据多语否不涉及

3.5 新对象/新字段 BI 分析申请

待确认。若新增开始时区、结束时区、循环系列标识、第三方系列 ID、单次实例 ID、同步异常原因等字段,需要补充 BI 分析申请。

3.6 操作日志说明

待确认。建议至少覆盖以下操作:

  • 创建循环日程并同步 Outlook
  • Outlook 循环日程同步为纷享循环日程
  • 修改循环规则
  • 编辑当前及后续日程
  • 作废当前及后续日程
  • 修改循环结束时间
  • 删除整个循环系列
  • 同步失败或规则不支持

3.7 需求风险点检测

ID风险分组风险类型有无该风险涉及风险的功能点影响的企业数是否报备响应策略
1对现逻辑有影响的风险点交互体验有变化有Outlook 同步日程创建时允许选择部分循环规则待评估待确认灰度验证,明确不支持规则提示
2对现逻辑有影响的风险点功能有减少无不减少现有普通日程同步能力待评估待确认保持普通日程同步逻辑不受影响
3对现逻辑有影响的风险点功能逻辑的调整有循环日程从只同步一条调整为同步系列待评估待确认先补齐能力差异,再明确暂未覆盖规则的异常边界
4新能力风险点逻辑不完善有单次日程、后续编辑、修改循环结束时间、删除系列映射待评估待确认本期先收敛范围,单次日程差异处理后续增强
5新能力风险点有性能压力待确认Outlook 循环系列实例拉取和批量同步待评估待确认研发评估同步范围、实例数量和重试策略
6新能力风险点时间计算错误有开始/结束不同时区、夏令时切换、循环实例持续时间待评估待确认统一使用标准时区标识换算,按 UTC 校验先后关系
7新能力风险点展示口径不一致有编辑态、查看态、参与人时间使用不同的时区基准待评估待确认按页面类型统一时区矩阵,覆盖跨日和个人时区变更

3.8 上线策略

3.8.1 收费标准

  • [X] 不收费
  • [ ] 收费

3.8.2 上线节奏

  • [X] 全网
  • [ ] 灰度
灰度发布的原因涉及第三方日历双向同步和循环系列规则,建议先灰度验证公共循环能力、同步异常提示和删除/修改循环结束时间边界
预计全网时机待确认
期间分几次灰度待确认
各灰度批次的时间节点及灰度的客户范围待确认

3.8.3 适用版本

资源名称标准版专业版旗舰版无限版扩展资源包
Outlook 循环日程同步能力待确认待确认待确认待确认待确认

附录:依据

A. 本地代码依据

文件结论
/Users/soren/Desktop/work/fs-new-schedule/fs-new-schedule-biz/src/main/java/com/facishare/schedule/biz/predefine/action/ScheduleAddAction.java第三方日程带循环设置时会被拦截
/Users/soren/Desktop/work/fs-new-schedule/fs-new-schedule-biz/src/main/java/com/facishare/schedule/biz/predefine/action/ScheduleEditAction.java编辑第三方日程时同样不支持循环设置
/Users/soren/Desktop/work/fs-new-schedule/fs-new-schedule-biz/src/main/java/com/facishare/schedule/biz/error/ScheduleError.java错误文案为“第三方日程不支持创建循环日程”
/Users/soren/Desktop/work/fs-new-schedule/fs-new-schedule-api/src/main/java/com/facishare/schedule/api/enums/RepeatTypeEnum.java纷享支持每日、每周、每两周、每月
/Users/soren/Desktop/work/fs-new-schedule/fs-new-schedule-api/src/main/java/com/facishare/schedule/api/enums/ScheduleCategoryEnum.java纷享区分普通日程、循环首条、循环后续日程
/Users/soren/Desktop/work/fs-new-schedule/fs-new-schedule-biz/src/main/java/com/facishare/schedule/biz/service/ScheduleCheckerService.java循环需要结束时间,且当前有最长一年限制
/Users/soren/Desktop/work/fs/fs/modules/feed-item/feed-widgets/body/feed-schedule/feed-body-schedule.js编辑循环日程时支持“仅此次日程 / 此次及后续未发生日程”
/Users/soren/Desktop/work/fs-new-schedule/fs-new-schedule-biz/src/main/java/com/facishare/schedule/biz/predefine/action/ScheduleInvalidAction.java作废支持当前及后续循环日程
/Users/soren/Desktop/work/fs-new-schedule/fs-new-schedule-biz/src/main/java/com/facishare/schedule/biz/predefine/action/ScheduleStopLoopAction.java支持结束日程循环
/Users/soren/Desktop/work/fs/fs/modules/feed-item/feed-widgets/foot/feed-foot-del-schedule.js首条循环日程支持删除整个系列
/Users/soren/Desktop/work/fs-new-schedule/fs-new-schedule-biz/src/main/java/com/facishare/schedule/biz/error/ScheduleError.java现有校验要求开始时间必须小于结束时间
/Users/soren/Desktop/work/fs-appserver-schedule/fs-appserver-schedule-api/src/main/java/com/facishare/appserver/schedule/api/model/arg/CreateArg.java现有创建校验比较开始、结束时间值,时区能力需在换算后复用该校验
/Users/soren/Desktop/work/fs-new-schedule/fs-new-schedule-biz/util-plan-a/describe/ScheduleObj.jsonbegin_time 已启用对象多时区能力,但现有日程模型未完整表达开始、结束所属时区
/Users/soren/Desktop/work/fs/fs/modules/schedules/timeHelper.js“查看参与人时间”将开始、结束时间戳和参与人日程绘制到同一时间轴
/Users/soren/Desktop/work/fs/fs/modules/fs-publish/schedule-publish/schedule-publish.js当前时间助手接收表单开始、结束时间;全天和跨天场景已有特殊处理

B. Microsoft 官方依据

官方文档结论
https://learn.microsoft.com/en-us/graph/outlook-schedule-recurring-eventsMicrosoft Graph 支持循环日程
https://learn.microsoft.com/en-us/graph/api/resources/recurrencepattern?view=graph-rest-1.0recurrencePattern 支持多种循环模式
https://learn.microsoft.com/en-us/graph/api/resources/recurrencerange?view=graph-rest-1.0recurrenceRange 可用于理解 Outlook API 循环结束模型;产品界面未暴露的能力不纳入本期方案
https://learn.microsoft.com/en-us/graph/api/resources/event?view=graph-rest-1.0event 类型可区分循环系列和实例;start、end 分别保存日期时间及时区
https://learn.microsoft.com/en-us/graph/api/resources/datetimetimezone?view=graph-rest-1.0dateTimeTimeZone 由当地日期时间与时区组成,可分别用于事件开始和结束
https://learn.microsoft.com/en-us/graph/api/event-list-instances?view=graph-rest-1.0支持获取循环系列下的实例
https://support.microsoft.com/en-gb/office/change-an-appointment-meeting-or-event-in-outlook-29b44f7a-8938-4b99-b98d-3efcf45f7613Outlook 产品侧支持编辑日程、会议或事件,循环编辑范围需按客户端实际表现确认
https://support.microsoft.com/en-us/outlook/getstarted/manage-time-zone-settings-in-outlookOutlook 将事件保存为 UTC,并按每位用户的当地时区展示;Scheduling Assistant 将忙闲时间调整到组织者时区
https://developers.google.com/workspace/calendar/api/concepts/events-calendarsGoogle 定时事件使用日期时间与时区;全日事件仅使用自然日期,时区对全日事件无意义;循环事件需要时区展开