﻿B+ APP 一键原地升级（Windows）
========================================

用途
----
把已安装的 B+ APP 升级到最新版（当前 8.94.366），不需要重新去网页下载、
不需要手工搬文件夹。全程自动：下载 → 解压 → 覆盖安装目录 → 重启。

什么时候用它
------------
App 内「检查更新 → 立即更新」点了没反应、或点完版本号还是旧的（例如 362 升 363 卡住），
就用本工具。它不依赖 App 自带的升级器，直接下载官方包覆盖安装目录，
并且会校验「装完的版本号是否真的变成目标版本」，不会出现「以为升了其实没升」。

怎么用
------
1. 把本压缩包解压到任意位置（桌面即可）。
2. 先关闭正在运行的 B+ APP（可选，脚本也会自动关）。
3. 双击 upgrade.bat（一键升级入口）。
4. 看到「=== DONE ===」并自动弹出新版 App，就升级成功了。

如果你的 App 不在桌面 / D:\B+APP 这些常见位置，脚本找不到时：
  在 bat 所在文件夹空白处按住 Shift + 右键 → 「在此处打开 PowerShell 窗口」，执行：
      powershell -NoProfile -ExecutionPolicy Bypass -File .\B+APP-upgrade.ps1 -InstallDir "你的B+APP所在文件夹"
  （文件夹里应该能看到 B+APP.exe）

升级后会怎样
------------
- 版本变成 8.94.366；
- 你原来填过的门店配置（bplus_app_config.json）会保留，不需要重新配；
- App 启动后会自动拉起采集端，看板「采集电脑」应显示本机在线。

本版（8.94.366）修了什么
-----------------------
两条，都是升到 365 之后实测出来的现象：

① 打开客户端要登两次。
   以前外壳一启动就把看板页塞进中间区域，两秒后才去问「有没有登录」——
   没会话的机器上，看板先把自己的登录页画出来（第 1 次），随后外壳再弹一次登录卡（第 2 次）。
   现在外壳先问登录态：已登录直接进看板；未登录根本不加载看板，只弹一次外壳登录卡。
   左下角那个按钮就是唯一入口：未登录写「登录」，点一下直接进客户端；
   已登录写「退出登录」，点了就地回到登录卡，程序不会退出。

② 点「立即采集」干等 30 秒后报「调试端口连不上」；点「立即下载」报「没发现报表」。
   前者是拉起 A+ 时没带调试端口，而且 A+ 已经在跑时参数根本传不进去；
   后者是报表目录被写死成「用户目录 / Downloads」，华为这类机器把「下载」重定向到
   OneDrive 之后就永远找不到。现在：拉起 A+ 一律带上调试端口，A+ 已在跑时直接提示
   「请先完全退出 A+（含托盘）再点」；报表目录改成读注册表里的真实「下载」位置，
   页面上自己填过的路径不会被改。另外「采集与下载」的日志改成最新在上，不用再往下翻。

365 及以前已修（一并包含）
-----------------------
五件事，都是客户直接报的现象：

① 双击「启动采集端」只报「退出码 9009 / 无可用 Python」，采集完全跑不起来。
   根因不是电脑没装 Python —— 是我们安装采集端时把子目录整个丢了：
   内置的 Python 运行时（runtime\）、定时下载（daily-download\）、
   成交采集（deal\）、开机自启（win-app\）全都没落地，界面却一直显示「安装成功」。
   于是启动脚本找不到自带 Python，转头去找系统 Python，系统又没装 → 9009。
   现在：装包连子目录一起合并；缺了会在 App 启动时自动补齐；
   界面上会明确标出「内置运行时缺失」「缺少 xxx」，不再假装一切正常；
   「安装/修复采集端」也改成真强制重装（以前版本不旧就直接跳过，点一百次没用）。

② 电脑无故弹「确定要卸载 A+ 吗？」。
   根因是我们的采集端旧版每 60 秒扫一次「名字里带 A+ 的程序」用于保活，
   把 A+ 安装目录里的「卸载 A+」也当成本体拉起来了。
   现在内置采集端插件升到 v8.94.500：识别并跳过卸载程序（含中文名），
   「一键修复」也不会再把下载夹里残留的旧插件包装回去（旧包没有这层判断）。

③ 左下角「退出登录」点了不退出。
   根因不是会话没清，而是客户端程序里同一个退出函数被写了两遍 ——
   后一个只备份了配置文件就回「成功」，把真正去清会话的那个盖掉了。
   现在只保留一个，退出后左下角变「未登录」，并弹出门店登录卡就地重登。

④ 「工具 → 采集与下载」页一直停在「正在加载…」。
   那一页原来是直接内嵌采集引擎自带的一张静态页，上面没有任何可点的按钮，
   也不跟客户端握手，所以加载动画永远不消失。
   现在改成客户端自己的页面：一句结论 + 四项自检（A+ 是否装、调试端口是否开、
   采集脚本是否在、报表目录是否正确）+ 立即采集/立即下载/停止 + 最近日志 + 报表收件箱，
   定时档位也从手写表达式改成了下拉三选一（每 6 小时 / 每天 08:30 / 每天 12:00 / 仅手动），
   并直接显示「下次运行时间」。

⑤ Windows 端「下载报表」现在真的能跑。
   以前触发下载写的是 macOS 的 open 命令，Windows 上必然失败，
   定时任务只是空等十分钟后报「没发现报表」。现在按平台分别查找「数据下载」组件，
   报表目录也能在页面上直接改（支持 ~ 路径）。

上一版（8.94.364）修了什么
-----------------------
能登录，但「退出登录 → 再重新登录」后，中间区域一直显示「看板暂时无法显示」。
根因在客户端自带的本地反代：上一版为了修「有些页面刷不出来」，把服务器的 302 跳转
交回浏览器自己跟随，浏览器于是真的去请求了一次登录页；可登录页本来就是登录页，
却被反代误判成「会话被踢」，于是反复静默重登，重试用尽后一个字节都没回给浏览器，
iframe 永远等不到加载完成，45 秒后弹兜底页。
现在：登录/鉴权路径不再参与「被踢」判定；并发重登按会话代次去重；换会话不留空窗；
重试用尽也必定给浏览器一个响应。

上一版（8.94.363）修了什么
-----------------------
上一版 8.94.363 有个回归：能登录，但「退出登录 → 再重新登录」后，中间区域一直显示
「看板暂时无法显示」，等多久都不出来。
根因在客户端自带的本地反代：上一版为了修「有些页面刷不出来」，把服务器的 302 跳转
交回浏览器自己跟随，浏览器于是真的去请求了一次登录页；可登录页本来就是登录页，
却被反代误判成「会话被踢」，于是反复静默重登，重试用尽后一个字节都没回给浏览器，
iframe 永远等不到加载完成，45 秒后弹兜底页。
现在：登录/鉴权路径不再参与「被踢」判定；并发重登按会话代次去重（不会互相把刚拿到
的会话踢掉）；换会话不留空窗；重试用尽也必定给浏览器一个响应。

① 首次配置点「保存」后弹红框启动失败；② 有些页面刷不出来、切页面卡。
