Bläddra i källkod

添加内部地址导出接口

liu 9 månader sedan
förälder
incheckning
eb7e4b94c5

+ 11 - 0
src/main/java/com/sqx/modules/address/controller/AdminInsideAddressController.java

@@ -17,7 +17,9 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.validation.Valid;
 import java.util.List;
@@ -80,4 +82,13 @@ public class AdminInsideAddressController {
         insideAddressService.exportData(query);
     }
 
+    @PostMapping("import")
+    @ApiOperation("导入内部地址列表")
+    public void importData(@RequestParam("file") MultipartFile file) {
+        if (file.isEmpty()) {
+            throw new SqxException("请选择需要上传的文件");
+        }
+
+        insideAddressService.importData(file);
+    }
 }

+ 11 - 1
src/main/java/com/sqx/modules/address/dto/InsideAddressDTO.java

@@ -1,5 +1,6 @@
 package com.sqx.modules.address.dto;
 
+import com.alibaba.excel.annotation.ExcelProperty;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -9,7 +10,6 @@ import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Pattern;
 import java.io.Serializable;
-import java.util.Date;
 
 /**
  * 内部地址
@@ -26,43 +26,53 @@ public class InsideAddressDTO implements Serializable {
 
     @ApiModelProperty(name = "站点id")
     @NotNull(message = "站点id不能为空")
+    @ExcelProperty(value = "站点id")
     private Long stationId;
 
     @ApiModelProperty(name = "配送费用")
     @NotNull(message = "配送费用不能为空")
     @Min(value = 0, message = "配送费用不能小于0")
+    @ExcelProperty(value = "配送费用")
     private Double deliveryFee;
 
     @ApiModelProperty(name = "省份")
     @NotBlank(message = "省份不能为空")
+    @ExcelProperty(value = "省份")
     private String province;
 
     @ApiModelProperty(name = "城市")
     @NotBlank(message = "城市不能为空")
+    @ExcelProperty(value = "城市")
     private String city;
 
     @ApiModelProperty(name = "区县")
     @NotBlank(message = "区县不能为空")
+    @ExcelProperty(value = "区县")
     private String district;
 
     @ApiModelProperty(name = "地址详情")
     @NotBlank(message = "地址详情不能为空")
+    @ExcelProperty(value = "地址详情")
     private String addressDetail;
 
     @ApiModelProperty(name = "经度")
     @NotNull(message = "经度不能为空")
+    @ExcelProperty(value = "经度")
     private Double lng;
 
     @ApiModelProperty(name = "维度")
     @NotNull(message = "维度不能为空")
+    @ExcelProperty(value = "维度")
     private Double lat;
 
     @ApiModelProperty(name = "启用状态;1启用、0禁用")
     @NotBlank(message = "启用状态不能为空")
     @Pattern(regexp = "0|1", message = "启用状态只能为0或1")
+    @ExcelProperty(value = "启用状态")
     private String status;
 
     @ApiModelProperty(name = "排序")
     @NotNull(message = "排序不能为空")
+    @ExcelProperty(value = "排序")
     private Integer sort;
 }

+ 7 - 0
src/main/java/com/sqx/modules/address/service/InsideAddressService.java

@@ -8,6 +8,7 @@ import com.sqx.modules.address.entity.InsideAddress;
 import com.sqx.modules.address.query.InsideAddressQuery;
 import com.sqx.modules.address.vo.InsideAddressShortVO;
 import com.sqx.modules.address.vo.InsideAddressVO;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
 
@@ -56,4 +57,10 @@ public interface InsideAddressService extends IService<InsideAddress> {
     void exportData(InsideAddressQuery query);
 
     List<InsideAddressVO> exportShippingAddress(InsideAddressQuery query);
+    /**
+     * 导入内部地址列表
+     * @param file 导入文件
+     */
+    void importData(MultipartFile file);
+
 }

+ 32 - 4
src/main/java/com/sqx/modules/address/service/impl/InsideAddressServiceImpl.java

@@ -10,19 +10,19 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sqx.common.exception.SqxException;
 import com.sqx.common.utils.Constant;
 import com.sqx.common.utils.PageUtils;
+import com.sqx.common.validator.ValidatorUtils;
 import com.sqx.modules.address.dao.InsideAddressDao;
-import com.sqx.modules.address.dto.AddressAddDTO;
 import com.sqx.modules.address.dto.InsideAddressDTO;
 import com.sqx.modules.address.entity.InsideAddress;
 import com.sqx.modules.address.query.InsideAddressQuery;
 import com.sqx.modules.address.service.InsideAddressService;
-import com.sqx.modules.address.vo.InsideAddressShortVO;
 import com.sqx.modules.address.vo.InsideAddressVO;
 import com.sqx.modules.utils.excel.EasyExcelUtil;
+import com.sqx.modules.utils.excel.ExcelFinishCallBack;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
 
-import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -107,7 +107,35 @@ public class InsideAddressServiceImpl extends ServiceImpl<InsideAddressDao, Insi
 
     @Override
     public List<InsideAddressVO> exportShippingAddress(InsideAddressQuery query) {
-       return baseMapper.exportShippingAddress(query);
+        return baseMapper.exportShippingAddress(query);
+    }
+
+    @Override
+    public void importData(MultipartFile file) {
+        EasyExcelUtil.readAnalysis(file, InsideAddressDTO.class, new ExcelFinishCallBack<InsideAddressDTO>() {
+            @Override
+            public void doAfterAllAnalysed(List<InsideAddressDTO> result) {
+                if (CollUtil.isNotEmpty(result)) {
+                    saveBatch(result);
+                }
+            }
+
+            @Override
+            public void doSaveBatch(List<InsideAddressDTO> result) {
+                saveBatch(result);
+            }
+
+            private void saveBatch(List<InsideAddressDTO> dtoList) {
+                List<InsideAddress> list = dtoList.stream().map(item -> {
+                    ValidatorUtils.validateEntity(item);
+                    InsideAddress address = new InsideAddress();
+                    BeanUtil.copyProperties(item, address);
+                    return address;
+                }).collect(Collectors.toList());
+
+                saveOrUpdateBatch(list);
+            }
+        });
     }
 
     private void checkAddressUnique(InsideAddressDTO insideAddressDTO) {

+ 18 - 0
src/main/java/com/sqx/modules/utils/excel/EasyExcelUtil.java

@@ -9,6 +9,7 @@ import com.sqx.common.exception.SqxException;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
@@ -25,6 +26,23 @@ import java.util.List;
 public class EasyExcelUtil {
 
     /**
+     * 读取excel文件
+     *
+     * @param <T>      数据类型
+     * @param file     excel文件
+     * @param head     列名
+     * @param callBack 回调 导入时传入定义好的回调接口,excel数据解析完毕之后监听器将数据传入回调函数
+     *                 这样调用工具类时可以通过回调函数获取导入的数据,如果数据量过大可根据实际情况进行分配入库
+     */
+    public static <T> void readAnalysis(MultipartFile file, Class<T> head, ExcelFinishCallBack<T> callBack) {
+        try {
+            EasyExcel.read(file.getInputStream(), head, new ExcelDataListener<>(callBack)).sheet().doRead();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
      * 导出Excel文件
      * @param dataList 数据列表
      * @param clazz 数据类的Class对象

+ 0 - 2
src/main/java/com/sqx/modules/utils/excel/ExcelDataListener.java

@@ -31,7 +31,6 @@ public class ExcelDataListener<T> extends AnalysisEventListener<T> {
 
     /**
      * 这个每一条数据解析都会来调用
-     * 在这里可以做一些其他的操作(过滤,分批入库...)  就考自己去拓展了
      *
      * @param data    one row value. is same as {@link AnalysisContext#readRowHolder()}
      * @param context context
@@ -46,7 +45,6 @@ public class ExcelDataListener<T> extends AnalysisEventListener<T> {
     }
 
     /**
-     * 所有数据解析完成了 都会来调用
      * 解析完成之后将所有数据存入回调接口中
      *
      * @param context context

+ 1 - 0
src/main/resources/mapper/address/InsideAddressDao.xml

@@ -42,6 +42,7 @@
         ORDER BY
             a.sort
     </select>
+
     <select id="exportShippingAddress" resultType="com.sqx.modules.address.vo.InsideAddressVO">
         SELECT
         a.id,