From 75b2904fbaf4fab6a9fb3baf065d2c927cc7a7a2 Mon Sep 17 00:00:00 2001
From: zouyu <2723363702@qq.com>
Date: 星期三, 27 九月 2023 18:16:34 +0800
Subject: [PATCH] 基础数据-物料清单维护-导出

---
 framework/src/main/java/com/yuanchu/mom/utils/easyexcel/template/ExcelMBomTemplate.java   |   45 ++++++
 base-server/src/main/java/com/yuanchu/mom/service/MbomModelService.java                   |    9 +
 framework/src/main/java/com/yuanchu/mom/utils/easyexcel/converter/LocalDateConverter.java |    2 
 framework/src/main/java/com/yuanchu/mom/utils/easyexcel/CustemHandler.java                |    1 
 base-server/src/main/java/com/yuanchu/mom/service/impl/MbomModelServiceImpl.java          |  141 +++++++++++++++++++
 framework/src/main/java/com/yuanchu/mom/utils/easyexcel/EasyExcelUtils.java               |   50 ++++++-
 inventory-server/src/main/java/com/yuanchu/mom/controller/SaleController.java             |   10 -
 inventory-server/src/main/java/com/yuanchu/mom/service/impl/SaleServiceImpl.java          |   18 --
 framework/src/main/java/com/yuanchu/mom/utils/easyexcel/ExcelMergeStrategy.java           |   87 ++++++++++++
 base-server/pom.xml                                                                       |   12 +
 base-server/src/main/java/com/yuanchu/mom/controller/MbomModelController.java             |   19 ++
 pom.xml                                                                                   |    5 
 12 files changed, 363 insertions(+), 36 deletions(-)

diff --git a/base-server/pom.xml b/base-server/pom.xml
index 5bfa438..79512fe 100644
--- a/base-server/pom.xml
+++ b/base-server/pom.xml
@@ -27,6 +27,18 @@
             <artifactId>user-server</artifactId>
             <version>0.0.1-SNAPSHOT</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml-schemas</artifactId>
+        </dependency>
 
     </dependencies>
 
diff --git a/base-server/src/main/java/com/yuanchu/mom/controller/MbomModelController.java b/base-server/src/main/java/com/yuanchu/mom/controller/MbomModelController.java
index a7904f8..66124f7 100644
--- a/base-server/src/main/java/com/yuanchu/mom/controller/MbomModelController.java
+++ b/base-server/src/main/java/com/yuanchu/mom/controller/MbomModelController.java
@@ -2,7 +2,7 @@
 
 
 import com.yuanchu.mom.pojo.dto.MbomModelDto;
-import com.yuanchu.mom.pojo.dto.TechniqueModelDto;
+import com.yuanchu.mom.utils.JackSonUtil;
 import com.yuanchu.mom.vo.Result;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -12,6 +12,11 @@
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import com.yuanchu.mom.service.MbomModelService;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
 
 
 /**
@@ -70,5 +75,17 @@
         return Result.success("鎵归噺鍒犻櫎鎴愬姛!");
     }
 
+    @ApiOperation(value = "涓嬭浇妯℃澘")
+    @PostMapping("/downloadTemplate")
+    public void downloadMBomTemplate(@RequestBody Map<String,Object> map,HttpServletResponse response){
+        mbomModelService.downloadTemplate(map,response);
+    }
+
+    @ApiOperation(value = "瀵煎嚭鐗╂枡娓呭崟")
+    @PostMapping("/exportMBom")
+    public void exportMBom(@RequestBody Map<String,Object> map, HttpServletResponse response){
+        mbomModelService.exportMBom(map,response);
+    }
+
 }
 
diff --git a/base-server/src/main/java/com/yuanchu/mom/service/MbomModelService.java b/base-server/src/main/java/com/yuanchu/mom/service/MbomModelService.java
index 92cc714..58af0bf 100644
--- a/base-server/src/main/java/com/yuanchu/mom/service/MbomModelService.java
+++ b/base-server/src/main/java/com/yuanchu/mom/service/MbomModelService.java
@@ -4,6 +4,7 @@
 import com.yuanchu.mom.pojo.MbomModel;
 import com.yuanchu.mom.pojo.dto.MbomModelDto;
 
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 import java.util.Map;
 
@@ -40,5 +41,13 @@
      * @param ids
      */
     void delAllMbom(String ids);
+
+    void downloadTemplate(Map<String, Object> map,HttpServletResponse response);
+
+    /**
+     * 瀵煎嚭
+     * @param map
+     */
+    void exportMBom(Map<String, Object> map,HttpServletResponse response);
 }
 
diff --git a/base-server/src/main/java/com/yuanchu/mom/service/impl/MbomModelServiceImpl.java b/base-server/src/main/java/com/yuanchu/mom/service/impl/MbomModelServiceImpl.java
index 81dd894..d92a843 100644
--- a/base-server/src/main/java/com/yuanchu/mom/service/impl/MbomModelServiceImpl.java
+++ b/base-server/src/main/java/com/yuanchu/mom/service/impl/MbomModelServiceImpl.java
@@ -1,17 +1,32 @@
 package com.yuanchu.mom.service.impl;
 
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.support.ExcelTypeEnum;
+import com.alibaba.excel.write.metadata.WriteSheet;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yuanchu.mom.mapper.MbomModelMapper;
 import com.yuanchu.mom.pojo.MbomModel;
 import com.yuanchu.mom.pojo.dto.MbomModelDto;
 import com.yuanchu.mom.pojo.dto.MbomModelDto2;
 import com.yuanchu.mom.service.MbomModelService;
+import com.yuanchu.mom.service.TechnicalModelService;
+import com.yuanchu.mom.utils.StringUtils;
+import com.yuanchu.mom.utils.easyexcel.CustemHandler;
+import com.yuanchu.mom.utils.easyexcel.EasyExcelUtils;
+import com.yuanchu.mom.utils.easyexcel.ExcelMergeStrategy;
+import com.yuanchu.mom.utils.easyexcel.converter.LocalDateConverter;
+import com.yuanchu.mom.utils.easyexcel.template.ExcelMBomTemplate;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.map.HashedMap;
 import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
-import java.util.List;
-import java.util.Map;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -25,6 +40,9 @@
 
     @Resource
     MbomModelMapper mbomModelMapper;
+
+    @Autowired
+    private TechnicalModelService technicalModelService;
 
 
     //鏌ヨ鐗╂枡娓呭崟缁存姢鍒楄〃-->鍙宠竟灞曠ず璇ュ伐鑹烘墍闇�瑕佺殑鍘熸潗鏂�
@@ -61,5 +79,124 @@
     public void delAllMbom(String ids) {
         mbomModelMapper.delAllMbom(ids);
     }
+
+    @Override
+    public void downloadTemplate(Map<String, Object> map,HttpServletResponse response) {
+        try{
+            List<String> typeList = getTypeList(map);
+            ExcelWriter excelWriter = EasyExcel.write(EasyExcelUtils.getResponse(response,"鐗╂枡娓呭崟瀵煎叆妯℃澘").getOutputStream())
+                    .excelType(ExcelTypeEnum.XLS)
+                    .build();
+            // 瀵煎嚭澶氫釜sheet椤�
+            for (int i = 0; i < typeList.size(); i++) {
+                WriteSheet sheet = EasyExcel.writerSheet(i, typeList.get(i))
+                        .head(ExcelMBomTemplate.class)
+                        .registerConverter(new LocalDateConverter())
+                        .registerWriteHandler(new CustemHandler())
+                        .registerWriteHandler(EasyExcelUtils.getStyleStrategy())
+                        .build();
+                excelWriter.write(null, sheet);
+            }
+            // 鍏抽棴 ExcelWriter锛屽畬鎴愬鍑�
+            excelWriter.finish();
+        }catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                response.getOutputStream().close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    @Override
+    public void exportMBom(Map<String, Object> map,HttpServletResponse response) {
+        try{
+            //绫诲瀷鍒楄〃
+            List<String> typeList = getTypeList(map);
+            //sheet鏁版嵁
+            Map<String,List<ExcelMBomTemplate>> exportListByType = new HashedMap<>();
+            typeList.forEach((type)->{
+                List<Map<String,Object>> techTemList =
+                        technicalModelService.selectAllTechTem(type, "");
+                List<ExcelMBomTemplate> list = new ArrayList<>();
+                techTemList.forEach(tech -> {
+                    String father = "";
+                    if(StringUtils.isNotEmpty(tech.get("name").toString())){
+                        father = tech.get("name").toString();
+                    }
+                    if(StringUtils.isNotEmpty(tech.get("children").toString())){
+                        List<Map<String,Object>> childrenList = (List<Map<String, Object>>) tech.get("children");
+                        String finalFather = father;
+                        childrenList.forEach(c -> {
+                            String name = c.get("name").toString();
+                            Integer id = Integer.parseInt(c.get("id").toString());
+                            List<Map<String, Object>> mbom = mbomModelMapper.selectAllMbom(id);
+                            if(CollectionUtils.isNotEmpty(mbom)){
+                                mbom.forEach(m->{
+                                    ExcelMBomTemplate temp = new ExcelMBomTemplate();
+                                    temp.setFather(finalFather);
+                                    temp.setName(name);
+                                    temp.setMaterialName(m.get("name").toString());
+                                    temp.setUnit(m.get("unit").toString());
+                                    list.add(temp);
+                                });
+                            }
+                        });
+                    }
+                });
+                exportListByType.put(type,list);
+            });
+            ExcelWriter excelWriter = EasyExcel.write(
+                        EasyExcelUtils.getResponse(response, "鐗╂枡娓呭崟瀵煎嚭").getOutputStream()
+                    )
+                    .excelType(ExcelTypeEnum.XLS)
+                    .build();
+            // 瀵煎嚭澶氫釜sheet椤�
+            for (int i = 0; i < typeList.size(); i++) {
+                String type = typeList.get(i);
+                List<String> fathers = exportListByType.get(type).stream()
+                        .map(ExcelMBomTemplate::getFather).collect(Collectors.toList());
+                List<String> names = exportListByType.get(type).stream()
+                        .map(ExcelMBomTemplate::getName).collect(Collectors.toList());
+                WriteSheet sheet = EasyExcel.writerSheet(i, typeList.get(i))
+                        .head(ExcelMBomTemplate.class)
+                        .registerConverter(new LocalDateConverter())
+                        .registerWriteHandler(new CustemHandler())
+                        .registerWriteHandler(EasyExcelUtils.getStyleStrategy())
+                        .registerWriteHandler(new ExcelMergeStrategy(fathers,0))
+                        .registerWriteHandler(new ExcelMergeStrategy(names,1))
+                        .build();
+                excelWriter.write(exportListByType.get(type), sheet);
+            }
+            // 鍏抽棴 ExcelWriter锛屽畬鎴愬鍑�
+            excelWriter.finish();
+        }catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                response.getOutputStream().close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+
+    }
+
+    /**
+     * 鑾峰彇绫诲瀷鍒楄〃
+     * @param map
+     * @return
+     */
+    private List<String> getTypeList(Map<String, Object> map){
+        if(!map.isEmpty()){
+            String arrStr = String.valueOf(map.get("typeList"));
+            String[] strings = arrStr.split(",");
+            return Arrays.asList(strings);
+        }
+        return null;
+    }
+
 }
 
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
index e6fc804..207dced 100644
--- a/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/CustemHandler.java
+++ b/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/CustemHandler.java
@@ -20,7 +20,6 @@
 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);
 
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
index 578666c..13018f6 100644
--- a/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/EasyExcelUtils.java
+++ b/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/EasyExcelUtils.java
@@ -1,6 +1,7 @@
 package com.yuanchu.mom.utils.easyexcel;
 
 
+import cn.hutool.core.date.DateUtil;
 import com.alibaba.excel.EasyExcelFactory;
 import com.alibaba.excel.ExcelReader;
 import com.alibaba.excel.ExcelWriter;
@@ -15,13 +16,17 @@
 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.formula.functions.T;
 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 javax.servlet.http.HttpServletResponse;
 import java.io.*;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.util.Calendar;
 import java.util.List;
 import java.util.Map;
@@ -33,7 +38,6 @@
 **/
 public class EasyExcelUtils {
 
-
     public static HorizontalCellStyleStrategy getStyleStrategy() {
         // 澶寸殑绛栫暐
         WriteCellStyle headWriteCellStyle = new WriteCellStyle();
@@ -42,7 +46,7 @@
         WriteFont headWriteFont = new WriteFont();
         headWriteFont.setFontHeightInPoints((short) 12);
         // 瀛椾綋鏍峰紡
-        headWriteFont.setFontName("Frozen");
+        headWriteFont.setFontName("瀹嬩綋");
         headWriteCellStyle.setWriteFont(headWriteFont);
         // 鑷姩鎹㈣
         headWriteCellStyle.setWrapped(false);
@@ -59,12 +63,19 @@
         contentWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
         WriteFont contentWriteFont = new WriteFont();
         // 瀛椾綋澶у皬
-        contentWriteFont.setFontHeightInPoints((short) 12);
+        contentWriteFont.setFontHeightInPoints((short) 11);
         // 瀛椾綋鏍峰紡
-        contentWriteFont.setFontName("Calibri");
+        contentWriteFont.setFontName("瀹嬩綋");
         contentWriteCellStyle.setWriteFont(contentWriteFont);
-        // 鍐呭宸﹀榻�
-        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
+        // 鍐呭灞呬腑瀵归綈
+        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
+        //鍐呭鍨傜洿灞呬腑
+        contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        //杈规璁剧疆
+        contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
+        contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
+        contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);
+        contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);
         // 杩欎釜绛栫暐鏄� 澶存槸澶寸殑鏍峰紡 鍐呭鏄唴瀹圭殑鏍峰紡 鍏朵粬鐨勭瓥鐣ュ彲浠ヨ嚜宸卞疄鐜�
         return new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
     }
@@ -82,7 +93,7 @@
         // 鑷姩鎹㈣
         headWriteCellStyle.setWrapped(false);
         // 姘村钩瀵归綈鏂瑰紡
-        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
+        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
         // 鍨傜洿瀵归綈鏂瑰紡
         headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
         // 鍐呭鐨勭瓥鐣�
@@ -141,6 +152,31 @@
     }
 
     /**
+     * 璁剧疆response
+     * @param response
+     * @param targetName
+     * @return
+     */
+    public static HttpServletResponse getResponse(HttpServletResponse response, String targetName){
+        String fileName;
+        try {
+            fileName = String.valueOf(new StringBuilder()
+                    .append(targetName)
+                    .append("_")
+                    .append(DateUtil.today())
+                    .append(ExcelTypeEnum.XLS.getValue()));
+            fileName =  URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());
+            response.setContentType("application/vnd.ms-excel");
+            response.setHeader("Cache-Control", "no-cache");
+            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
+            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
+            return response;
+        } catch (UnsupportedEncodingException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+                                                  /**
      * excel鏂囦欢璇诲彇
      *
      * @param clazz model绫诲瀷Class瀵硅薄
diff --git a/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/ExcelMergeStrategy.java b/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/ExcelMergeStrategy.java
new file mode 100644
index 0000000..59b0146
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/ExcelMergeStrategy.java
@@ -0,0 +1,87 @@
+package com.yuanchu.mom.utils.easyexcel;
+
+import com.alibaba.excel.metadata.Head;
+import com.alibaba.excel.write.merge.AbstractMergeStrategy;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * 鍚堝苟鍗曞厓鏍�
+ * @Author: Zou, Yu
+ * @DATE: 2023/9/26 0026 10:16
+ */
+public class ExcelMergeStrategy extends AbstractMergeStrategy {
+
+    /**
+     * 鍒嗙粍锛屾瘡鍑犺鍚堝苟涓�娆�
+     */
+    private List<Integer> exportFieldGroupCountList;
+
+    /**
+     * 鐩爣鍚堝苟鍒梚ndex
+     */
+    private Integer targetColumnIndex;
+
+    // 闇�瑕佸紑濮嬪悎骞跺崟鍏冩牸鐨勯琛宨ndex
+    private Integer rowIndex;
+
+    // exportDataList涓哄緟鍚堝苟鐩爣鍒楃殑鍊�
+    public ExcelMergeStrategy(List<String> exportDataList, Integer targetColumnIndex) {
+        this.exportFieldGroupCountList = getGroupCountList(exportDataList);
+        this.targetColumnIndex = targetColumnIndex;
+    }
+
+    @Override
+    protected void merge(Sheet sheet, Cell cell, Head head, Integer integer) {
+        if (null == rowIndex) {
+            rowIndex = cell.getRowIndex();
+        }
+        // 浠呬粠棣栬浠ュ強鐩爣鍒楃殑鍗曞厓鏍煎紑濮嬪悎骞讹紝蹇界暐鍏朵粬
+        if (cell.getRowIndex() == rowIndex && cell.getColumnIndex() == targetColumnIndex) {
+            mergeGroupColumn(sheet);
+        }
+    }
+
+    private void mergeGroupColumn(Sheet sheet) {
+        int rowCount = rowIndex;
+        for (Integer count : exportFieldGroupCountList) {
+            if(count == 1) {
+                rowCount += count;
+                continue ;
+            }
+            // 鍚堝苟鍗曞厓鏍�
+            CellRangeAddress cellRangeAddress = new CellRangeAddress(rowCount, rowCount + count - 1, targetColumnIndex, targetColumnIndex);
+            sheet.addMergedRegionUnsafe(cellRangeAddress);
+            rowCount += count;
+        }
+    }
+
+    // 璇ユ柟娉曞皢鐩爣鍒楁牴鎹�兼槸鍚︾浉鍚岃繛缁彲鍚堝苟锛屽瓨鍌ㄥ彲鍚堝苟鐨勮鏁�
+    private List<Integer> getGroupCountList(List<String> exportDataList){
+        if (CollectionUtils.isEmpty(exportDataList)) {
+            return new ArrayList<>();
+        }
+
+        List<Integer> groupCountList = new ArrayList<>();
+        int count = 1;
+
+        for (int i = 1; i < exportDataList.size(); i++) {
+            if (exportDataList.get(i).equals(exportDataList.get(i - 1))) {
+                count++;
+            } else {
+                groupCountList.add(count);
+                count = 1;
+            }
+        }
+        // 澶勭悊瀹屾渶鍚庝竴鏉″悗
+        groupCountList.add(count);
+        return groupCountList;
+    }
+}
diff --git a/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/LocalDateConverter.java b/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/converter/LocalDateConverter.java
similarity index 96%
rename from framework/src/main/java/com/yuanchu/mom/utils/easyexcel/LocalDateConverter.java
rename to framework/src/main/java/com/yuanchu/mom/utils/easyexcel/converter/LocalDateConverter.java
index 91e2eb5..3582407 100644
--- a/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/LocalDateConverter.java
+++ b/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/converter/LocalDateConverter.java
@@ -1,4 +1,4 @@
-package com.yuanchu.mom.utils.easyexcel;
+package com.yuanchu.mom.utils.easyexcel.converter;
 
 import com.alibaba.excel.converters.Converter;
 import com.alibaba.excel.enums.CellDataTypeEnum;
diff --git a/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/template/ExcelMBomTemplate.java b/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/template/ExcelMBomTemplate.java
new file mode 100644
index 0000000..5d26f52
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/mom/utils/easyexcel/template/ExcelMBomTemplate.java
@@ -0,0 +1,45 @@
+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.annotation.write.style.ContentLoopMerge;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import com.alibaba.excel.metadata.BaseRowModel;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+/**
+ * @Author: Zou, Yu
+ * @DATE: 2023/9/25 0025 12:47
+ */
+@Data
+@HeadRowHeight(40)
+@ContentRowHeight(25)
+@EqualsAndHashCode(callSuper = true)
+public class ExcelMBomTemplate extends BaseRowModel implements Serializable {
+
+    @ColumnWidth(30)
+    @ExcelProperty(value="宸ュ簭", index = 0)
+    @JsonSerialize
+    private String father;
+
+    @ColumnWidth(30)
+    @ExcelProperty(value="宸ヨ壓鍚嶇О", index = 1)
+    @JsonSerialize
+    private String name;
+
+    @ColumnWidth(30)
+    @ExcelProperty(value="鍘熸潗鏂欏悕绉�", index = 2)
+    @JsonSerialize
+    private String materialName;
+
+    @ColumnWidth(30)
+    @ExcelProperty(value="鍗曚綅", index = 3)
+    @JsonSerialize
+    private String unit;
+
+}
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 bd6a077..d2bc5b0 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,22 +1,15 @@
 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.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;
@@ -28,9 +21,6 @@
 
 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.*;
 
 /**
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 516d62d..4f61f64 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
@@ -7,21 +7,20 @@
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yuanchu.mom.Task.SyncOrder;
+import com.yuanchu.mom.mapper.SaleMapper;
 import com.yuanchu.mom.mapper.SaleMaterialMapper;
 import com.yuanchu.mom.pojo.Sale;
-import com.yuanchu.mom.mapper.SaleMapper;
 import com.yuanchu.mom.pojo.SaleMaterial;
 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.converter.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;
@@ -272,16 +271,7 @@
             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())
+            EasyExcel.write(EasyExcelUtils.getResponse(response,"閿�鍞鍗�").getOutputStream())
                     .head(ExportSaleTemplate.class)
                     .registerConverter(new LocalDateConverter())
                     .autoCloseStream(true)
diff --git a/pom.xml b/pom.xml
index 1929bb9..0318ba8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -124,6 +124,11 @@
                 <artifactId>poi-ooxml</artifactId>
                 <version>${poi.version}</version>
             </dependency>
+            <dependency>
+                <groupId>org.apache.poi</groupId>
+                <artifactId>poi-ooxml-schemas</artifactId>
+                <version>${poi.version}</version>
+            </dependency>
             <!--log4j-->
             <dependency>
                 <groupId>log4j</groupId>

--
Gitblit v1.9.3