Cargo-Planner Docs

Inclusion dans votre application

Bien que notre application web couvre la plupart des cas d’utilisation, il peut parfois être intéressant d’ajouter des fonctionnalités de planification de chargement à un système WMS ou ERP existant - ou peut-être à votre propre portail web personnalisé. Vous pouvez utiliser la plupart des fonctionnalités en utilisant notre API Rest et le SDK JavaScript.

Trois façons d’ajouter Cargo-Planner à votre application

Il existe trois façons d’ajouter des fonctionnalités de planification de chargement à votre application. La plus appropriée dans votre cas dépend d’un compromis entre complexité, fonctionnalités et personnalisation.

1. Intégrer dans un iframe - sans code (ou presque)

La façon la plus simple d’intégrer notre outil de planification de chargement est d’intégrer la vue dans un élément html iframe.

Le plus grand inconvénient de cette approche est qu’elle sera réalisée de manière non authentifiée, ce qui signifie que les objets de liste de chargement doivent être créés au préalable et ensuite permettre l’accès en lecture et écriture pour le partage public. Pour ce faire, vous devez créer un nouveau plan de chargement (vous devez simplement le créer - vous n’avez pas besoin de remplir de données) puis activer le partage.

Une fois cela fait, copiez le lien de partage et intégrez-le dans un iframe comme ceci :

<iframe
  src="https://app.cargo-planner.com/loadlist/10405cacde654075kjf53bd1f78520/workspace/0?length_dim=IN&weight_dim=LB&primary=1e3a8a"></iframe>

Plan de chargement depuis l'API

Notez que vous pouvez ajouter un paramètre de requête primaire avec une couleur hexadécimale. Fournissez la couleur de votre thème et elle s’intégrera mieux dans votre environnement.

Vous pouvez également définir le paramètre de requête hide_navigation sur true pour masquer la barre de navigation. Cela pourrait être utile si, par exemple, vous souhaitez uniquement afficher la vue du plan de chargement.

2. Télécharger des données en utilisant l’API - afficher le résultat dans un iframe

Bien que la solution ci-dessus permette rapidement d’attacher des fonctionnalités de planification de chargement à votre site, les principaux inconvénients sont que vous devez créer chaque liste manuellement. Si vous avez plusieurs utilisateurs utilisant votre application, cela peut entraîner un comportement étrange car la même liste de chargement pourrait être mise à jour simultanément.

Un autre inconvénient est que les données de chargement doivent être ajoutées manuellement (bien que vous puissiez toujours utiliser les différentes fonctions d’importation). Votre application aura probablement déjà ces informations disponibles - il serait donc idéal de pouvoir télécharger ces informations automatiquement.

La solution est d’utiliser notre API.

Disons que votre application a le point de terminaison ci-dessous :

# Point de terminaison /calculate sur votre serveur situé à https://example.com

import requests
import json

CARGO_PLANNER_TOKEN = 'Token your-token'

def calculate(request):

    # Ces données proviennent peut-être de votre site web ou de votre source de données interne
    data = {
        "loadlist": {
            "name": "Commande d'achat 1234",
            "public_access": "RW"
        },
        "calculation": {
            "length_dim": "CM",
            "weight_dim": "KG"
            "container_types": [
                {
                    "id": 1,
                    "payload": 20000
                }
            ],
            "items": [
                {
                    "label": "produit 1",
                    "l": 30,
                    "w": 80,
                    "h": 90,
                    "wt": 70,
                    "qty": 2
                },
                {
                    "label": "produit 2",
                    "l": 50,
                    "w": 40,
                    "h": 50,
                    "wt": 40,
                    "qty": 3
                }
            ],
        }
    }

    # Appeler notre API
    response = requests.post(
        url="https://api.cargo-planner.com/api/2/create_and_calculate/",
        data=json.dumps(data),
        headers={
            'Content-type': 'application/json',
            'Authorization': CARGO_PLANNER_TOKEN
        })
    if response.status_code == 200:
        # Retourner le lien vers votre page pour l'iframe
        return "https://app.cargo-planner.com/loadlist/{}/".format(response.data["id"])
    #...

3. Télécharger des données en utilisant l’API - afficher le résultat en utilisant notre SDK

Afin d’obtenir une personnalisation complète de l’apparence, tout en éliminant le besoin d’utiliser un iframe, vous pouvez utiliser notre SDK Javascript.

De cette manière, vous pouvez afficher les mises en page 3D de chaque conteneur et également présenter les métriques que vous jugez les plus importantes.

Ci-dessous un simple extrait côté serveur en Python et un extrait Javascript pour votre application frontale :

# Point de terminaison /calculate sur votre serveur situé à https://example.com

import requests
import json

CARGO_PLANNER_TOKEN = 'Token your-token'

def calculate(request):
    response = requests.post(
        url="https://api.cargo-planner.com/api/2/calculate/",
        data=json.dumps(request.data),
        headers={
            'Content-type': 'application/json',
            'Authorization': CARGO_PLANNER_TOKEN
        })
    if response.status_code == 200:
        return response.json()
    #...
<meta charset="utf-8">
<title>Mon portail client</title>
<script src="https://usermedia.cargoplanner.net/sdk/cargoPlannerSDK.es.js"></script>

<body>
    <h1>Plan de chargement</h1>
</body>

<script>

calculate();

async function calculate() {

    // Initialiser le moteur 3D
    await cargoPlannerSDK.SceneManager.init();

    // Référez-vous à la documentation de l'API pour plus d'options
    let calculationData = {
        length_dim: "M",
        weight_dim: "KG",
        // Peut-être que les dimensions du chargement pourraient être saisies à partir d'un formulaire interactif ?
        "items": [
            {
                "label": "Chargement 1",
                "l": 1.2,
                "w": 0.8,
                "h": 0.5,
                "wt": 300,
                "qty": 20,
                "layers": 2,
                "color":"#48c9b0"
            },
            {
                "label": "Chargement 2",
                "l": 1.2,
                "w": 1.0,
                "h": 0.9,
                "wt": 300,
                "qty": 20,
                "layers": 2,
                "color":"#ec7063"
            },

        ],
        "container_types": [
            {
                "name": "40ft DV",
                "L":    12,
                "W":    2.33,
                "H":    2.38,
                "payload": 22000,
                "door": {
                  H: 2.33,
                  W: 2.28
                }
            }
        ]
    }

    fetch('/calculate/', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
        },
        body: JSON.stringify(calculationData),
    })
    .then(response => response.json())
    .then(data => {
        // Si nous avons reçu des solutions
        if(data.solutions) {

            // Pour le moment, chaque calcul donne une solution (à l'avenir, nous pourrions en fournir plus)
            data.solutions.forEach((solution) => {

                // Parcourir chaque conteneur
                solution.containers.forEach((container, index) => {

                    // Rendre le canvas
                    cargoPlannerSDK.SceneManager.createScene(
                        [container],  // données du conteneur, vous pouvez envoyer plusieurs conteneurs à une scène et spécifier leur position
                        null,       // Mode interactif (mettre à null lors de l'affichage de plusieurs conteneurs)
                        400,        // Largeur en pixels
                        200         // Hauteur en pixels
                    ).then((canvas) => {

                        const containerDiv = document.createElement("div");

                        const label = document.createTextNode(`Conteneur ${index+1} : ${container.name} Espace max utilisé : ${container.items_bb.max.x}, Poids utilisé : ${container.WT}  `)
                        containerDiv.appendChild(label);
                        containerDiv.appendChild(canvas);

                        document.body.appendChild(containerDiv);
                    });

                });
            });
        }
    });
}

</script>

L’exemple ci-dessus générera le plan de chargement ci-dessous :

Plan de chargement depuis l'API