diff --git a/backend/.env.example b/backend/.env.example index 2a4f4d12b..8d2134594 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -100,7 +100,7 @@ WECHAT_OA_TEMPLATE_PENDING=ukQRYoczEXH1fZe9TdL8uX6LmuJJTlPidboxqtq_7N0 WECHAT_OA_TEMPLATE_RESULT=vA_z15BdP-8LltRmS__1MmUcNKQBy6b6rvAXKEYzoLY WECHAT_OA_TEMPLATE_COMPLETION=rnPOIVknPqfgwVzKbchj6pCMCWpoDe3h3dkrFbUEsD4 WECHAT_OA_TEMPLATE_CERT_REMINDER=aYzLZ_EqI8hq7RXrlf73BTAfNvzgJHeg_xWKar01Md0 -# 每日扫描证件,仅周一、周三扫描后发送微信汇总;Asia/Shanghai,同时受总开关控制。 +# 每日扫描证件,仅周一、周三、周五扫描后发送微信汇总;Asia/Shanghai,同时受总开关控制。 WECHAT_OA_CERT_REMINDER_ENABLED=true WECHAT_OA_CERT_NOTICE_ROLE_NAME=证件到期通知接收人 WECHAT_OA_CERT_REMINDER_HOUR=10 diff --git a/backend/app/services/wechat_cert_notices.py b/backend/app/services/wechat_cert_notices.py index b75c5003c..89746cb00 100644 --- a/backend/app/services/wechat_cert_notices.py +++ b/backend/app/services/wechat_cert_notices.py @@ -1,4 +1,4 @@ -"""证件到期周一、周三汇总:扫描后入队,发送前复核真实证件与收件权限。""" +"""证件到期周一、周三、周五汇总:扫描后入队,发送前复核真实证件与收件权限。""" from __future__ import annotations from datetime import date, datetime @@ -51,8 +51,8 @@ def _recipients(db: Session): def _is_notice_time(now: datetime) -> bool: - # 门户预警仍每日扫描,微信只在上海时间周一、周三10点(默认)之后发送。 - return now.weekday() in (0, 2) and (now.hour, now.minute) >= ( + # 门户预警仍每日扫描,微信只在上海时间周一、周三、周五10点(默认)之后发送。 + return now.weekday() in (0, 2, 4) and (now.hour, now.minute) >= ( settings.WECHAT_OA_CERT_REMINDER_HOUR, settings.WECHAT_OA_CERT_REMINDER_MINUTE, ) diff --git a/backend/tests/test_wechat_cert_notices.py b/backend/tests/test_wechat_cert_notices.py index 76e667894..1e521c5e5 100644 --- a/backend/tests/test_wechat_cert_notices.py +++ b/backend/tests/test_wechat_cert_notices.py @@ -233,9 +233,9 @@ def test_scope_is_based_on_reminder_creator_as_in_list(cert_notices): @pytest.mark.parametrize("day,hour,expected", [ (26, 9, 0), (26, 10, 1), (27, 10, 0), (28, 10, 1), - (29, 10, 0), (30, 10, 0), (31, 10, 0), + (29, 10, 0), (30, 10, 1), (31, 10, 0), ]) -def test_only_monday_wednesday_after_ten_enqueue(cert_notices, day, hour, expected): +def test_only_monday_wednesday_friday_after_ten_enqueue(cert_notices, day, hour, expected): svc, db, _, add_cert, Notice = cert_notices add_cert() assert svc.enqueue_daily_cert_notices(db, now=datetime(2026, 10, day, hour)) == expected diff --git a/docs/wechat-approval-notices-setup.md b/docs/wechat-approval-notices-setup.md index 50b185b5f..b8a815ccc 100644 --- a/docs/wechat-approval-notices-setup.md +++ b/docs/wechat-approval-notices-setup.md @@ -18,7 +18,7 @@ 2. 在系统角色/用户管理中给指定人员分配该角色;脚本不自动分配人员。角色名称需要与 `WECHAT_OA_CERT_NOTICE_ROLE_NAME` 一致。 3. 新角色默认空自定义数据范围,**不会扩大用户原有数据权限**。接收人需要通过已有角色或管理员配置的数据范围拥有相应证件提醒的可见权限;没有可见提醒就不发。菜单、数据范围、角色启用状态均沿用现有管理界面。 4. 接收人关注服务号并完成头像菜单“微信通知”绑定。 -5. 默认每周一、周三 **10:00(Asia/Shanghai)** 在证件扫描完成后入队,每人每个通知日最多一条;周二、周四、周五及周末不发,10点前也不发,数量按各人现有权限计算。无预警不发;发送前重新检查角色、证件有效期及数量。跨日滞留通知取消,不补发旧日摘要。当天漏过调度时间的启动不会自动补跑,可在联调中手动执行扫描任务验证。 +5. 默认每周一、周三、周五 **10:00(Asia/Shanghai)** 在证件扫描完成后入队,每人每个通知日最多一条;周二、周四及周末不发,10点前也不发,数量按各人现有权限计算。无预警不发;发送前重新检查角色、证件有效期及数量。跨日滞留通知取消,不补发旧日摘要。当天漏过调度时间的启动不会自动补跑,可在联调中手动执行扫描任务验证。 新租户创建后需再次执行角色初始化SQL或在角色管理中手动建立同名角色、菜单和数据范围。新增模板不是公众号新建模板接口自动申请,须确保这两个模板已添加到当前服务号。 @@ -53,7 +53,7 @@ WECHAT_OA_CERT_REMINDER_MINUTE=0 `WECHAT_OA_MINI_APPID` 必须是已关联的门户小程序,不能填服务号AppID。未配置时消息使用门户Web回退入口。小程序与服务号OpenID分别保存,不能互换。 -证件提醒开关同时受 `WECHAT_OA_ENABLED` 总开关控制;修改小时/分钟需要重启调度器。证件扫描与微信摘要使用同一调度任务,扫描仍每日执行,微信入队和发送复核均限制在周一、周三。部署时如私有环境仍显式配置旧值8,须改为10并重启后端;本次未修改私有环境。通知关闭时仍执行原证件扫描;已安装队列表时,充值撤销操作仍会取消旧完成通知,避免重新启用后复活。 +证件提醒开关同时受 `WECHAT_OA_ENABLED` 总开关控制;修改小时/分钟需要重启调度器。证件扫描与微信摘要使用同一调度任务,扫描仍每日执行,微信入队和发送复核均限制在周一、周三、周五。部署时如私有环境仍显式配置旧值8,须改为10并重启后端;本次未修改私有环境。通知关闭时仍执行原证件扫描;已安装队列表时,充值撤销操作仍会取消旧完成通知,避免重新启用后复活。 ## 跳转边界 @@ -109,7 +109,7 @@ LIMIT 100; 使用已关注并绑定的申请人、两名审批人分别验证:提交仅首节点收到;中间通过只通知下一审批人;最终结果为通过或打回,运费提交人收到审批结果及汇款凭证登记完成通知;代申请给实际申请人;撤回/重提不发送旧轮次;或签一人通过取消其他未发任务;未关注/解绑不向小程序OpenID发送。 -新增验收:备用金、报销、运费、充值四业务真实发放/支付后收到完成模板,纯冲抵不发;重复操作不重复发送;充值撤销/换绑后未发旧通知失效;长单号只记失败。证件接收人角色开启/移除、停用、不同租户与不同数据范围分别验证;周一/周三10点扫描发送,其他日期及10点前不发送,同日重复扫描不重复发送;续期/删除后更新数量,无预警不发送;跨日滞留取消;核对申请人字面值“系统默认发出”。 +新增验收:备用金、报销、运费、充值四业务真实发放/支付后收到完成模板,纯冲抵不发;重复操作不重复发送;充值撤销/换绑后未发旧通知失效;长单号只记失败。证件接收人角色开启/移除、停用、不同租户与不同数据范围分别验证;周一/周三/周五10点扫描发送,其他日期及10点前不发送,同日重复扫描不重复发送;续期/删除后更新数量,无预警不发送;跨日滞留取消;核对申请人字面值“系统默认发出”。 本地自动化使用SQLite及假的微信传输,不代替真实账号权限、模板内容、域名、小程序关联、MySQL多实例并发测试。生产发布及真实发送需单独执行上述验收。 diff --git a/miniprogram/pages/common/wechat-official-account.vue b/miniprogram/pages/common/wechat-official-account.vue index e29c42666..f9efb6dba 100644 --- a/miniprogram/pages/common/wechat-official-account.vue +++ b/miniprogram/pages/common/wechat-official-account.vue @@ -85,7 +85,7 @@ const openAccountProfile = () => { 证件到期提醒 - 每周一、周三10点向指定接收角色汇总证件提醒 + 每周一、周三、周五10点向指定接收角色汇总证件提醒 具体接收范围由业务权限和通知角色决定。