From da69b887b075a52f43bbbf75ad1fe75ecde32f6d Mon Sep 17 00:00:00 2001 From: wangqiong <1322446236@qq.com> Date: Fri, 21 Jun 2024 11:07:42 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=93=E6=9E=84=E6=A0=91=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manage/controller/BomTreeController.java | 31 ++++++ .../mapper/CostStandardDetailMapper.java | 14 +++ .../mapper/xml/CostStandardDetailMapper.xml | 9 ++ .../cost/manage/service/BomTreeService.java | 14 +++ .../service/impl/BomTreeServiceImpl.java | 44 ++++++++ .../kn/cost/manage/util/BomTreeBuilder.java | 80 +++++++++++++ .../qomo/kn/cost/manage/vo/BomTreeInfoVO.java | 105 ++++++++++++++++++ 7 files changed, 297 insertions(+) create mode 100644 qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/controller/BomTreeController.java create mode 100644 qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/BomTreeService.java create mode 100644 qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/impl/BomTreeServiceImpl.java create mode 100644 qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/util/BomTreeBuilder.java create mode 100644 qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/vo/BomTreeInfoVO.java diff --git a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/controller/BomTreeController.java b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/controller/BomTreeController.java new file mode 100644 index 0000000..1a392ef --- /dev/null +++ b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/controller/BomTreeController.java @@ -0,0 +1,31 @@ +package com.zzsmart.qomo.kn.cost.manage.controller; + +import com.zzsmart.qomo.kn.cost.manage.service.BomTreeService; +import com.zzsmart.qomo.kn.cost.manage.vo.BomTreeInfoVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.api.vo.Result; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@Api(tags = "结构树查询") +@RestController +@RequestMapping("//bomTree") +@Slf4j +public class BomTreeController { + @Autowired + BomTreeService bomTreeService; + + @ApiOperation(value = "结构树查询", notes = "结构树查询") + @GetMapping(value = "/queryBomTree") + public Result queryBomTree(@RequestParam(name = "materialNumber", required = false) String materialNumber, @RequestParam(name = "versionNumber", required = false) String versionNumber) { + List bomTreeInfoVOS = bomTreeService.getBomTreeByMaterialNumber(materialNumber, versionNumber); + return Result.OK(bomTreeInfoVOS); + } +} diff --git a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/mapper/CostStandardDetailMapper.java b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/mapper/CostStandardDetailMapper.java index 916aead..d3b927a 100644 --- a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/mapper/CostStandardDetailMapper.java +++ b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/mapper/CostStandardDetailMapper.java @@ -10,6 +10,8 @@ import com.zzsmart.qomo.kn.cost.manage.vo.CostStandardDetailVO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** *

* 标准成本明细表 Mapper 接口 @@ -20,6 +22,18 @@ import org.apache.ibatis.annotations.Param; */ @Mapper public interface CostStandardDetailMapper extends BaseMapper { + /** + * 分页查询 + * @param page + * @param wrapper + * @return + */ IPage pageList(@Param("page") Page page , @Param(Constants.WRAPPER) Wrapper wrapper); + /** + * 查询列表 + * @param wrapper + * @return + */ + List queryListResult(@Param(Constants.WRAPPER) Wrapper wrapper); } diff --git a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/mapper/xml/CostStandardDetailMapper.xml b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/mapper/xml/CostStandardDetailMapper.xml index 2028f3d..424a63d 100644 --- a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/mapper/xml/CostStandardDetailMapper.xml +++ b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/mapper/xml/CostStandardDetailMapper.xml @@ -46,5 +46,14 @@ ORDER BY c1.create_time desc + diff --git a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/BomTreeService.java b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/BomTreeService.java new file mode 100644 index 0000000..61766c7 --- /dev/null +++ b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/BomTreeService.java @@ -0,0 +1,14 @@ +package com.zzsmart.qomo.kn.cost.manage.service; + +import com.zzsmart.qomo.kn.cost.manage.vo.BomTreeInfoVO; + +import java.util.List; + +public interface BomTreeService { + /** + * 根据物料号查询物料树 + * @param materialNumber + * @return + */ + List getBomTreeByMaterialNumber(String materialNumber, String version_number); +} diff --git a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/impl/BomTreeServiceImpl.java b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/impl/BomTreeServiceImpl.java new file mode 100644 index 0000000..154fc96 --- /dev/null +++ b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/impl/BomTreeServiceImpl.java @@ -0,0 +1,44 @@ +package com.zzsmart.qomo.kn.cost.manage.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.zzsmart.qomo.kn.cost.manage.entity.CostStandardDetail; +import com.zzsmart.qomo.kn.cost.manage.mapper.CostStandardDetailMapper; +import com.zzsmart.qomo.kn.cost.manage.service.BomTreeService; +import com.zzsmart.qomo.kn.cost.manage.util.BomTreeBuilder; +import com.zzsmart.qomo.kn.cost.manage.vo.BomTreeInfoVO; +import com.zzsmart.qomo.kn.cost.manage.vo.CostStandardDetailVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; + +@Service +public class BomTreeServiceImpl implements BomTreeService { + @Autowired + CostStandardDetailMapper costStandardDetailMapper; + + /** + * 根据物料号查询物料树 + * + * @param materialNumber + * @return + */ + @Override + public List getBomTreeByMaterialNumber(String materialNumber, String version_number) { + QueryWrapper wrapper = new QueryWrapper<>(); + //设置条件 + if (StrUtil.isNotEmpty(materialNumber)) { + // 物料号 + wrapper.like("c1.material_number", materialNumber); + } + if (StrUtil.isNotEmpty(version_number)) { + // 版本号 + wrapper.like("c2.version_number", version_number); + } + List costStandardDetailVOS = costStandardDetailMapper.queryListResult(wrapper); + List bomTreeInfoVOS = BomTreeBuilder.buildBomTree(costStandardDetailVOS); + return bomTreeInfoVOS; + } +} diff --git a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/util/BomTreeBuilder.java b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/util/BomTreeBuilder.java new file mode 100644 index 0000000..327111f --- /dev/null +++ b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/util/BomTreeBuilder.java @@ -0,0 +1,80 @@ +package com.zzsmart.qomo.kn.cost.manage.util; + +import com.zzsmart.qomo.kn.cost.manage.entity.CostStandardDetail; +import com.zzsmart.qomo.kn.cost.manage.vo.BomTreeInfoVO; +import com.zzsmart.qomo.kn.cost.manage.vo.CostStandardDetailVO; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class BomTreeBuilder { + public static List buildBomTree(List sourceData) { + List result = new ArrayList<>(); + if (sourceData == null || (sourceData != null && sourceData.size() < 1)) { + return result; + } + //1.把BOM信息分成按照物料号分组 + Map materialMap = sourceData.stream().filter(s -> s.getMaterialNumber() != null).collect(Collectors.toMap(CostStandardDetailVO::getMaterialNumber, vo -> vo)); + //查找最顶端的父类节点 + Map parentDataMap = sourceData.stream().filter(s -> s.getParentMaterialNumber() == null).collect(Collectors.toMap(CostStandardDetailVO::getMaterialNumber, vo -> vo)); + //查找有父节点的子节点 + Map> childDataMap = sourceData.stream().filter(s -> s.getParentMaterialNumber() != null).collect(Collectors.groupingBy(CostStandardDetailVO::getParentMaterialNumber)); + //查找有父节点的子节点 +// //1.把BOM信息分成按照层级分组 +// Map> levelMap = sourceData.stream().filter(s -> s.getLevel() != null).collect(Collectors.groupingBy(CostStandardDetail::getLevel)); +// //2.对每层进行排序 +// for (Integer level : levelMap.keySet()) { +// List levelList = levelMap.get(level); +// List sortedCostDetails = levelList.stream().sorted(Comparator.comparing(CostStandardDetailVO::getSort)).collect(Collectors.toList()); +// levelMap.put(level, sortedCostDetails); +// } +// TreeMap> levelTreeMap = new TreeMap<>(levelMap); + //3.构建BOM树 + if (parentDataMap.size() > 0) { + for (CostStandardDetailVO parent : parentDataMap.values()) { + BomTreeInfoVO parentBomTreeInfoVO = costStandardDetailChangeToBomTreeInfoVO(parent); + parentBomTreeInfoVO = loopFindChildrenBuild(parentBomTreeInfoVO, materialMap, childDataMap, result); + if (parentBomTreeInfoVO != null) { + result.add(parentBomTreeInfoVO); + } + } + } + materialMap = null; + parentDataMap = null; + childDataMap = null; + return result; + } + + private static BomTreeInfoVO loopFindChildrenBuild(BomTreeInfoVO parentBomTreeInfoVO, Map materialMap, Map> childDataMap, List result) { + if (parentBomTreeInfoVO != null) { + //4.根据物料号查找子节点 + List childs = childDataMap.get(parentBomTreeInfoVO.getMaterialNumber()); + //构造父节点下的bomtree结构数据 + List children = new ArrayList<>(); + for (int j = 0; childs != null && childs.size() > 0 && j < childs.size(); j++) { + CostStandardDetailVO child = childs.get(j); + BomTreeInfoVO childBomTreeInfoVO = costStandardDetailChangeToBomTreeInfoVO(child); + childBomTreeInfoVO = loopFindChildrenBuild(childBomTreeInfoVO, materialMap, childDataMap, result); + children.add(childBomTreeInfoVO); + } + //对象的子节点进行排序(升序) + children = children.stream().sorted(Comparator.comparing(BomTreeInfoVO::getSort, Comparator.nullsLast(Comparator.naturalOrder()))).collect(Collectors.toList()); + parentBomTreeInfoVO.setChildren(children); + } + return parentBomTreeInfoVO; + } + + /** + * 把单行查询的数据转换为BomTreeInfoVO + * + * @param parent + * @return + */ + static BomTreeInfoVO costStandardDetailChangeToBomTreeInfoVO(CostStandardDetail parent) { + BomTreeInfoVO bomTreeInfoVO = BomTreeInfoVO.builder().materialNumber(parent.getMaterialNumber()).materialName(parent.getMaterialName()).level(parent.getLevel()).parentMaterialNumber(parent.getParentMaterialNumber()).quantity(parent.getDosage()).unit(parent.getUnit()).auxiliaryCost(parent.getAuxiliaryCost()).equipCost(parent.getEquipConsumeCost()).otherCost(parent.getOtherCost()).laborCost(parent.getLaborCost()).accumulatedEquipCost(parent.getTotalEquipConsumeCost()).accumulatedOtherCost(parent.getTotalOtherCost()).accumulatedLaborCost(parent.getTotalLaborCost()).accumulatedMaterialCost(parent.getAuxiliaryCost()).accumulatedFuelCost(parent.getTotalEuipDepreciationCost()).sort(parent.getSort()).build(); + return bomTreeInfoVO; + } +} diff --git a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/vo/BomTreeInfoVO.java b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/vo/BomTreeInfoVO.java new file mode 100644 index 0000000..85d6165 --- /dev/null +++ b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/vo/BomTreeInfoVO.java @@ -0,0 +1,105 @@ +package com.zzsmart.qomo.kn.cost.manage.vo; + +import lombok.Builder; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +@Data +@Builder +public class BomTreeInfoVO { + /** + * 物料号 + */ + private String materialNumber; + /** + * 父类物料号 + */ + private String parentMaterialNumber; + /** + * 物料名称 + */ + private String materialName; + /** + * 数量 + */ + private double quantity; + /** + * 单位 + */ + private String unit; + /** + * 层级 + */ + private Integer level; + /** + * 序号 + */ + private Integer sort; + /** + * 本阶标准成本 + */ + private BigDecimal standardCost; + /** + * 本阶物料成本 + */ + private BigDecimal materialCost; + /** + * 本阶人工成本 + */ + private BigDecimal laborCost; + /** + * 本阶设备成本 + */ + private BigDecimal equipCost; + /** + * 本阶燃动成本 + */ + private BigDecimal fuelCost; + /** + * 本阶辅料成本 + */ + private BigDecimal auxiliaryCost; + /** + * 本阶其他成本 + */ + private BigDecimal otherCost; + /** + * 累计标准成本 + */ + private BigDecimal accumulatedStandardCost; + /** + * 累计物料成本 + */ + private BigDecimal accumulatedMaterialCost; + /** + * 累计人工成本 + */ + private BigDecimal accumulatedLaborCost; + /** + * 累计设备成本 + */ + private BigDecimal accumulatedEquipCost; + /** + * 累计燃动成本 + */ + private BigDecimal accumulatedFuelCost; + + /** + * 累计辅料成本 + */ + private BigDecimal accumulatedAuxiliaryCost; + /** + * 累计其他成本 + */ + private BigDecimal accumulatedOtherCost; + /** + * 节点父类所有的物料编码 + */ + private List parentMaterialNumbers; + /** + * 子节点 + */ + private List children; +}