Explorar o código

feat: 批量订单导入;

hanchaolong hai 3 semanas
pai
achega
5c921b4662

+ 16 - 3
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/controller/BizWaybillOrderController.java

@@ -12,11 +12,13 @@ import com.ruoyi.logistics.domain.BizWaybillOrder;
 import com.ruoyi.logistics.domain.dto.JDOrderDTO;
 import com.ruoyi.logistics.domain.dto.JDOrderDTO;
 import com.ruoyi.logistics.service.IBizWaybillOrderService;
 import com.ruoyi.logistics.service.IBizWaybillOrderService;
 import com.ruoyi.logistics.service.LogisticsOrderService;
 import com.ruoyi.logistics.service.LogisticsOrderService;
+import com.ruoyi.system.domain.dto.DeptImportDTO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.MultipartFile;
 
 
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 import java.util.List;
 import java.util.List;
 import java.util.ArrayList;
 import java.util.ArrayList;
 
 
@@ -168,7 +170,6 @@ public class BizWaybillOrderController extends BaseController
             }
             }
 
 
             // 使用 ExcelUtil 读取 Excel 数据
             // 使用 ExcelUtil 读取 Excel 数据
-            int[] result = new int[2];
             if (1 == orderType) {
             if (1 == orderType) {
                 ExcelUtil<JDOrderDTO> util = new ExcelUtil<>(JDOrderDTO.class);
                 ExcelUtil<JDOrderDTO> util = new ExcelUtil<>(JDOrderDTO.class);
                 List<JDOrderDTO> orderList = util.importExcel(file.getInputStream());
                 List<JDOrderDTO> orderList = util.importExcel(file.getInputStream());
@@ -179,10 +180,10 @@ public class BizWaybillOrderController extends BaseController
                 }
                 }
 
 
                 // 调用批量下单方法
                 // 调用批量下单方法
-                result = bizWaybillOrderService.batchInsertJDBizWaybillOrder(orderList, orderType);
+                bizWaybillOrderService.batchInsertJDBizWaybillOrder(orderList, orderType);
             }
             }
 
 
-            return AjaxResult.success(String.format("批量下单完成!成功 %d 单,失败 %d 单", result[0], result[1]));
+            return AjaxResult.success("批量下单完成!");
 
 
         } catch (Exception e) {
         } catch (Exception e) {
             log.error("批量下单异常", e);
             log.error("批量下单异常", e);
@@ -190,4 +191,16 @@ public class BizWaybillOrderController extends BaseController
         }
         }
     }
     }
 
 
+    /**
+     * 下载批量下单模板
+     */
+    @RequiresPermissions("system:order:add")
+    @GetMapping("/importTemplate")
+    public void importTemplate(HttpServletResponse response, @RequestParam("orderType") Integer orderType) throws IOException {
+        if (1 == orderType) {
+            ExcelUtil<JDOrderDTO> util = new ExcelUtil<JDOrderDTO>(JDOrderDTO.class);
+            util.importTemplateExcel(response, "订单数据");
+        }
+    }
+
 }
 }

+ 33 - 15
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/domain/dto/JDOrderDTO.java

@@ -1,5 +1,6 @@
 package com.ruoyi.logistics.domain.dto;
 package com.ruoyi.logistics.domain.dto;
 
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ruoyi.common.core.annotation.Excel;
 import com.ruoyi.common.core.annotation.Excel;
 
 
 import java.io.Serializable;
 import java.io.Serializable;
@@ -12,29 +13,33 @@ import java.util.Date;
 public class JDOrderDTO implements Serializable {
 public class JDOrderDTO implements Serializable {
     private static final long serialVersionUID = 1L;
     private static final long serialVersionUID = 1L;
 
 
-    /** 件人姓名 */
-    @Excel(name = "件人姓名")
+    /** 件人姓名 */
+    @Excel(name = "件人姓名")
     private String senderName;
     private String senderName;
 
 
-    /** 发件人电话 */
+    /** 寄件人电话 */
+    @Excel(name = "寄件人电话")
     private String senderPhone;
     private String senderPhone;
 
 
-    /** 件省 */
+    /** 件省 */
     private String senderProvince;
     private String senderProvince;
 
 
-    /** 件市 */
+    /** 件市 */
     private String senderCity;
     private String senderCity;
 
 
-    /** 件区县 */
+    /** 件区县 */
     private String senderCounty;
     private String senderCounty;
 
 
-    /** 发件详细地址 */
+    /** 寄件详细地址 */
+    @Excel(name = "寄件详细地址")
     private String senderAddress;
     private String senderAddress;
 
 
     /** 收件人姓名 */
     /** 收件人姓名 */
+    @Excel(name = "收件人姓名")
     private String receiverName;
     private String receiverName;
 
 
     /** 收件人电话 */
     /** 收件人电话 */
+    @Excel(name = "收件人电话")
     private String receiverPhone;
     private String receiverPhone;
 
 
     /** 收件省 */
     /** 收件省 */
@@ -47,30 +52,40 @@ public class JDOrderDTO implements Serializable {
     private String receiverCounty;
     private String receiverCounty;
 
 
     /** 收件详细地址 */
     /** 收件详细地址 */
+    @Excel(name = "收件详细地址")
     private String receiverAddress;
     private String receiverAddress;
 
 
-    /** 货物名称 */
+    /** 物品名称 */
+    @Excel(name = "物品名称")
     private String goodsName;
     private String goodsName;
 
 
-    /** 货物重量 */
+    /** 物品重量 */
+    @Excel(name = "物品重量", cellType = Excel.ColumnType.NUMERIC)
     private BigDecimal goodsWeight;
     private BigDecimal goodsWeight;
 
 
-    /** 货物体积 */
+    /** 物品体积 */
+    @Excel(name = "物品体积", cellType = Excel.ColumnType.NUMERIC)
     private BigDecimal goodsVolume;
     private BigDecimal goodsVolume;
 
 
-    /** 货物数量 */
+    /** 物品数量 */
+    @Excel(name = "物品数量", cellType = Excel.ColumnType.NUMERIC)
     private Long goodsQty;
     private Long goodsQty;
 
 
     /** 取件类型 */
     /** 取件类型 */
     private Integer pickupType;
     private Integer pickupType;
 
 
     /** 上门取件开始时间 */
     /** 上门取件开始时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "上门取件开始时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
     private Date sendStartTime;
     private Date sendStartTime;
 
 
     /** 上门取件结束时间 */
     /** 上门取件结束时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "上门取件结束时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
     private Date sendEndTime;
     private Date sendEndTime;
 
 
     /** 产品类型 */
     /** 产品类型 */
+    @Excel(name = "产品类型", combo = {"京东标快", "京东特快", "特快重货"})
     private String productCode;
     private String productCode;
 
 
     /** 增值服务 */
     /** 增值服务 */
@@ -79,13 +94,16 @@ public class JDOrderDTO implements Serializable {
     /** 备注 */
     /** 备注 */
     private String remark;
     private String remark;
 
 
-    /** 是否包装 */
+    /** 包装服务 */
+    @Excel(name = "包装服务", combo = {"是", "否"})
     private String isPack;
     private String isPack;
 
 
     /** 保价金额 */
     /** 保价金额 */
-    private String guaranteeMoney;
+    @Excel(name = "保价金额", cellType = Excel.ColumnType.NUMERIC)
+    private BigDecimal guaranteeMoney;
 
 
     /** 签单返还 */
     /** 签单返还 */
+    @Excel(name = "签单返还", combo = {"是", "否"})
     private String isReceiptCollect;
     private String isReceiptCollect;
 
 
     public String getSenderName() {
     public String getSenderName() {
@@ -272,11 +290,11 @@ public class JDOrderDTO implements Serializable {
         this.isPack = isPack;
         this.isPack = isPack;
     }
     }
 
 
-    public String getGuaranteeMoney() {
+    public BigDecimal getGuaranteeMoney() {
         return guaranteeMoney;
         return guaranteeMoney;
     }
     }
 
 
-    public void setGuaranteeMoney(String guaranteeMoney) {
+    public void setGuaranteeMoney(BigDecimal guaranteeMoney) {
         this.guaranteeMoney = guaranteeMoney;
         this.guaranteeMoney = guaranteeMoney;
     }
     }
 
 

+ 1 - 1
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/IBizWaybillOrderService.java

@@ -105,5 +105,5 @@ public interface IBizWaybillOrderService
      * @param orderType 订单类型 1-京东,2-顺丰
      * @param orderType 订单类型 1-京东,2-顺丰
      * @return 结果数组,每个元素表示对应订单的结果 [0:成功数,1:失败数]
      * @return 结果数组,每个元素表示对应订单的结果 [0:成功数,1:失败数]
      */
      */
-    public int[] batchInsertJDBizWaybillOrder(List<JDOrderDTO> orderList, Integer orderType);
+    public int batchInsertJDBizWaybillOrder(List<JDOrderDTO> orderList, Integer orderType);
 }
 }

+ 119 - 18
jd-logistics-modules/jd-logistics-system/src/main/java/com/ruoyi/logistics/service/impl/BizWaybillOrderServiceImpl.java

@@ -3,23 +3,26 @@ package com.ruoyi.logistics.service.impl;
 import java.io.UnsupportedEncodingException;
 import java.io.UnsupportedEncodingException;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDate;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.ruoyi.common.core.exception.ServiceException;
 import com.ruoyi.common.core.exception.ServiceException;
 import com.ruoyi.common.core.utils.DateUtils;
 import com.ruoyi.common.core.utils.DateUtils;
+import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.datascope.annotation.DataScope;
 import com.ruoyi.common.datascope.annotation.DataScope;
 import com.ruoyi.common.redis.service.RedisIdGenerator;
 import com.ruoyi.common.redis.service.RedisIdGenerator;
 import com.ruoyi.common.security.utils.SecurityUtils;
 import com.ruoyi.common.security.utils.SecurityUtils;
+import com.ruoyi.logistics.constant.JDDictConstants;
 import com.ruoyi.logistics.constant.RedisCacheConstants;
 import com.ruoyi.logistics.constant.RedisCacheConstants;
 import com.ruoyi.logistics.domain.BizAddressBook;
 import com.ruoyi.logistics.domain.BizAddressBook;
 import com.ruoyi.logistics.domain.BizWaybillCostDetails;
 import com.ruoyi.logistics.domain.BizWaybillCostDetails;
+import com.ruoyi.logistics.domain.SysDeptRate;
 import com.ruoyi.logistics.domain.dto.OrderStatisticsDto;
 import com.ruoyi.logistics.domain.dto.OrderStatisticsDto;
 import com.ruoyi.logistics.domain.dto.RecentAddressDto;
 import com.ruoyi.logistics.domain.dto.RecentAddressDto;
 import com.ruoyi.logistics.domain.dto.JDOrderDTO;
 import com.ruoyi.logistics.domain.dto.JDOrderDTO;
@@ -66,6 +69,9 @@ public class BizWaybillOrderServiceImpl implements IBizWaybillOrderService
     @Autowired
     @Autowired
     private BizAddressBookMapper bizAddressBookMapper;
     private BizAddressBookMapper bizAddressBookMapper;
 
 
+    @Autowired
+    private SysDeptRateServiceImpl sysDeptRateService;
+
     /**
     /**
      * 查询运单管理
      * 查询运单管理
      * 
      * 
@@ -366,15 +372,23 @@ public class BizWaybillOrderServiceImpl implements IBizWaybillOrderService
      * @return 结果数组,每个元素表示对应订单的结果 [0:成功数,1:失败数]
      * @return 结果数组,每个元素表示对应订单的结果 [0:成功数,1:失败数]
      */
      */
     @Override
     @Override
-    public int[] batchInsertJDBizWaybillOrder(List<JDOrderDTO> orderList, Integer orderType) {
+    public int batchInsertJDBizWaybillOrder(List<JDOrderDTO> orderList, Integer orderType) {
         int successCount = 0;
         int successCount = 0;
         int failCount = 0;
         int failCount = 0;
         List<String> errorMessages = new ArrayList<>();
         List<String> errorMessages = new ArrayList<>();
 
 
         LoginUser loginUser = SecurityUtils.getLoginUser();
         LoginUser loginUser = SecurityUtils.getLoginUser();
 
 
+        SysDeptRate sysDeptRate = new SysDeptRate();
+        sysDeptRate.setDeptId(loginUser.getSysUser().getDeptId());
+        List<SysDeptRate> sysDeptRates = sysDeptRateService.selectSysDeptRateList(sysDeptRate);
+        Set<String> collect = sysDeptRates.stream().map(SysDeptRate::getProductType).collect(Collectors.toSet());
+
+        List<BizWaybillOrder> bizWaybillOrders = new ArrayList<>();
         for (JDOrderDTO dto : orderList) {
         for (JDOrderDTO dto : orderList) {
             try {
             try {
+                preDataVerify(dto, collect);
+
                 // 将 JDOrderDTO 转换为 BizWaybillOrder
                 // 将 JDOrderDTO 转换为 BizWaybillOrder
                 BizWaybillOrder bizWaybillOrder = convertToBizWaybillOrder(dto, loginUser);
                 BizWaybillOrder bizWaybillOrder = convertToBizWaybillOrder(dto, loginUser);
 
 
@@ -406,18 +420,8 @@ public class BizWaybillOrderServiceImpl implements IBizWaybillOrderService
                 bizWaybillOrder.setUserId(loginUser.getUserid());
                 bizWaybillOrder.setUserId(loginUser.getUserid());
                 bizWaybillOrder.setDeptId(loginUser.getSysUser().getDeptId());
                 bizWaybillOrder.setDeptId(loginUser.getSysUser().getDeptId());
 
 
-                // 保存到数据库
-                int result = bizWaybillOrderMapper.insertBizWaybillOrder(bizWaybillOrder);
-                if (result > 0) {
-                    successCount++;
-                    // 保存最近使用地址
-                    saveRecentAddresses(bizWaybillOrder, loginUser.getUserid());
-                } else {
-                    failCount++;
-                    errorMessages.add(String.format("订单 %s-%s 保存失败",
-                            dto.getSenderName(), dto.getReceiverName()));
-                }
 
 
+                bizWaybillOrders.add(bizWaybillOrder);
             } catch (Exception e) {
             } catch (Exception e) {
                 log.error("批量下单异常!发件人:{}, 收件人:{}", 
                 log.error("批量下单异常!发件人:{}, 收件人:{}", 
                     dto.getSenderName(), dto.getReceiverName(), e);
                     dto.getSenderName(), dto.getReceiverName(), e);
@@ -427,9 +431,73 @@ public class BizWaybillOrderServiceImpl implements IBizWaybillOrderService
             }
             }
         }
         }
 
 
-        log.info("批量下单完成!总数:{}, 成功:{}, 失败:{}", orderList.size(), successCount, failCount);
+        if (failCount > 0) {
+            throw new ServiceException("批量下单失败!失败原因:" + StringUtils.join(errorMessages, "\n"));
+        }
+
+        bizWaybillOrders.forEach(bizWaybillOrder -> {
+            // 保存到数据库
+            bizWaybillOrderMapper.insertBizWaybillOrder(bizWaybillOrder);
+        });
+        return bizWaybillOrders.size();
+    }
+
+    private void preDataVerify(JDOrderDTO dto, Set<String> collect) {
+        if (dto == null) {
+            throw new ServiceException("数据异常!订单数据不能为空");
+        }
         
         
-        return new int[]{successCount, failCount};
+        // 校验寄件人信息
+        if (StringUtils.isBlank(dto.getSenderName())) {
+            throw new ServiceException("数据异常!寄件人姓名不能为空");
+        }
+        if (StringUtils.isBlank(dto.getSenderPhone())) {
+            throw new ServiceException("数据异常!寄件人电话不能为空");
+        }
+        if (StringUtils.isBlank(dto.getSenderAddress())) {
+            throw new ServiceException("数据异常!寄件详细地址不能为空");
+        }
+        
+        // 校验收件人信息
+        if (StringUtils.isBlank(dto.getReceiverName())) {
+            throw new ServiceException("数据异常!收件人姓名不能为空");
+        }
+        if (StringUtils.isBlank(dto.getReceiverPhone())) {
+            throw new ServiceException("数据异常!收件人电话不能为空");
+        }
+        if (StringUtils.isBlank(dto.getReceiverAddress())) {
+            throw new ServiceException("数据异常!收件详细地址不能为空");
+        }
+        
+        // 校验货物信息
+        if (StringUtils.isBlank(dto.getGoodsName())) {
+            throw new ServiceException("数据异常!物品名称不能为空");
+        }
+        if (dto.getGoodsWeight() == null) {
+            throw new ServiceException("数据异常!物品重量不能为空");
+        }
+        if (dto.getGoodsVolume() == null) {
+            throw new ServiceException("数据异常!物品体积不能为空");
+        }
+        if (dto.getGoodsQty() == null) {
+            throw new ServiceException("数据异常!物品数量不能为空");
+        }
+        
+        // 校验取件时间
+        if (dto.getSendStartTime() == null || dto.getSendEndTime() == null) {
+            throw new ServiceException("数据异常!上门取件开始时间和结束时间不能为空");
+        }
+        if (dto.getSendStartTime().after(dto.getSendEndTime())) {
+            throw new ServiceException("数据异常!上门取件开始时间不能晚于结束时间");
+        }
+        
+        // 校验产品类型
+        if (StringUtils.isBlank(dto.getProductCode())) {
+            throw new ServiceException("数据异常!产品类型不能为空");
+        }
+        if (!collect.contains(dto.getProductCode())) {
+            throw new ServiceException("数据异常!产品类型不存在");
+        }
     }
     }
 
 
     /**
     /**
@@ -475,4 +543,37 @@ public class BizWaybillOrderServiceImpl implements IBizWaybillOrderService
         
         
         return bizWaybillOrder;
         return bizWaybillOrder;
     }
     }
+
+    private static String getProductCode(String productName) {
+        if (productName == null) {
+            return null;
+        }
+        if (productName.equals("京东标快")) {
+            return JDDictConstants.PRODUCT_CODE_ED_M_0001;
+        }
+        if (productName.equals("京东特快")) {
+            return JDDictConstants.PRODUCT_CODE_ED_M_0002;
+        }
+        if (productName.equals("特快重货")) {
+            return JDDictConstants.PRODUCT_CODE_FR_M_0004;
+        }
+        return null;
+    }
+
+    private static String getAddedService(JDOrderDTO dto) {
+        JSONObject addedService = new JSONObject();
+        addedService.put("isPack", null);
+        addedService.put("guaranteeMoney", null);
+        addedService.put("isReceiptCollect", null);
+        if ("是".equals(dto.getIsPack())) {
+            addedService.put("isPack", true);
+        }
+        if (null != dto.getGuaranteeMoney()) {
+            addedService.put("guaranteeMoney", dto.getGuaranteeMoney());
+        }
+        if ("是".equals(dto.getIsPack())) {
+            addedService.put("isReceiptCollect", true);
+        }
+        return JSON.toJSONString(addedService, SerializerFeature.WriteMapNullValue);
+    }
 }
 }