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.

1802 lines
60 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-08-11c)— Direct 对齐官网 + 二级加速 + 轮询 400ms
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260811c.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next + Worker) |
### 含本次变更
1. MotherShip 登录态报价条数对齐官网:`cargo.type` 用 `Pieces`、优先 `ratesV2`、提货时刻进时区、不自动加住宅/尾板
2. 二级「补充信息」刷价走 Direct HTTP,失败再回退 DOM 队列
3. 一级 Direct 成功即写入 refine-hold,可继续填二级
4. 同承运商多档报价卡 React key 含价格,不再撞 key
5. 前端轮询间隔 400ms(原 2s),页面出结果更快
6. 含 11b 查价记录全档展示及此前累计改动
7. **ccnew / cc-client 无需改代码**(iframe 协议未变)
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-08-11b)— 查价记录展示全部报价
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260811b.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next;Worker 可不建) |
### 含本次变更
1. 查价记录不再只显示第一条报价;详情列出该次询价全部承运商档位
2. 主表报价列改为「N 档 / 最低价」
3. 详情支持复制全部报价
4. 含 11a 及此前累计改动
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-08-11a)— 查价记录减压与复制
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260811a.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next;Worker 可不建) |
### 含本次变更
1. 查价记录主表改为:时间、客户、线路、结果、报价、详情,不再横向滑动
2. 详情抽屉展示完整提货/派送地址与货物参数,支持单项复制与复制全部
3. 含此前累计改动
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-08-07q)— 更新报价回顶 + 时间/邮箱校验
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260807q.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next;Worker 建议同刷) |
### 含本次变更
1. 点击「保存并更新报价」后视角回弹到「选择承运商」报价区(刷价结束也会再滚一次)
2. 就绪时刻早于开门、开门不早于关门:选择时即时红字提示并禁止提交
3. 提货/送货联系人邮箱不得相同:即时提示 + 前后端拦截
4. 含 07p 及此前累计改动
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-08-07p)— 线路无价不再误导补详情
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260807p.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next + Worker) |
### 含本次变更
1. 官网已明确「该线路/货物暂无报价」时,直接展示中文拒价,**不再**弹出「请补充必要信息以获取报价」
2. 修复同屏同时出现 required fields + unable to find any rates 时误判为需补二级的问题
3. 含 07o 及此前累计改动
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-08-07o)— 全面取消托盘 1–25 硬限
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260807o.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next;Worker 可不建) |
### 含本次变更
1. 取消托盘数 1–25 上限(一级/二级/匿名均不再因此拒价);仅要求托盘数为正整数
2. 重量、尺寸、登录态均重≤5000 / 总重≤45000 等其他规则保留
3. 含 07n 及此前累计改动
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-08-07n)— 二级刷价误触托盘 1–25
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260807n.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next;Worker 可不建) |
### 含本次变更
1. 修复:一级可出价、二级刷价却报「托盘数超出(1-25)」——刷价请求无 `cargo_lines` 误走匿名硬限
2. 与 piece count 无关;有 `mothership_details` 即按登录态跳过 1–25
3. 含 07m 件数类型非必填等累计改动
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-08-07m)— 件数类型非必填 + 选项补全
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260807m.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next;Worker 可不建) |
### 含本次变更
1. 件数类型 / 件数数量按官网改为非必填(去掉 * 与校验拦截)
2. 件数类型下拉补全为 18 项(Pieces/Cartons/Boxes/…)
3. 补齐附加服务区块 ⓘ;含 07l tip 点击等累计改动
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-08-07l)— 二级 ⓘ 提示可点击且译中文
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260807l.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next;Worker 可不建) |
### 含本次变更
1. 二级 Details 字段 ⓘ 可点击/悬停显示说明(原为空图标)
2. 货物类型 / 件数类型 / NMFC 按官网 tip 原文准确译中;参考号、就绪时刻、运费等级同步说明
3. 含 07k 混装托盘计数修复等累计改动
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-08-07k)— 混装询价误报托盘数超限
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260807k.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next;Worker 可不建) |
### 含本次变更
1. 修复:登录态 `pallet_count` 误把纸箱等行数量加总,触发「托盘数超出允许范围(1-25)」;现仅合计类型为托盘的行
2. 录入提示文案对齐:支持小数录入,提交时向上取整
3. 含 07j 补填红边等累计改动
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-08-07j)— 补填态必填框红边提醒
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260807j.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next;Worker 可不建) |
### 含本次变更
1. 用户确认「请补充必要信息后重新获取报价」后,空/错必填输入框显示明显红边与短提示
2. 填写正确后红边消失;提交校验失败也会强制高亮
3. 含 07i 就绪时刻规则等累计改动
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-08-07i)— 货运就绪时刻不得早于提货开门
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260807i.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next **与** Worker) |
### 含本次变更
1. 对齐官网:就绪时刻不得早于提货点开门;开门须早于关门(前端拦截 + 开门变更自动拨就绪时刻)
2. 二级刷价透传 `ready_date` / `ready_time`;RPA refine 重填就绪时间
3. 门户英文「Freight ready time is before…」译为中文
4. 含 07h 及此前白标累计改动
```bash
bash deploy/update-code-only-bt-host-mysql.sh
# Worker 须一并重建(refine RPA 改动)
```
---
# 本次更新说明(2026-08-07h)— 去掉「无法服务此货件的承运商」模块
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260807h.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next) |
### 含本次变更
1. 侧栏移除「无法服务此货件的承运商」整块占位模块
2. 含 07g 及此前白标累计改动
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-08-07g)— 侧栏去掉「以官网为准」
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260807g.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next) |
### 含本次变更
1. Dedicated 等服务说明不再出现「以官网为准」
2. 不可用承运商相关占位文案同步去官网表述
3. 含 07f 及此前白标/补填/保障外链等累计改动
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-08-07f)— 去掉保障方案外链与官网提示
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260807f.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next) |
### 含本次变更
1. 移除「查看保障详情与除外条款」「了解更多」
2. 不再弹出「外链暂未配置 / 请在官网查看」类提示
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-08-07e)— 补充信息无客户时限 + 笼统提示
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260807e.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next + Worker) |
### 含本次变更
1. 取消客户侧填写倒计时与自动放弃;修复超时后「保存并更新报价」按钮消失
2. 敏感文案(超时/二级/官网)改为笼统提示,如「请补充必要信息后重新获取报价」「信息不完整…」
3. 内部会话过期时:用原地址 + 补充信息完整重查,不向客户暴露超时
4. 提交区 sticky,下滚仍可见
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-08-07d)— 二级补填提示改为短文案
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260807d.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next 必须) |
### 含本次变更
1. 图一弹窗与图二红色提示统一为:「请补充必要信息后重新获取报价」
2. 去掉「官网 / Save & update quote」等对外暴露细节
3. 含 07c:MotherShip 品牌脱敏
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-08-07c)— 客户可见文案隐藏 MotherShip 品牌
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260807c.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next 必须;Worker 建议重建以同步错误文案) |
### 含本次变更
1. 校验/错误提示不再出现 MotherShip / Mothership 字样(如「尺寸超出允许范围」)
2. 模块入口改为「私卡询价 / 合单询价」;报价卡片承运商名「MotherShip」脱敏为「平台承运」
3. API `fail` 与询价 `error_message` 统一品牌脱敏,防止漏网
4. 含 07b:shipment-form import 修复等
### 重测要点
1. 故意超尺寸询价:红字不得含 MotherShip
2. 报价结果承运商列表不得显示 MotherShip 品牌名
3. 若宿主左侧仍写「MotherShip 要求整数」,需宿主侧同步改文案(本仓嵌入侧提示已无品牌)
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-08-07b)— 修复 shipment-form 构建缺 import
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260807b.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next 必须;Worker 建议一并重建以含 07a) |
### 含本次变更
1. 修复 `mothership-logged-in-shipment-form.tsx` 误删 `evaluateMothershipAccessorialCompat` import 导致 `npm run build` 失败
2. 含 07a:ste/suite 不自动勾住宅等 RPA 对齐官网改动
### 重测要点
1. `npm run build` / 镜像构建通过
2. West Covina → Columbus(ste 2)未选手动附加服务可询价
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-08-07a)— 对齐官网:ste/suite 不自动勾住宅
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260807a.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next + RPA Worker 须重建) |
### 含本次变更
1. 商业地址含 `ste`/`suite` 时,RPA 不再自动勾选派送「住宅/尾板」(与官网可直接出价行为对齐)
2. 仅 `apt`/`apartment` 才自动补住宅类附加服务
3. 清空残留附加服务时先打开下拉;附加服务操作失败时优先展示官网拒价原文
4. 含 05g:一级页去掉常驻风险横幅等
### 重测要点
1. West Covina → Columbus(含 ste 2)未选手动附加服务时应能正常询价
2. 若仍失败,前端应优先显示官网真实拒价,而非固定「附加服务下拉超时」
3. 硬刷新(Ctrl+F5)
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-08-05g)— 去掉一级页常驻风险横幅
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260805g.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next 必须) |
### 含本次变更
1. 一级「创建新货件」页去掉顶部一直常驻的附加服务风险横幅
2. 提货侧「住宅」仍可选,且仍会在控件附近提示“可能得不到报价”
3. 含 05f:提货住宅改为可选风险提示
### 重测要点
1. 勾选提货「住宅」后,标题下方不再出现整条常驻提示
2. 附加服务控件附近仍会显示风险提示
3. 硬刷新(Ctrl+F5)
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-08-05f)— 提货住宅改为可选风险提示
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260805f.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next 必须) |
### 含本次变更
1. MotherShip 提货侧「住宅」不再前端直接禁选,用户可勾选后继续
2. 勾选后立即提示「该选择可能得不到报价」,与官网实际拒价规律对齐
3. 含 05e:FreightProtect 货值支持小数
### 重测要点
1. 提货侧可勾选「住宅」,且会显示风险提示,不再被灰掉
2. 送货侧互斥与提醒逻辑保持不变
3. 硬刷新(Ctrl+F5)
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-08-05e)— FreightProtect 货值支持小数
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260805e.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next 必须;RPA Worker 须重建以同步小数货值填入) |
### 含本次变更
1. FreightProtect 货值输入支持小数(最多两位,如 `300.55`),不再强制进位为整数
2. RPA 同步官网时按小数填入货值字段
3. 含 05d:客户端隐藏加价明细 + 去掉嵌入保存按钮
### 重测要点
1. 保障方案货值可输入 `300.5` / `300.55` 且不会被改成整数
2. 硬刷新(Ctrl+F5)
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-08-05d)— 客户端隐藏加价 + 去掉嵌入保存按钮
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260805d.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next 必须) |
### 含本次变更
1. 私卡侧栏/报价卡:客户端不再展示「原价 / 客户加价 / 最终价」拆解,仅显示加价后最终报价
2. 嵌入宿主模式去掉绿色「保存本次询价记录」按钮(点选承运商/保障已通过 `chajia:quote-result` 同步)
3. 含 05c:去掉货值小数说明 + 超时文案精确化
### 重测要点
1. 承运商卡片与底部摘要不再出现「原价」「客户加价」
2. 嵌入页侧栏底部无绿色保存按钮;点选承运商宿主仍能收到选中报价
3. 硬刷新(Ctrl+F5)
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-08-05c)— 去掉货值小数说明 + 超时文案精确化
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260805c.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next 必须) |
### 含本次变更
1. FreightProtect 区去掉「货值不允许小数/进位」说明文案(进位逻辑仍静默生效)
2. 含 05b:超时/报错按具体控件显示真实原因;历史笼统文案展示时纠正
### 重测要点
1. 保障方案区不再出现货值小数进位说明
2. 预警详情超时根因不再出现「附加服务选项未展开」套话
3. 硬刷新(Ctrl+F5)
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-08-05b)— 超时/报错根因文案精确化
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260805b.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next 必须;预警/报价失败文案走 API) |
### 含本次变更
1. Playwright 超时按具体控件翻译(提货地址框 / 「继续」按钮 / 报价卡片等),不再笼统写成「创建货件/报价表单控件」
2. 去掉易误导的「附加服务选项未展开」套话;改为与控件匹配的真实原因
3. 历史已入库的笼统超时文案,在预警详情/报价失败展示时自动纠正
### 重测要点
1. 管理端打开预警 #85(或同文案失败单):根本原因不应再出现「附加服务选项未展开」
2. 硬刷新后新失败单应显示具体控件名
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-08-05)— 「继续」进二级后置顶 + scroll-top
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260805.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next 必须) |
### 含本次变更
1. 一级点「继续」进入提货信息后:iframe 内滚顶,并向宿主发 `chajia:scroll-top`
2. 协议正式登记 `chajia:scroll-top` / `chajia:scroll-quotes`
3. 含 0804c:出报价滚到「选择承运商」、已选不挡标题;点选锁价等
### 重测要点
1. 私卡询价点「继续」后,查价区应回到视口顶部(需 cc-client 一并处理 scroll-top)
2. 硬刷新(Ctrl+F5)
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-08-04c)— 出报价后自动滚到选择承运商
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260804c.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next 必须) |
### 含本次变更
1. 报价列表出现后自动滚到侧栏「选择承运商」
2. 「已选」角标与承运商名同行,不挡标题
3. 宿主可发 `chajia:scroll-quotes` 再滚一次
4. 含 0804b:侧栏点选即时 `quote-result` 锁价;0804 隐藏门户外壳
### 重测要点
1. 出票后视口落在承运商列表(配合宿主左侧「当前选中报价」)
2. 已选角标不遮挡承运商名称
3. 硬刷新(Ctrl+F5)
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-08-04b)— 侧栏点选即时 quote-result 锁价
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260804b.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next 必须) |
### 含本次变更
1. **MS 侧栏点选承运商**:立即 `chajia:quote-result`,点中行 `selected: true`(无需绿「保存」)
2. 默认选中 / 换承运商 / 保障变化导致生效费率变 → 再推一次
3. 绿「保存」仍可选 `chajia:quote-save` 写快照
4. 含 0804:嵌入隐藏门户外壳(账密/模块条)
### 重测要点
1. 宿主 iframe 点侧栏承运商 → 收到带 `selected` 的 `quote-result` 并可锁价
2. 未点绿保存也能跳转确认询价
3. 硬刷新(Ctrl+F5)
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-08-04)— 嵌入演示隐藏门户外壳
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260804.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next 必须;Worker 建议一并) |
### 含本次变更
1. **嵌入 `/embed-demo`**:登录后隐藏「当前客户」卡、模块切换、免账号/登录后 Tab、承运商明文账密表单
2. 已配置官网账密时直接进入查价表单;账密仅管理端维护
3. 宿主托管(SSO / embed)去掉顶栏大壳,仅查价区
4. 含此前:quote-save 补全、查价记录供应商/报价、MotherShip 加价展示等
### 重测要点
1. 登录 CUST_004 → 不应再出现账密明文卡 / 模块条
2. 有账密应直接看到 MotherShip 登录态表单并可询价
3. 硬刷新(Ctrl+F5)后再验
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-07-31)— 检测包:quote-save 补全 + 查价记录/加价展示
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260731.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next 必须;Worker 建议一并) |
### 含本次变更
1. **`chajia:quote-save`**:回传货物行、提派送地址、可提货日、预计送达(供宿主 ccnew 快照落库)
2. **管理端查价记录**:供应商 / 最终报价列;长文本折叠悬停看全量
3. **MotherShip 侧栏**:原价 / 客户加价 / 最终价;FreightProtect 未确认前不误报最终价
4. **宿主协议**:客户加价显式字段(`customer_final_total` 等)
### 检测要点
1. if.dev `embed-demo` / 宿主私卡询价 → 保存后快照含送达日、货物、地址
2. 管理端「查价记录」有供应商与 USD 报价
3. 侧栏有加价时拆开显示;硬刷新(Ctrl+F5)后再测
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-07-30g)— 管理端查价记录供应商/报价 + MotherShip 加价展示
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260730g.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next 必须;Worker 建议一并,含近期结账/加价逻辑) |
### 含本次变更
1. **管理端查价记录**:地址/货物/失败原因过长单行折叠,悬停看全量;新增「供应商」「报价」列(按 `quote_id` 回查默认档)
2. **MotherShip 侧栏**:显示原价 / 客户加价 / 最终价;FreightProtect 未确认前不误报最终价
3. **宿主 postMessage**:`quote-result` / `quote-save` 显式标明客户加价后字段
4. 含 30f:加价搜索/保存、Flock 档内加价、日历翻月
### 重测要点
1. 管理端「查价记录」能看到供应商与 USD 报价;长地址悬停可看全量
2. MotherShip 侧栏有加价时拆开原价/加价/最终价
3. 勾选 FreightProtect 后,未确认前不显示假最终总价
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-07-30f)— 加价搜索/保存 + Flock 档内加价 + 日历翻月
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260730f.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next + Worker 均须重建) |
### 含本次变更
1. **加价配置搜索**:按客户代码/名称/账号可搜;`SPO`↔`SP012`(0/O);防抖;空态提示
2. **业务客户「客户加价」弹窗**:空值拒存、回显已有规则、保存成功提示、列表加价列
3. **Flock 档内承运商/灵活价**:落库前叠加业务客户加价(Echo 等不再只显示官网原价)
4. **MotherShip 登录态日历**:选日前翻到目标月;报错全中文
### 重测要点
1. 管理端「客户加价」搜 `SP012` / `STAR` / `STARPOST` 能命中
2. 给 SP012 设固定 `$3` → 保存后列表显示「固定 $3.00」
3. STARPOST 询价选 Echo FTL → 价应为原价 + $3(须 Worker 新镜像)
4. MotherShip 可提货日跨月(如 8/5)应能点中
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-07-30e)— 货物红 ! 提示点加固(内联可见)
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260730e.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next 必须) |
### 含本次变更
1. 「货物」旁红 `!` 改为内联上移按钮(避免 absolute 被裁切)
2. `QuoteSectionTitle` 增加 `overflow-visible`
3. 测服实测:`MS_LOGGED_IN` 标题已含「货物 !」,点击可展开录入限制
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-07-30d)— 一级「货物」录入限制提示点
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260730d.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next;Worker 建议一并) |
### 含本次变更
1. 一级表单「货物」标题右上角红 `!` 提示点(`data-testid=cargo-limits-hint-dot`)
2. 悬停/聚焦展开黄底说明:整数进一、单件 ≤5000 lb、整票 ≤45000 lb
3. 保留标题下灰色整数提示文案
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 本次更新说明(2026-07-30c)— 结账/刷价透传二级详情与附加服务
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260730c.zip`**(仅代码,约 1.36MB) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next + Worker 必须) |
### 含本次变更(在 30b 基础上)
1. 结账 `ms-checkout` / 刷价 `refine-details` 透传 `mothership_details` + `pickup/delivery_accessorials`
2. 二级 `toPayload` 含附加服务;结账侧栏读取最新二级表单状态
3. Worker 结账失败时回传中文业务原因(非堆栈)
测服未闭环:报价有效期 3min 内 refine/checkout 易超时;需看 `rpa-worker` 的 `[ms-checkout] FAIL` 日志。
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 历史:本次更新说明(2026-07-30b)— MotherShip 二级 UI 对齐官网
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260730b.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next;Worker 建议一并重建) |
### 含本次变更(在 30a 基础上)
1. **二级附加服务卡片化**:双列服务卡 +「查看服务详情」开关(替换下拉)
2. **侧栏视觉对齐**:已选角标、服务类型本地说明、无法服务折叠占位、FreightProtect 徽章、结账「前往结账 — $x」
3. **验收 fixture**:`/e2e-fixtures/ms-l2-ui`(仅本地/非生产)
缺口(可点仅提示):保障详情外链、了解更多、See why 完整名单、Dedicated Dry Van 抽屉、一级 Create 卡片化。
```bash
# 解压覆盖(勿覆盖 .env)后:
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 历史:本次更新说明(2026-07-29i)— Inside 误勾 / lane 红字 / 小数进一
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260729i.zip`**(仅代码,约 0.9MB) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next + Worker) |
### 含本次修复(在 29h 基础上)
1. **一级禁止点 Recommended**:避免官网自动勾选 Inside Delivery/Pickup
2. **清残留附加服务勾选**:用户未选则主动取消 Sticky/Recommended 残留
3. **红字 lane 无价识别**:`unable to find any rates for this lane` 译回中文并硬拒,不再误走 NEEDS_DETAILS
4. **重量/尺寸小数进一**:表单提示 + RPA 填整数(如 25.68 → 26)
仍含 29h:均重 ≤5000 lb、整票 ≤45000 lb、一级/二级分流、`MS_NEEDS_DETAILS`。
```bash
# 解压覆盖(勿覆盖 .env)后:
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 历史:本次更新说明(2026-07-29h)— 货物重量限制 + 测试包
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260729h.zip`**(仅代码,约 0.89MB) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Next + Worker) |
### 含本次能力
1. 一级/二级分流、`MS_NEEDS_DETAILS`、官网红字译回
2. `readyDate` 构建修复(29g)
3. **MotherShip 登录态货物限**:
- 单件均重(Weight each)> **5000 lb** → 不可询价
- 整票总重 > **45000 lb**(53 英尺货车最大载重)→ 不可询价
- 托数不设 1–25 硬拒
```bash
# 解压覆盖(勿覆盖 .env)后:
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 历史:本次更新说明(2026-07-29g)— 修复构建类型错误 readyDate
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260729g.zip`**(仅代码) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是** |
### 修复
`embedded-quote-widget.tsx`:`loggedInDraft?.ready_date` → `readyDate`(对齐 `MothershipLoggedInShipmentPayload`),解决 `npm run build` TS 失败。
含 29f 全部能力(一级/二级分流、官网红字回传)。
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 历史:本次更新说明(2026-07-29f)— 一级/二级询价分流 + 官网红字回传
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260729f.zip`**(仅代码,约 0.89MB) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(必须重建 Worker + Next) |
### 含本次能力
1. **一级询价**不填公司名/联系人;Continue 后 Skip + Save&update 出价
2. 一级仍「必填无价」→ `MS_NEEDS_DETAILS`,引导客户填**二级**再刷价(驻留会话)
3. 官网底部**红色业务报错**(线路无运力、地址问题、住宅取件等)译中文回传客户
```bash
# 解压覆盖项目目录(勿覆盖 .env)后:
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 历史:本次更新说明(2026-07-29d)— Details 禁用字段 30s 空等修复
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260729d.zip`**(仅代码,约 0.88MB) |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(必须重建 Worker) |
### 根因(用户 LA→New Haven 参数复现)
Continue 后无价卡 → 补 Details 时 `delivery-contact-first-name` 为 **disabled**,`locator.fill` 空等默认 30s。
### 修复
- `safeFillInput`:禁用字段跳过/短超时,禁止默认 30s
- 优先点 `Skip (none apply)` + `Save & update quote`
- 本地无头复现同参数已 OK(12 档报价)
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 历史:本次更新说明(2026-07-29c)— 可提货日空等修复(正式部署包)
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260729c.zip`**(仅代码,约 0.88MB) |
| 是否改库 | **否**(若尚未执行 `datagrip-manual-migrate-20260728.sql` 仍须先跑) |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(Worker 含登录态可提货日修复) |
### 含本次修复
- MotherShip 登录态:可提货日按钮多选择器 + 短超时 + Inbox 遮挡 force 点击
- 本地有头探针已验证可出 9 档报价
```bash
# 解压覆盖 /home/project/chajia(勿覆盖 .env)后:
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 历史:本次更新说明(2026-07-29b)— 登录态可提货日 30s 空等修复
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260729b.zip`**(仅代码) |
| 是否改库 | **否**(若尚未跑过 `datagrip-manual-migrate-20260728.sql` 仍须先跑) |
| 是否改 `.env` | **否** |
| 重建镜像 | **是** |
### 修复
MotherShip 登录态选「可提货日」时,日期按钮 `click()` 被 Inbox 遮挡会空等 Playwright 默认 **30 秒**,前端显示「未能等到目标页面元素」。
已改为:多选择器找日期钮、显式短超时、force 点击兜底、点日期前关闭 Inbox。
```bash
# 解压覆盖代码后(勿覆盖 .env):
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 历史:本次更新说明(2026-07-29)— 租户/业务客户二层 + 更新后 HTTP 500 修复
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260729.zip`**(仅代码) |
| 是否改库 | **是** — DataGrip 执行 `deploy/datagrip-manual-migrate-20260728.sql` |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**(已更新则只需补库) |
### 更新后「服务异常 (HTTP 500)」
**根因**:代码已读 `business_customer` 表 / `business_customer_id` 列,但 `update-code-only-bt-host-mysql.sh` **不跑 migrate**,库结构落后。
**立刻修**:
1. DataGrip 连生产库,执行 `deploy/datagrip-manual-migrate-20260728.sql`
2. 自检:`SHOW TABLES LIKE 'business_customer';` 有结果
3. 刷新页面(无需再打镜像)
可选(容器内标记 migration 已应用):
```bash
npx prisma migrate resolve --applied 20260728171500_tenant_business_customer_split
npx prisma migrate resolve --applied 20260728174500_business_customer_id_guid_width
```
---
# 历史:本次更新说明(2026-07-27e)— Flock 一级表单 4 项补齐
| 项目 | 说明 |
|------|------|
| 打包文件 | **`上传到服务器/chajia-code-20260727e.zip`**(仅代码) |
| 是否改库 / `.env` | **否** |
| 重建镜像 | **是** |
| 构建校验 | **已通过**:`tsc --noEmit`、`next build` |
### 本次代码要点
- 调度高级项:件数>5 **或** 总重>5000 解锁(含提示文案)
- 提货「指定提货时段」常可选;选中即出起止时间
- 额外货运险:选「需要」时展示货值 `$` 并必填
- 解锁后车型区下增加撑杆 / 绑带(Load Bars / Straps)
- 含此前聚合能力(MS/Flock 结账、hold、灵活价等)
```bash
cp .env .env.backup.$(date +%Y%m%d)
# 解压 chajia-code-20260727e.zip 覆盖代码后:
bash deploy/update-code-only-bt-host-mysql.sh
```
### 部署后冒烟
1. embed-demo 登录 `CUST_004` → Flock 登录后
2. 件数填 6:高级调度应变可选;车型区下出现撑杆/绑带
3. 选「需要额外货运险」须出现货值框,空值不可提交
---
# 历史:本次更新说明(2026-07-27d)— 多项更新聚合重打包(构建校验通过)
| 项目 | 说明 |
|------|------|
| 打包文件 | **`上传到服务器/chajia-code-20260727d.zip`**(仅代码) |
| 是否改库 / `.env` | **否** |
| 重建镜像 | **是** |
| 构建校验 | **已通过**:`tsc --noEmit`、`next build` |
### 本次出包说明
- 本包聚合当前工作区已完成的多项更新,含 MotherShip、Flock、嵌入组件、RPA 与相关测试/脚本
- 出包前已本地完成生产构建校验,避免服务器重建时再出现 TypeScript / Next build 报错
- 上传时仍按既有增量覆盖方式执行,**不要覆盖服务器 `.env`**
```bash
cp .env .env.backup.$(date +%Y%m%d)
# 解压 chajia-code-20260727d.zip 覆盖代码后:
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 历史:本次更新说明(2026-07-27c)— RPA 优先点 Save & update quote(对齐人工复现)
| 项目 | 说明 |
|------|------|
| 打包文件 | **`上传到服务器/chajia-code-20260727c.zip`**(仅代码) |
| 是否改库 / `.env` | **否** |
| 重建镜像 | **是** |
### 根因(用户手测)
Brea / Boston 手测均可出价,**只需先点 Save & update quote**。RPA 原在点 Save 前就因「无价」文案抛错。
### 修复
- Continue 后 grace 无价卡 → **强制补 Details + 点 Save & update**
- `ensureRateCardsReady`:**先 Save,再判无运力**(idle≥4 才 throw)
- Save 按钮短暂 disabled 时等待启用
```bash
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 历史:本次更新说明(2026-07-27b)— MS fail5 加固(货型预切 Pallet + 派送附加服务软降级)
| 项目 | 说明 |
|------|------|
| 打包文件 | **`上传到服务器/chajia-code-20260727b.zip`**(仅代码) |
| 适用场景 | 服务器增量覆盖 |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**:`bash deploy/update-code-only-bt-host-mysql.sh` |
### 针对线上 fail5 复测残留
- 复测结果曾 **3/5**:Albany/Phoenix/Detroit OK;Brea 小件 `cargo-type-dropdown` 超时;Boston 双侧尾板派送入口仍缺失
- **Brea**:piece/box/carton/drum 预切换 Pallet;货型下拉前清遮罩+滚动重试
- **Boston**:派送 Services 等待/补选地址;入口仍缺失则**跳过派送附加服务继续出价**(不整单失败)
- 复测:`npx tsx scripts/probe-embed-ms-fail5-retest.ts`
- Flock×20:`npx tsx scripts/probe-embed-flock-server-x20.ts`
```bash
cp .env .env.backup.$(date +%Y%m%d)
# 解压 chajia-code-20260727b.zip 覆盖后:
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 历史:本次更新说明(2026-07-27a)— Flock 登录态 hold(60s/5min)+ 安全收口
| 项目 | 说明 |
|------|------|
| 打包文件 | **`上传到服务器/chajia-code-20260727a.zip`**(仅代码) |
| 适用场景 | 服务器**已有**查价项目,增量覆盖代码 |
| 是否改库 | **否** |
| 是否改 `.env` | **否**(勿覆盖;勿带本机 `.env`) |
| 重建镜像 | **是**:`bash deploy/update-code-only-bt-host-mysql.sh` |
### 本次代码要点
- Flock 登录询价:首价同步 Direct/Standard 下三档灵活价;60s「继续填写 / 不继续」;5min 硬限;结账接管驻留会话
- API:`POST /api/quotes/flock-hold/continue|decline`;GET quote 附带 `flock_hold` / `flock_flexibility_by_tier`
- 安全:生产禁用 `/e2e-fixtures`;hold continue/decline 失败可观测;Redis hold JSON zod 校验
```bash
cp .env .env.backup.$(date +%Y%m%d)
# 解压 chajia-code-20260727a.zip 覆盖代码后:
chmod +x deploy/update-code-only-bt-host-mysql.sh
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 历史:本次更新说明(2026-07-27)— ×20 失败 5 条修复(标准档/附加服务/托盘回退)
| 项目 | 说明 |
|------|------|
| 打包文件 | **`上传到服务器/chajia-code-20260727.zip`**(仅代码) |
| 适用场景 | 服务器**已有**查价项目,增量覆盖代码 |
| 是否改库 | **否** |
| 是否改 `.env` | **否**(勿覆盖) |
| 重建镜像 | **是**:`bash deploy/update-code-only-bt-host-mysql.sh` |
### 本次代码要点
- 入库不再强制 `standard` 档(仅 guaranteed/dedicated 也可完成报价)
- 派送附加服务:地址就绪等待 + 侧感知内联检测(修双侧尾板入口缺失)
- 官网无价时:piece/box/carton/drum 自动改 Pallet 再刷价一次
- 复测:`npx tsx scripts/probe-embed-ms-fail5-retest.ts`
```bash
cp .env .env.backup.$(date +%Y%m%d)
# 解压 chajia-code-20260727.zip 覆盖代码后:
chmod +x deploy/update-code-only-bt-host-mysql.sh
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 历史:本次更新说明(2026-07-24d)— 修复构建类型错误(部署失败)
| 项目 | 说明 |
|------|------|
| 打包文件 | **`上传到服务器/chajia-code-20260724d.zip`**(仅代码) |
| 适用场景 | 服务器增量覆盖;替代构建失败的 24c |
| 是否改库 | **否** |
| 是否改 `.env` | **否** |
| 重建镜像 | **是**:`bash deploy/update-code-only-bt-host-mysql.sh` |
### 修复
- `mothership-logged-in-shipment-form`:`normalizeMothershipReadyDateIso` 可能 `undefined`,仅在有值时 `setReadyDate`
- `flock/checkout.ts`:登录失败分支用 `!login.ok` 收窄后再读 `errorMessage`
- 含 24c:ShipRo URL 直进 + fill 灌表
```bash
cp .env .env.backup.$(date +%Y%m%d)
# 解压 chajia-code-20260724d.zip 覆盖代码后:
chmod +x deploy/update-code-only-bt-host-mysql.sh
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 历史:本次更新说明(2026-07-24c)— ShipRo 嵌入 postMessage 灌表
| 项目 | 说明 |
|------|------|
| 打包文件 | **`上传到服务器/chajia-code-20260724c.zip`**(仅代码,约 0.8MB+) |
| 对接文档 | **`上传到服务器/文档/`**(嵌入 + postMessage v1.1 + OpenAPI) |
| 适用场景 | 服务器**已有**查价项目,增量覆盖代码 |
| 是否改库 | **否** |
| 是否改 `.env` | **否**(勿覆盖) |
| 重建镜像 | **是**:`bash deploy/update-code-only-bt-host-mysql.sh` |
### 本次代码要点
- URL `module=MS_LOGGED_IN` / `entry=ms_logged_in` 直进 MotherShip 登录后「创建新货件」
- `chajia:fill` 可晚到、可重复、先缓存再灌表;地址整段文本写入搜索框 + `cargo_lines`
- 文档:`嵌入-postMessage对接文档.md` v1.1(ShipRo 联调要点)
### 上传与更新(推荐)
```bash
cp .env .env.backup.$(date +%Y%m%d)
# 解压 chajia-code-20260724c.zip 覆盖代码后:
chmod +x deploy/update-code-only-bt-host-mysql.sh
bash deploy/update-code-only-bt-host-mysql.sh
```
### 给宿主的 iframe 样例
```text
https://if.dev.51track.vip/embed-demo?login_type=api_key&api_key=<API_Key>&embed=1&module=MS_LOGGED_IN
```
---
# 历史:本次更新说明(2026-07-24b)— 修复 ms-checkout 构建类型错误
| 项目 | 说明 |
|------|------|
| 打包文件 | **`上传到服务器/chajia-code-20260724b.zip`**(仅代码) |
| 适用场景 | 服务器**已有**查价项目,增量覆盖代码 |
| 是否改库 | **否** |
| 是否改 `.env` | **否**(勿覆盖) |
| 重建镜像 | **是**:`bash deploy/update-code-only-bt-host-mysql.sh` |
### 本次代码要点
- 修复 `ms-checkout/route.ts`:`mothership_details.pickup/delivery` Zod 输出与 `QuoteRequestBody` 对齐(`default({})`),`npm run build` 类型检查通过
- 含 2026-07-24:结账选承运商/保障 + 安全收口
### 上传与更新(推荐)
```bash
cp .env .env.backup.$(date +%Y%m%d)
# 解压 chajia-code-20260724b.zip 覆盖代码后:
chmod +x deploy/update-code-only-bt-host-mysql.sh
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 历史:本次更新说明(2026-07-24)— MS 结账选承运商/保障 + 安全收口
| 项目 | 说明 |
|------|------|
| 打包文件 | **`上传到服务器/chajia-code-20260724.zip`**(仅代码) |
| 适用场景 | 服务器**已有**查价项目,增量覆盖代码 |
| 是否改库 | **否** |
| 是否改 `.env` | **否**(勿覆盖) |
| 重建镜像 | **是**:`bash deploy/update-code-only-bt-host-mysql.sh` |
### 本次代码要点
- MotherShip 登录态:侧栏指定承运商 + FreightProtect 货值 → `POST /api/quotes/ms-checkout` fill-only(不支付)
- 首价后 60s 确认刷价 / 5min 硬限(既有能力一并打包)
- 安全收口:`fillOnly` 参数化;结账状态脱敏;details 结构化校验;同单 job 互斥且完成后可重试;嵌入轮询 AbortController
### 上传与更新(推荐)
```bash
cp .env .env.backup.$(date +%Y%m%d)
# 解压 chajia-code-20260724.zip 覆盖代码后:
chmod +x deploy/update-code-only-bt-host-mysql.sh
bash deploy/update-code-only-bt-host-mysql.sh
```
### 验证建议
1. 登录态询价 → 侧栏选承运商/保障 →「前往结账」→ 轮询至 done(官网填齐、未支付)
2. FreightProtect 缺货值应拦截;processing 中重复提交提示「进行中」
3. 附加服务勾选(提货尾板等)回归仍正常
---
# 历史:本次更新说明(2026-07-23a)— MotherShip 附加服务内联 UI 修复
| 项目 | 说明 |
|------|------|
| 打包文件 | **`上传到服务器/chajia-code-20260723a.zip`**(仅代码,约 0.75MB) |
| 适用场景 | 服务器**已有**查价项目,增量覆盖代码 |
| 是否改库 | **否** |
| 是否改 `.env` | **否**(勿覆盖) |
| 重建镜像 | **是**:`bash deploy/update-code-only-bt-host-mysql.sh` |
### 本次代码要点
- MotherShip 登录态:官网附加服务改为平铺 checkbox 后,不再硬等 `address-book-accessorials-trigger` 25s
- 内联勾选 + 旧 trigger/Chevron 兜底;失败抛中文业务错
- 探测:`PROBE_PICKUP_LIFTGATE=1` / `PROBE_APPOINTMENT=1`
### 上传与更新(推荐)
```bash
cp .env .env.backup.$(date +%Y%m%d)
# 解压 chajia-code-20260723a.zip 覆盖代码后:
chmod +x deploy/update-code-only-bt-host-mysql.sh
bash deploy/update-code-only-bt-host-mysql.sh
```
### 验证建议
1. 登录态询价勾选提货尾板 / 派送预约,确认不再出现「未能等到 address-book-accessorials-trigger」
2. 管理端 `/admin/alerts` 观察是否仍有同类 STRUCT_CHANGE
---
# 历史:本次更新说明(2026-07-22a)— CC iframe 直登 + 对接文档 §2.5
| 项目 | 说明 |
|------|------|
| 打包文件 | **`上传到服务器/chajia-code-20260722a.zip`**(仅代码,约 0.75MB) |
| 对接文档 | **`上传到服务器/文档/api对接文档.md`**(v1.2) |
| 适用场景 | 服务器已有项目,增量覆盖代码 |
| 是否改库 | **否** |
| 是否改 `.env` | **否**(勿覆盖) |
| 重建镜像 | **是**:`bash deploy/update-code-only-bt-host-mysql.sh` |
### 本次代码要点
- `/embed-demo`:宿主传 `login_type` + `api_key` 自动登录,**跳过登录页**;成功后剥离 URL 敏感参数
- 生产嵌入 Cookie:`SameSite=None; Secure`(跨站 iframe)
- 密码 / Key 登录统一两模块门户(MotherShip / Flock)
- 对接文档 v1.2:§2.5 网页嵌入完整说明(参数、iframe 示例、排错)
### 上传与更新
```bash
cp .env .env.backup.$(date +%Y%m%d)
# 解压 chajia-code-20260722a.zip 覆盖代码后:
chmod +x deploy/update-code-only-bt-host-mysql.sh
bash deploy/update-code-only-bt-host-mysql.sh
```
CC iframe 示例:
```text
https://if.dev.51track.vip/embed-demo?login_type=api_key&api_key=<API_Key>&embed=1
```
---
# 历史:本次更新说明(2026-07-21d)— 嵌入门户两模块统一(密码=Key)
| 项目 | 说明 |
|------|------|
| 打包文件 | **`上传到服务器/chajia-code-20260721d.zip`**(仅代码) |
| 适用场景 | 服务器**已有**查价项目,增量覆盖代码 |
| 是否改库 | **否** |
| 是否改 `.env` | **否**(勿覆盖) |
| 重建镜像 | **是**:`bash deploy/update-code-only-bt-host-mysql.sh` |
### 本次代码要点
- 账号密码登录与 API Key 登录同一门户:仅 **MotherShip / Flock Freight** 两模块
- 模块内切换「免账号 / 登录后」;登录后可配置官网账密
- 含 21c:单位换算、选项互斥提示、MS/Flock 稳定性修复
### 上传与更新
```bash
cp .env .env.backup.$(date +%Y%m%d)
# 解压 chajia-code-20260721d.zip 覆盖代码后:
chmod +x deploy/update-code-only-bt-host-mysql.sh
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 历史:本次更新说明(2026-07-21c)— 单位换算 / 选项互斥提示 / MS+Flock 稳定性
| 项目 | 说明 |
|------|------|
| 打包文件 | **`上传到服务器/chajia-code-20260721c.zip`**(仅代码) |
| 适用场景 | 服务器**已有**查价项目,增量覆盖代码 |
| 是否改库 | **否**(本次无新 migration) |
| 是否改 `.env` | **否**(保留现有即可;勿用包内覆盖) |
| 重建镜像 | **是**:`bash deploy/update-code-only-bt-host-mysql.sh` |
### 本次代码要点
- API 重量/尺寸公制换算(`kg/t`、`cm/m` → `lb/in`,进一)
- MotherShip:地址确认假阳性修复;附加服务 appointment 超时加固;登录态选项互斥提示(禁住宅提货等)
- Flock:调度 radio 点击降级;登录态选项提示(冷藏须温控、易无价地点/包装)
- 询价失败中文原因展示增强
### 上传与更新(推荐)
```powershell
# 开发机:
# X:\work\chajia\上传到服务器\chajia-code-20260721c.zip
# X:\work\chajia\上传到服务器\代码\
```
服务器(项目根目录,勿覆盖 `.env`):
```bash
cp .env .env.backup.$(date +%Y%m%d)
# 解压 zip 覆盖代码目录后:
chmod +x deploy/update-code-only-bt-host-mysql.sh
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 历史:本次更新说明(2026-07-21)— 嵌入 Key 登录 / 中文报错 / 预警中文化
| 项目 | 说明 |
|------|------|
| 打包文件 | **`chajia-code-20260721.zip`**(仅代码,约 0.74MB) |
| 适用场景 | 服务器**已有**查价项目,增量覆盖代码 |
| 是否改库 | **否**(本次无新 migration) |
| 是否改 `.env` | **否**(保留现有即可) |
| 重建镜像 | **是**:`bash deploy/update-code-only-bt-host-mysql.sh` |
### 本次代码要点
- `/embed-demo`:账号密码 / API Key 双登录;Key 登录后 4 路线门户(MotherShip/Flock × 免账号/登录后)
- 承运商账密明文回显 + 可保存修改;登录失败 `PROVIDER_LOGIN_FAILED` 中文提示
- 查价失败 / 管理端预警详情:英文 Playwright 日志译中文(含 `locator.waitFor`)
### 上传与更新(推荐)
```powershell
# 开发机已生成:
# X:\work\chajia\chajia-code-20260721.zip
# X:\work\chajia\上传到服务器\代码\
```
服务器(项目根目录,勿覆盖 `.env`):
```bash
cp .env .env.backup.$(date +%Y%m%d)
# 解压 zip 覆盖代码目录后:
chmod +x deploy/update-code-only-bt-host-mysql.sh
bash deploy/update-code-only-bt-host-mysql.sh
```
---
# 历史:本次更新说明(2026-07-16)— Flock Freight + MotherShip 登录查价 + 客户承运商账密
## 更新主题
| 项目 | 说明 |
|------|------|
| 打包时间 | 2026-07-16(安全增量包) |
| 适用场景 | **服务器已有查价项目**,增量同步本地大更新 |
| 是否改库 | **仅本机 DataGrip 跑 SQL**;服务器上不改库、不跑 migrate;勿重导 `chajia.sql` |
| 是否改 `.env` | **保留**已有 `.env`,**必须追加**下方 Flock / 轮询变量 |
| 是否必须清 Redis | **建议**(避免旧报价缓存) |
| 是否必须重建镜像 | **是**(next-app + rpa-worker 均有大量新代码) |
---
## 安全更新铁律(省磁盘 / 不伤现网)
1. **只覆盖 `代码/`**:不要上传/解压 `数据库/`(增量更新勿导入 SQL)
2. **绝对勿覆盖服务器 `.env`**:上传包不含根目录 `.env`;覆盖前先 `cp .env .env.backup.$(date +%Y%m%d)`
3. **勿停其他无关容器**:只操作本项目 compose 文件 `deploy/docker-compose.bt-host-mysql.yml`
4. **省磁盘**:解压后立刻删 zip;构建前 `df -h`;构建后可 `docker image prune -f`(勿加 `-a`,避免误删正在用的镜像)
5. **防 SSH 断线**:`nohup bash deploy/install-bt-host-mysql.sh > /tmp/chajia-deploy.log 2>&1 &`
6. **构建慢属正常**:`npm ci` + `npm run build` 常需 10–30 分钟,勿反复 Ctrl+C 重开并行构建
---
## 本次必上传 / 必生效的变更清单(勿遗漏)
### A. 代码(打包脚本 `代码/` 已覆盖)
| 模块 | 关键路径 | 说明 |
|------|----------|------|
| Flock 嵌入 UI | `components/flock/`、`app/api/flock/` | 第二报价源表单 / 两档结果 / 轮询 |
| Flock RPA | `workers/rpa/flock*`、`lib/flock/`、`modules/flock/` | Direct + DOM 回退、登录态、队列 `flock-quote` |
| MotherShip 登录查价 | `workers/rpa/mothership-logged-in-quote.ts`、`components/mothership/`、`lib/rpa/mothership-login-context.ts` | 登录态填表刮价 |
| 地址联想 | `app/api/addresses/mothership-suggest/`、`lib/address/` | 登录态选址 |
| 客户承运商账密 | `modules/customer/provider-credentials.ts`、`app/api/admin/customers/.../provider-credentials/`、`app/admin/customers/` | 按客户配置 MotherShip/Flock 官网账密 |
| 中间件 | `middleware.ts` | 放行 `/api/flock`、`/api/addresses` |
| Prisma | `prisma/schema.prisma` + `prisma/migrations/` | 见下方迁移 |
| 依赖清单 | `package.json` / `package-lock.json` | Docker `npm ci` 用 |
### B. 数据库变更(二选一)
| Migration | 作用 |
|-----------|------|
| `20260709175000_service_api_key_ciphertext` | `service_api_key.token_ciphertext` |
| `20260715094000_customer_provider_credential` | 新表 `customer_provider_credential` |
- **推荐**:本机 DataGrip 执行 `deploy/datagrip-manual-migrate-20260716.sql`(服务器零改库)
- **禁止混用**:DataGrip 改过库后,不要再跑 `install-bt-host-mysql.sh` 的自动 migrate
### C. `.env` 必须追加(生产)
```env
# ── Flock Freight(默认关;开启才出现报价源切换)──
FLOCK_RPA_ENABLED=true
FLOCK_QUOTE_URL=https://app.flockfreight.com/get-a-quote
FLOCK_QUOTE_MODE=direct_then_dom
FLOCK_STORAGE_STATE_PATH=.rpa/flock-storage.json
FLOCK_MIN_QUOTES=1
FLOCK_QUOTE_WAIT_MS=20000
FLOCK_POLL_TIMEOUT_MS=210000
NEXT_PUBLIC_FLOCK_POLL_TIMEOUT_MS=210000
FLOCK_WORKER_REUSE_SESSION=false
FLOCK_SESSION_MAX_ROTATIONS=1
# 可选:全局 Flock 登录(优先推荐在管理端「客户管理」按客户配置账密)
# FLOCK_LOGIN_EMAIL=
# FLOCK_LOGIN_PASSWORD=
# MotherShip 登录查价:优先管理端客户账密;也可继续用全局:
# MOTHERSHIP_EMAIL=
# MOTHERSHIP_PASSWORD=
```
**Docker 生产禁止**(若存在请删除/注释):
```env
# RPA_BROWSER_CHANNEL=chrome
```
容器内无系统 Chrome;设了会启动失败。
**已有项保留**:`MASTER_LOGIN_PASSWORD`、`JWT_SECRET`、`DATABASE_URL`、`HOST_SERVICE_TOKENS`、`RPA_DWELL_MS` 等不要丢。
### D. 管理端部署后必配(数据,非文件)
1. 打开 `/admin/customers`,为需要登录态查价的客户配置 **MotherShip / Flock** 官网邮箱密码
2. 未配置时:Flock 可能走无痕/弱注册路径(不稳定);MotherShip 登录查价会缺凭据失败
---
## 本次主要功能(相对服务器 2026-07-10 版)
1. **Flock Freight** 第二报价源(嵌入切换、Direct API 优先 + DOM 回退、串行锁、轮询 210s)
2. **MotherShip 登录后查价**(客户账密 → storage / 登录页 → 填表刮价)
3. **客户级承运商账密**(加密存库,管理端只读查看)
4. **MotherShip 地址联想 API**(登录态选址)
5. 历次能力保留:万能登录密码、客户 API Key、Priority1、加价、embed-demo
---
## 零、开发机打包(Windows)
```powershell
cd X:\work\chajia
powershell -ExecutionPolicy Bypass -File deploy\pack-server-upload.ps1
Compress-Archive -Path "上传到服务器\*" -DestinationPath "chajia-upload-20260716.zip" -Force
```
生成目录:
```
上传到服务器/
├── README.md
├── RELEASE-NOTES.md ← 本文件(操作步骤)
├── 辅助脚本/
├── 代码/ ← 上传此目录全部内容(增量更新只传这个)
└── 数据库/ ← 本次增量更新不必上传、不必导入
```
**推荐上传方式(省磁盘)**:只把 **`代码/`** 打成 zip(或整包解压后只覆盖 `代码/`),**不要**把 `数据库/` 传到服务器。
```powershell
# 更省空间的上传包(仅代码,约数 MB~十几 MB)
Compress-Archive -Path "上传到服务器\代码\*" -DestinationPath "chajia-code-20260716.zip" -Force
```
服务器解压后:用 `代码/` 覆盖 `/home/project/chajia/`,**保留 `.env`**。
**推荐走下方「方式 B」**(DataGrip 改库 + 代码-only 脚本),不要用会自动 migrate 的安装脚本。
---
## 一、服务器更新步骤(场景 B:已有旧版)
### 1. 备份
```bash
cd /home/project/chajia
cp .env .env.backup.$(date +%Y%m%d)
```
### 2. 上传代码
用 **`代码/`** 覆盖 `/home/project/chajia/`。**勿覆盖 `.env`**。
确认存在:`deploy/datagrip-manual-migrate-20260716.sql`、`deploy/update-code-only-bt-host-mysql.sh`。
### 3. 追加 `.env`(勿整文件替换)
```bash
cd /home/project/chajia
grep -q '^FLOCK_RPA_ENABLED=' .env || cat >> .env <<'EOF'
# --- 2026-07-16 Flock Freight ---
FLOCK_RPA_ENABLED=true
FLOCK_QUOTE_URL=https://app.flockfreight.com/get-a-quote
FLOCK_QUOTE_MODE=direct_then_dom
FLOCK_STORAGE_STATE_PATH=.rpa/flock-storage.json
FLOCK_MIN_QUOTES=1
FLOCK_QUOTE_WAIT_MS=20000
FLOCK_POLL_TIMEOUT_MS=210000
NEXT_PUBLIC_FLOCK_POLL_TIMEOUT_MS=210000
FLOCK_WORKER_REUSE_SESSION=false
FLOCK_SESSION_MAX_ROTATIONS=1
EOF
grep -q '^MASTER_LOGIN_PASSWORD=' .env || echo 'MASTER_LOGIN_PASSWORD=mmgy2026master' >> .env
sed -i '/^RPA_BROWSER_CHANNEL=chrome/d' .env || true
```
---
### 方式 B(推荐)— DataGrip 只改库 SQL + 服务器只更新代码
#### B1. 本机 DataGrip(唯一改库步骤)
1. 连 `192.168.2.14` → 库 **`chajia`**
2. console 粘贴并执行 `deploy/datagrip-manual-migrate-20260716.sql`(或下方两段 DDL)
3. 刷新表列表:应有 `customer_provider_credential`;`service_api_key` 有 `token_ciphertext`
4. **服务器上不要跑任何改库命令**
#### B2. 服务器只更新代码/镜像(不碰库)
```bash
cd /home/project/chajia
chmod +x deploy/update-code-only-bt-host-mysql.sh
bash deploy/update-code-only-bt-host-mysql.sh
```
#### B3. 清 Redis(建议)
```bash
docker compose --env-file .env -f deploy/docker-compose.bt-host-mysql.yml exec redis redis-cli FLUSHDB
```
**以后禁止**再跑 `install-bt-host-mysql.sh`(会自动 migrate,与 DataGrip 手改冲突)。
---
### 方式 A(不推荐本次)— 安装脚本自动改库
仅当你**不用** DataGrip、接受服务器自动 `migrate deploy` 时:
```bash
chmod +x deploy/install-bt-host-mysql.sh
nohup bash deploy/install-bt-host-mysql.sh > /tmp/chajia-deploy.log 2>&1 &
```
**注意**:方式 B 与方式 A **不要混用**。
---
### 4. 部署后数据配置
1. 管理端登录:`admin_demo` + 万能密码(或库内密码)
2. **客户管理** → 为目标客户写入 MotherShip / Flock 官网账密
3. 确认客户 embed 密码 / API Key 仍可用
---
## 二、验收
| 检查项 | 操作 | 预期 |
|--------|------|------|
| 容器 | `docker compose ... ps` | next-app / rpa-worker / scheduler / redis 均为 Up |
| 管理端 | `/login` | 可进 `/admin/customers`,可查看承运商账密 |
| MotherShip 匿名 | `/embed-demo` → MotherShip | 询价出 4 档或明确失败码 |
| MotherShip 登录 | 已配账密客户 + 登录查价开关 | 出承运商价卡(非空超时) |
| Flock | 切换 Flock 报价源 | 出两档结果;超时约 210s 内有终态 |
| 库表 | DataGrip | 有 `token_ciphertext` 列 + `customer_provider_credential` 表 |
Worker 日志:
```bash
docker compose --env-file .env -f deploy/docker-compose.bt-host-mysql.yml logs -f rpa-worker --tail 100
```
---
## 三、失败排查
| 现象 | 处理 |
|------|------|
| embed 无 Flock 切换 | `.env` 缺 `FLOCK_RPA_ENABLED=true` 或未重建 next-app |
| Flock 一直转圈后超时 | 查 rpa-worker;确认客户/全局登录账密;看是否撞报价上限 |
| MotherShip 登录查价失败 | 管理端是否已配该客户 MotherShip 账密 |
| `chrome is not found` | 删除 `RPA_BROWSER_CHANNEL=chrome` 后重建 rpa-worker |
| Duplicate column / table | 该 DDL 已执行过,跳过即可 |
| 构建 OOM | 用方式 B 串行脚本;或加 Swap;勿并行多个 compose build |
---
## 四、回滚
还原更新前目录 / zip,恢复 `.env.backup.*`,再执行方式 B 的 build/up(或方式 A 安装脚本)。
库表回滚需在 DataGrip 手工:`DROP TABLE customer_provider_credential`;`ALTER TABLE service_api_key DROP COLUMN token_ciphertext`(仅确认无依赖后)。
---
# 历史更新说明(2026-07-10)— 管理员万能登录密码
## 更新主题
| 项目 | 说明 |
|------|------|
| 打包时间 | 2026-07-10 |
| 适用场景 | **服务器已有查价项目**,增量更新代码 |
| 是否改库 | **否**(安装脚本仍会 `prisma migrate deploy`) |
| 是否改 `.env` | **保留**已有 `.env`,**须追加** `MASTER_LOGIN_PASSWORD`(见下) |
| 是否必须清 Redis | **否** |
### 本次主要功能
1. **管理员万能登录密码**:`.env` 配置 `MASTER_LOGIN_PASSWORD` 后,可用该密码登录管理端与 embed-demo
2. **安全**:未配置则禁用;`timingSafeEqual` 防时序攻击
```env
MASTER_LOGIN_PASSWORD=mmgy2026master
```
---
# 历史更新说明(2026-07-07)— Priority1 网络重试 + 加价展示
详见仓库 git 历史与更早打包记录。完整运维命令、场景 A 首次部署见同目录打包后的说明或 `deploy/服务器更新说明.md`。