feat: 支持定时监控
This commit is contained in:
@@ -30,7 +30,7 @@ preload 必须构建为 CommonJS `.js`。项目启用了 Electron renderer sandb
|
||||
|
||||
`PSPLVISITORID` 等运行时凭证按 `courtId` 独立存储在 Electron `userData` 目录。范思伯特福中福的场地 ID 固定为适配器私有常量,只在请求边界映射到第三方 `userId` 字段和 `STOREID` 请求头,不经过 IPC,也不在配置界面暴露。设置弹窗通过专用白名单 IPC 读取凭证原值并回填密码框,默认遮挡;关闭弹窗立即清除渲染层中的输入值和设置对象,其他查询及预约接口不返回凭证。
|
||||
|
||||
可订列表刷新链路不读取球场凭证,`CourtAdapter.getAvailability()` 也不接收运行时设置,从类型边界保证列表请求不能携带 `PSPLVISITORID`。只有下单和释放写操作在主进程互斥区内读取最新凭证。
|
||||
匿名可订列表刷新链路不读取球场凭证,`CourtAdapter.getAvailability()` 也不接收运行时设置,从类型边界保证列表请求不能携带 `PSPLVISITORID`。范思伯特只有下单和释放写操作读取凭证;大湾区的列表查询也通过独立鉴权方法读取本机 Authorization。
|
||||
|
||||
配置文件使用临时文件加重命名的方式原子替换。共享层始终用字符串表达外部 ID,避免超出 JavaScript 安全整数范围;具体适配器负责校验接口是否接受该范围并转换为请求格式。
|
||||
|
||||
@@ -56,7 +56,7 @@ preload 必须构建为 CommonJS `.js`。项目启用了 Electron renderer sandb
|
||||
|
||||
## 空场监控
|
||||
|
||||
监控任务由主进程持久化和调度,应用通过单实例锁避免重复调度。日期可指定为创建时的今日或明日,也可以留空。指定日期的任务到达当天结束时间后自动停用;未指定日期的任务持续滚动检查主界面当前支持的未来 7 天,跨日后自动向后滚动一天且不会过期。轮询间隔固定为 10 秒;本地时间进入新的整点时绕过剩余轮询冷却立即检查一次,以捕获整点释放的新场地。同一整点只触发一次,并复用现有串行调度,不与尚未结束的检查并发。应用启动和休眠后恢复也会立即调度一次。今日已经结束的指定日期范围不能创建。相同球场和日期的请求在同一轮中复用,并分别过滤 `available/limited` 时段。
|
||||
监控任务由主进程持久化和调度,应用通过单实例锁避免重复调度。日期可指定为创建时的未来 7 天之一,也可以留空。指定日期的任务到达当天结束时间后自动停用;未指定日期的任务持续滚动检查主界面当前支持的未来 7 天,跨日后自动向后滚动一天且不会过期。轮询间隔固定为 10 秒;本地时间进入新的整点时绕过剩余轮询冷却立即检查一次,以捕获整点释放的新场地。同一整点只触发一次,并复用现有串行调度,不与尚未结束的检查并发。应用启动和休眠后恢复也会立即调度一次。今日已经结束的指定日期范围不能创建。相同球场和日期的请求在同一轮中复用,并分别过滤 `available/limited` 时段。
|
||||
|
||||
任务持久化上一次可订时段 ID 集合,只对新增 ID 通知;同一时段持续可订时不会重复通知,先消失再重新出现则再次通知。暂停和删除会让在途响应失效。提醒同时使用 Electron 系统通知和主进程待消费队列中的应用内提示,渲染器启动较晚或同轮出现多条提醒时也不会覆盖;默认只提醒,只有任务被用户显式授权自动预定时才会下单。带 `enrollment` 报名活动的时段属于已订场地,即使上游同时返回可预约标记,也必须从可订统计和监控提醒中排除。
|
||||
|
||||
@@ -70,7 +70,7 @@ preload 必须构建为 CommonJS `.js`。项目启用了 Electron renderer sandb
|
||||
|
||||
## 大湾区网球场
|
||||
|
||||
`dawanqu` 使用华润文体室内网球场矩阵接口。2026-09-23 实测无凭证列表返回业务码 403,因此使用主进程鉴权查询,不开放只允许匿名请求的后台监控。`credential` 保存 Authorization 值,适配器规范为 `Wechat <token>`;不内置抓包凭证。
|
||||
`dawanqu` 使用华润文体室内网球场矩阵接口。2026-09-23 实测无凭证列表返回业务码 403,因此手动查询和后台监控均使用主进程鉴权查询,凭证不进入任务或日志。`credential` 保存 Authorization 值,适配器规范为 `Wechat <token>`;不内置抓包凭证。
|
||||
|
||||
先重查列表,再调用 `reserve/price` 核对金额,最后调用 `reserve` 提交完整连续组合。场地与时段联合构成唯一标识,物理场地用通用 `physicalCourtId` 表达。价格或格式变化时阻止提交。提交后的超时、5xx、解析异常均按不确定处理,不自动重试。订单金额取核价结果,订单号取 `orderBusUuid`;不推测支付到期时间。
|
||||
|
||||
@@ -81,3 +81,7 @@ preload 必须构建为 CommonJS `.js`。项目启用了 Electron renderer sandb
|
||||
以 `isAbleReserve` 区分可订与不可订;`msg` 是原因提示,秒杀/优惠字段描述预约方式,不能覆盖已售状态。已开始时段显示“已开始”;不可订且无其他原因的优惠时段仍显示“已售”。可订但当前适配器未覆盖优惠/原时段转换流程时,保留可订状态,通过通用 `bookingUnavailableReason` 禁止应用内提交并提示在小程序预约。
|
||||
|
||||
矩阵接口业务码 `2000` 配合“当前最多可提前 N 天预定场地”表示未进入开放窗口,返回空时段及统一 `notice`,不是网络失败;只识别该明确响应,不把其他 `2000` 错误吞成空列表。开放窗口以服务端当次结果为准,不在客户端写死日期或推测放场时间。
|
||||
|
||||
### 放场监控
|
||||
|
||||
大湾区支持与已有球场相同的提醒、一次性自动锁场、完整连续时段复核、待支付互斥和不确定结果熔断。任务可选择未来 7 天中的具体日期,或持续滚动。每天北京时间 09:00 的首分钟优先检查当天 +2 日,先服务已启用且自动预定处于 armed 的任务;命中后不等其他日期完成就锁场。此后继续原有 10 秒轮询。独立整点唤醒与串行补查避免冷却漏检,仍不与正在执行的检查重叠;网络、系统休眠和登录有效性影响实际时延。
|
||||
|
||||
Reference in New Issue
Block a user