# ProductFollowpy **Repository Path**: style1987_admin_admin/product-follow-py ## Basic Information - **Project Name**: ProductFollowpy - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-11-04 - **Last Updated**: 2026-11-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 产品跟进系统 需求优先级页面支持按产品状态多选筛选:默认显示全部,点击后只显示所选状态;状态数量按合并后的需求卡片统计,切换产品人员时恢复显示全部状态。“看”流程弹窗每次打开都会读取项目管理的最新审批详情,并更新本地节点快照。 工作周历点击“完成本次”时,未填写下次跟进日期会自动安排到明天;手动选择日期后只在所选日期继续,明天及中间日期不生成待办。 工作周历的“个人设置”保存在当前浏览器中。每位同事首次设置自己的姓名后,之后打开共享地址会默认进入自己的周历,不会覆盖其他人的默认选择;原有共享周历数据仍按产品归属区分。 ## 数据规则 - 流程和人员日程每次从原系统接口实时读取,不写入本地数据库。 - 需求刷新只查询当前年度,同时读取流程跟进与南昌团队全部项目(在查询日期范围内,不限制资源类型或项目状态):流程跟进提供审批、跟进信息,项目列表补齐遗漏流程。已有项目按项目 ID 精确匹配;无 ID 时只允许唯一同名匹配,项目状态优先取匹配项目的有效状态,审批状态保持流程来源。同名项目无法唯一确认时进入“待确认归属”,不再自动分给第一位产品;缺失项优先采用根项目,同编号只计一条。两处均完整翻页;返回分页不完整或重复时整次刷新失败,保留页面旧数据,避免把缺页误当成无需求或已处理。没有真实流程编号(空或占位 `0`)的行不作为流程记录。 - 产品归属优先级:原系统明确产品字段(realProduct,其次 mainProduct)中的每位产品都会计入各自的需求统计;没有明确产品时,再使用本地指定结果和原有参与人员推断。详情中的“主产品”仍保留第一位/本地指定值作为展示和兼容旧调整记录;姚思凡归赵宇轩及开发产品合并规则保留。明确产品即使不在当前岗位名单中也能显示。 - 产品需求分布只使用人员日程中 `projectTeam=南昌` 且没有 `leaveTime` 的产品人员。离职人员的原始流程和本地历史不删除,但不出现在当前产品筛选、分布统计和优先级中;不使用接口中对在职人员也可能返回 `false` 的 `enabled` 字段判断离职。 - 数据状态显示最近一次项目读取成功时间;读取失败保留上次数据和时间,单独提示需求模块未更新及本地保存失败,不再用“实时数据”表示授权状态。时间只对应当前页面已加载的数据,重开页面需刷新。 - “近3日未跟进”规则保持原样:无跟进时间立即计入提醒。 - 正式流程或项目补回时,只保留本地指定主产品,不再沿用补录时的“未匹配模块”等旧标记;模块使用需求系统的当次结果。项目列表补齐项若未提供提交日期,使用流程编号前14位的日期时间;未返回的审批状态和流程跟进时间保持空白,不用人员日程汇报时间冒充。 - SQLite 保存主产品人工调整、优先级顺序、手动任务、个人工作周历和审批节点快照。 - 登录 Cookie 只保存在 Python 进程内存中,服务重启后自动清空。 ## 启动 运行 `start.ps1`,页面地址为 `http://127.0.0.1:4174/`。 首次使用或登录过期时: 1. 在 Chrome 或 Edge 加载 `product-follow-up-sync` 文件夹作为已解压扩展。 2. 登录原项目管理系统。 3. 点击扩展中的“连接登录状态”。 4. 回到产品跟进系统点击“刷新数据”。 Python API 使用 `http://127.0.0.1:5175/`,数据库位于 `backend/product_follow_up.sqlite3`。 ## 每周本地备份 - 目录:`backups/database/`,文件名为 `product_follow_up_年月日_时分秒.sqlite3`,保留全部历史备份。 - 首次启用立即备份,此后距上次成功备份满 7 天再备份。服务运行时每小时检查;服务关闭期间不运行,下次启动补做逾期备份。 - 使用 SQLite 在线备份并校验后发布正式文件,失败不记录成功,下次检查重试;错误输出到服务日志。备份包括周历、跟进历史、本地调整、优先级及节点快照,不包含只保存在内存中的登录授权。 ## 审批关键节点 - 所有需求卡片(需求清单、需求优先级、每日跟进、重复产品清单)均展示当前审批节点、进入时间及最近一次完成的关键节点。关键节点详情和历史默认收起;“看”打开的完整流程也包含此区域。 - 同一项目包含多个需求时,按流程编号分别展示,避免把不同需求的节点混在一起。手动任务或没有流程编号的卡片显示未关联审批流程,不生成虚构的完成时间。 - 数据沿用原审批明细接口的 `tasks`,以 `taskId + userId` 关联审批人。只有 `COMPLETED + AGREE` 且人员岗位匹配的提交计入完成时间;转交、取消、拒绝、抄送和评论均不算完成。 - 产品按产品名单核验,开发与测试按人员日程的岗位名单核验;未匹配的记录仍可在历史中核查,不计入完成时间。 - 重复提交优先展示最新一次符合条件且完成时间完整的记录,保留全部历史。缺少时间的完成记录仍在历史中可查;只有全部符合条件的记录都缺少时间时,摘要才显示时间缺失。当前阶段独立取 `RUNNING` 节点,返工后不会用历史完成记录覆盖当前待处理状态。 - 项目跟踪期分别展示进入时间和提交验收时间;已转到最终验收时,不再标记为“正在项目跟踪期”。 - 原接口暂未返回节点名称。`src/flow-milestones.js` 中的活动编号映射依据流程 `202609082126000403762` 的钉钉截图与接口逐项核对,仅适用于“IT需求开发申请”。四类关键节点已全部核对;未知节点显示未识别,不根据人员或顺序推断。若原系统未来返回名称,则优先按名称匹配。 - 审批明细首次可见时读取并保存到 SQLite `settings` 的 `flow-snapshot:v1:<流程编号>`,同一时间只读取一个新流程。快照包含完整节点记录、保存时间及当时的产品和岗位名单。重开页面或普通「刷新数据」沿用快照,只有「刷新节点」才重新请求;手动刷新期间及失败时保留旧进度,记录不会因退出授权丢失。 - 页面预先检测同步助手,授权时有助手则由助手打开原系统;没有助手响应时直接打开对应系统登录页,15 秒内重复点击不再开页。打开登录页不代表本地同步授权完成,仍需在 Chrome/Edge 加载同步助手。重复点击及页面自动同步共用一次验证。同步助手和本地服务均对重复授权去重,未变的成功授权直接复用;失败的新授权不清除原成功状态。原系统返回限流时,按照 Retry-After(未提供则 60 秒)暂停该系统请求,等待手动重试,不自动循环重试。 - 切回窗口只检查本地连接状态,不再全量同步;取消每小时自动刷新。首次连接、手动刷新以及切到未加载日期时才读取数据,同一日期读取失败后不会自动反复请求。 验证:在 `vue-app` 运行 `node --test tests/flow-milestones.test.js` 和 `npm run build`。开发服务下的 `tests/milestones-preview.html` 是独立固定样例预览,不连接生产数据,不参与正式构建。 ## 个人工作周历 - 周历读取和保存使用轻量接口 `/api/calendar`、`/api/calendar/settings`,不再随每次操作传输全部审批快照。切换到未加载日期时只通过 `/api/schedule` 补取人员日程,不触发流程、项目和需求的全量刷新。 - 周历工具栏的“个人设置”用于设置当前电脑的使用者,姓名可从在职产品名单选择或直接输入,保存键为 `calendar-profile:v1:owner`。以后打开默认进入本人的周历,临时切换其他产品不改变本人设置。 - 日期工具栏「请假」默认为所选日期,可设置整天或连续多天,备注选填;对应日期顶部显示红色「请假」标签,点击可修改范围或取消整段请假。按所选产品人员独立保存,过去和未来日期均支持,历史标签持续保留。请假只标记日期,不改变任务显示、顺延、实际跟进与完成统计;同一人员的重复日期会提示修改已有标记。沿用本地 SQLite `settings`,键为 `work-calendar:v1:leave:`;取消保存标记,不删除任务或跟进记录。 - 成功刷新原系统需求后,按需求分析默认范围(当年、默认需求状态、每位主产品)同步「近3日未跟进」自动提醒:跟进日期早于或等于三天前、或尚未填写即计入。临时产品、流程编号和状态筛选不会把其他需求误判为已完成;列表查询会同时读取默认年度范围。与节点快照刷新独立,不新增轮询或授权操作。 - 自动提醒未完成时为「待跟进X个需求」,全部处理后为「已跟进X个需求」,每产品每天一条,首次为0不创建;非0为待处理,减少时更新内容,归零自动完成,再次非0恢复同一条待处理。每次变更追加带时间的数字快照 `pendingCount`、`followedCount`,日志显示「待跟进X个需求,已跟进Y个需求」,旧日志不会被清零覆盖。已跟进按当日刷新时从待跟进清单移出的需求累计去重;同数量替换需求也能记录,新增需求不清空已跟进数。旧记录从原有日志中的数量下降恢复数字展示,不改写原记录;旧版未保留需求标识的历史无法还原同数量替换等明细,不编造缺失数量。 - 提醒只依据成功刷新数据更新,失败保留原状态;最新未完成提醒自动顺延到今天,离线数日仍可看到,每产品当天最多一条,不重复堆叠。成功刷新后用当天快照接替顺延提醒;即使当天首次刷新已经为0,也会记录当天已跟进数量并标为完成,之后不再顺延。每日快照及数字日志独立保留,历史不回写,未经刷新的中间日期不生成历史工作记录。 - 具体事项按序号完整展开所有需求标题,不截断、不设置清单内部滚动;超出屏幕时滚动整个详情弹窗查看,完成后保留数量摘要。自动提醒由源数据管理,不提供手工改名或状态操作,仍支持重点和按日删除。当天刷新会保留当天的手动删除和星标。键为 `work-calendar:v1:item:stale-follow:<日期>:<编码人员名>`,沿用本地 SQLite。 - 顶部按当前在职产品人员切换周历,默认刘琪。每次成功同步都会把南昌在职产品名单保存为 `active-product-roster:v1`,服务重启或授权尚未恢复时继续使用最近一次成功名单;下次同步自动覆盖。离职人员不会出现在下拉选项中,但其历史周历和请假记录继续保存在 SQLite。每条新事项保存 `owner`,原来没有归属字段的事项按刘琪显示;切换仅切换当前人员的数据,不清除其他人的事项。各人的任务、跟进历史、删除日期与汇总相互独立。 - 选中日期的列底部,将状态数量与「开发 n/测试 n」合并为同一行;今天未选中时,底部保留开发/测试入口,状态数量显示在顶部日期右侧。状态按各自日期的历史记录统计;开发/测试按所选产品与该日人员日程统计,同一天相同流程合并后计数。点击打开该日期的需求清单,标题明确显示日期,保留执行人员、流程数据、审批节点和「复/看」操作。数量与弹窗共用筛选规则,不受其他页面的流程搜索条件影响。连接项目管理后,切换到已加载范围之外的日期会自动补取日程,查询同时覆盖选中日期前后各 3 天及每日跟进的昨日/今日/明日;未加载或未连接时显示「—」,不会冒充 0。 - 事项详情右上角可标记/取消重点,点击即保存;以 `starredDates` 记录对应日期,每位产品每天最多 3 个。重点事项从普通状态列移到当天底部单列展示,按当日状态显示颜色并计入汇总。星标不修改跟进记录或安排,也不算当天实际跟进,不影响详情中尚未保存的输入;按日删除会释放该日的重点名额。 - 左侧「工作周历」也是默认首页,初始展示前 3 天、今天、后 3 天。左右箭头每次切换一天;点击日期或日期列空白处,将该日放在中间并展示其前后各 3 天。任务卡片点击仍进入详情。今天突出显示,窄窗口可左右滑动,随时回到今天。 - 「新建」位于日期工具栏。点击日期可切换选中日,新增事项默认放在选中日(初始为今天),也支持为过去日期补建事项;真实创建时间仍保留,未完事项继续顺延。 - 新建只填写「标题、具体事项」,自动使用日历中选中的日期;不显示本地识别入口和日期输入框。标题就是日历上的短名称,可编辑。 - 新建底部「确认添加」创建待处理事项,「结束事项」直接创建已完成事项。补录的已完成事项只显示在所选日期,之后不顺延,实际创建时间单独保留,今日汇总只统计日期为今天的完成事项。 - 点击事项可修改标题及内容,添加跟进记录、手动指定下一次日期、标记完成或取消。写下进展后自动转为进行中;同一天多次操作只计一件事项。 - 详情不再手动选择状态。底部显示整体事项状态和「完成本次、结束事项、取消/不做、保存」操作;有跟进内容即为进行中,后续保存或改期保持整体进行中,只有结束事项或取消才结束。取消时可填写原因再确认。 - 「完成本次」必须明确选择今天之后的下次跟进日期;同一事项追加 `session_completed` 事件,今天按绿色已完成展示和统计,整体仍为进行中。所选未来日期按红色待办展示,中间日期不顺延填入,约定日未处理则继续按原规则延期。后续跟进、改期、结束或取消不改写之前日期的完成记录;历史显示「本次完成」、记录时间、备注和下次日期,不复制新事项。普通保存、星标、按日删除和自动需求提醒保持原规则。 - 详情顶部使用紧凑标题。新增跟进记录与下一次日期共用一行标题,日期提示在输入区下方,历史记录放在编辑区之后。 - 详情底部「删除」只移除所点击日期的那条任务,日期取自点击的日历卡片。使用 `deletedDates` 保存按日排除结果,事项本身、跟进历史、其他日期及原有顺延规则保留;删除今天时同步更新今日汇总。重新明确安排到已删除的日期时恢复该日任务。 - 普通已完成事项支持「重新处理」,从操作当天转为进行中并恢复顺延;之前的完成记录保留。跟进记录展示完整日期与时分秒。 - 未完成且没有另约未来日期的事项,按自然日自动顺延;周末也顺延,离线数日再打开仍能看到待跟进事项。延期由原事项历史推导,不生成重复事项,不需要后台定时任务。 - 事项整体状态与当日处理状态分开:未操作的顺延事项今天按红色待办展示和计数,即使整体状态已经是进行中;当天新增跟进记录或重新处理后,才按进行中计数。详情底部保留整体事项状态。改名、普通保存或星标不视为实际跟进。 - 回看过去日期,只保留当天新建(含选定日期补录)、跟进、完成、重新处理、取消或手动改期的记录;纯顺延且未操作的日期不展示、不计数。新建或仅改期仍作为待办记录保留,不计为进行中;自动需求提醒继续保留每日快照。原事项及完整跟进历史不删除、不迁移。 - 手动选定未来日期后,保留实际操作日的记录,并在新日期出现;中间不重复填入。新日期过后如果没有操作,该日的纯安排不留作历史工作记录。完成事项保留在完成当天,之后停止延期。 - 日历卡片只显示名称,以颜色区分当日状态:已完成绿色、进行中橙色、待办红色、已取消/不做灰色。今天使用浅蓝灰底色。选中日加宽为原单日约两倍,按「待办、进行中、已完成」三列展示,短标题可换行完整显示;取消事项在三列下方单独保留。其余日期缩窄,任务保持单列、不换行,超长显示省略号。日历高度适配一屏,每日事项较多时在列内滚动。 - 取消原因选填,取消时保留此前记录和原因,取消当天显示灰色事项;取消后的日期不再自动延期或保留已取消的未来安排。 - 未选中的今天及过去日期在顶部按「放大日期居左/正常字号的三色数量居右」排列,隐藏周几,绿色/橙色/红色小圆点分别显示该日完成、进行中、待处理数量;选中日的数量仍放在底部,并与开发/测试入口并排,未选中的今天底部只保留开发/测试入口,避免重复统计展示。取消不计入这三项,星标任务照常计入;悬停或读屏可查看含义。未来日期隐藏三色进度数量(含选中日的底部数量),保留已安排事项及开发/测试入口。请假标签仍在日期旁,列宽按数字位数适配。页面跨天或从后台恢复后更新当天日期。 - 周历存储在现有 SQLite 的 `settings` 表,键为 `work-calendar:v1:item:`,值为 JSON,包含 `title`、`label`、`description` 和追加式 `events`。不依赖原项目管理授权,不向外部 AI 传输内容。改期与完成仍使用同一个 UUID。 - 本地识别入口暂时移除,尚未接入 AI 模型。 - 向其他人分发桌面软件时使用全新的空数据库,不携带当前电脑的 `product_follow_up.sqlite3`、`backups`、周历、请假或跟进历史;因此刘琪的个人数据不会随程序共享。每台电脑单独授权、保存和备份。 - 验证:`node --test tests/work-calendar.test.js tests/flow-milestones.test.js`。开发服务的 `tests/work-calendar-preview.html` 使用隔离样例存储测试新增、改期、完成及刷新,不写入真实个人事项,也不参与正式构建。