合并到主分支 #12

Merged
bgy merged 54 commits from bgy into master 2024-08-28 10:59:12 +00:00
7 changed files with 297 additions and 0 deletions
Showing only changes of commit da69b887b0 - Show all commits
@@ -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);
}
}
@@ -10,6 +10,8 @@ import com.zzsmart.qomo.kn.cost.manage.vo.CostStandardDetailVO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.util.List;
/** /**
* <p> * <p>
* 标准成本明细表 Mapper 接口 * 标准成本明细表 Mapper 接口
@@ -20,6 +22,18 @@ import org.apache.ibatis.annotations.Param;
*/ */
@Mapper @Mapper
public interface CostStandardDetailMapper extends BaseMapper<CostStandardDetail> { 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); 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);
} }
@@ -46,5 +46,14 @@
ORDER BY c1.create_time desc ORDER BY c1.create_time desc
</select> </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> </mapper>
@@ -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);
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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;
}