浏览代码

订单列表导出

skyline 2 年之前
父节点
当前提交
95bc0858d5

+ 6 - 0
admin/pom.xml

@@ -37,6 +37,12 @@
             <version>3.1.1</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>5.2.3</version>
+        </dependency>
+
 
     </dependencies>
 

+ 7 - 0
admin/src/main/java/com/kym/admin/controller/CustomController.java

@@ -8,6 +8,7 @@ import com.kym.entity.admin.queryParams.CustomChargeOrdersQueryParam;
 import com.kym.service.miniapp.ChargeOrderService;
 import com.kym.service.miniapp.PayLogService;
 import com.kym.service.miniapp.UserService;
+import jakarta.servlet.http.HttpServletResponse;
 import org.springframework.web.bind.annotation.*;
 
 /**
@@ -43,6 +44,12 @@ public class CustomController {
         return R.success(customChargeOrders.customChargeOrders(params));
     }
 
+    @SysLog(value = "用户充电订单列表导出", ignoreParams = true)
+    @GetMapping("/exportChargeOrders")
+    public void exportChargeOrders(@ModelAttribute CustomChargeOrdersQueryParam params, HttpServletResponse response) {
+        customChargeOrders.exportCustomChargeOrders(params, response);
+    }
+
     @SysLog("订单详情")
     @GetMapping("/orderDetail/{startChargeSeq}")
     public R orderDetail(@PathVariable("startChargeSeq") String startChargeSeq) {

+ 3 - 0
service/src/main/java/com/kym/service/miniapp/ChargeOrderService.java

@@ -7,6 +7,7 @@ import com.kym.entity.admin.vo.CustomOrderVo;
 import com.kym.entity.admin.vo.StationStatVo;
 import com.kym.entity.common.PageBean;
 import com.kym.entity.miniapp.ChargeOrder;
+import jakarta.servlet.http.HttpServletResponse;
 
 import java.util.List;
 import java.util.Map;
@@ -36,4 +37,6 @@ public interface ChargeOrderService extends IService<ChargeOrder> {
     Map<String, Object> stationTodayStat(String  stationId);
 
     List<ChargeOrder> getChargeOrdersBySeqs(String[] startChargeSeqs);
+
+    void exportCustomChargeOrders(CustomChargeOrdersQueryParam params, HttpServletResponse response);
 }

+ 86 - 2
service/src/main/java/com/kym/service/miniapp/impl/ChargeOrderServiceImpl.java

@@ -1,6 +1,9 @@
 package com.kym.service.miniapp.impl;
 
 import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.io.IoUtil;
+import cn.hutool.poi.excel.ExcelUtil;
+import cn.hutool.poi.excel.ExcelWriter;
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.pagehelper.PageHelper;
@@ -14,11 +17,17 @@ import com.kym.entity.miniapp.ChargeOrder;
 import com.kym.mapper.miniapp.ChargeOrderMapper;
 import com.kym.service.miniapp.ChargeOrderService;
 import com.kym.service.utils.KymCache;
+import jakarta.servlet.ServletOutputStream;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.SneakyThrows;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.net.URLEncoder;
+import java.time.format.DateTimeFormatter;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -70,11 +79,87 @@ public class ChargeOrderServiceImpl extends ServiceImpl<ChargeOrderMapper, Charg
         // 查询订单列表(订单编号,手机号,充电站,充电桩SN/短码,订单状态,建单时间,结算时间,充电电量,实付金额,付款状态)
         var result = baseMapper.listChargeOrders(params);
         var page = new PageBean<>(result);
-        page.setList(result.stream().map(item -> item.setShortId(kymCache.getShortId(item.getConnectorId().substring(0, 15))).setStationName(kymCache.getStationName(item.getConnectorId()))).collect(Collectors.toList()));
+        page.setList(result.stream().map(item -> item.setShortId(kymCache.getShortId(item.getConnectorId())).setStationName(kymCache.getStationName(item.getStationId()))).collect(Collectors.toList()));
         var map = baseMapper.statChargeOrders(params);
         return page.setExtraData(map);
     }
 
+    @SneakyThrows
+    @Override
+    public void exportCustomChargeOrders(CustomChargeOrdersQueryParam params, HttpServletResponse response) {
+
+        if (params.getConnectorId() != null) {
+            var connectorId = kymCache.getConnectorId(params.getConnectorId());
+            params.setConnectorId(connectorId);
+        }
+        // 判断数据权限
+        var adminStationId = kymCache.getAdminUserStationId(StpUtil.getLoginIdAsLong());
+        if (adminStationId != null) {
+            params.setStationId(adminStationId);
+        }
+        // 查询订单列表(订单编号,手机号,充电站,充电桩SN/短码,订单状态,建单时间,结算时间,充电电量,实付金额,付款状态)
+        var result = baseMapper.listChargeOrders(params);
+        result = result.stream().map(item -> item.setShortId(kymCache.getShortId(item.getConnectorId())).setStationName(kymCache.getStationName(item.getStationId()))).collect(Collectors.toList());
+
+        // stationId,startChargeSeq,connectorId,startTime,endTime,totalPower,totalMoney,elecMoney,serviceMoney,orderStatus,chargeStatus,stopReason,invoiceStatus
+        var rows = result.stream().map(item -> {
+            var map = new HashMap<>();
+            map.put("stationId", item.getStationId());
+            map.put("startChargeSeq", item.getStartChargeSeq());
+            map.put("connectorId", item.getConnectorId());
+            map.put("startTime", item.getStartTime() == null ? "-" : item.getStartTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            map.put("endTime", item.getEndTime() == null ? "-" : item.getEndTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            map.put("totalPower", item.getTotalPower());
+            map.put("totalMoney", BigDecimal.valueOf(item.getTotalMoney()).divide(BigDecimal.valueOf(100)));
+            map.put("elecMoney", BigDecimal.valueOf(item.getElecMoney()).divide(BigDecimal.valueOf(100)));
+            map.put("serviceMoney", BigDecimal.valueOf(item.getServiceMoney()).divide(BigDecimal.valueOf(100)));
+            map.put("orderStatus", item.getOrderStatus());
+            map.put("chargeStatus", item.getChargeStatus());
+            return map;
+        }).toList();
+
+        // 通过工具类创建writer,默认创建xls格式
+        ExcelWriter writer = ExcelUtil.getWriter();
+
+        //自定义标题别名
+        writer.addHeaderAlias("stationId", "站点ID");
+        writer.addHeaderAlias("startChargeSeq", "充电订单号");
+        writer.addHeaderAlias("connectorId", "充电设备接口编号");
+        writer.addHeaderAlias("startTime", "充电开始时间");
+        writer.addHeaderAlias("endTime", "充电结束时间");
+        writer.addHeaderAlias("totalPower", "充电量(度)");
+        writer.addHeaderAlias("totalMoney", "累积总金额(元)");
+        writer.addHeaderAlias("elecMoney", "累积电费(元)");
+        writer.addHeaderAlias("serviceMoney", "累积服务费(元)");
+        writer.addHeaderAlias("orderStatus", "订单状态");
+        writer.addHeaderAlias("chargeStatus", "充电状态");
+
+        // TODO: 2023-09-25 抽公共导出工具 
+
+        // 默认的,未添加alias的属性也会写出,如果想只写出加了别名的字段,可以调用此方法排除之
+        writer.setOnlyAlias(true);
+        // 合并单元格后的标题行,使用默认标题样式 从0开始计算
+        writer.merge(10, "订单列表");
+        // 一次性写出内容,使用默认样式,强制输出标题
+        writer.write(rows, true);
+        // 自适应列宽 必须在列数据写出后调用
+        writer.autoSizeColumnAll();
+        //out为OutputStream,需要写出到的目标流
+        //response为HttpServletResponse对象
+        response.setContentType("application/vnd.ms-excel;charset=utf-8");
+        //test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
+        var fileName = new String("订单列表.xls".getBytes("ISO-8859-1"), "utf-8");
+        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
+        ServletOutputStream out = response.getOutputStream();
+
+        writer.flush(out, true);
+        // 关闭writer,释放内存
+        writer.close();
+        //此处记得关闭输出Servlet流
+        IoUtil.close(out);
+    }
+
+
     @Override
     public Object orderDetail(String startChargeSeq) {
         // TODO: 2023-08-22 订单详情(基本信息、收费信息) 上面接口貌似已经实现了
@@ -142,5 +227,4 @@ public class ChargeOrderServiceImpl extends ServiceImpl<ChargeOrderMapper, Charg
         return lambdaQuery().in(ChargeOrder::getStartChargeSeq, Arrays.stream(startChargeSeqs).toList()).list();
     }
 
-
 }