You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

222 lines
6.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 本次更新说明2026-07-03— 管理端增强 + 登录门控 + 客户管理
## 更新主题
| 项目 | 说明 |
|------|------|
| 打包时间 | 2026-07-03 |
| 适用场景 | **服务器已有旧版查价**,增量更新代码 |
| 是否改库 | **是**,需执行 Prisma 迁移(安装脚本自动执行) |
| 是否改 `.env` | **保留**已有 `.env`;可删除废弃的 `NEXT_PUBLIC_EMBED_DEMO_*` |
| 是否必须清 Redis | **建议**(避免旧报价缓存) |
---
## 本次主要功能
1. **管理端登录**:不再预填/展示演示账号;默认密码改为 `kj123456`(已有库需手动改密)
2. **嵌入演示登录**:客户编号 + 密码 `123456`按客户展示加价配置并查价Cookie 会话,无需页面 Token
3. **宿主 API 多租户**:按 Token 对应 `customer_id` 加价(如 `CUST_002`
4. **预警中心增强**:中文根本原因、客户、地址、货物信息
5. **查价记录**(原「队列监控」):最近 1000 条询价流水
6. **客户管理**:管理端新增客户、签发 API Key
7. **加价精度**:支持 0.01% 加价比例
---
## 数据库迁移(必做)
安装脚本会自动执行 `prisma migrate deploy`。本次新增迁移:
| 迁移目录 | 内容 |
|----------|------|
| `20260703100000_markup_percent_two_decimals` | 加价字段支持两位小数 |
| `20260703120000_host_customer_api_keys` | 客户表 + API Key 表 |
| `20260703140000_quote_query_log` | 查价审计流水表(最多 1000 条) |
**注意:不要**重新导入 `数据库/chajia.sql`,否则会清空生产数据。
---
## 零、开发机打包Windows
```powershell
cd X:\work\chajia
powershell -ExecutionPolicy Bypass -File deploy\pack-server-upload.ps1
```
生成目录:
```
上传到服务器/
├── README.md
├── RELEASE-NOTES.md ← 本文件(操作步骤)
├── 辅助脚本/
├── 代码/ ← 上传此目录全部内容
└── 数据库/ ← 本次更新不必导入
```
将整个 **`上传到服务器`** 打成 zip 上传到服务器。
---
## 一、服务器更新步骤(场景 B已有旧版
### 1. 备份(强烈建议)
```bash
cd /home/project/chajia
cp .env .env.backup.$(date +%Y%m%d)
```
### 2. 上传代码
用 zip 解压后的 **`代码/`** 覆盖 `/home/project/chajia/`
**不要上传或覆盖:**
- `.env`(服务器已有配置)
- `node_modules/`
- `.next/`
### 3. 检查 `.env`(通常无需修改)
确认以下项仍存在且正确即可:
```env
DATABASE_URL=mysql://chajia:密码@host.docker.internal:3306/chajia
JWT_SECRET=...
HOST_SERVICE_TOKENS=...
CUSTOMER_REGISTRY=...
RPA_MOCK_MODE=false
```
**不要**设置 `RPA_BROWSER_CHANNEL=chrome`Docker Worker 无系统 Chrome
本次**无新增必填环境变量**。可删除(已不再使用):
```env
NEXT_PUBLIC_EMBED_DEMO_SERVICE_TOKEN=...
NEXT_PUBLIC_EMBED_DEMO_CUSTOMER_ID=...
```
可选:自定义嵌入演示密码(默认 `123456`
```env
EMBED_DEMO_PASSWORD=123456
```
### 已有服务器:管理员改密
`admin_demo` 仍为旧密码 `Demo@123`,请在管理端改密,或在 MySQL 更新 `admin_user.password_hash`(新装 seed 默认为 `kj123456`)。
### 4. 执行安装(构建 + 迁移 + 重启)
```bash
cd /home/project/chajia
test -f .env && echo "OK: .env exists" || { echo "ERROR: 缺少 .env"; exit 1; }
chmod +x deploy/install-bt-host-mysql.sh
bash deploy/install-bt-host-mysql.sh
```
**515 分钟**。脚本会:
1. `docker compose build`next-app + rpa-worker + scheduler
2. 启动容器
3. **`npx prisma migrate deploy`**(执行上述 3 条迁移)
4. 健康检查
### 5. 确认服务状态
```bash
COMPOSE="docker compose --env-file .env -f deploy/docker-compose.bt-host-mysql.yml"
$COMPOSE ps
```
应看到 **next-app、rpa-worker、scheduler、redis** 均为 **Up**
```bash
curl -I http://127.0.0.1:30325
```
### 5. 清空 Redis 缓存(建议)
```bash
COMPOSE="docker compose --env-file .env -f deploy/docker-compose.bt-host-mysql.yml"
$COMPOSE exec redis redis-cli FLUSHDB
```
---
## 二、部署后验收
### 管理端
| 检查项 | 地址 / 操作 |
|--------|-------------|
| 管理端登录 | `/login``admin_demo` / `kj123456`(已有库可能仍为旧密码) |
| 嵌入演示 | `/embed-demo``CUST_002` / `123456` — 应显示 CUST_002 加价配置 |
| 预警中心 | `/admin/alerts` — 中文根因、客户、地址、货物 |
| 查价记录 | `/admin/queues` — 提交询价后有新行 |
| 客户管理 | `/admin/customers` — 可新增客户、轮换 Key |
### 询价回归
```bash
export CHAJIA_BASE_URL="http://你的IP:端口"
export CHAJIA_SERVICE_TOKEN="你的token"
export CHAJIA_CUSTOMER_ID="CUST_001"
bash 辅助脚本/test-denver-boston.sh
```
或在浏览器打开 `/embed-demo`,用客户编号登录后完成一次询价。
### 迁移是否成功
```bash
COMPOSE="docker compose --env-file .env -f deploy/docker-compose.bt-host-mysql.yml"
$COMPOSE exec next-app npx prisma migrate status
```
应显示 **Database schema is up to date**
---
## 三、本次变更文件清单(供排查)
| 类别 | 主要路径 |
|------|----------|
| 数据库 | `prisma/schema.prisma`,迁移 `202607031*` |
| 查价审计 | `modules/quote/query-log.ts``app/api/admin/query-logs/` |
| 预警展示 | `modules/alert/alert-presentation.ts``app/admin/alerts/` |
| 查价记录页 | `app/admin/queues/page.tsx` |
| 导航 | `components/layout/admin-layout.tsx``app/dashboard/page.tsx` |
| 客户管理 | `app/admin/customers/``modules/customer/` |
| 全链路挂钩 | `orchestrator.ts``job-handler.ts``fallback-orchestrator.ts``timeout-sweeper.ts` |
---
## 四、常见问题
| 现象 | 处理 |
|------|------|
| 构建报 `node:crypto` / `UnhandledSchemeError` | 已修复middleware 改用 `service-token-env.ts`;请用**本包最新代码**重建 |
| 查价记录为空 | 迁移后**新提交的询价**才会写入;旧数据无回溯 |
| 预警详情仍像 JSON | 确认 next-app 已重建;有 `quote_id` 的预警会关联报价单补全 |
| `prisma migrate` 失败 | 查 MySQL 权限;勿手动改表后与迁移冲突 |
| 嵌入演示登录失败 | 确认客户编号存在于 DB 或 `CUSTOMER_REGISTRY`;密码默认 `123456` |
| 嵌入演示查价 401 | 确认已登录middleware 使用 `embed_demo_session` Cookie |
| 构建 OOM | 服务器建议 4GB+ 内存;单独 build`$COMPOSE build next-app` |
---
## 五、回滚
```bash
# 还原代码备份后
bash deploy/install-bt-host-mysql.sh
```
数据库迁移**不建议**回滚;若必须,请在 DBA 协助下操作。