Cargo-Planner Docs

集成

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

货物库同步

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

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

此方法基本上可以作为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',
  }),
});

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

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