========================================
贝成口腔 · 广告创意盯盘助手（服务器版）
========================================

一、这个程序做什么
  每天 8:00-22:00 每个整点，自动做三件事：
    1. 读取 config\腾讯账户简称.xlsx 的账户清单，拉取当日累计数据
       （消耗 / 转化 / CPA / 有效人数 / 有效成本）
    2. 生成一张 372px 宽的盯盘卡图片（异常标红/标橙）
    3. 推送到企业微信群
  全程不需要打开 WorkBuddy，服务器自己跑。

二、目录说明
  盯盘助手.exe              主程序（双击无效，用命令行/定时任务调用）
  config\腾讯账户简称.xlsx  ★账户清单，增删账户只改这张表
  config\accounts.json      运行参数（回溯天数、并发数）；accounts 数组只在 Excel 读不到时兜底
  config\rules.json         判定阈值（CPA 超线、有效成本超线等）
  config\wecom.json         企业微信群机器人地址 + 推送时段
  config\credentials.json   腾讯广告授权（有效期到 2026-12-11，到期需替换）
  install-task.ps1          一键安装定时任务（第一次部署时运行）
  reports\realtime\         生成的盯盘卡图片（按 盯盘-YYYYMMDD-HHMM.png 留档）
  logs\                     运行日志（每天一个文件）

三、账户清单怎么维护（重点）
  直接编辑 config\腾讯账户简称.xlsx，第一行是表头，下面一行一个账户：

     账户名称                        | 账户ID        | 简称   | 目标CPA
     晋江市青阳贝成口腔门诊部有限公司 | ID: 30300648  | 晋江一 | 180
     泉州新贝成口腔门诊有限公司       | ID: 60494197  | 泉州一 |
     石狮贝成口腔门诊部               | 71234567      | 石狮一 |

   · 列顺序随意，多余的列会被忽略；列名认「账户名称 / 账户ID / 简称 / 目标CPA」
   · 账户ID 三种写法都认："ID: 30300648"、"30300648"、纯数字 30300648
   · 简称就是卡片上显示的名字，建议 3-4 个字；留空则用「账户名称」，都空则显示「账户+ID」
   · 目标CPA 留空 = 用该账户近 7 日均值自适应，一般不用填
   · 增删账户 / 改名后直接保存，不需要重新打包、不需要重启任务，
     下一个整点自动按新清单抓（每次运行都会重新读这张表）
   · 重复的账户ID 只保留第一行；空行自动跳过

四、部署步骤（Windows Server）
  1) 把整个文件夹复制到服务器，例如 D:\ad-monitor\
     ⚠ 路径建议放在 D 盘根目录下
  2) 确认服务器已安装 Microsoft Edge（Windows Server 2022 自带；
     没有的话装一下，程序用无头 Edge 截图生成图片）
  3) 右键 install-task.ps1 → 使用 PowerShell 运行
     脚本会自动：建目录 → 自检跑一次 → 注册每小时任务 → 发测试消息到群里
  4) 群里收到「投放在线测试」消息 = 部署成功

五、日常操作
  手动跑一次：      .\盯盘助手.exe once
  只出图不推送：    .\盯盘助手.exe render
  发测试消息：      .\盯盘助手.exe test
  常驻守护模式：    .\盯盘助手.exe daemon   （不开定时任务时用，窗口别关）

  查看定时任务：    Get-ScheduledTask -TaskName "贝成口腔-广告盯盘-每小时"
  删除定时任务：    Unregister-ScheduledTask -TaskName "贝成口腔-广告盯盘-每小时"

六、改阈值 / 推送时段
  - 改推送时段：改 config\wecom.json 的 hours（默认 [8..22]）
  - 改异常阈值：改 config\rules.json 的 realtime 段
      cpa_warn        转化成本超线（默认 200）
      valid_cost_warn 有效成本超线（默认 350）
      min_valid_cost_yuan 低于该消耗不判异常（默认 30）
  - 改完不需要重新打包，下一次整点自动生效

七、授权到期怎么办（重要）
  config\credentials.json 有效期到 2026-12-11。
  到期前在 WorkBuddy 里重新生成腾讯广告 API Key，
  把新的 credentials.json 覆盖到服务器 config\ 目录即可（无需重启任务）。
  授权失效的表现：日志里出现「报表查询失败: ... AUTH_EXPIRED / Access token is empty」

八、常见问题
  1) 群里没收到消息
     · 看 logs\当天日期.log 有没有「✓ 完成」
     · 若日志显示「不在推送时段」，说明当前小时不在 hours 列表里
     · 若显示 webhook errcode 非 0，检查 config\wecom.json 的地址是否被删/换群
  2) 账户改了没生效
     · 看日志第 2 行「账户来源: Excel config\腾讯账户简称.xlsx（N 个：晋江一 / ...）」
       N 和你表格里的行数是否一致、名字对不对
     · 若显示的是「accounts.json」→ Excel 没读到，常见原因：
       a. 文件被 Excel 打开占用（关掉 Excel 再试）
       b. 表格另存成了老的 .xls 格式 → 用「另存为」存成 .xlsx
       c. 账户ID 列里没有 5 位以上的数字（比如填了文字账户名）
     · 若某个账户数据全是 0，日志里会有
       「resource owner is not permitted to operate this [xxxx] 'account_id'」
       = 该账户没授权给这套 API 应用，先在腾讯广告后台加授权，或从表格里删掉
  3) 报「找不到 Edge/Chrome」
     · 服务器没装浏览器，装 Edge 后重试（这是唯一的外部依赖）
  4) 数据全是 0
     · 腾讯接口延迟约 10-30 分钟；早上 8 点刚过时当日数据可能还很少，属正常
  5) 图片想看历史
     · reports\realtime\ 里按「盯盘-YYYYMMDD-HHMM.png」保存了每一张

九、这台电脑（当前）与服务器的关系
  程序和配置都在服务器上跑，本地 WorkBuddy 可以完全关闭。
  本地项目目录仅作开发/改样式用，改完重新执行 node deploy\build-exe.mjs 再覆盖服务器文件。
  账户清单以 deploy\腾讯账户简称.xlsx 为源文件，打包时会自动同步到 dist\config\。
