|
|
@@ -2,6 +2,7 @@ package com.ruoyi.logistics.service.impl;
|
|
|
|
|
|
import java.io.UnsupportedEncodingException;
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.text.ParseException;
|
|
|
import java.time.LocalDate;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.time.ZoneId;
|
|
|
@@ -380,7 +381,6 @@ public class BizWaybillOrderServiceImpl implements IBizWaybillOrderService
|
|
|
*/
|
|
|
@Override
|
|
|
public int batchInsertJDBizWaybillOrder(List<JDOrderDTO> orderList, Integer orderType) {
|
|
|
- int successCount = 0;
|
|
|
int failCount = 0;
|
|
|
List<String> errorMessages = new ArrayList<>();
|
|
|
|
|
|
@@ -392,34 +392,46 @@ public class BizWaybillOrderServiceImpl implements IBizWaybillOrderService
|
|
|
Set<String> collect = sysDeptRates.stream().map(SysDeptRate::getProductType).collect(Collectors.toSet());
|
|
|
|
|
|
List<BizWaybillOrder> bizWaybillOrders = new ArrayList<>();
|
|
|
- for (JDOrderDTO dto : orderList) {
|
|
|
+ for (int i = 0; i < orderList.size(); i++) {
|
|
|
+ JDOrderDTO dto = orderList.get(i);
|
|
|
+ int row = i + 2; // 行号从1开始
|
|
|
try {
|
|
|
preDataVerify(dto, collect);
|
|
|
|
|
|
// 将 JDOrderDTO 转换为 BizWaybillOrder
|
|
|
BizWaybillOrder bizWaybillOrder = convertToBizWaybillOrder(dto, loginUser);
|
|
|
+ String orderId = redisIdGenerator.generateUniqueId("RJSD");
|
|
|
+ bizWaybillOrder.setWaybillNo(orderId);
|
|
|
+ bizWaybillOrder.setOrderStatus(OrderStatusEnum.ORDER_STATUS_1.getCode());
|
|
|
|
|
|
// 前置校验
|
|
|
+ String senderProvince = bizWaybillOrder.getSenderProvince();
|
|
|
+ String senderCity = bizWaybillOrder.getSenderCity();
|
|
|
+ String senderCounty = bizWaybillOrder.getSenderCounty();
|
|
|
+ String receiverProvince = bizWaybillOrder.getReceiverProvince();
|
|
|
+ String receiverCity = bizWaybillOrder.getReceiverCity();
|
|
|
+ String receiverCounty = bizWaybillOrder.getReceiverCounty();
|
|
|
+
|
|
|
+ bizWaybillOrder.setSenderProvince("");
|
|
|
+ bizWaybillOrder.setSenderCity("");
|
|
|
+ bizWaybillOrder.setSenderCounty("");
|
|
|
+ bizWaybillOrder.setReceiverProvince("");
|
|
|
+ bizWaybillOrder.setReceiverCity("");
|
|
|
+ bizWaybillOrder.setReceiverCounty("");
|
|
|
+
|
|
|
JSONObject jsonObject = logisticsOrderService.precheckOrder(bizWaybillOrder);
|
|
|
if (!jsonObject.getBooleanValue("success")) {
|
|
|
log.warn("订单前置校验未通过!发件人:{}, 收件人:{}, 原因:{}",
|
|
|
dto.getSenderName(), dto.getReceiverName(), jsonObject.getString("msg"));
|
|
|
- failCount++;
|
|
|
- errorMessages.add(String.format("订单 %s-%s 校验失败:%s",
|
|
|
- dto.getSenderName(), dto.getReceiverName(), jsonObject.getString("msg")));
|
|
|
- continue;
|
|
|
+ throw new ServiceException(jsonObject.getString("msg"));
|
|
|
}
|
|
|
|
|
|
- // 调用下单接口
|
|
|
- JSONObject orderObject = logisticsOrderService.createOrder(bizWaybillOrder);
|
|
|
- if (!orderObject.getBooleanValue("success")) {
|
|
|
- log.warn("下单失败!发件人:{}, 收件人:{}, 原因:{}",
|
|
|
- dto.getSenderName(), dto.getReceiverName(), orderObject.getString("msg"));
|
|
|
- failCount++;
|
|
|
- errorMessages.add(String.format("订单 %s-%s 下单失败:%s",
|
|
|
- dto.getSenderName(), dto.getReceiverName(), orderObject.getString("msg")));
|
|
|
- continue;
|
|
|
- }
|
|
|
+ bizWaybillOrder.setSenderProvince(senderProvince);
|
|
|
+ bizWaybillOrder.setSenderCity(senderCity);
|
|
|
+ bizWaybillOrder.setSenderCounty(senderCounty);
|
|
|
+ bizWaybillOrder.setReceiverProvince(receiverProvince);
|
|
|
+ bizWaybillOrder.setReceiverCity(receiverCity);
|
|
|
+ bizWaybillOrder.setReceiverCounty(receiverCounty);
|
|
|
|
|
|
// 设置默认值
|
|
|
bizWaybillOrder.setPickupType(1);
|
|
|
@@ -427,14 +439,13 @@ public class BizWaybillOrderServiceImpl implements IBizWaybillOrderService
|
|
|
bizWaybillOrder.setUserId(loginUser.getUserid());
|
|
|
bizWaybillOrder.setDeptId(loginUser.getSysUser().getDeptId());
|
|
|
|
|
|
-
|
|
|
bizWaybillOrders.add(bizWaybillOrder);
|
|
|
} catch (Exception e) {
|
|
|
log.error("批量下单异常!发件人:{}, 收件人:{}",
|
|
|
dto.getSenderName(), dto.getReceiverName(), e);
|
|
|
failCount++;
|
|
|
- errorMessages.add(String.format("订单 %s-%s 异常:%s",
|
|
|
- dto.getSenderName(), dto.getReceiverName(), e.getMessage()));
|
|
|
+ errorMessages.add(String.format("第 %s 行订单 %s-%s 异常:%s",
|
|
|
+ row, dto.getSenderName(), dto.getReceiverName(), e.getMessage()));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -442,27 +453,69 @@ public class BizWaybillOrderServiceImpl implements IBizWaybillOrderService
|
|
|
throw new ServiceException("批量下单失败!失败原因:" + StringUtils.join(errorMessages, "\n"));
|
|
|
}
|
|
|
|
|
|
- bizWaybillOrders.forEach(bizWaybillOrder -> {
|
|
|
- // 保存到数据库
|
|
|
- bizWaybillOrderMapper.insertBizWaybillOrder(bizWaybillOrder);
|
|
|
- });
|
|
|
+ jdOrderImport(bizWaybillOrders);
|
|
|
return bizWaybillOrders.size();
|
|
|
}
|
|
|
|
|
|
+ @Async
|
|
|
+ private void jdOrderImport(List<BizWaybillOrder> bizWaybillOrders) {
|
|
|
+ String batchNum = redisIdGenerator.generateUniqueId("JDPC");
|
|
|
+
|
|
|
+ int successCount = 0;
|
|
|
+ int failCount = 0;
|
|
|
+ List<String> errorMessages = new ArrayList<>();
|
|
|
+ for (BizWaybillOrder dto : bizWaybillOrders) {
|
|
|
+ try {
|
|
|
+ // 调用下单接口
|
|
|
+ JSONObject orderObject = logisticsOrderService.createOrder(dto);
|
|
|
+ if (!orderObject.getBooleanValue("success")) {
|
|
|
+ log.warn("下单失败!发件人:{}, 收件人:{}, 原因:{}",
|
|
|
+ dto.getSenderName(), dto.getReceiverName(), orderObject.getString("msg"));
|
|
|
+ failCount++;
|
|
|
+ errorMessages.add(String.format("订单 %s-%s 下单失败:%s",
|
|
|
+ dto.getSenderName(), dto.getReceiverName(), orderObject.getString("msg")));
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ dto.setBatchNum(batchNum);
|
|
|
+ // 保存到数据库
|
|
|
+ int result = bizWaybillOrderMapper.insertBizWaybillOrder(dto);
|
|
|
+ if (result > 0) {
|
|
|
+ successCount++;
|
|
|
+ // 保存最近使用地址
|
|
|
+ saveRecentAddresses(dto, dto.getUserId());
|
|
|
+ } else {
|
|
|
+ failCount++;
|
|
|
+ errorMessages.add(String.format("订单 %s-%s 保存失败",
|
|
|
+ dto.getSenderName(), dto.getReceiverName()));
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("批量下单异常!发件人:{}, 收件人:{}",
|
|
|
+ dto.getSenderName(), dto.getReceiverName(), e);
|
|
|
+ failCount++;
|
|
|
+ errorMessages.add(String.format("订单 %s-%s 异常:%s",
|
|
|
+ dto.getSenderName(), dto.getReceiverName(), e.getMessage()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ log.info("批量下单完成!总数:{}, 成功:{}, 失败:{}", bizWaybillOrders.size(), successCount, failCount);
|
|
|
+ }
|
|
|
+
|
|
|
private void preDataVerify(JDOrderDTO dto, Set<String> collect) {
|
|
|
+ StringBuilder errorMsg = new StringBuilder();
|
|
|
if (dto == null) {
|
|
|
- throw new ServiceException("数据异常!订单数据不能为空");
|
|
|
+ errorMsg.append("订单数据不能为空");
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
// 校验寄件人信息
|
|
|
if (StringUtils.isBlank(dto.getSenderName())) {
|
|
|
- throw new ServiceException("数据异常!寄件人姓名不能为空");
|
|
|
+ errorMsg.append("寄件人姓名不能为空;");
|
|
|
}
|
|
|
if (StringUtils.isBlank(dto.getSenderPhone())) {
|
|
|
- throw new ServiceException("数据异常!寄件人电话不能为空");
|
|
|
+ errorMsg.append("寄件人电话不能为空;");
|
|
|
}
|
|
|
if (StringUtils.isBlank(dto.getSenderAddress())) {
|
|
|
- throw new ServiceException("数据异常!寄件详细地址不能为空");
|
|
|
+ errorMsg.append("寄件详细地址不能为空;");
|
|
|
}
|
|
|
|
|
|
Map param = new HashMap();
|
|
|
@@ -483,20 +536,20 @@ public class BizWaybillOrderServiceImpl implements IBizWaybillOrderService
|
|
|
dto.setSenderCity(receiverCity);
|
|
|
dto.setSenderCounty(receiverDistrict);
|
|
|
} catch (Exception e) {
|
|
|
- throw new ServiceException("数据异常!寄件详细地址识别有误");
|
|
|
+ errorMsg.append("寄件详细地址识别有误;");
|
|
|
}
|
|
|
|
|
|
// 校验收件人信息
|
|
|
if (StringUtils.isBlank(dto.getReceiverName())) {
|
|
|
- throw new ServiceException("数据异常!收件人姓名不能为空");
|
|
|
+ errorMsg.append("收件人姓名不能为空;");
|
|
|
}
|
|
|
if (StringUtils.isBlank(dto.getReceiverPhone())) {
|
|
|
- throw new ServiceException("数据异常!收件人电话不能为空");
|
|
|
+ errorMsg.append("收件人电话不能为空;");
|
|
|
}
|
|
|
if (StringUtils.isBlank(dto.getReceiverAddress())) {
|
|
|
- throw new ServiceException("数据异常!收件详细地址不能为空");
|
|
|
+ errorMsg.append("收件详细地址不能为空;");
|
|
|
}
|
|
|
- param.put("param", dto.getSenderAddress());
|
|
|
+ param.put("param", dto.getReceiverAddress());
|
|
|
try {
|
|
|
Map result = kuaidi100Service.queryIcrExpres(param);
|
|
|
Map<String, Object> receiverData = (Map<String, Object>) result.get("data");
|
|
|
@@ -513,42 +566,53 @@ public class BizWaybillOrderServiceImpl implements IBizWaybillOrderService
|
|
|
dto.setReceiverCity(receiverCity);
|
|
|
dto.setReceiverCounty(receiverDistrict);
|
|
|
} catch (Exception e) {
|
|
|
- throw new ServiceException("数据异常!收件详细地址识别有误");
|
|
|
+ errorMsg.append("收件详细地址识别有误;");
|
|
|
}
|
|
|
|
|
|
// 校验货物信息
|
|
|
if (StringUtils.isBlank(dto.getGoodsName())) {
|
|
|
- throw new ServiceException("数据异常!物品名称不能为空");
|
|
|
+ errorMsg.append("物品名称不能为空;");
|
|
|
}
|
|
|
if (dto.getGoodsWeight() == null) {
|
|
|
- throw new ServiceException("数据异常!物品重量不能为空");
|
|
|
+ errorMsg.append("物品重量不能为空;");
|
|
|
}
|
|
|
if (dto.getGoodsVolume() == null) {
|
|
|
- throw new ServiceException("数据异常!物品体积不能为空");
|
|
|
+ errorMsg.append("物品体积不能为空;");
|
|
|
}
|
|
|
if (dto.getGoodsQty() == null) {
|
|
|
- throw new ServiceException("数据异常!物品数量不能为空");
|
|
|
+ errorMsg.append("物品数量不能为空;");
|
|
|
}
|
|
|
|
|
|
// 校验取件时间
|
|
|
if (dto.getSendStartTime() == null || dto.getSendEndTime() == null) {
|
|
|
- throw new ServiceException("数据异常!上门取件开始时间和结束时间不能为空");
|
|
|
+ errorMsg.append("上门取件开始时间和结束时间不能为空;");
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ dto.setPickupStartTime(DateUtils.parseDate(dto.getSendStartTime(), "yyyy-MM-dd HH:mm:ss"));
|
|
|
+ } catch (ParseException e) {
|
|
|
+ errorMsg.append("上门取件开始时间格式不正确");
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ dto.setPickupEndTime(DateUtils.parseDate(dto.getSendEndTime(), "yyyy-MM-dd HH:mm:ss"));
|
|
|
+ } catch (ParseException e) {
|
|
|
+ errorMsg.append("上门取件开始时间格式不正确");
|
|
|
}
|
|
|
- dto.setPickupStartTime(DateUtils.dateTime(dto.getSendStartTime(), "yyyy-MM-dd HH:mm:ss"));
|
|
|
- dto.setPickupEndTime(DateUtils.dateTime(dto.getSendEndTime(), "yyyy-MM-dd HH:mm:ss"));
|
|
|
if (dto.getPickupStartTime().getTime() > dto.getPickupEndTime().getTime()) {
|
|
|
- throw new ServiceException("数据异常!上门取件开始时间不能大于上门取件结束时间");
|
|
|
+ errorMsg.append("上门取件开始时间不能大于上门取件结束时间;");
|
|
|
}
|
|
|
|
|
|
// 校验产品类型
|
|
|
if (StringUtils.isBlank(dto.getProductCode())) {
|
|
|
- throw new ServiceException("数据异常!产品类型不能为空");
|
|
|
+ errorMsg.append("产品类型不能为空;");
|
|
|
}
|
|
|
+ dto.setProductCode(getProductCode(dto.getProductCode()));
|
|
|
if (!collect.contains(dto.getProductCode())) {
|
|
|
- throw new ServiceException("数据异常!产品类型不存在");
|
|
|
+ errorMsg.append("产品类型不存在;");
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+ if (StringUtils.isNotBlank(errorMsg)) {
|
|
|
+ throw new ServiceException(errorMsg.toString());
|
|
|
+ }
|
|
|
}
|
|
|
@Async
|
|
|
@Override
|