涉税信息（移植自 ERP「内部数据 → 涉税信息」）
================================================

它是什么
  和 ERP 一样：把每家店铺的「主体涉税信息」拉下来存库，页面按「主体所有人 / 涉及店铺 / 年份」筛选，
  并给出 Q1-Q4 的「季度增值税汇总」「季度收入净额汇总」。UI 与 ERP 的 InternalTax.vue 一致。

和 ERP 的区别（重要）
  · ERP：backend/branch_tax.py 由后台常驻定时器（branch_scheduler）每天跑一次，数据写进 MySQL 表 `店铺_涉税信息`
    （库 duijie，权限用 InternalTax.vue + /api/internal/tax/data）
  · 本插件：用「云捷.定时」登记一个每天 03:00 的定时任务，把**同样的数据**写进**插件自己的本地库**
    （云捷.数据库，集合「涉税信息」，一个应用一个独立库，清缓存不会删）
    页面直接读本地库做展示，不依赖任何服务端
  · 取数逻辑一比一照搬 ERP：同一个接口 / 同一份请求体 / 同一套字段口径
      POST /bill_center/domestic/shop/query_item   { query_type:'TAX_SUBJECT', size:100 }            → 店铺主体列表
      POST /bill_center/domestic/shop/query_item   { query_type:'TAX_BILL', bill_date:[今年12个月],
                                                     member_id }                                     → 涉税账单
      收入净额 = company_goods_net_amount ÷ 100（接口给的是分）；交易笔数 = trade_cnt
      去重键（原表主键）= 主体所有人 + 月份 + 涉及店铺，重复采集就更新，不会重复行
  · 按需求**去掉了「已取得成本票」**：表格不再有该列（也就没有依赖它的「季度开票汇总」）

怎么跑（本地调试）
  1. 客户端「开发者中心 → 我的应用 → 版本 → 选择/更换目录」选中**本目录**（有 index.html 的这一层）
  2. 点「本地调试」→ 页面打开即读本地库展示（第一次是空的，点「立即同步」拉一次）
  3. 点右上角「立即同步」：遍历「本应用可用的全部店铺」逐店采集（逐店 try/catch，一家失败不影响别家）

定时器（每天自动采集）
  · app.js 顶层会调 云捷.定时.注册 登记任务「采集涉税信息」（每天 03:00）
  · **登记 ≠ 生效**：任务先是「待授权」，授权后才会自动跑
  · 客户端没开不会执行、错过的不会补跑（宿主机制，不是 bug）
  · 任务只在**本机**，换电脑 / 重装客户端要重新登记授权
  · 采集结果会回写到定时任务的「上次结果」（店铺 x/y、写入 n 条、失败 n 家）

授权（页面里的「授权设置」卡片，共用组件 共用/授权设置.js）
  · 卡片里直接显示定时任务的 **已授权 / 待授权 / 未登记**，以及触发方式、下次执行时间、上次结果
  · 未授权时点「授权」= **真授权**（调 云捷.定时.设置授权），不用再去「我的应用 → 定时任务」找
  · 同一个组件也管「首页面板」的授权（`:显示面板="true"` + `:面板配置="{…}"`）：
    面板被用户在「我的应用 → 首页面板」关掉后，可以在插件里一键「开启常驻」。
    本插件只用定时采集，所以传的是 `:显示面板="false"`；其它插件要面板时复制这个组件即可。
  · ⚠️ **需要新版客户端**：这依赖客户端新加的桥方法（定时.我的列表 / 定时.设置授权 / 首页.启用）。
    旧客户端没有这些方法时，组件会显示"当前客户端版本不支持在应用内授权…"，
    此时仍然可以走老路：到「我的应用 → 定时任务」手动授权。

配套改动清单（本次一起改了，方便你排查）
  1) 客户端主进程 src/main/index.ts：新增 IPC
     sched:listByPage（只返回本应用的定时任务）
     sched:setGrantByPage（授权/取消授权，**按页面归属校验，插件只能操作自己的任务**）
     panel:setEnabledByPage（开启/关闭本应用首页面板的常驻，同样校验归属）
  2) 客户端 src/preload/index.ts：桥新增
     定时.我的列表 / 定时.设置授权 / 首页.启用
  3) SDK（电商软件/SDK/云捷SDK.js → 同步到 服务端/SDK/云捷SDK.js）
     新增 云捷.定时.我的列表() / 云捷.定时.设置授权(任务ID, 授权) / 云捷.首页.启用(启用)
     开发包版本 2.5.17 → **2.5.18**（更新日志已补一条）
  4) 本插件 云捷SDK.js 已同步成 2.5.18

数据存在哪
  · 业务数据（涉税记录）：云捷.数据库 → 集合 `涉税信息`（长存，清缓存不删）
  · 上次同步时间：云捷.缓存 → 键 `上次同步时间`（可重建，清缓存后重来）
  · 不用 localStorage（容量小、会被清缓存、可能与其他插件串数据）

文件结构
  index.html / app.js   入口页：筛选 + 季度汇总 + 表格；app.js 里含「取数入库」和「定时登记」
  共用/授权设置.js       共用组件：管「定时任务」和「首页面板」的授权状态 + 一键授权（标签 auth-settings）
  资源/                 Vue2 + ElementUI（本地文件，别改成 CDN）
  云捷SDK.js            SDK（不要手写、不要改）

移植时要注意的点（排查方向）
  1. 这个接口是 **POST + JSON body**，由客户端带店铺登录态并自动算 a_bogus，插件不用管 Cookie / 签名。
     若返回「当前环境存在风险 / 10001010A」，先试在 云捷.请求 的选项里加 `设备指纹: true`
     （让客户端补上该店铺的 verifyFp/fp 再请求，与 ERP 某些写接口的处理方式一致）。
  2. 抖店该接口的 `data` 是**JSON 字符串数组**（每项要先 JSON.parse），不是对象数组 —— 代码里已兼容。
  3. 成功率看 `code === '100000'`（字符串），失败原因读 `msg` —— 与 ERP 判断一致。
  4. 单店铺内每个主体之间 sleep 1 秒（与 ERP 的 time.sleep(1) 一致），店铺多时同步会慢，属正常。
  5. 定时唤醒是**后台静默加载整包**运行，排查要用「本地调试」，正式运行看不到开发者工具。
