diff --git a/nflg_project_dev/nflg-technology/pom.xml b/nflg_project_dev/nflg-technology/pom.xml
index 058aaa39..1b360c6a 100644
--- a/nflg_project_dev/nflg-technology/pom.xml
+++ b/nflg_project_dev/nflg-technology/pom.xml
@@ -123,7 +123,11 @@
2.2.8
-
+
+ cn.idev.excel
+ fastexcel
+ 1.0.0
+
diff --git a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/api/ProductCostAnalysisApi.java b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/api/ProductCostAnalysisApi.java
index d3b8d5cb..39e35519 100644
--- a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/api/ProductCostAnalysisApi.java
+++ b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/api/ProductCostAnalysisApi.java
@@ -5,6 +5,7 @@ import com.nflg.product.technology.pojo.query.MaterialVersionCostQuery;
import com.nflg.product.technology.pojo.query.SaveCostQuery;
import com.nflg.product.technology.pojo.vo.*;
import com.nflg.product.technology.service.ProductCostAnalysisService;
+import com.nflg.product.technology.util.ExcelUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import nflg.product.common.vo.ResultVO;
@@ -12,11 +13,14 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
+import java.io.IOException;
import java.math.BigDecimal;
+import java.util.ArrayList;
import java.util.List;
/**
@@ -45,18 +49,78 @@ public class ProductCostAnalysisApi extends BaseApi {
return ResultVO.success(productCostAnalysisService.getHighValuePurchasedParts(materialNo, price));
}
+ @GetMapping("exportHighValuePurchasedParts")
+ @ApiOperation("导出高价值外购件")
+ public void exportHighValuePurchasedParts(HttpServletResponse response
+ , @Validated @RequestParam @NotBlank String materialNo
+ , @Valid @RequestParam @Min(value = 0, message = "价格应大于等于0") BigDecimal price) throws IOException {
+ HighValuePurchasedPartsVO vo = productCostAnalysisService.getHighValuePurchasedParts(materialNo, price);
+ //HighValuePurchasedPartsVO vo = new HighValuePurchasedPartsVO();
+ //MaterialCostVO cost = new MaterialCostVO()
+ // .setMaterialNo("1100003735")
+ // .setPrice(new BigDecimal("5044.25"))
+ // .setNum(new BigDecimal("10000"))
+ // .setTotalPrice(new BigDecimal("18437.25"))
+ // .setMaterialDesc("梅花弹性联轴器 ROTEX 90 ST 98SHA 1B-32/1B-60 图号727576-0")
+ // .setMaterialCategoryName("梅花弹性联轴器")
+ // .setMaterialUnit("SET")
+ // .setInventory(new BigDecimal("100000"))
+ // .setLeadTime("100");
+ //vo.getCosts().add(cost);
+
+ ExcelUtil.export(response, vo.getCosts(), MaterialCostVO.class, materialNo + "高价值外购件", "价格高于" + price);
+ }
+
+
@GetMapping("getBomCostSingleLayer")
@ApiOperation("获取Bom组件成本(单层)")
- public ResultVO> getBomCostSingleLayer(@Valid @RequestParam @NotBlank String materialNo) {
+ public ResultVO> getBomCostSingleLayer(@Valid @RequestParam @NotBlank String materialNo) {
return ResultVO.success(productCostAnalysisService.getBomCostSingleLayer(materialNo));
}
+ @GetMapping("exportBomCostSingleLayer")
+ @ApiOperation("导出Bom组件成本(单层)")
+ public void exportBomCostSingleLayer(HttpServletResponse response
+ , @Valid @RequestParam @NotBlank String materialNo) throws IOException {
+ List vos = productCostAnalysisService.getBomCostSingleLayer(materialNo);
+ //List vos = new ArrayList<>();
+ //BomCostSingleLayerVO vo = new BomCostMultilayerVO()
+ // .setMaterialNo("2100032594")
+ // .setMaterialDesc("六角头螺栓 M20×55 GB/T 5783 全螺纹 8.8级 镀锌 耐96H盐雾")
+ // .setMaterialCategoryName("梅花弹性联轴器")
+ // .setMaterialUnit("SET")
+ // .setPrice(new BigDecimal("1000.00"))
+ // .setNum(new BigDecimal(100))
+ // .setTotalNum(new BigDecimal("10000"))
+ // .setTotalCost(new BigDecimal("2299.3814"));
+ //vos.add(vo);
+
+ ExcelUtil.export(response, vos, BomCostSingleLayerVO.class, materialNo + "组件成本(单层)", materialNo);
+ }
+
@GetMapping("getBomCostMultilayer")
@ApiOperation("获取Bom组件成本(多层)")
public ResultVO getBomCostMultilayer(@Valid @RequestParam @NotBlank String materialNo) {
return ResultVO.success(productCostAnalysisService.getBomCostMultilayer(materialNo));
}
+ @GetMapping("exportBomCostMultilayer")
+ @ApiOperation("导出Bom组件成本(多层)")
+ public void exportBomCostMultilayer(HttpServletResponse response
+ , @Valid @RequestParam @NotBlank String materialNo) throws IOException {
+ BomCostMultilayerVO vo = productCostAnalysisService.getBomCostMultilayer(materialNo);
+ List vos = new ArrayList<>();
+ vos.add(vo);
+ vo.getChildren().forEach(c -> add(c, vos));
+
+ ExcelUtil.export(response, vos, BomCostMultilayerVO.class, materialNo + "组件成本(多层)", materialNo);
+ }
+
+ private void add(BomCostMultilayerVO child, List vos) {
+ vos.add(child);
+ child.getChildren().forEach(c -> add(c, vos));
+ }
+
@GetMapping("getMaterialComposition")
@ApiOperation("查询材料组成分析(物料属性)")
public ResultVO getMaterialComposition(@Valid @RequestParam @NotBlank String materialNo) {
diff --git a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/BomCostMultilayerVO.java b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/BomCostMultilayerVO.java
index f6a470b4..ef6a1b34 100644
--- a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/BomCostMultilayerVO.java
+++ b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/BomCostMultilayerVO.java
@@ -1,15 +1,17 @@
package com.nflg.product.technology.pojo.vo;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.nflg.product.base.core.config.BigDecimalSerializer;
+import cn.idev.excel.annotation.ExcelIgnore;
+import cn.idev.excel.annotation.ExcelProperty;
+import cn.idev.excel.annotation.write.style.*;
+import cn.idev.excel.enums.poi.HorizontalAlignmentEnum;
+import cn.idev.excel.enums.poi.VerticalAlignmentEnum;
+import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
-import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
@@ -20,68 +22,20 @@ import java.util.List;
@Data
@Accessors(chain = true)
@ApiModel(value = "com-nflg-product-technology-pojo-vo-BomCostMultilayerVO")
-public class BomCostMultilayerVO implements Serializable {
+@HeadStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER)
+@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.RIGHT, verticalAlignment = VerticalAlignmentEnum.CENTER)
+@HeadFontStyle(fontHeightInPoints = 10)
+@ContentFontStyle(fontHeightInPoints = 10)
+public class BomCostMultilayerVO extends BomCostSingleLayerVO implements Serializable {
- @ApiModelProperty("物料编码")
- private String materialNo;
-
- @ApiModelProperty("物料描述")
- private String materialDesc;
-
- @ApiModelProperty("物料类别")
- private String materialCategoryName;
-
- @ApiModelProperty("单位")
- private String materialUnit;
-
- @ApiModelProperty("单件成本")
- @JsonFormat(pattern = "#.##")
- @JsonSerialize(using = BigDecimalSerializer.class)
- private BigDecimal price;
-
- @ApiModelProperty("单层数量")
- private BigDecimal num;
-
- @ApiModelProperty("累乘数量")
- private BigDecimal totalNum;
-
- @ApiModelProperty("总成本")
- @JsonFormat(pattern = "#.##")
- @JsonSerialize(using = BigDecimalSerializer.class)
- private BigDecimal totalCost;
-
- @ApiModelProperty("单件材料成本")
- private String materialCost = "-";
-
- @ApiModelProperty("材料成本")
- private String totalMaterialCost = "-";
-
- @ApiModelProperty("单件油漆成本")
- private String paintCost = "-";
-
- @ApiModelProperty("油漆成本")
- private String totalPaintCost = "-";
-
- @ApiModelProperty("单件标准人工工资")
- private String directManualProductionCost = "-";
-
- @ApiModelProperty("标准人工工资")
- private String totalDirectManualProductionCost = "-";
-
- @ApiModelProperty("单件辅助费用")
- private String auxiliaryManufacturingCost = "-";
-
- @ApiModelProperty("辅助费用")
- private String totalAuxiliaryManufacturingCost = "-";
+ @ApiModelProperty("层级")
+ @JsonIgnore
+ @ExcelProperty(value = "层级", index = 0)
+ @ColumnWidth(5)
+ @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER)
+ private Integer level;
@ApiModelProperty("子物料列表")
+ @ExcelIgnore
private List children = new ArrayList<>();
-
- @ApiModelProperty("物料行id")
- private Long materialRowId;
-
- @ApiModelProperty("是否有下级")
- private boolean hasChildren = false;
-
- private String relCategoryCode;
}
diff --git a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/BomCostSingleLayerVO.java b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/BomCostSingleLayerVO.java
index 6f2ac1f6..fe7e7435 100644
--- a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/BomCostSingleLayerVO.java
+++ b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/BomCostSingleLayerVO.java
@@ -1,5 +1,11 @@
package com.nflg.product.technology.pojo.vo;
+import cn.idev.excel.annotation.ExcelIgnore;
+import cn.idev.excel.annotation.ExcelProperty;
+import cn.idev.excel.annotation.format.NumberFormat;
+import cn.idev.excel.annotation.write.style.*;
+import cn.idev.excel.enums.poi.HorizontalAlignmentEnum;
+import cn.idev.excel.enums.poi.VerticalAlignmentEnum;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.nflg.product.base.core.config.BigDecimalSerializer;
@@ -18,53 +24,110 @@ import java.math.BigDecimal;
@Data
@Accessors(chain = true)
@ApiModel(value = "com-nflg-product-technology-pojo-vo-BomCostSingleLayerVO")
+@HeadStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER)
+@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.RIGHT, verticalAlignment = VerticalAlignmentEnum.CENTER)
+@HeadFontStyle(fontHeightInPoints = 10)
+@ContentFontStyle(fontHeightInPoints = 10)
public class BomCostSingleLayerVO implements Serializable {
@ApiModelProperty("物料编码")
+ @ExcelProperty("物料编码")
+ @ColumnWidth(15)
+ @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER)
private String materialNo;
- @ApiModelProperty("单价")
- @JsonFormat(pattern = "#.##")
- @JsonSerialize(using = BigDecimalSerializer.class)
- private BigDecimal price;
-
- @ApiModelProperty("数量")
- private BigDecimal num;
-
- @ApiModelProperty("总价格")
- @JsonFormat(pattern = "#.##")
- @JsonSerialize(using = BigDecimalSerializer.class)
- private BigDecimal totalPrice;
-
@ApiModelProperty("物料描述")
+ @ExcelProperty("物料描述")
+ @ColumnWidth(50)
+ @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.LEFT, verticalAlignment = VerticalAlignmentEnum.CENTER)
private String materialDesc;
@ApiModelProperty("物料类别")
+ @ExcelProperty("物料类别")
+ @ColumnWidth(20)
+ @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.LEFT, verticalAlignment = VerticalAlignmentEnum.CENTER)
private String materialCategoryName;
@ApiModelProperty("单位")
+ @ExcelProperty("单位")
+ @ColumnWidth(5)
+ @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER)
private String materialUnit;
- @ApiModelProperty("版本号")
- private String version;
-
- @ApiModelProperty("材料总价")
- @JsonFormat(pattern = "#.##")
+ @ApiModelProperty("单件成本")
+ @JsonFormat(pattern = "0.##")
@JsonSerialize(using = BigDecimalSerializer.class)
- private BigDecimal materialTotalPrice;
+ @ExcelProperty("单件成本")
+ @ColumnWidth(10)
+ @NumberFormat("0.##")
+ private BigDecimal price;
- @ApiModelProperty("直接人工费用")
- @JsonFormat(pattern = "#.##")
- @JsonSerialize(using = BigDecimalSerializer.class)
- private BigDecimal laborCosts;
+ @ApiModelProperty("单层数量")
+ @ExcelProperty("单层数量")
+ @ColumnWidth(10)
+ private BigDecimal num;
- @ApiModelProperty("辅助制造成本")
- @JsonFormat(pattern = "#.##")
+ @ApiModelProperty("累乘数量")
+ @ExcelProperty("累乘数量")
+ @ColumnWidth(10)
+ private BigDecimal totalNum;
+
+ @ApiModelProperty("总成本")
+ @JsonFormat(pattern = "0.##")
@JsonSerialize(using = BigDecimalSerializer.class)
- private BigDecimal auxiliaryManufacturingCost;
+ @ExcelProperty("总成本")
+ @ColumnWidth(10)
+ @NumberFormat("0.##")
+ private BigDecimal totalCost;
+
+ @ApiModelProperty("单件材料成本")
+ @ExcelProperty("单件材料成本")
+ @ColumnWidth(10)
+ private String materialCost = "-";
+
+ @ApiModelProperty("材料成本")
+ @ExcelProperty("材料成本")
+ @ColumnWidth(10)
+ private String totalMaterialCost = "-";
+
+ @ApiModelProperty("单件油漆成本")
+ @ExcelProperty("单件油漆成本")
+ @ColumnWidth(10)
+ private String paintCost = "-";
+
+ @ApiModelProperty("油漆成本")
+ @ExcelProperty("油漆成本")
+ @ColumnWidth(10)
+ private String totalPaintCost = "-";
+
+ @ApiModelProperty("单件标准人工工资")
+ @ExcelProperty("单件标准人工工资")
+ @ColumnWidth(10)
+ private String directManualProductionCost = "-";
+
+ @ApiModelProperty("标准人工工资")
+ @ExcelProperty("标准人工工资")
+ @ColumnWidth(10)
+ private String totalDirectManualProductionCost = "-";
+
+ @ApiModelProperty("单件辅助费用")
+ @ExcelProperty("单件辅助费用")
+ @ColumnWidth(10)
+ private String auxiliaryManufacturingCost = "-";
+
+ @ApiModelProperty("辅助费用")
+ @ExcelProperty("辅助费用")
+ @ColumnWidth(10)
+ private String totalAuxiliaryManufacturingCost = "-";
@ApiModelProperty("物料行id")
+ @ExcelIgnore
private Long materialRowId;
+ @ApiModelProperty("是否有下级")
+ @ExcelIgnore
+ private boolean hasChildren = false;
+
+ @ExcelIgnore
private String relCategoryCode;
}
diff --git a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/MaterialCostVO.java b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/MaterialCostVO.java
index 87214aaa..6029b8e7 100644
--- a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/MaterialCostVO.java
+++ b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/MaterialCostVO.java
@@ -1,5 +1,11 @@
package com.nflg.product.technology.pojo.vo;
+import cn.idev.excel.annotation.ExcelIgnore;
+import cn.idev.excel.annotation.ExcelProperty;
+import cn.idev.excel.annotation.format.NumberFormat;
+import cn.idev.excel.annotation.write.style.*;
+import cn.idev.excel.enums.poi.HorizontalAlignmentEnum;
+import cn.idev.excel.enums.poi.VerticalAlignmentEnum;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
@@ -19,22 +25,37 @@ import java.math.BigDecimal;
@Data
@Accessors(chain = true)
@ApiModel(value = "com-nflg-product-technology-pojo-vo-MaterialCostVO")
+@HeadStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER)
+@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.RIGHT, verticalAlignment = VerticalAlignmentEnum.CENTER)
+@HeadFontStyle(fontHeightInPoints = 10)
+@ContentFontStyle(fontHeightInPoints = 10)
public class MaterialCostVO implements Serializable {
@ApiModelProperty("物料编号")
+ @ExcelProperty("物料编号")
+ @ColumnWidth(15)
+ @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER)
private String materialNo;
@ApiModelProperty("单价")
@JsonFormat(pattern = "#.##")
@JsonSerialize(using = BigDecimalSerializer.class)
+ @ExcelProperty("单价")
+ @ColumnWidth(10)
+ @NumberFormat("#.##")
private BigDecimal price = BigDecimal.ZERO;
@ApiModelProperty("数量")
+ @ExcelProperty("数量")
+ @ColumnWidth(10)
private BigDecimal num = BigDecimal.ZERO;
@ApiModelProperty("总价格")
- @JsonFormat(pattern = "#.##")
+ @JsonFormat(pattern = "0.##")
@JsonSerialize(using = BigDecimalSerializer.class)
+ @ExcelProperty("总价格")
+ @ColumnWidth(10)
+ @NumberFormat("0.##")
private BigDecimal totalPrice = BigDecimal.ZERO;
//public BigDecimal getTotalPrice() {
@@ -42,31 +63,48 @@ public class MaterialCostVO implements Serializable {
//}
@ApiModelProperty("物料描述")
+ @ExcelProperty("物料描述")
+ @ColumnWidth(60)
+ @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.LEFT, verticalAlignment = VerticalAlignmentEnum.CENTER)
private String materialDesc;
@ApiModelProperty("物料类别")
+ @ExcelProperty("物料类别")
+ @ColumnWidth(30)
+ @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.LEFT, verticalAlignment = VerticalAlignmentEnum.CENTER)
private String materialCategoryName;
@ApiModelProperty("单位")
+ @ExcelProperty("单位")
+ @ColumnWidth(10)
+ @ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER)
private String materialUnit;
@ApiModelProperty("库存")
+ @ExcelProperty("库存")
+ @ColumnWidth(10)
private BigDecimal inventory = BigDecimal.ZERO;
@ApiModelProperty("交期")
+ @ExcelProperty("交期")
+ @ColumnWidth(10)
private String leadTime;
@ApiModelProperty("物料行id")
+ @ExcelIgnore
private Long materialRowId;
+ @ExcelIgnore
private String relCategoryCode;
/**
* 是否外购件
*/
@JsonIgnore
+ @ExcelIgnore
private boolean isPurchasedParts;
@JsonIgnore
+ @ExcelIgnore
private String categoryCode;
}
diff --git a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/service/ProductCostAnalysisService.java b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/service/ProductCostAnalysisService.java
index aef8c3f0..3a68a320 100644
--- a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/service/ProductCostAnalysisService.java
+++ b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/service/ProductCostAnalysisService.java
@@ -1,6 +1,7 @@
package com.nflg.product.technology.service;
import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;
import com.nflg.product.technology.constant.BomConstant;
import com.nflg.product.technology.pojo.dto.EBomCostCacheDTO;
@@ -47,7 +48,7 @@ public class ProductCostAnalysisService {
@Resource
private BomCostService bomCostService;
- public List getBomCostSingleLayer(String materialNo) {
+ public List getBomCostSingleLayer(String materialNo) {
List datas = bomCostCalculateService.calculate(materialNo);
if (CollectionUtil.isEmpty(datas)) {
return Collections.emptyList();
@@ -58,7 +59,7 @@ public class ProductCostAnalysisService {
vo.setTotalNum(BigDecimal.ONE);
vo.setHasChildren(true);
buildMultilayerChildren(parent.getRowId(), vo, materials, datas, false);
- return vo.getChildren();
+ return Convert.toList(BomCostSingleLayerVO.class, vo.getChildren());
}
public BomCostMultilayerVO getBomCostMultilayer(String materialNo) {
@@ -71,6 +72,7 @@ public class ProductCostAnalysisService {
BomCostMultilayerVO vo = new BomCostMultilayerVO();
vo.setMaterialNo(parent.getMaterialNo());
vo.setHasChildren(true);
+ vo.setLevel(1);
EBomDTO pm = materials.stream().filter(m -> StrUtil.equals(m.getMaterialNo(), parent.getMaterialNo())).findFirst().orElse(null);
if (Objects.nonNull(pm)) {
vo.setMaterialDesc(pm.getMaterialDesc());
@@ -104,6 +106,9 @@ public class ProductCostAnalysisService {
if (!StrUtil.equals(child.getProjectType(), BomConstant.PROJECT_TYPE_TEMPORARY)) {
BomCostMultilayerVO cvo = new BomCostMultilayerVO();
cvo.setMaterialNo(child.getMaterialNo());
+ if (Objects.nonNull(pvo.getLevel())) {
+ cvo.setLevel(pvo.getLevel() + 1);
+ }
EBomDTO cpm = materials.stream().filter(m -> StrUtil.equals(m.getMaterialNo(), child.getMaterialNo())).findFirst().orElse(null);
if (Objects.nonNull(cpm)) {
cvo.setMaterialDesc(cpm.getMaterialDesc());
diff --git a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/util/ExcelUtil.java b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/util/ExcelUtil.java
new file mode 100644
index 00000000..66afd3d5
--- /dev/null
+++ b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/util/ExcelUtil.java
@@ -0,0 +1,22 @@
+package com.nflg.product.technology.util;
+
+import cn.idev.excel.FastExcel;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.util.List;
+
+public class ExcelUtil {
+
+ public static void export(HttpServletResponse response, List data, Class> clazz, String fileName, String sheetName) throws IOException {
+ response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
+ fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
+ response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename*=utf-8''" + fileName + ".xlsx");
+ FastExcel.write(response.getOutputStream(), clazz)
+ .sheet(sheetName)
+ .doWrite(data);
+ }
+}