姚章浩
719876d039
build / build (push) Successful in 3m5s
fix(qa-weekly-mail): 修复周日发送窗口并提供正式补发
根因:SendDue 同时要求“已到配置时段”与“该周已结束(下周一00:00)”。周日23点的时段
只在周内存在,当周周报永远不满足“已结束”,于是 11/08 23:00 只报 nothing_confirmed、
11/09 00:00 又已成 not_due —— 邮件从未尝试发送,与 SMTP 凭据/网络无关。
改法(最小、不碰历史发布模块):
1. 由发送窗口反推要发的周:周日窗口发当天结束的那一周,其它工作日仍发上一完整周
(周一09:00 语义不变)。自动发送只处理这一周,不再按“所有已结束的周”回填。
2. 认领改为只重认 failed(或首次)记录:sent 幂等返回真实 message_id;sending 视为
结果未知,拒绝盲重发并提示核对邮箱。自动与手工共用同一条渲染/认领/投递路径,
并发或重复点击只投递一次;失败如实写 failed,不假写 sent。
3. 新增管理员正式补发(页面按钮 + GET 预览 + POST /weekly-mail/send/{week}):精确指定
周、已确认版本与正文 hash,必须同源操作意图;未来周拒绝,当前周须到设定时点,
已结束周可显式补发。正文/看板图片/主送/抄送与自动发送一致,结果写入正式发送记录。
这不是“发送测试邮件”(只发 review 地址、不登记)。
验证:真实隔离 PostgreSQL(kg-pgtest-writeset 上的独立一次性库)先 RED(旧实现真实
复现 nothing_confirmed)后 GREEN;覆盖到点前/未来周/未确认/正文变化、周一语义保持、
手工补发一次并读回 message_id、并发只投递一次、结果未知不重发、失败可重试一次。
HTTP 与前端解析用例通过;make verify 17 项全绿。
2026-11-09 00:48:33 +08:00
..
2026-09-30 10:54:07 +08:00
2026-10-08 15:41:13 +08:00
2026-11-06 10:04:19 +08:00
2026-11-03 10:14:08 +08:00
2026-11-05 13:19:27 +08:00
2026-10-10 16:46:39 +08:00
2026-10-12 00:10:31 +08:00
2026-10-26 18:36:11 +08:00
2026-10-14 12:59:52 +08:00
2026-10-27 10:42:30 +08:00
2026-10-27 09:56:19 +08:00
2026-09-30 10:54:07 +08:00
2026-10-28 15:11:27 +08:00
2026-10-28 19:11:37 +08:00
2026-11-01 11:35:09 +08:00
2026-10-30 03:09:21 +08:00
2026-11-01 11:35:10 +08:00
2026-11-06 10:51:21 +08:00
2026-11-06 10:51:21 +08:00
2026-11-06 10:51:21 +08:00
2026-10-29 13:01:37 +08:00
2026-10-29 13:01:37 +08:00
2026-10-29 06:55:13 +08:00
2026-10-29 07:13:18 +08:00
2026-11-01 11:35:09 +08:00
2026-10-29 13:01:37 +08:00
2026-10-29 13:01:37 +08:00
2026-11-06 10:04:19 +08:00
2026-11-05 12:50:11 +08:00
2026-10-30 19:22:48 +08:00
2026-11-01 17:21:42 +08:00
2026-11-01 11:35:09 +08:00
2026-10-30 16:14:54 +08:00
2026-11-01 11:35:09 +08:00
2026-11-01 11:35:10 +08:00
2026-11-01 11:35:09 +08:00
2026-11-05 13:19:27 +08:00
2026-10-29 06:28:29 +08:00
2026-11-03 10:14:08 +08:00
2026-11-01 22:05:02 +08:00
2026-10-28 21:52:14 +08:00
2026-11-05 13:19:27 +08:00
2026-11-01 11:35:10 +08:00
2026-11-01 11:35:09 +08:00
2026-11-01 11:35:09 +08:00
2026-10-30 16:14:54 +08:00
2026-11-05 13:19:27 +08:00
2026-11-05 13:19:27 +08:00
2026-10-29 04:45:34 +08:00
2026-11-05 10:38:26 +08:00
2026-11-05 10:38:26 +08:00
2026-10-19 14:29:49 +08:00
2026-10-08 17:26:26 +08:00
2026-11-03 10:14:08 +08:00
2026-11-03 10:14:08 +08:00
2026-10-10 15:48:30 +08:00
2026-10-19 14:29:49 +08:00
2026-10-19 14:29:49 +08:00
2026-10-17 19:02:13 +08:00
2026-10-19 14:29:49 +08:00
2026-10-19 14:29:49 +08:00
2026-10-25 12:45:31 +08:00
2026-10-19 19:01:36 +08:00
2026-10-19 19:01:36 +08:00
2026-10-20 08:18:03 +08:00
2026-10-20 08:18:03 +08:00
2026-10-19 08:49:18 +08:00
2026-10-19 19:01:36 +08:00
2026-10-18 19:10:47 +08:00
2026-10-18 19:10:47 +08:00
2026-10-18 19:10:47 +08:00
2026-10-17 19:59:33 +08:00
2026-10-18 21:50:29 +08:00
2026-10-17 09:04:19 +08:00
2026-10-17 09:04:19 +08:00
2026-10-17 09:04:19 +08:00
2026-10-25 12:45:31 +08:00
2026-10-17 11:39:38 +08:00
2026-10-17 17:36:07 +08:00
2026-10-17 17:36:07 +08:00
2026-10-17 22:37:26 +08:00
2026-10-18 21:50:29 +08:00
2026-10-18 21:50:29 +08:00
2026-10-25 12:45:31 +08:00
2026-10-25 12:45:31 +08:00
2026-10-18 15:45:09 +08:00
2026-10-18 02:00:31 +08:00
2026-10-20 08:18:03 +08:00
2026-10-18 21:50:29 +08:00
2026-10-20 05:44:02 +08:00
2026-11-09 00:48:33 +08:00
2026-11-09 00:48:33 +08:00
2026-10-10 15:29:31 +08:00
2026-10-08 15:41:13 +08:00
2026-10-08 15:41:13 +08:00
2026-10-29 13:01:37 +08:00
2026-11-09 00:48:33 +08:00
2026-09-30 10:54:07 +08:00
2026-10-27 10:42:30 +08:00
2026-10-27 10:42:30 +08:00
2026-10-26 17:23:27 +08:00
2026-10-26 17:22:09 +08:00
2026-10-14 12:36:32 +08:00
2026-10-14 12:36:32 +08:00
2026-10-10 12:10:46 +08:00
2026-10-10 12:10:46 +08:00
2026-09-30 10:54:07 +08:00
2026-10-10 10:55:03 +08:00
2026-09-30 10:54:07 +08:00
2026-09-30 10:54:07 +08:00
2026-10-18 18:11:49 +08:00
2026-10-18 18:11:49 +08:00