From 05981a8e1db6adcb3dc79907fc22453fb2e51230 Mon Sep 17 00:00:00 2001
From: zouyu <2723363702@qq.com>
Date: 星期日, 24 九月 2023 18:30:28 +0800
Subject: [PATCH] 销售订单导出

---
 framework/pom.xml                                                                        |   14 
 framework/src/main/java/com/yuanchu/mom/utils/easyexcel/CustemHandler.java               |   81 ++++
 framework/src/main/java/com/yuanchu/mom/exception/ExcelException.java                    |   25 +
 framework/src/main/java/com/yuanchu/mom/utils/easyexcel/EasyExcelUtils.java              |  405 +++++++++++++++++++++++
 inventory-server/src/main/java/com/yuanchu/mom/controller/SaleController.java            |   29 +
 framework/src/main/java/com/yuanchu/mom/utils/easyexcel/ResponseResultEnum.java          |   28 +
 inventory-server/src/main/java/com/yuanchu/mom/pojo/dto/ExportSaleDto.java               |   30 +
 pom.xml                                                                                  |   20 +
 framework/src/main/java/com/yuanchu/mom/utils/easyexcel/template/ExportSaleTemplate.java |   68 ++++
 framework/src/main/java/com/yuanchu/mom/utils/easyexcel/converter/SaleTypeConverter.java |   48 ++
 inventory-server/src/main/java/com/yuanchu/mom/service/impl/SaleServiceImpl.java         |   51 ++
 framework/src/main/java/com/yuanchu/mom/utils/easyexcel/ExcelListener.java               |   79 ++++
 inventory-server/src/main/resources/mapper/SaleMapper.xml                                |   26 +
 framework/src/main/java/com/yuanchu/mom/utils/easyexcel/LocalDateConverter.java          |   43 ++
 inventory-server/src/main/java/com/yuanchu/mom/mapper/SaleMapper.java                    |    4 
 inventory-server/src/main/java/com/yuanchu/mom/service/SaleService.java                  |   11 
 16 files changed, 954 insertions(+), 8 deletions(-)

diff --git a/framework/pom.xml b/framework/pom.xml
index 4fcce66..6ca70ae 100644
--- a/framework/pom.xml
+++ b/framework/pom.xml
@@ -38,5 +38,19 @@
             <groupId>com.auth0</groupId>
             <artifactId>java-jwt</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+        </dependency>
+        <!--poi-->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.github.whvcse</groupId>
+            <artifactId>easy-captcha</artifactId>
+            <version>1.6.2</version>
+        </dependency>
     </dependencies>
 </project>
diff --git a/framework/src/main/java/com/yuanchu/mom/exception/ExcelException.java b/framework/src/main/java/com/yuanchu/mom/exception/ExcelException.java
new file mode 100644
index 0000000..c5d18ab
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/mom/exception/ExcelException.java
@@ -0,0 +1,25 @@
+package com.yuanchu.mom.exception;
+
+import com.yuanchu.mom.utils.easyexcel.ResponseResultEnum;
+import lombok.Getter;
+
+/**
+ * excel鍏ㄥ眬寮傚父
+ * @auther Zou, Yu
+ * @create 2023-9-24
+ */
+@Getter
+public class ExcelException extends RuntimeException {
+
+    private Integer status;
+
+    public ExcelException(ResponseResultEnum resultEnum) {
+        super(resultEnum.getMessage());
+        this.status = resultEnum.getStatus();
+    }
+
+    public ExcelException(Integer status, String message) {
+        super(message);
+        this.status = status;
+    }
+}
diff --git a/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/CustemHandler.java b/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/CustemHandler.java
new file mode 100644
index 0000000..e6fc804
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/CustemHandler.java
@@ -0,0 +1,81 @@
+package com.yuanchu.mom.utils.easyexcel;
+
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.CellData;
+import com.alibaba.excel.metadata.Head;
+import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
+import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;
+import org.apache.poi.ss.usermodel.Cell;
+import org.springframework.util.CollectionUtils;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+*@author: Zou, Yu
+*@description:
+*@date: 2023/9/24 0024 12:56
+**/
+public class CustemHandler extends AbstractColumnWidthStyleStrategy {
+
+    private static final int MAX_COLUMN_WIDTH = 255;
+    //鍥犱负鍦ㄨ嚜鍔ㄥ垪瀹界殑杩囩▼涓紝鏈変簺璁剧疆鍦版柟璁╁垪瀹芥樉寰楃揣鍑戯紝鎵�浠ュ仛鍑轰簡涓垽鏂�
+    private static final int COLUMN_WIDTH = 20;
+    private Map<Integer, Map<Integer, Integer>> CACHE = new HashMap(8);
+
+    public CustemHandler() {
+    }
+
+    @Override
+    protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
+        boolean needSetWidth = isHead || !CollectionUtils.isEmpty(cellDataList);
+        if (needSetWidth) {
+            Map<Integer, Integer> maxColumnWidthMap = (Map) CACHE.get(writeSheetHolder.getSheetNo());
+            if (maxColumnWidthMap == null) {
+                maxColumnWidthMap = new HashMap(16);
+                CACHE.put(writeSheetHolder.getSheetNo(), maxColumnWidthMap);
+            }
+
+            Integer columnWidth = this.dataLength(cellDataList, cell, isHead);
+            if (columnWidth >= 0) {
+                if (columnWidth > MAX_COLUMN_WIDTH) {
+                    columnWidth = MAX_COLUMN_WIDTH;
+                } else {
+                    if (columnWidth < COLUMN_WIDTH) {
+                        columnWidth = columnWidth * 2;
+                    }
+                }
+
+                Integer maxColumnWidth = (Integer) ((Map) maxColumnWidthMap).get(cell.getColumnIndex());
+                if (maxColumnWidth == null || columnWidth > maxColumnWidth) {
+                    ((Map) maxColumnWidthMap).put(cell.getColumnIndex(), columnWidth);
+                    writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), columnWidth * 256);
+                }
+            }
+        }
+    }
+
+    private Integer dataLength(List<CellData> cellDataList, Cell cell, Boolean isHead) {
+        if (isHead) {
+            return cell.getStringCellValue().getBytes().length;
+        } else {
+            CellData cellData = (CellData) cellDataList.get(0);
+            CellDataTypeEnum type = cellData.getType();
+            if (type == null) {
+                return -1;
+            } else {
+                switch (type) {
+                    case STRING:
+                        return cellData.getStringValue().getBytes().length;
+                    case BOOLEAN:
+                        return cellData.getBooleanValue().toString().getBytes().length;
+                    case NUMBER:
+                        return cellData.getNumberValue().toString().getBytes().length;
+                    default:
+                        return -1;
+                }
+            }
+        }
+    }
+}
diff --git a/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/EasyExcelUtils.java b/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/EasyExcelUtils.java
new file mode 100644
index 0000000..578666c
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/EasyExcelUtils.java
@@ -0,0 +1,405 @@
+package com.yuanchu.mom.utils.easyexcel;
+
+
+import com.alibaba.excel.EasyExcelFactory;
+import com.alibaba.excel.ExcelReader;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.metadata.Font;
+import com.alibaba.excel.metadata.Sheet;
+import com.alibaba.excel.metadata.Table;
+import com.alibaba.excel.metadata.TableStyle;
+import com.alibaba.excel.metadata.*;
+import com.alibaba.excel.support.ExcelTypeEnum;
+import com.alibaba.excel.write.metadata.style.WriteCellStyle;
+import com.alibaba.excel.write.metadata.style.WriteFont;
+import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
+import com.yuanchu.mom.exception.ExcelException;
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.*;
+import java.util.Calendar;
+import java.util.List;
+import java.util.Map;
+
+/**
+*@author: Zou, Yu
+*@description:
+*@date: 2023/9/24 0024 13:18
+**/
+public class EasyExcelUtils {
+
+
+    public static HorizontalCellStyleStrategy getStyleStrategy() {
+        // 澶寸殑绛栫暐
+        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
+        // 鑳屾櫙璁剧疆涓虹伆鑹�
+        headWriteCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
+        WriteFont headWriteFont = new WriteFont();
+        headWriteFont.setFontHeightInPoints((short) 12);
+        // 瀛椾綋鏍峰紡
+        headWriteFont.setFontName("Frozen");
+        headWriteCellStyle.setWriteFont(headWriteFont);
+        // 鑷姩鎹㈣
+        headWriteCellStyle.setWrapped(false);
+        // 姘村钩瀵归綈鏂瑰紡
+        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
+        // 鍨傜洿瀵归綈鏂瑰紡
+        headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+
+        // 鍐呭鐨勭瓥鐣�
+        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
+        // 杩欓噷闇�瑕佹寚瀹� FillPatternType 涓篎illPatternType.SOLID_FOREGROUND 涓嶇劧鏃犳硶鏄剧ず鑳屾櫙棰滆壊.澶撮粯璁や簡 FillPatternType鎵�浠ュ彲浠ヤ笉鎸囧畾
+//        contentWriteCellStyle.setFillPatternType(FillPatternType.SQUARES);
+        // 鑳屾櫙鐧借壊
+        contentWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
+        WriteFont contentWriteFont = new WriteFont();
+        // 瀛椾綋澶у皬
+        contentWriteFont.setFontHeightInPoints((short) 12);
+        // 瀛椾綋鏍峰紡
+        contentWriteFont.setFontName("Calibri");
+        contentWriteCellStyle.setWriteFont(contentWriteFont);
+        // 鍐呭宸﹀榻�
+        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
+        // 杩欎釜绛栫暐鏄� 澶存槸澶寸殑鏍峰紡 鍐呭鏄唴瀹圭殑鏍峰紡 鍏朵粬鐨勭瓥鐣ュ彲浠ヨ嚜宸卞疄鐜�
+        return new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
+    }
+
+    public static HorizontalCellStyleStrategy getStyleFixedStrategy() {
+        // 澶寸殑绛栫暐
+        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
+        // 鑳屾櫙璁剧疆涓虹伆鑹�
+        headWriteCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
+        WriteFont headWriteFont = new WriteFont();
+        headWriteFont.setFontHeightInPoints((short) 12);
+        // 瀛椾綋鏍峰紡
+        headWriteFont.setFontName("Calibri");
+        headWriteCellStyle.setWriteFont(headWriteFont);
+        // 鑷姩鎹㈣
+        headWriteCellStyle.setWrapped(false);
+        // 姘村钩瀵归綈鏂瑰紡
+        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
+        // 鍨傜洿瀵归綈鏂瑰紡
+        headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        // 鍐呭鐨勭瓥鐣�
+        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
+        // 杩欓噷闇�瑕佹寚瀹� FillPatternType 涓篎illPatternType.SOLID_FOREGROUND 涓嶇劧鏃犳硶鏄剧ず鑳屾櫙棰滆壊.澶撮粯璁や簡 FillPatternType鎵�浠ュ彲浠ヤ笉鎸囧畾
+//        contentWriteCellStyle.setFillPatternType(FillPatternType.SQUARES);
+        // 鑳屾櫙鐧借壊
+        contentWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
+        WriteFont contentWriteFont = new WriteFont();
+        // 瀛椾綋澶у皬
+        contentWriteFont.setFontHeightInPoints((short) 10);
+        // 瀛椾綋鏍峰紡
+        contentWriteFont.setFontName("Calibri");
+        contentWriteCellStyle.setWriteFont(contentWriteFont);
+        // 鍐呭宸﹀榻�
+        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
+        // 杩欎釜绛栫暐鏄� 澶存槸澶寸殑鏍峰紡 鍐呭鏄唴瀹圭殑鏍峰紡 鍏朵粬鐨勭瓥鐣ュ彲浠ヨ嚜宸卞疄鐜�
+        return new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
+    }
+
+    public static HorizontalCellStyleStrategy getArveStyleStrategy() {
+        // 澶寸殑绛栫暐
+        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
+        // 鑳屾櫙璁剧疆涓�
+        headWriteCellStyle.setFillForegroundColor(IndexedColors.BLACK.getIndex());
+        WriteFont headWriteFont = new WriteFont();
+        headWriteFont.setFontHeightInPoints((short) 12);
+        // 瀛椾綋鏍峰紡
+        headWriteFont.setFontName("Calibri");
+        headWriteFont.setColor(IndexedColors.WHITE.getIndex());
+        headWriteCellStyle.setWriteFont(headWriteFont);
+
+        headWriteCellStyle.setBorderBottom(BorderStyle.MEDIUM);
+        headWriteCellStyle.setLeftBorderColor(IndexedColors.WHITE.getIndex());
+        headWriteCellStyle.setRightBorderColor(IndexedColors.WHITE.getIndex());
+        // 鑷姩鎹㈣
+        headWriteCellStyle.setWrapped(true);
+        // 姘村钩瀵归綈鏂瑰紡
+        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
+        // 鍨傜洿瀵归綈鏂瑰紡
+        headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        // 鍐呭鐨勭瓥鐣�
+        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
+        // 杩欓噷闇�瑕佹寚瀹� FillPatternType 涓篎illPatternType.SOLID_FOREGROUND 涓嶇劧鏃犳硶鏄剧ず鑳屾櫙棰滆壊.澶撮粯璁や簡 FillPatternType鎵�浠ュ彲浠ヤ笉鎸囧畾
+//        contentWriteCellStyle.setFillPatternType(FillPatternType.SQUARES);
+        // 鑳屾櫙鐧借壊
+        contentWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
+        WriteFont contentWriteFont = new WriteFont();
+        // 瀛椾綋澶у皬
+        contentWriteFont.setFontHeightInPoints((short) 10);
+        // 瀛椾綋鏍峰紡
+        contentWriteFont.setFontName("Calibri");
+        contentWriteCellStyle.setWriteFont(contentWriteFont);
+        // 杩欎釜绛栫暐鏄� 澶存槸澶寸殑鏍峰紡 鍐呭鏄唴瀹圭殑鏍峰紡 鍏朵粬鐨勭瓥鐣ュ彲浠ヨ嚜宸卞疄鐜�
+        return new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
+    }
+
+    /**
+     * excel鏂囦欢璇诲彇
+     *
+     * @param clazz model绫诲瀷Class瀵硅薄
+     * @param excel excel鏂囦欢瀵硅薄
+     * @param <T>   model绫诲瀷娉涘瀷
+     * @return model绫诲瀷鏁版嵁闆嗗悎
+     * @throws IOException IO寮傚父
+     */
+    public static <T extends BaseRowModel> List<T> readModelExcel(Class<T> clazz, MultipartFile excel) throws IOException {
+        ExcelListener<T> excelListener = new ExcelListener<>();
+        ExcelReader reader = getReader(excel, excelListener);
+        try {
+            reader.getSheets().forEach(sheet -> {
+                sheet.setClazz(clazz);
+                reader.read(sheet);
+            });
+        } catch (Exception e) {
+            throw new IOException("璇锋鏌ュ鍏ユā鏉匡紒");
+        }
+        return excelListener.getDataList();
+    }
+
+    /**
+     *
+     * @param clazz model绫诲瀷Class瀵硅薄
+     * @param excel excel鏂囦欢瀵硅薄
+     * @param sheetNumber 鎸囧畾sheet椤�
+     * @param <T> model绫诲瀷娉涘瀷
+     * @return model绫诲瀷鏁版嵁闆嗗悎
+     * @throws IOException
+     */
+    public static <T extends BaseRowModel> List<T> readModelSheetExcel(Class<T> clazz, MultipartFile excel, int sheetNumber) throws IOException {
+        ExcelListener<T> excelListener = new ExcelListener<>();
+        ExcelReader reader = getReader(excel, excelListener);
+        try {
+            Sheet sheet = reader.getSheets().get(sheetNumber);
+            sheet.setClazz(clazz);
+            reader.read(sheet);
+        } catch (Exception e) {
+            throw new IOException("璇锋鏌ュ鍏ユā鏉匡紒");
+        }
+        return excelListener.getDataList();
+    }
+
+    /**
+     * 鑾峰彇excel鏂囦欢璇诲彇瀵硅薄
+     *
+     * @param excel         excel鏂囦欢瀵硅薄
+     * @param excelListener excel浜嬩欢澶勭悊
+     * @return excel 璇诲彇瀵硅薄
+     * @throws IOException IO寮傚父
+     */
+    private static ExcelReader getReader(MultipartFile excel, ExcelListener excelListener) throws IOException {
+        String filename = excel.getOriginalFilename();
+        if (filename == null || (!filename.toLowerCase().endsWith(".xls") && !filename.toLowerCase().endsWith(".xlsx") && !filename.toLowerCase().endsWith(".xltm") && !filename.toLowerCase().endsWith(".xlsm"))) {
+            throw new ExcelException(ResponseResultEnum.EXCEL_FILE_EXT_ERROR);
+        }
+        InputStream inputStream = new BufferedInputStream(excel.getInputStream());
+        return new ExcelReader(inputStream, null, excelListener, false);
+    }
+
+    /**
+     * 鍐欏叆鏁版嵁鍒板鍑烘枃浠�
+     *
+     * @param clazz       model绫诲瀷Class瀵硅薄
+     * @param sheetNo     sheet搴忓彿
+     * @param headLineMun head琛屾暟
+     * @param startRow    寮�濮嬪啓鍏ヨ鏁�
+     * @param tableNo     table搴忓彿
+     * @param modelList   model鏁版嵁闆嗗悎
+     * @param temp        涓存椂鏂囦欢瀵硅薄
+     * @param export      瀵煎嚭鏂囦欢瀵硅薄
+     * @param <T>         model娉涘瀷
+     */
+    public static <T extends BaseRowModel> void writeModelExport(Class<T> clazz, Integer sheetNo, Integer headLineMun, Integer startRow, Integer tableNo, List<T> modelList, File temp, File export) {
+        try {
+            InputStream inputStream = new FileInputStream(temp);
+            FileOutputStream OutputStream = new FileOutputStream(export);
+            ExcelWriter writer = EasyExcelFactory.getWriterWithTemp(inputStream, OutputStream, ExcelTypeEnum.XLSX, false);
+            writer.write(modelList, initSheet(sheetNo, headLineMun, startRow), initTable(tableNo, clazz));
+            writer.finish();
+            OutputStream.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * Sheet鍒濆鍖�
+     *
+     * @param sheetNo     sheet搴忓彿
+     * @param headLineMun head琛屾暟
+     * @param startRow    寮�濮嬪啓鍏ヨ鏁�
+     * @return Sheet瀵硅薄
+     */
+    public static Sheet initSheet(Integer sheetNo, Integer headLineMun, Integer startRow) {
+        Sheet sheet = new Sheet(sheetNo, headLineMun);
+        sheet.setStartRow(startRow);
+        return sheet;
+    }
+
+    /**
+     * Table鍒濆鍖�
+     *
+     * @param tableNo table搴忓彿
+     * @param clazz   model绫诲瀷Class瀵硅薄
+     * @param <T>     model娉涘瀷
+     * @return Table瀵硅薄
+     */
+    public static <T extends BaseRowModel> Table initTable(Integer tableNo, Class<T> clazz) {
+        Table table = new Table(tableNo);
+        table.setClazz(clazz);
+        TableStyle tableStyle = new TableStyle();
+        tableStyle.setTableContentBackGroundColor(IndexedColors.WHITE);
+        tableStyle.setTableHeadBackGroundColor(IndexedColors.WHITE);
+        Font font = new Font();
+        font.setBold(false);
+        font.setFontName("瀹嬩綋");
+        font.setFontHeightInPoints((short) 11);
+        tableStyle.setTableContentFont(font);
+        table.setTableStyle(tableStyle);
+        return table;
+    }
+
+    /**
+     * 鏇挎崲妯℃澘鏍囪
+     *
+     * @param export     瀵煎嚭鏂囦欢瀵硅薄
+     * @param index      sheet搴忓彿
+     * @param rows       鍗曞厓鏍艰搴�
+     * @param columns    鍗曞厓鏍煎垪搴�
+     * @param replaceMap 澶氫釜鏍囪闆嗗悎
+     */
+    public static void editModelWorkBook(File export, Integer index, Integer rows, Integer columns, Map<String, String> replaceMap) {
+        try {
+            XSSFWorkbook workBook = new XSSFWorkbook(export);
+//            editModelWorkBook(workBook,index,0,0,replaceMap);
+            editModelWorkBook(workBook, index, rows, columns, replaceMap);
+            workBook.close();
+        } catch (IOException | InvalidFormatException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 鏇挎崲妯℃澘鏍囪
+     *
+     * @param workBook   excel宸ヤ綔鍐屽璞�
+     * @param index      sheet搴忓彿
+     * @param rows       鍗曞厓鏍艰搴�
+     * @param columns    鍗曞厓鏍煎垪搴�
+     * @param replaceMap 澶氫釜鏍囪闆嗗悎
+     */
+    public static void editModelWorkBook(XSSFWorkbook workBook, Integer index, Integer rows, Integer columns, Map<String, String> replaceMap) {
+        XSSFSheet sheet = workBook.getSheetAt(index);
+        Row row = sheet.getRow(rows);
+        Cell cell = row.getCell(columns);
+        String replaceString = cell.toString();
+        for (Map.Entry<String, String> entry : replaceMap.entrySet()) {
+            replaceString = replaceString.replace(entry.getKey(), entry.getValue());
+        }
+        cell.setCellValue(replaceString);
+        workBook.setSheetName(index, replaceString.replace(":", ""));
+    }
+
+    /**
+     * 妯℃澘sheet鍏嬮殕鍙婂懡鍚�
+     *
+     * @param temp           涓存椂鏂囦欢瀵硅薄
+     * @param export         瀵煎嚭鏂囦欢瀵硅薄
+     * @param cloneSheetNo   鍏嬮殕sheet搴忓垪
+     * @param rows           鍗曞厓鏍艰搴�
+     * @param columns        鍗曞厓鏍煎垪搴�
+     * @param replaceMapList 澶氫釜鏍囪闆嗗悎
+     */
+    public static void writeModelCloneSheet(File temp, File export, Integer cloneSheetNo, Integer rows, Integer columns, List<Map<String, String>> replaceMapList) {
+        try {
+            XSSFWorkbook workBook = new XSSFWorkbook(temp);
+            OutputStream outputStream = new FileOutputStream(export);
+            /** 濡傛灉浣犻渶瑕�6浠界浉鍚屾ā鏉跨殑sheet 閭d箞浣犲彧闇�瑕佸厠闅�5浠藉嵆鍙�*/
+            for (int index = 0; index < replaceMapList.size() - 1; index++) {
+                /** 鍏嬮殕妯℃澘鏂囦欢 */
+                XSSFSheet sheet = workBook.cloneSheet(cloneSheetNo);
+            }
+            for (int index = 0; index < replaceMapList.size(); index++) {
+                editModelWorkBook(workBook, index, rows, columns, replaceMapList.get(index));
+            }
+            workBook.write(outputStream);
+            outputStream.flush();
+            outputStream.close();
+            workBook.close();
+        } catch (IOException | InvalidFormatException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 涓存椂鏂囦欢鍐欏叆瀵煎嚭鏂囦欢
+     *
+     * @param temp    涓存椂鏂囦欢瀵硅薄
+     * @param export  瀵煎嚭鏂囦欢瀵硅薄
+     * @param index   sheet搴忓彿
+     * @param rows    鍗曞厓鏍艰搴�
+     * @param columns 鍗曞厓鏍煎垪搴�
+     * @param isTime  鏄惁鏈夋椂闂存爣璁�
+     */
+    public static void writeModelWorkBook(File temp, File export, Integer index, Integer rows, Integer columns, Boolean isTime) {
+        try {
+            XSSFWorkbook workBook = new XSSFWorkbook(temp);
+            OutputStream outputStream = new FileOutputStream(export);
+            if (isTime) {
+                writeModelWorkBook(workBook, index, rows, columns);
+            }
+            workBook.write(outputStream);
+            outputStream.flush();
+            outputStream.close();
+            workBook.close();
+        } catch (IOException | InvalidFormatException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 鏇挎崲鏃堕棿鏍囪锛坹ear,month,day锛�
+     *
+     * @param workBook excel宸ヤ綔鍐屽璞�
+     * @param index    sheet搴忓彿
+     * @param rows     鍗曞厓鏍艰搴�
+     * @param columns  鍗曞厓鏍煎垪搴�
+     */
+    public static void writeModelWorkBook(XSSFWorkbook workBook, Integer index, Integer rows, Integer columns) {
+        XSSFSheet xssfSheet = workBook.getSheetAt(index);
+        Row row = xssfSheet.getRow(rows);
+        Cell cell = row.getCell(columns);
+        String cellString = cell.toString();
+        Calendar calendar = Calendar.getInstance();
+        int year = calendar.get(Calendar.YEAR);
+        int month = calendar.get(Calendar.MONTH) + 1;
+        int day = calendar.get(Calendar.DAY_OF_MONTH);
+        String yearString = cellString.replace("year", String.valueOf(year));
+        String monthString = yearString.replace("month", String.valueOf(month));
+        String dayString = monthString.replace("day", String.valueOf(day));
+        cell.setCellValue(dayString);
+    }
+
+    /**
+     * 閽堝UserModel瀵煎嚭鏂规硶
+     *
+     * @param temp
+     * @param export
+     * @param isTime
+     */
+    public static void writeModelWorkBook(File temp, File export, Boolean isTime) {
+        writeModelWorkBook(temp, export, 0, 1, 9, isTime);
+    }
+
+
+    public static void writeModelCloneSheet(File temp, File export, List<Map<String, String>> replaceMapList) {
+        writeModelCloneSheet(temp, export, 0, 0, 0, replaceMapList);
+    }
+
+}
diff --git a/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/ExcelListener.java b/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/ExcelListener.java
new file mode 100644
index 0000000..0b9f4e8
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/ExcelListener.java
@@ -0,0 +1,79 @@
+package com.yuanchu.mom.utils.easyexcel;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * excel鏁版嵁瀵煎叆鏁版嵁澶勭悊
+ *
+ * @param <T>
+ * @author Zou, Yu
+ */
+@Slf4j
+@Getter
+@Setter
+public class ExcelListener<T> extends AnalysisEventListener<T> {
+
+    private List<T> dataList = new ArrayList<>();
+
+    @Override
+    public void invoke(T classType, AnalysisContext analysisContext) {
+        dataList.add(classType);
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext context) {
+    }
+
+    @Override
+    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
+        String templateHead = "";
+
+        List<String> headList = new ArrayList<>();
+        for (Integer i : headMap.keySet()) {
+            headList.add(headMap.get(i));
+        }
+        String importHead = headMap.values().toString();
+        log.info("importHead:{}", importHead);
+        String templateName = context.getCurrentSheet().getClazz().getSimpleName();
+        log.info("templateName:", templateName);
+//        if ("CostModel".equals(templateName)) {
+//            templateHead = templateHeadCost;
+//        } else if ("StaffInfoTemplate".equals(templateName)) {
+//            templateHead = templateHeadStaff;
+//        } else if ("OrganizationTemplate".equals(templateName)) {
+//            templateHead = templateHeadOrganization;
+//        }else if ("StaffDictionaryTemplate".equals(templateName)) {
+//            templateHead = templateHeadDictionary;
+//        }else if ("StaffCtfTemplate".equals(templateName)){
+//            templateHead = templateHeadCtf;
+//        }else if ("IndustryLineTemplate".equals(templateName)){
+//            templateHead = templateHeadIndustryLine;
+//        }else if ("SubServiceLineTemplate".equals(templateName)){
+//            templateHead = templateHeadSubServiceLine;
+//        }else if ("StaffHealthTemplate".equals(templateName)){
+//            templateHead = templateHeadHealth;
+//        }else if ("AccountDataTemplate".equals(templateName)){
+//            templateHead = templateAccountData;
+//        }else if ("PlInfoTemplate".equals(templateName)){
+//            templateHead = templatePlInfo;
+//        }else if ("CodeDataTemplate".equals(templateName)){
+//            templateHead = templateCodeData;
+//        }else if ("CodeTbdDataTemplate".equals(templateName)){
+//            templateHead = templateCodeTbdData;
+//        }
+
+        if (!templateHead.equals(importHead)) {
+            throw new RuntimeException(ResponseResultEnum.EXCEL_MODEL_ERROR.getMessage());
+        }
+
+    }
+
+}
\ No newline at end of file
diff --git a/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/LocalDateConverter.java b/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/LocalDateConverter.java
new file mode 100644
index 0000000..91e2eb5
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/LocalDateConverter.java
@@ -0,0 +1,43 @@
+package com.yuanchu.mom.utils.easyexcel;
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.CellData;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+
+/**
+*@author: Zou, Yu
+*@description:
+*@date: 2023/9/24 0024 13:18
+**/
+@Component
+public class LocalDateConverter implements Converter<LocalDate> {
+
+    @Override
+    public Class<LocalDate> supportJavaTypeKey() {
+        return LocalDate.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        return CellDataTypeEnum.STRING;
+    }
+
+    @Override
+    public LocalDate convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,
+                                       GlobalConfiguration globalConfiguration) {
+        return LocalDate.parse(cellData.getStringValue(), DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+    }
+
+    @Override
+    public CellData<String> convertToExcelData(LocalDate value, ExcelContentProperty contentProperty,
+                                               GlobalConfiguration globalConfiguration) {
+        return new CellData<>(value.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+    }
+
+}
\ No newline at end of file
diff --git a/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/ResponseResultEnum.java b/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/ResponseResultEnum.java
new file mode 100644
index 0000000..34dcead
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/ResponseResultEnum.java
@@ -0,0 +1,28 @@
+package com.yuanchu.mom.utils.easyexcel;
+
+import lombok.Getter;
+
+/**
+ * 寮傚父淇℃伅鏋氫妇
+ * @auther Zou, Yu
+ * @create 2023-09-24
+ */
+@Getter
+public enum ResponseResultEnum {
+    EXCEL_FILE_EXT_ERROR(1000,"鏂囦欢鏍煎紡閿欒"),
+    EXCEL_FILE_READ_FAIL(1001,"excel鏂囦欢璇诲彇澶辫触,璇锋鏌ユā鏉�!"),
+    EXCEL_FILE_IS_EMPTY(1002,"excel鏂囦欢涓虹┖"),
+    MODEL_FILE_NOT_EXIT(1003,"妯$増鏂囦欢涓嶅瓨鍦�"),
+    EXCEL_ACTIVE_DATE_ERROR(1004,"鐢熸晥鏃堕棿閿欒"),
+    EXCEL_MODEL_ERROR(1005,"瀵煎叆妯℃澘鏈夎锛岃妫�鏌ワ紒"),
+    EXCEL_FILE_EXCESS(1006,"鎵归噺瀵煎叆鏁版嵁閲忎笉鍙秴杩�500鏉�");
+
+    private Integer status;
+    private String message;
+
+    ResponseResultEnum(Integer status, String message) {
+        this.status = status;
+        this.message = message;
+    }
+
+}
diff --git a/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/converter/SaleTypeConverter.java b/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/converter/SaleTypeConverter.java
new file mode 100644
index 0000000..52bfb0d
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/converter/SaleTypeConverter.java
@@ -0,0 +1,48 @@
+package com.yuanchu.mom.utils.easyexcel.converter;
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.CellData;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+import org.springframework.stereotype.Component;
+
+/** 璁㈠崟鐘舵�佽浆鎹�
+ * @Author: Zou, Yu
+ * @DATE: 2023/9/24 0024 14:21
+ */
+@Component
+public class SaleTypeConverter implements Converter<String> {
+
+    @Override
+    public Class<String> supportJavaTypeKey() {
+        return String.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        return CellDataTypeEnum.STRING;
+    }
+
+    @Override
+    public String convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        if("閫氳繃".equals(cellData.getStringValue())){
+            return "1";
+        }else if("涓嶉�氳繃".equals(cellData.getStringValue())){
+            return "0";
+        }else{
+            return "2";
+        }
+    }
+
+    @Override
+    public CellData convertToExcelData(String str, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        if("1".equals(str)){
+            return new CellData<>("閫氳繃");
+        }else if("0".equals(str)){
+            return new CellData<>("涓嶉�氳繃");
+        }else{
+            return new CellData<>("鏈鏍�");
+        }
+    }
+}
diff --git a/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/template/ExportSaleTemplate.java b/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/template/ExportSaleTemplate.java
new file mode 100644
index 0000000..eec62ea
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/template/ExportSaleTemplate.java
@@ -0,0 +1,68 @@
+package com.yuanchu.mom.utils.easyexcel.template;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.metadata.BaseRowModel;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.yuanchu.mom.utils.easyexcel.converter.SaleTypeConverter;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Author: Zou, Yu
+ * @DATE: 2023/9/24 0024 11:21
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ExportSaleTemplate extends BaseRowModel implements Serializable {
+
+    @ColumnWidth(26)
+    @ExcelProperty(value="搴忓彿", index = 0)
+    private Integer id;
+
+    @ColumnWidth(26)
+    @ExcelProperty(value="璁㈠崟缂栧彿", index = 1)
+    @JsonSerialize
+    private String orderNumber;
+
+    @ColumnWidth(26)
+    @ExcelProperty(value="璁㈠崟绫诲瀷", index = 2)
+    @JsonSerialize
+    private String orderType;
+
+    @ColumnWidth(26)
+    @ExcelProperty(value="鍚堝悓缂栧彿", index = 3)
+    @JsonSerialize
+    private String code;
+
+    @ColumnWidth(26)
+    @ExcelProperty(value="宸ョ▼鍚嶇О", index = 4)
+    @JsonSerialize
+    private String name;
+
+    @ColumnWidth(26)
+    @ExcelProperty(value="瀹㈡埛鍚嶇О", index = 5)
+    @JsonSerialize
+    private String proname;
+
+    @ColumnWidth(26)
+    @ExcelProperty(value="浜よ揣鏃ユ湡", index = 6)
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date delTime;
+
+    @ColumnWidth(26)
+    @ExcelProperty(value="澶囨敞", index = 7)
+    @JsonSerialize
+    private String note;
+
+    @ColumnWidth(26)
+    @ExcelProperty(value="鐘舵��", index = 8 ,converter = SaleTypeConverter.class)
+    @JsonSerialize
+    private String type;
+
+}
diff --git a/inventory-server/src/main/java/com/yuanchu/mom/controller/SaleController.java b/inventory-server/src/main/java/com/yuanchu/mom/controller/SaleController.java
index dfc3a62..bd6a077 100644
--- a/inventory-server/src/main/java/com/yuanchu/mom/controller/SaleController.java
+++ b/inventory-server/src/main/java/com/yuanchu/mom/controller/SaleController.java
@@ -1,15 +1,22 @@
 package com.yuanchu.mom.controller;
 
 
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.support.ExcelTypeEnum;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.pojo.dto.ExportSaleDto;
+import com.yuanchu.mom.utils.easyexcel.template.ExportSaleTemplate;
+import com.yuanchu.mom.pojo.dto.SaleDto;
 import com.yuanchu.mom.pojo.dto.SaleMaterialDto;
 import com.yuanchu.mom.pojo.vo.SaleVo;
-import com.yuanchu.mom.service.RepertoryService;
-import com.yuanchu.mom.utils.JackSonUtil;
-import com.yuanchu.mom.pojo.dto.SaleDto;
 import com.yuanchu.mom.service.SaleService;
+import com.yuanchu.mom.utils.JackSonUtil;
 import com.yuanchu.mom.utils.Jwt;
+import com.yuanchu.mom.utils.easyexcel.CustemHandler;
+import com.yuanchu.mom.utils.easyexcel.EasyExcelUtils;
+import com.yuanchu.mom.utils.easyexcel.LocalDateConverter;
 import com.yuanchu.mom.vo.Result;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -20,6 +27,10 @@
 import springfox.documentation.spring.web.json.Json;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.util.*;
 
 /**
@@ -148,4 +159,16 @@
         return Result.success(saleService.download(id));
     }
 
+    @ApiOperation(value = "閿�鍞鍗曞鍑�")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "orderNumber", value = "璁㈠崟缂栧彿", dataTypeClass = String.class),
+            @ApiImplicitParam(name = "name", value = "浜у搧鍚嶇О", dataTypeClass = String.class),
+            @ApiImplicitParam(name = "type", value = "鐘舵��(涓虹┖=鍏ㄩ儴)", dataTypeClass = Integer.class),
+            @ApiImplicitParam(name = "delTime", value = "浜よ揣鏃ユ湡", dataTypeClass = String.class)
+    })
+    @PostMapping("/exportSale")
+    public void exportSale(@RequestBody ExportSaleDto dto, HttpServletResponse response){
+        saleService.exportSale(dto,response);
+    }
+
 }
diff --git a/inventory-server/src/main/java/com/yuanchu/mom/mapper/SaleMapper.java b/inventory-server/src/main/java/com/yuanchu/mom/mapper/SaleMapper.java
index 14de9eb..04bdcdd 100644
--- a/inventory-server/src/main/java/com/yuanchu/mom/mapper/SaleMapper.java
+++ b/inventory-server/src/main/java/com/yuanchu/mom/mapper/SaleMapper.java
@@ -4,7 +4,9 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.yuanchu.mom.pojo.Sale;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yuanchu.mom.utils.easyexcel.template.ExportSaleTemplate;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -25,4 +27,6 @@
 
     //鎵归噺鍒犻櫎
     void delAllSale(String ids);
+
+    List<ExportSaleTemplate> selectSaleListByExport(String orderNumber, String name, Integer type, String delTime);
 }
diff --git a/inventory-server/src/main/java/com/yuanchu/mom/pojo/dto/ExportSaleDto.java b/inventory-server/src/main/java/com/yuanchu/mom/pojo/dto/ExportSaleDto.java
new file mode 100644
index 0000000..5fb99c6
--- /dev/null
+++ b/inventory-server/src/main/java/com/yuanchu/mom/pojo/dto/ExportSaleDto.java
@@ -0,0 +1,30 @@
+package com.yuanchu.mom.pojo.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @Author: Zou, Yu
+ * @DATE: 2023/9/24 0024 15:45
+ */
+@Data
+@JsonSerialize
+public class ExportSaleDto {
+
+    @JsonSerialize
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private String delTime;
+
+    @JsonSerialize
+    private String name;
+
+    @JsonSerialize
+    private Integer type;
+
+    @JsonSerialize
+    private String orderNumber;
+
+}
diff --git a/inventory-server/src/main/java/com/yuanchu/mom/service/SaleService.java b/inventory-server/src/main/java/com/yuanchu/mom/service/SaleService.java
index c420b22..a2ce614 100644
--- a/inventory-server/src/main/java/com/yuanchu/mom/service/SaleService.java
+++ b/inventory-server/src/main/java/com/yuanchu/mom/service/SaleService.java
@@ -5,9 +5,12 @@
 import com.yuanchu.mom.pojo.Sale;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yuanchu.mom.pojo.dto.ConsignmentDto1;
+import com.yuanchu.mom.pojo.dto.ExportSaleDto;
 import com.yuanchu.mom.pojo.dto.SaleDto;
 import com.yuanchu.mom.pojo.vo.SaleVo;
+import com.yuanchu.mom.utils.easyexcel.template.ExportSaleTemplate;
 
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 import java.util.Map;
 
@@ -90,4 +93,12 @@
      * @return
      */
     List<String> download(Integer id);
+
+    /**
+     * 瀵煎嚭閿�鍞鍗�
+     * @param dto
+     * @param response
+     */
+    void exportSale(ExportSaleDto dto, HttpServletResponse response);
+
 }
diff --git a/inventory-server/src/main/java/com/yuanchu/mom/service/impl/SaleServiceImpl.java b/inventory-server/src/main/java/com/yuanchu/mom/service/impl/SaleServiceImpl.java
index 85abcc8..516d62d 100644
--- a/inventory-server/src/main/java/com/yuanchu/mom/service/impl/SaleServiceImpl.java
+++ b/inventory-server/src/main/java/com/yuanchu/mom/service/impl/SaleServiceImpl.java
@@ -1,6 +1,8 @@
 package com.yuanchu.mom.service.impl;
 
 import cn.hutool.core.date.DateUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.support.ExcelTypeEnum;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -10,20 +12,25 @@
 import com.yuanchu.mom.pojo.Sale;
 import com.yuanchu.mom.mapper.SaleMapper;
 import com.yuanchu.mom.pojo.SaleMaterial;
-import com.yuanchu.mom.pojo.dto.ConsignmentDto1;
-import com.yuanchu.mom.pojo.dto.ConsignmentDto2;
-import com.yuanchu.mom.pojo.dto.SaleDto;
-import com.yuanchu.mom.pojo.dto.SaleMaterialDto;
+import com.yuanchu.mom.pojo.dto.*;
 import com.yuanchu.mom.pojo.vo.SaleVo;
 import com.yuanchu.mom.service.SaleMaterialService;
 import com.yuanchu.mom.service.SaleService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.mom.utils.easyexcel.CustemHandler;
+import com.yuanchu.mom.utils.easyexcel.EasyExcelUtils;
+import com.yuanchu.mom.utils.easyexcel.LocalDateConverter;
+import com.yuanchu.mom.utils.easyexcel.template.ExportSaleTemplate;
 import com.yuanchu.mom.vo.Result;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
@@ -257,4 +264,40 @@
         }
         return list;
     }
+
+    @Override
+    public void exportSale(ExportSaleDto dto, HttpServletResponse response) {
+        try{
+            List<ExportSaleTemplate> exportSaleTemplates = saleMapper.selectSaleListByExport(dto.getOrderNumber(), dto.getName(), dto.getType(), dto.getDelTime());
+            for (int i = 0; i < exportSaleTemplates.size(); i++) {
+                exportSaleTemplates.get(i).setId(i+1);
+            }
+            String fileName = String.valueOf(new StringBuilder()
+                    .append("閿�鍞鍗昣")
+                    .append(DateUtil.today())
+                    .append(ExcelTypeEnum.XLS.getValue()));
+            fileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());
+            response.setContentType("application/octet-stream");
+            response.setHeader("Cache-Control", "no-cache");
+            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
+            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
+            EasyExcel.write(response.getOutputStream())
+                    .head(ExportSaleTemplate.class)
+                    .registerConverter(new LocalDateConverter())
+                    .autoCloseStream(true)
+                    .excelType(ExcelTypeEnum.XLS)
+                    .registerWriteHandler(new CustemHandler())
+                    .registerWriteHandler(EasyExcelUtils.getStyleStrategy())
+                    .sheet("Sheet1")
+                    .doWrite(exportSaleTemplates);
+        }catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                response.getOutputStream().close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
 }
diff --git a/inventory-server/src/main/resources/mapper/SaleMapper.xml b/inventory-server/src/main/resources/mapper/SaleMapper.xml
index 5bcccc2..b2d9448 100644
--- a/inventory-server/src/main/resources/mapper/SaleMapper.xml
+++ b/inventory-server/src/main/resources/mapper/SaleMapper.xml
@@ -33,7 +33,31 @@
         </if>
         order by id desc
     </select>
-
+    <select id="selectSaleListByExport" resultType="com.yuanchu.mom.utils.easyexcel.template.ExportSaleTemplate">
+        select order_number AS orderNumber,
+        code,
+        name,
+        proname,
+        type,
+        DATE_FORMAT(delTime, '%Y-%m-%d') AS delTime,
+        note,
+        order_type AS orderType
+        from mom_ocean.sale
+        where state=1
+        <if test="orderNumber!=null and orderNumber!=''">
+            and order_number like concat('%',#{orderNumber},'%')
+        </if>
+        <if test="name!=null and name!=''">
+            and name LIKE CONCAT('%',#{name},'%')
+        </if>
+        <if test="type!=null ">
+            and type=#{type}
+        </if>
+        <if test="delTime!=null and delTime!=''">
+            and DATE_FORMAT(delTime, '%Y-%m-%d')=#{delTime}
+        </if>
+        order by id desc
+    </select>
     <!--鏌ヨ璁㈠崟BOM鍒楄〃-->
     <select id="selectAllOrder" resultType="java.util.Map">
         select sm.id,
diff --git a/pom.xml b/pom.xml
index d372146..797173f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,6 +39,8 @@
         <feign-okhttp.version>11.0</feign-okhttp.version>
         <shiro.version>1.5.3</shiro.version>
         <hutool.version>5.8.16</hutool.version>
+        <easyexcel.version>2.2.10</easyexcel.version>
+        <poi.version>4.1.2</poi.version>
         <!--鎻愪氦鍓�-->
         <!-- 鎵撳寘鍚庡鍑虹殑璺緞 -->
         <package.path>${project.build.directory}/BLOG</package.path>
@@ -98,6 +100,24 @@
 
     <dependencyManagement>
         <dependencies>
+            <!--easyexcel-->
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>easyexcel</artifactId>
+                <version>${easyexcel.version}</version>
+            </dependency>
+            <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
+            <dependency>
+                <groupId>org.apache.poi</groupId>
+                <artifactId>poi</artifactId>
+                <version>${poi.version}</version>
+            </dependency>
+            <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
+            <dependency>
+                <groupId>org.apache.poi</groupId>
+                <artifactId>poi-ooxml</artifactId>
+                <version>${poi.version}</version>
+            </dependency>
             <!--log4j-->
             <dependency>
                 <groupId>log4j</groupId>

--
Gitblit v1.9.3