Merge branch 'technology/rakor-w3' into technology-init-lhj1119

This commit is contained in:
曹鹏飞 2025-01-09 11:37:14 +08:00
commit 7723bfea96
7 changed files with 245 additions and 95 deletions

View File

@ -123,7 +123,11 @@
<version>2.2.8</version>
</dependency>
<dependency>
<groupId>cn.idev.excel</groupId>
<artifactId>fastexcel</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>

View File

@ -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<List<BomCostMultilayerVO>> getBomCostSingleLayer(@Valid @RequestParam @NotBlank String materialNo) {
public ResultVO<List<BomCostSingleLayerVO>> 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<BomCostSingleLayerVO> vos = productCostAnalysisService.getBomCostSingleLayer(materialNo);
//List<BomCostSingleLayerVO> 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<BomCostMultilayerVO> 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<BomCostMultilayerVO> 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<BomCostMultilayerVO> vos) {
vos.add(child);
child.getChildren().forEach(c -> add(c, vos));
}
@GetMapping("getMaterialComposition")
@ApiOperation("查询材料组成分析(物料属性)")
public ResultVO<MaterialCompositionVO> getMaterialComposition(@Valid @RequestParam @NotBlank String materialNo) {

View File

@ -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<BomCostMultilayerVO> children = new ArrayList<>();
@ApiModelProperty("物料行id")
private Long materialRowId;
@ApiModelProperty("是否有下级")
private boolean hasChildren = false;
private String relCategoryCode;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<BomCostMultilayerVO> getBomCostSingleLayer(String materialNo) {
public List<BomCostSingleLayerVO> getBomCostSingleLayer(String materialNo) {
List<EBomCostCacheDTO> 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());

View File

@ -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 <T> void export(HttpServletResponse response, List<T> 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);
}
}