# 集装箱装箱计算器 · Container Load Calculator

> 多品类混装的 3D 装箱方案计算器。**纯前端、零依赖、完全离线、开源（MIT）**。
> 一套静态文件，扔到任何网站 / 任何目录就能跑，不需要后端、不需要注册、不上传任何数据。

在线地址（nudgetick.com）：<https://nudgetick.com/tools/container-loading-calculator>

---

## 一、它解决什么问题

一个 20 尺柜几何容积约 33 m³，实装 25–28 m³ 已经很满。柜里往往混装 5～15 个品类，
每个品类长宽高、重量、箱数都不同。**凭经验装**的典型结果是：大箱装完，上面/左边/右边剩下
一堆塞不进任何东西的零碎空隙，最后一柜货活生生少装 10%～20%。

本工具做的是：把每个品类拆成单箱，在柜内空间里做三维排布搜索，输出

- **3D 装载图**（可拖拽旋转 / 缩放 / 按高度剖切 / 按品类高亮隐藏）
- **精确到坐标的装载清单**（每箱的 x/y/z、朝向、所在层）
- **装柜步骤**（按先装→后装的顺序，告诉工人第几步搬什么、搬到哪）
- **利用率体检**：体积利用率、地板利用率、载重利用率、重心位置、前后配载差
- **多柜自动拆分** + **最优柜型推荐**（20GP / 40GP / 40HQ / 45HQ 谁最省柜）

---

## 二、功能一览（取十款商业软件之长）

调研对象：CargoWiz、CubeIQ、ORTEC Load Planning、MaxLoad Pro、EasyCargo、Goodloading、
3DBinPacking、LoadOptimizer.ai、CubeMaster、SeaRates Load Calculator、CAPE PACK、ContainerLoad。

| 能力 | 商业软件常见做法 | 本工具 |
|---|---|---|
| 多品类混装 | 多数付费版才放开 | ✅ 无限品类，免费 |
| 3D 可视化 | Goodloading / EasyCargo 的卖点 | ✅ 手写 Canvas 渲染，零依赖 |
| 摆放方向约束 | CargoWiz 最强（自定义堆码规则） | ✅ 六向自由 / 可平转不可倒置 / 完全固定 |
| 易碎不承压 | CubeIQ 企业级才有 | ✅ 勾一下即可 |
| 最大堆码层数 | CargoWiz / CubeMaster | ✅ 按品类单独设 |
| 单箱承重上限 | CargoWiz | ✅ 沿支撑链向下累计校验 |
| 底面支撑率 | 少有 | ✅ 60 / 75 / 90 / 100% 可选 |
| 装柜 & 卸货顺序 | Goodloading（stop sequence） | ✅ 先装靠柜头、后装靠柜门 |
| 打托装载 | CAPE PACK / 多数付费 | ✅ 先算每托盘码放，再算托盘进柜 |
| 轴重 / 前后配载平衡 | Goodloading、ORTEC | ✅ 重心位置 + 前后重量差告警 |
| 多柜拆分 | 付费 | ✅ 自动拆到第 N 柜 |
| 最优柜型推荐 | LoadOptimizer | ✅ 四种主流柜型横向对比 |
| Excel / CSV 导入 | LoadOptimizer、3DBinPacking | ✅ 直接整块粘贴 |
| 导出 | PDF / Excel（付费） | ✅ CSV + 3D PNG + 打印版装柜单 |
| 分享协作 | Goodloading（分享链接） | ✅ URL 自带全部参数，发给客户即可复现 |
| 离线 / 自托管 | 基本没有 | ✅ 纯静态，双击 index.html 也能跑 |
| 价格 | $9.7/天 ~ $1000 买断 | ✅ 免费 + MIT |

---

## 三、算法说明

`js/packer.js`，约 400 行，无任何依赖。

1. **展开**：每个品类按箱数展开成单箱单位，预计算允许的朝向（六向 / 二向 / 固定）。
2. **排序**：8 种排序策略（体积、底面积、高度、最长边、重量、矮件优先）× 2 种填充方向
   （由内向外 / 由左至右）。可按「装柜顺序」先分组——先装的品类排前面，自然落到柜头。
3. **锚点 + 重力落位**：候选锚点从 (0,0) 出发，每放一箱衍生出两个新角点；
   锚点处的落箱高度由「重力下落」决定（取底面覆盖区域内已有箱体的最高面），
   因此**天然不会重叠**，省掉了昂贵的碰撞检测。
4. **约束校验**：底面支撑率、最大堆码层数、单箱承重（沿支撑链向下累加）、
   易碎件上方禁压、柜型限重、安全余量、柜门端预留。
5. **评分**：`min(高度) → min(填充方向坐标) → min(另一坐标) → max(贴合度)`，
   贴合度 = 靠墙面积 + 落地面积 + 被支撑面积，用来压掉零星空隙。
6. **多策略 + 随机重启**：按数据量自适应决定参与搜索的策略数与扰动幅度，
   取**已装体积最大**的方案——这就是「取长补短」：单次启发式的短板由别的策略补上。
7. **加速**：40cm 空间网格索引 + 复用暂存数组；超过 300 箱时启用「同朝向成排续放」快路径。
   实测：254 箱 / 8 品类 ≈ 2 秒；800 箱单一规格 ≈ 0.9 秒，首柜体积利用率 82%。

> 实测基准（20GP，5 品类 830 箱混装）：首柜体积利用率 **90.0%**、地板利用率 94.0%。

---

## 四、怎么用

1. **填货物**：品名 / 长 / 宽 / 高 / 箱数 / 单箱重。可从 Excel 直接复制一整块，
   点「批量粘贴导入」粘进去（自动识别 `品名 长 宽 高 箱数 重量`）。
2. **选柜型**：内置 20GP / 40GP / 40HQ / 45HQ / 冷藏柜 / 开顶柜 / 框架柜 / 53 尺 / 9.6m、13m、17.5m 卡车，
   内径与载重可直接改（以箱体 CSC 铭牌为准）。
3. **设规则**：安全余量、柜门端预留、底面支撑率、摆放方向、堆码层数、承重、易碎、装柜顺序。
4. **点计算**：出 3D 图 + 清单 + 步骤。可导出 CSV、导出 3D 图、直接打印装柜单。

### 高级约束要不要开？

- **摆放方向**：纸箱建议「六向自由」；印刷面朝上、不能倒置的货选「可平转」；
  木箱、机器类选「固定朝向」。
- **底面支撑率**：75% 是实用值。100% 会让算法非常保守，利用率明显下降。
- **装柜顺序**：有多卸货点时才需要。勾上会略微牺牲利用率（这是真实的取舍，值得）。
- **易碎不承压**：勾上后这类货上面不会再压任何东西，且它自己仍按「最多层」叠放。

---

## 五、集成到你自己的网站

三种方式，任选：

**① 当独立页面（推荐）**
把整个 `loadcalc/` 目录拷到站点任意位置，入口 `index.html`，相对路径自带。

**② 嵌进现有页面（iframe）**
```html
<iframe src="/tools/container-loading-calculator" style="width:100%;height:900px;border:0"></iframe>
```

**③ 只抄算法**
只要 `js/specs.js` + `js/packer.js`，两个文件、无任何 DOM 依赖：
```js
const r = LC.packer.pack(items, {
  container: { L: 589.8, W: 235.2, H: 239.3, payload: 28000 },
  margin: 2, doorClear: 3, supportRatio: 0.75,
  effort: 'normal', respectPriority: true, maxContainers: 5
});
// r.containers[0].boxes → [{x,y,z,dx,dy,dz,wt,level,name,color,...}]
// r.containers[0].stats → {volUtil, floorUtil, wtUtil, cogPct, balance, ...}
// r.unplaced            → 没装下的货
```

---

## 六、坐标系约定

- **x**：柜长方向，`x=0` 是**柜头（最里端）**，`x=L` 是**柜门**。
- **y**：柜宽方向，0 → W。
- **z**：高度，0 是地板。
- 单位统一 **厘米 / 公斤**。

「先装」的货落在柜头，最后装的在柜门——卸货时最先卸门口，与真实作业一致。

---

## 七、常见柜型参考数据

| 柜型 | 内径 长×宽×高 (cm) | 几何容积 | 常见实装 | 最大载重 |
|---|---|---|---|---|
| 20'GP | 590 × 235 × 239 | 33.2 m³ | 25–28 m³ | 28,000 kg |
| 40'GP | 1203 × 235 × 239 | 67.7 m³ | 55–58 m³ | 26,700 kg |
| 40'HC | 1203 × 235 × 270 | 76.3 m³ | 62–68 m³ | 26,500 kg |
| 45'HC | 1356 × 235 × 270 | 85.9 m³ | 70–76 m³ | 27,600 kg |
| 20'RF | 546 × 229 × 227 | 28.4 m³ | 22–25 m³ | 27,400 kg |
| 40'RF | 1158 × 229 × 253 | 66.9 m³ | 55–60 m³ | 27,800 kg |

> 提示：网上流传的「20 尺能装 46 方」是不对的——46 方接近 40GP 的**实装上限**，
> 20GP 实装到 26 方就已经很满。实际以箱体铭牌（CSC plate）和你自己的货为准。

---

## 八、开源协议

MIT License。见 `LICENSE`。
可自由使用、修改、商用、二次分发，只需保留版权声明。

## 九、隐私

全部计算在你的浏览器里完成，**货物清单不会上传到任何服务器**。
保存 / 分享都走 localStorage 与 URL hash，不经过后端。
