结构树查询接口 #9
+31
@@ -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<BomTreeInfoVO> bomTreeInfoVOS = bomTreeService.getBomTreeByMaterialNumber(materialNumber, versionNumber);
|
||||
return Result.OK(bomTreeInfoVOS);
|
||||
}
|
||||
}
|
||||
+14
@@ -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;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 标准成本明细表 Mapper 接口
|
||||
@@ -20,6 +22,18 @@ import org.apache.ibatis.annotations.Param;
|
||||
*/
|
||||
@Mapper
|
||||
public interface CostStandardDetailMapper extends BaseMapper<CostStandardDetail> {
|
||||
/**
|
||||
* 分页查询
|
||||
* @param page
|
||||
* @param wrapper
|
||||
* @return
|
||||
*/
|
||||
IPage<CostStandardDetailVO> pageList(@Param("page") Page<CostStandardDetailVO> page , @Param(Constants.WRAPPER) Wrapper<CostStandardDetailVO> wrapper);
|
||||
/**
|
||||
* 查询列表
|
||||
* @param wrapper
|
||||
* @return
|
||||
*/
|
||||
List<CostStandardDetailVO> queryListResult(@Param(Constants.WRAPPER) Wrapper<CostStandardDetailVO> wrapper);
|
||||
|
||||
}
|
||||
|
||||
+9
@@ -46,5 +46,14 @@
|
||||
ORDER BY c1.create_time desc
|
||||
|
||||
</select>
|
||||
<select id="queryListResult" resultMap="CostStandardDetailVOResultMap">
|
||||
select c1.*, c2.version_number, c2.version_status, c2.stage,c2.version_year
|
||||
from
|
||||
cost_standard_detail c1
|
||||
left join cost_standard_version c2 on c1.version_number_id = c2.id
|
||||
${ew.customSqlSegment}
|
||||
ORDER BY c1.create_time desc
|
||||
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
|
||||
+14
@@ -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<BomTreeInfoVO> getBomTreeByMaterialNumber(String materialNumber, String version_number);
|
||||
}
|
||||
+44
@@ -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<BomTreeInfoVO> getBomTreeByMaterialNumber(String materialNumber, String version_number) {
|
||||
QueryWrapper<CostStandardDetailVO> 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<CostStandardDetailVO> costStandardDetailVOS = costStandardDetailMapper.queryListResult(wrapper);
|
||||
List<BomTreeInfoVO> bomTreeInfoVOS = BomTreeBuilder.buildBomTree(costStandardDetailVOS);
|
||||
return bomTreeInfoVOS;
|
||||
}
|
||||
}
|
||||
+80
@@ -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<BomTreeInfoVO> buildBomTree(List<CostStandardDetailVO> sourceData) {
|
||||
List<BomTreeInfoVO> result = new ArrayList<>();
|
||||
if (sourceData == null || (sourceData != null && sourceData.size() < 1)) {
|
||||
return result;
|
||||
}
|
||||
//1.把BOM信息分成按照物料号分组
|
||||
Map<String, CostStandardDetailVO> materialMap = sourceData.stream().filter(s -> s.getMaterialNumber() != null).collect(Collectors.toMap(CostStandardDetailVO::getMaterialNumber, vo -> vo));
|
||||
//查找最顶端的父类节点
|
||||
Map<String, CostStandardDetailVO> parentDataMap = sourceData.stream().filter(s -> s.getParentMaterialNumber() == null).collect(Collectors.toMap(CostStandardDetailVO::getMaterialNumber, vo -> vo));
|
||||
//查找有父节点的子节点
|
||||
Map<String, List<CostStandardDetailVO>> childDataMap = sourceData.stream().filter(s -> s.getParentMaterialNumber() != null).collect(Collectors.groupingBy(CostStandardDetailVO::getParentMaterialNumber));
|
||||
//查找有父节点的子节点
|
||||
// //1.把BOM信息分成按照层级分组
|
||||
// Map<Integer, List<CostStandardDetailVO>> levelMap = sourceData.stream().filter(s -> s.getLevel() != null).collect(Collectors.groupingBy(CostStandardDetail::getLevel));
|
||||
// //2.对每层进行排序
|
||||
// for (Integer level : levelMap.keySet()) {
|
||||
// List<CostStandardDetailVO> levelList = levelMap.get(level);
|
||||
// List<CostStandardDetailVO> sortedCostDetails = levelList.stream().sorted(Comparator.comparing(CostStandardDetailVO::getSort)).collect(Collectors.toList());
|
||||
// levelMap.put(level, sortedCostDetails);
|
||||
// }
|
||||
// TreeMap<Integer, List<CostStandardDetailVO>> 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<String, CostStandardDetailVO> materialMap, Map<String, List<CostStandardDetailVO>> childDataMap, List<BomTreeInfoVO> result) {
|
||||
if (parentBomTreeInfoVO != null) {
|
||||
//4.根据物料号查找子节点
|
||||
List<CostStandardDetailVO> childs = childDataMap.get(parentBomTreeInfoVO.getMaterialNumber());
|
||||
//构造父节点下的bomtree结构数据
|
||||
List<BomTreeInfoVO> 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;
|
||||
}
|
||||
}
|
||||
+105
@@ -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<String> parentMaterialNumbers;
|
||||
/**
|
||||
* 子节点
|
||||
*/
|
||||
private List<BomTreeInfoVO> children;
|
||||
}
|
||||
Reference in New Issue
Block a user