Bước 1: Login để lấy token

  • Đầu tiên bạn sẽ cần gọi API /user/login với tên đăng nhập và mật khẩu để lấy token tạm thời.
  • Tiếp theo bạn gọi bạn gọi API /user/ownerconnect với tên đăng nhập, mật khẩu và token tạm thời để lấy token lâu dài.

Bước 2: Tạo vận đơn

Tât cả các bước dưới đây đều sử dụng token lâu dài đã lấy được ở Bước 1.

  • Đầu tiên bạn gọi API /order/getPriceAllNlp , địa chỉ người gửi, người nhận ở dạng văn bản để lấy được danh sách dịch vụ vận chuyển, hãy code để chọn 1 loại mà bạn muốn.
  • Tiếp theo bạn gọi API /user/listInventory để lấy thông tin store, cụ thể là trường CUS_ID.
  • Tiếp theo bạn gọi API /order/createOrder để tạo vận đơn với thông tin dịch vận chuyển và store đã lấy được ở trên, vậy là xong.

Code java ví dụ:

ProductCurrencyModel vnd = currencyService
    .getCurrencyByIsoCode("VND");
if (vnd == null) {
    throw new IllegalStateException("noCurrencyVND");
}
List<ForDeliveryProductModel> products = deliveryOrder.getProducts();
if (products.isEmpty()) {
    throw new IllegalStateException("noProduct");
}
List<Map<Object, Object>> productMaps = products
    .stream()
    .filter(it -> it.getAmount() != null)
    .map(it -> {
        logger.info(
            "productId: {}, currencyId: {}, vnd: {}",
            it.getProductId(),
            deliveryOrder.getCurrencyId(),
            vnd.getId()
        );
        return EzyMapBuilder.mapBuilder()
            .put("PRODUCT_NAME", it.getProductName())
            .put(
                "PRODUCT_PRICE",
                exchangeRateService
                    .exchangeValueByFromAndToCurrencyIdOrThrow(
                        it.getPrice(),
                        deliveryOrder.getCurrencyId(),
                        vnd.getId()
                    ).longValue()
            )
            .put("PRODUCT_WEIGHT", it.getWeightLong())
            .put("PRODUCT_QUANTITY", it.getAmountInt())
            .toMap();
    })
    .collect(Collectors.toList());
ForDeliveryOrderRecipientModel orderRecipient = deliveryOrder
    .getOrderRecipient();
OrderRecipientType orderRecipientType = orderRecipient
    .getType();

// 1: Uncollect money
// 2: Collect express fee and price of goods.
// 3: Collect price of goods
// 4: Collect express fee
int orderPayment = 1;
long pickMoney = 0;
ShippingFeePayer shippingFeePayer = deliveryOrder
    .getShippingFeePayer();
if (orderRecipientType != OrderRecipientType.PAID) {
    orderPayment = 3;
    pickMoney = exchangeRateService
    .exchangeValueByFromAndToCurrencyIdOrThrow(
        deliveryOrder.getCodAmount(),
        deliveryOrder.getCurrencyId(),
        vnd.getId()
    ).longValue();
    if (shippingFeePayer != ShippingFeePayer.SENDER) {
        orderPayment = 2;
    }
} else {
    if (shippingFeePayer != ShippingFeePayer.SENDER) {
        orderPayment = 4;
    }
}
String productType = "TH";
for (ForDeliveryProductModel product : products) {
    if (!product.isDocument()) {
        productType = "HH";
        break;
    }
}
long productWeight = productMaps
    .stream()
    .mapToLong(it -> (long) it.get("PRODUCT_WEIGHT"))
    .sum();
long productPrice = productMaps
    .stream()
    .mapToLong(it -> (long) it.get("PRODUCT_PRICE"))
    .sum();
long productLength = products
    .stream()
    .mapToLong(ForDeliveryProductModel::getLengthLong)
    .max()
    .orElse(0L) / 10;
long productWidth = products
    .stream()
    .mapToLong(ForDeliveryProductModel::getWidthLong)
    .max()
    .orElse(0L) / 10;
long productHeight = products
    .stream()
    .mapToLong(ForDeliveryProductModel::getHeightLong)
    .sum() / 10;
Map<String, Object> matchingServices = getAllMatchingServices(
    apiUrl,
    token,
    deliveryOrder.getSenderOrFromWarehouseAddress(),
    orderRecipient,
    productType,
    productWeight,
    productPrice,
    pickMoney,
    productLength,
    productWidth,
    productHeight
);
Map<String, Object> senderAddress =
    (Map<String, Object>) matchingServices
        .get("SENDER_ADDRESS");
Map<String, Object> receiverAddress =
    (Map<String, Object>) matchingServices
        .get("RECEIVER_ADDRESS");
List<Map<String, Object>> services =
    (List<Map<String, Object>>) matchingServices
        .get("RESULT");
if (senderAddress == null
    || receiverAddress == null
    || services == null
) {
    throw new IllegalStateException(
        "not matching viettel post delivery services: " +
            matchingServices
    );
}
Map<String, Object> suitableService = getSuitableService(
    services
);
Map<String, Object> store = getStoreInformation(
    apiUrl,
    token
);
String productName = productMaps
    .stream()
    .map(it -> (String) it.get("PRODUCT_NAME"))
    .collect(Collectors.joining(" + "));
String orderNumber = deliveryOrder.getId() + "-" +
    System.currentTimeMillis();
long deliveryAt = deliveryOrder.getDeliveryAt();
String deliveryDate = deliveryAt > 0
    ? EzyDates.format(deliveryAt, DATE_TIME_FORMAT)
    : EzyDates.format(clock.nowDateTime(), DATE_TIME_FORMAT);
return EzyMapBuilder.mapBuilder()
    .put("ORDER_NUMBER", orderNumber)
    .put("GROUPADDRESS_ID", store.get("groupaddressId"))
    .put("CUS_ID", store.get("cusId"))
    .put("DELIVERY_DATE", deliveryDate)
    .put("SENDER_FULLNAME", deliveryOrder.getSenderOrShopFullName())
    .put("SENDER_ADDRESS", deliveryOrder.getSenderOrFromWarehouseAddress())
    .put("SENDER_PHONE", deliveryOrder.getSenderOrFromWarehousePhoneNumber())
    .put("SENDER_EMAIL", deliveryOrder.getSenderOrFromWarehouseEmail())
    .put(
        "SENDER_WARD",
        senderAddress.get("WARD_ID")
    )
    .put(
        "SENDER_DISTRICT",
        senderAddress.get("DISTRICT_ID")
    )
    .put(
        "SENDER_PROVINCE",
        senderAddress.get("PROVINCE_ID")
    )
    .put("SENDER_LATITUDE", "")
    .put("SENDER_LONGITUDE", "")
    .put("RECEIVER_FULLNAME", orderRecipient.getFullName())
    .put("RECEIVER_ADDRESS", orderRecipient.getFullAddress())
    .put("RECEIVER_PHONE", orderRecipient.getPhoneNumber())
    .put("RECEIVER_EMAIL", orderRecipient.getEmail())
    .put(
        "RECEIVER_WARD",
        receiverAddress.get("WARD_ID")
    )
    .put(
        "RECEIVER_DISTRICT",
        receiverAddress.get("DISTRICT_ID")
    )
    .put(
        "RECEIVER_PROVINCE",
        receiverAddress.get("PROVINCE_ID")
    )
    .put("RECEIVER_LATITUDE", "")
    .put("RECEIVER_LONGITUDE", "")
    .put("PRODUCT_NAME", productName)
    .put("PRODUCT_DESCRIPTION", "")
    .put("PRODUCT_QUANTITY", 1)
    .put("PRODUCT_PRICE", productPrice)
    .put("PRODUCT_WEIGHT", productWeight)
    .put("PRODUCT_LENGTH", productLength)
    .put("PRODUCT_WIDTH", productWidth)
    .put("PRODUCT_HEIGHT", productHeight)
    .put("PRODUCT_TYPE", productType)
    .put("ORDER_PAYMENT", orderPayment)
    .put("ORDER_SERVICE", suitableService.get("MA_DV_CHINH"))
    .put("ORDER_SERVICE_ADD", "")
    .put("ORDER_VOUCHER", "")
    .put("ORDER_NOTE", orderRecipient.getNotes())
    .put("MONEY_COLLECTION", pickMoney)
    .put("MONEY_TOTALFEE", "")
    .put("MONEY_FEECOD", "")
    .put("MONEY_FEEVAS", "")
    .put("MONEY_FEEINSURRANCE", "")
    .put("MONEY_FEE", "")
    .put("MONEY_FEEOTHER", "")
    .put("MONEY_TOTALVAT", "")
    .put("LIST_ITEM", productMaps)
    .toMap();