Jelajahi Sumber

新增用户端根据id查询内部地址接口;
新增导出内部地址列表接口;

codingliang 9 bulan lalu
induk
melakukan
f28a82ad3d

+ 6 - 4
src/main/java/com/sqx/modules/address/controller/AdminInsideAddressController.java

@@ -11,13 +11,10 @@ import com.sqx.modules.address.entity.InsideAddress;
 import com.sqx.modules.address.query.InsideAddressQuery;
 import com.sqx.modules.address.service.InsideAddressService;
 import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
-import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -48,7 +45,6 @@ public class AdminInsideAddressController {
         return Result.success();
     }
 
-
     @PostMapping("update")
     @ApiOperation("更新内部地址")
     public Result update(@Valid @RequestBody InsideAddressDTO insideAddressDTO) {
@@ -78,4 +74,10 @@ public class AdminInsideAddressController {
         return Result.success();
     }
 
+    @GetMapping("export")
+    @ApiOperation("导出内部地址列表")
+    public void export(@Valid InsideAddressQuery query) {
+        insideAddressService.exportData(query);
+    }
+
 }

+ 17 - 0
src/main/java/com/sqx/modules/address/controller/app/InsideAddressController.java

@@ -1,8 +1,12 @@
 package com.sqx.modules.address.controller.app;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.sqx.common.exception.SqxException;
 import com.sqx.common.utils.Result;
 import com.sqx.modules.address.entity.InsideAddress;
 import com.sqx.modules.address.service.InsideAddressService;
+import com.sqx.modules.address.vo.InsideAddressShortVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -27,4 +31,17 @@ public class InsideAddressController {
         List<InsideAddress> list = insideAddressService.listByStationId(stationId);
         return Result.success().put("data", list);
     }
+
+    @ApiOperation("根据id查询内部地址")
+    @GetMapping("{id}")
+    public Result info(@PathVariable("id") Long id) {
+        InsideAddress address = insideAddressService.getById(id);
+        if(ObjectUtil.isNull(address)){
+            throw new SqxException("无效的内部地址id");
+        }
+
+        InsideAddressShortVO insideAddressShortVO = new InsideAddressShortVO();
+        BeanUtil.copyProperties(address, insideAddressShortVO);
+        return Result.success().put("data", insideAddressShortVO);
+    }
 }

+ 3 - 4
src/main/java/com/sqx/modules/address/service/InsideAddressService.java

@@ -49,9 +49,8 @@ public interface InsideAddressService extends IService<InsideAddress> {
     List<InsideAddress> listByStationId(Long stationId);
 
     /**
-     * 从内部地址添加地址
-     * @param userId 用户id
-     * @param insideAddressDTO 内部地址
+     * 导出内部地址列表
+     * @param query 导出查询参数
      */
-    void addAddressFromInsideAddress(Long userId, AddressAddDTO insideAddressDTO);
+    void exportData(InsideAddressQuery query);
 }

+ 0 - 6
src/main/java/com/sqx/modules/address/service/impl/AddressServiceImpl.java

@@ -104,12 +104,6 @@ public class AddressServiceImpl extends ServiceImpl<AddressDao, Address> impleme
             throw new SqxException("地址不存在");
         }
 
-        if (ObjectUtil.isNotNull(address.getInsideAddressId())) {
-            InsideAddress insideAddress = insideAddressService.getById(address.getInsideAddressId());
-            address.setInsideDeliveryFee(insideAddress.getDeliveryFee());
-            address.setStationId(insideAddress.getStationId());
-        }
-
         return Result.success().put("data", address);
     }
 

+ 13 - 1
src/main/java/com/sqx/modules/address/service/impl/InsideAddressServiceImpl.java

@@ -1,6 +1,7 @@
 package com.sqx.modules.address.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -17,6 +18,7 @@ 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 org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -89,8 +91,18 @@ public class InsideAddressServiceImpl extends ServiceImpl<InsideAddressDao, Insi
     }
 
     @Override
-    public void addAddressFromInsideAddress(Long userId, AddressAddDTO insideAddressDTO) {
+    public void exportData(InsideAddressQuery query) {
+        Page<InsideAddress> page = new Page<>(query.getPage(), query.getLimit());
+        IPage<InsideAddressVO> data = baseMapper.selectPages(page, query);
+
+        // 导出数据
+        List<InsideAddressVO> list = data.getRecords();
+
+        list.forEach(item -> {
+            item.setStatus(item.getStatus() == Constant.YES ? "正常" : "停用");
+        });
 
+        EasyExcelUtil.exportExcel(list, InsideAddressVO.class, "内部地址", "sheet1");
     }
 
     private void checkAddressUnique(InsideAddressDTO insideAddressDTO) {

+ 17 - 0
src/main/java/com/sqx/modules/address/vo/InsideAddressVO.java

@@ -1,5 +1,7 @@
 package com.sqx.modules.address.vo;
 
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.format.DateTimeFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -20,42 +22,57 @@ public class InsideAddressVO implements Serializable {
     @ApiModelProperty(name = "id")
     private Long id;
 
+    @ExcelProperty("创建时间")
     @ApiModelProperty(name = "创建时间")
+    @DateTimeFormat("yyyy-MM-dd HH:mm:ss")
     private Date createTime;
 
+    @ExcelProperty("更新时间")
     @ApiModelProperty(name = "更新时间")
+    @DateTimeFormat("yyyy-MM-dd HH:mm:ss")
     private Date updateTime;
 
     @ApiModelProperty(name = "站点id")
+    @ExcelProperty("站点id")
     private Long stationId;
 
     @ApiModelProperty(name = "站点名称")
+    @ExcelProperty("站点名称")
     private String stationName;
 
     @ApiModelProperty(name = "配送费用")
+    @ExcelProperty("配送费用")
     private Double deliveryFee;
 
     @ApiModelProperty(name = "省份")
+    @ExcelProperty("省份")
     private String province;
 
     @ApiModelProperty(name = "城市")
+    @ExcelProperty("城市")
     private String city;
 
     @ApiModelProperty(name = "区县")
+    @ExcelProperty("区县")
     private String district;
 
     @ApiModelProperty(name = "地址详情")
+    @ExcelProperty("地址详情")
     private String addressDetail;
 
     @ApiModelProperty(name = "经度")
+    @ExcelProperty("经度")
     private Double lng;
 
     @ApiModelProperty(name = "维度")
+    @ExcelProperty("维度")
     private Double lat;
 
     @ApiModelProperty(name = "启用状态;1启用、0禁用")
+    @ExcelProperty("启用状态;1启用、0禁用")
     private String status;
 
     @ApiModelProperty(name = "排序")
+    @ExcelProperty("排序")
     private Integer sort;
 }

+ 2 - 29
src/main/java/com/sqx/modules/order/service/impl/AppAppOrderServiceImpl.java

@@ -1,12 +1,8 @@
 package com.sqx.modules.order.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
-import cn.hutool.core.util.URLUtil;
-import com.alibaba.excel.EasyExcel;
-import com.alibaba.excel.converters.longconverter.LongStringConverter;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -106,6 +102,7 @@ import com.sqx.modules.shop.service.ShopTypeService;
 import com.sqx.modules.sys.entity.SysUserEntity;
 import com.sqx.modules.sys.service.SysUserService;
 import com.sqx.modules.utils.SenInfoCheckUtil;
+import com.sqx.modules.utils.excel.EasyExcelUtil;
 import com.sqx.modules.utils.excel.ExcelData;
 import com.sqx.modules.utils.fieYun.FeiYunUtils;
 import lombok.extern.slf4j.Slf4j;
@@ -121,13 +118,8 @@ import org.springframework.transaction.TransactionStatus;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.support.DefaultTransactionDefinition;
-import org.springframework.web.context.request.RequestAttributes;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
 
 import javax.annotation.Resource;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
@@ -2898,26 +2890,7 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
         IPage<GoodsSkuSalesCountVO> page = baseMapper.getGoodsSkuSalesCount(pages, query);
         List<GoodsSkuSalesCountVO> records = page.getRecords();
 
-        try {
-            RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
-            HttpServletResponse response = ((ServletRequestAttributes) requestAttributes).getResponse();
-            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
-            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
-            response.setCharacterEncoding("UTF-8");
-
-            String excelName = "sku销售记录_";
-            excelName += DateUtil.format(new Date(), "yyyyMMddHHmmss");
-            String fileName = URLUtil.encode(excelName, "UTF-8");
-            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
-
-            EasyExcel.write(response.getOutputStream(), GoodsSkuSalesCountVO.class)
-                    .sheet("sheet1")
-                    .registerConverter(new LongStringConverter())
-                    .doWrite(records);
-        } catch (IOException e) {
-            log.error("sku销售记录导出失败:{}", e.getMessage());
-            throw new SqxException("sku销售记录导出失败");
-        }
+        EasyExcelUtil.exportExcel(records, GoodsSkuSalesCountVO.class, "sku销售记录", "sheet1");
     }
 
     /**

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

@@ -0,0 +1,78 @@
+package com.sqx.modules.utils.excel;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.converters.longconverter.LongStringConverter;
+import com.alibaba.excel.write.builder.ExcelWriterBuilder;
+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 javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * easyexcel工具类
+ * @author codingliang
+ * @date 2025-09-16
+ */
+@Slf4j
+public class EasyExcelUtil {
+
+    /**
+     * 导出Excel文件
+     * @param dataList 数据列表
+     * @param clazz 数据类的Class对象
+     * @param fileName 文件名(不含后缀)
+     * @param sheetName 工作表名称
+     * @throws IOException IO异常
+     */
+    public static <T> void exportExcel(List<T> dataList, Class<T> clazz, String fileName, String sheetName) {
+        try {
+            ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+            if (requestAttributes == null) {
+                throw new SqxException("无法获取响应对象");
+            }
+            HttpServletResponse response = requestAttributes.getResponse();
+
+            // 设置响应头
+            setResponseHeader(response, fileName);
+
+            ExcelWriterBuilder writerBuilder = EasyExcel.write(response.getOutputStream(), clazz);
+            writerBuilder.sheet(sheetName);
+
+
+            EasyExcel.write(response.getOutputStream(), clazz)
+                    .sheet(sheetName)
+                    .registerConverter(new LongStringConverter())
+                    .doWrite(dataList);
+        } catch (IOException e) {
+            log.error("Excel导出失败:{}", e.getMessage());
+            throw new SqxException("Excel导出失败:" + e.getMessage());
+        }
+    }
+
+    /**
+     * 设置响应头,包括内容类型和文件名
+     */
+    private static void setResponseHeader(HttpServletResponse response, String fileName) throws IOException {
+        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+        response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
+        response.setCharacterEncoding("UTF-8");
+
+        // 如果文件名为空,使用默认名称
+        if (StrUtil.isBlank(fileName)) {
+            fileName = "导出数据";
+        }
+        // 添加时间戳,避免文件名重复
+        fileName += "_" + DateUtil.format(new Date(), "yyyyMMddHHmmss");
+        // URL编码,避免中文乱码
+        String encodedFileName = URLEncoder.encode(fileName, "UTF-8");
+        response.setHeader("Content-disposition", "attachment;filename=" + encodedFileName + ".xlsx");
+    }
+}

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

@@ -0,0 +1,58 @@
+package com.sqx.modules.utils.excel;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * excel读取监听器
+ */
+public class ExcelDataListener<T> extends AnalysisEventListener<T> {
+    /**
+     * 定义一个保存Excel所有记录的集合
+     */
+    private final List<T> list = new LinkedList<>();
+    /**
+     * 回调接口
+     */
+    private final ExcelFinishCallBack<T> callBack;
+
+    /**
+     * 构造 ExcelFinishCallBack
+     *
+     * @param callBack ExcelFinishCallBack
+     */
+    public ExcelDataListener(ExcelFinishCallBack<T> callBack) {
+        this.callBack = callBack;
+    }
+
+
+    /**
+     * 这个每一条数据解析都会来调用
+     * 在这里可以做一些其他的操作(过滤,分批入库...)  就考自己去拓展了
+     *
+     * @param data    one row value. is same as {@link AnalysisContext#readRowHolder()}
+     * @param context context
+     */
+    @Override
+    public void invoke(T data, AnalysisContext context) {
+        list.add(data);
+        if (list.size() == 500) {
+            this.callBack.doSaveBatch(list);
+            list.clear();
+        }
+    }
+
+    /**
+     * 所有数据解析完成了 都会来调用
+     * 解析完成之后将所有数据存入回调接口中
+     *
+     * @param context context
+     */
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext context) {
+        this.callBack.doAfterAllAnalysed(this.list);
+    }
+}

+ 22 - 0
src/main/java/com/sqx/modules/utils/excel/ExcelFinishCallBack.java

@@ -0,0 +1,22 @@
+package com.sqx.modules.utils.excel;
+
+import java.util.List;
+
+public interface ExcelFinishCallBack<T> {
+
+    /**
+     * 导出后置处理数据
+     * Do after all analysed.
+     *
+     * @param result the result
+     */
+    void doAfterAllAnalysed(List<T> result);
+
+    /**
+     * Do save batch.
+     *
+     * @param result the result
+     */
+    default void doSaveBatch(List<T> result) {
+    }
+}