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> 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); } } 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); } 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; } } 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); 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对象 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; /** * ç®æ åå¹¶åindex */ private Integer targetColumnIndex; // éè¦å¼å§åå¹¶åå æ ¼çé¦è¡index 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; } } framework/src/main/java/com/yuanchu/mom/utils/easyexcel/converter/LocalDateConverter.java
ÎļþÃû´Ó framework/src/main/java/com/yuanchu/mom/utils/easyexcel/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; 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; } 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.*; /** 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) 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>