Cargo-Planner Docs

集成

如果您已经有数字工具来管理仓库中的存储内容,或者如何处理客户的装载清单,Cargo-Planner 可以通过一点集成在此基础上进行扩展。

货物库同步

与您当前工具进行集成的最简单方法是通过 货物库。所有 Cargo-Planner 许可证都包括货物库,它本质上是一个简化的 WMS 或资源规划系统。

设置后,可以通过流畅的导入或自动完成在我们的 Web 应用中轻松创建新的装载清单。

这种方法基本上可以作为 CRON 任务或每日同步运行,Cargo-Planner 将负责创建装载清单的所有 UI 方面。

自动完成装载清单的 GIF

但手动设置货物库可能是一项艰巨的任务。因此,让我们通过一点代码与您当前使用的任何工具保持同步。

// 查看入门页面以了解如何创建您的令牌
const API_TOKEN = 'Token b123...';
const cargoes: CargoPlannerItem[] = [];

// 假设我们有一个项目/货物的来源看起来像这样,
// 其中一切都以毫米和克为单位定义。
const sourceItems = [
  {
    id: 511732,
    title: 'Basket Catcher',
    description: '...',
    length: 900,
    width: 900,
    height: 500,
    weight: 20000,
    inner_quantity: 1,
  },
  {
    id: 512789,
    title: 'Putters (10pcs)',
    description: '...',
    length: 210,
    width: 210,
    height: 150,
    weight: 1700,
    inner_quantity: 10,
  },
  // ... 等等
];

// 我们的 sourceItems 与 cargo-planner 中的表示略有不同
// 因此我们需要对数据进行一些调整
for (let i = 0; i < sourceItems.length; i++) {
  let s = sourceItems[i];
  // 我们希望将 ID 和标题都存储为名称
  const title = `${s.id} - ${s.title}`;

  let cargo: CargoPlannerItem = {
    name: title,
    length_dim: 'MM',
    // Cargo-Planner 不接受克,因此我们转换为千克
    weight_dim: 'KG',
    data: {
      label: title,
      l: s.length,
      w: s.width,
      h: s.height,
      wt: s.weight / 1000, // 重量转换
      unit_qty: s.inner_quantity,
    },
  };
  cargoes.push(cargo);
}

// 在我们创建所有项目之前,我们首先要
// 删除货物库中存在的所有内容,
// 这样我们就不会有任何重复。
// 让我们使用 cargo/truncate 端点
fetch('https://api.cargo-planner.com/api/2/cargo/truncate/', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    Authorization: API_TOKEN,
  },
  body: JSON.stringify({ confirm: true }),
});

// 最后我们批量创建货物列表
fetch('https://api.cargo-planner.com/api/2/cargo/bulk_create/', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    Authorization: API_TOKEN,
  },
  body: JSON.stringify(cargoes),
});

// Cargo-Planner 接受的简化类型定义
interface CargoPlannerItem {
  name: string;
  data: ItemData;
  length_dim: 'M' | 'DM' | 'CM' | 'MM' | 'FT' | 'IN';
  weight_dim: 'KG' | 'MT' | 'LB';
}
interface ItemData {
  label: string;
  l: number;
  w: number;
  h: number;
  wt: number;
  not_stackable?: boolean | null;
  not_rotatable?: boolean | null;
  tiltable?: boolean | null;
  bottom_only?: boolean | null;
  color?: string | null;
  qty?: number | null;
  unit_qty?: number | null;
}

现在,我们不必再通过 Excel 导入/导出,计划下一次发货将会快得多。

直接创建装载清单

如果您希望直接从其他工具创建装载清单,这与前一个示例中的 API 调用没有太大区别。这次我们将完全跳过货物库,直接创建一个新装载清单

这种方法的缺点是您需要在调用 API 之前选择要运输的物品以及每种物品的数量。这很可能需要一些 UI。

// 我们重用前一个示例中的常量 sourceItems 和 API_TOKEN

let cargoes: ItemData[] = [];

// 从 sourceItem 到 Cargo-Planner 表示的转换
for (let i = 0; i < source.length; i++) {
  let s = source[i];
  // 我们希望将 ID 和标题都存储为名称
  const title = `${s.id} - ${s.title}`;

  let cargo: ItemData = {
    label: title,
    l: s.length,
    w: s.width,
    h: s.height,
    // 从克到千克的重量转换
    wt: s.weight / 1000,
    unit_qty: s.inner_quantity,
    // 我们希望发送每种物品的 10 个
    qty: 10,
  };
  cargoes.push(cargo);
}

// 最后我们创建一个装载清单
fetch('https://api.cargo-planner.com/api/2/loadlist/', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    Authorization: API_TOKEN,
  },
  body: JSON.stringify({
    name: 'Shipment 123',
    data: cargoes,
    etd: '2022-12-01',
    length_dim: 'MM',
    weight_dim: 'KG',
  }),
});

新的装载清单将在 Web 应用中可见,但响应将包含一个直接链接到新装载清单的 URL。

还可以通过 创建并计算 端点更进一步,但这需要一些更多的输入数据,例如使用什么设置和设备。