企业微信成员范围同步修复
原因与处理
截图中的“待移出”来自本地禁用状态与上次企微范围不一致。批量修改原来只写入同步队列,依赖后台分钟任务;单独保存忽略了同步器的 noop/未完成状态。另有两个一致性缺陷:同步期间配置版本变化后仍返回 synced;周期重算可能将超时租约或尚未应用的版本直接视为完成。
本次修改:
- 新增 POST
/firstvisit.wecomPromotion/syncMemberRange,只向当前有权限操作的方案推送完整可用成员名单,再回读确认。不使用会导入其他链接的syncRemoteLinks。 - 批量保存后由页面最多 2 并发调用专用同步接口,等待每个方案结果,不以后台任务启动为本次修改立即生效的前提。
- 单独保存、批量保存、手动同步均返回明确的
synced/pending/failed/blocked状态。保存本地成功与远端确认分开显示。 - 已下线成员从推送名单排除,部门范围清空;回读仍含旧成员或部门时判失败,不能标同步成功。
- 同步完成时检查租约、令牌、配置版本。过期工作不能覆盖新确认快照;变更未完成时继续排队。
- 同样的开关状态再次批量保存仍会重算,以修复之前留下的待同步任务。
- 页面新增“同步成员范围”按钮和批量失败结果重试,并展示当前计划、上次确认的远端范围与具体同步错误。
部署与现有方案
本次修改源代码,未部署,未读取业务数据库或调用真实企业微信修改接口。不新增表结构或权限菜单,沿用获客助手页面和方案操作范围权限;需将 admin 构建及 server 修改一起部署。已有队列表仍按原项目要求安装。
部署后,对已经出现“待移出”的方案点击“同步成员范围”;只有显示“企微成员范围已确认同步”,才能认为当前计划已经由企业微信回读确认。批量重新保存也会主动同步各方案。后台分钟任务仍用于上限、有效期和失败补偿。
追加:直接批量同步成员范围
列表上方新增“批量同步成员范围”。左侧勾选或全选方案后可直接同步当前配置,无需再次保存方案。单次最多 100 个方案,最多 2 个请求同时执行;展示逐项结果及完成进度。同步未确认或受阻的方案保留勾选,可再次批量同步或单项重试。共享操作人可以勾选有操作权限的方案,访问授权和批量配置仍沿用管理权限。
新增 6 项回归,前端合计 13 项通过(包括实际 SFC、模板和 SCSS 编译),详见 批量同步回归记录。浏览器用三个虚构方案验证批量同步,两项成功、一项模拟失败时,结果准确且仅保留失败方案勾选。全量类型检查已再次执行,仍因其他模块错误未通过;本次获客助手页面及 API 无类型报错。此次追加未重新执行全量生产构建,未部署或调用真实企微。
验证记录
见 前端验证 与 隔离数据库验证。所有测试使用虚构数据,未向真实企业微信发送请求。
生产构建通过(Vite,2 分 4 秒),输出到任务临时目录,未覆盖线上目录。完整输出保留在 build.log;仍有既有的大体积分包警告。前端 7 项回归与后端 24 个场景、52 个断言均通过。全量类型检查仍有其他模块的已有报错,详情见前端验证记录。
浏览器隔离验证已通过:使用实际 Vue 页面和本地 API 替身,初始仅“测试许可”上线、“测试旧医助”仍在远端快照中。手动同步成功后,页面显示仅许可在企微范围,旧医助变为“未在企微范围”;模拟接口失败后,页面保留旧医助“待移出(仍在企微)”,展示具体错误和“重试同步”。验证页及临时服务已关闭。复现入口为 ui-preview.mjs,使用本机回环地址和虚构数据。