Các bước tạo đơn Viettel Post
Back to viettel post sandboxBước 1: Login để lấy token
- Đầu tiên bạn sẽ cần gọi API
/user/loginvớ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/ownerconnectvớ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ườngCUS_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();