优化标准成本计算功能
This commit is contained in:
-37
@@ -1,37 +0,0 @@
|
|||||||
package com.zzsmart.qomo.kn.cost.manage.mapper;
|
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Constants;
|
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
|
||||||
import org.apache.ibatis.annotations.Param;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>
|
|
||||||
* 标准成本明细表 Mapper 接口
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* @author
|
|
||||||
* @since 2024-06-20
|
|
||||||
*/
|
|
||||||
@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);
|
|
||||||
|
|
||||||
}
|
|
||||||
-59
@@ -1,59 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
|
||||||
<mapper namespace="com.zzsmart.qomo.kn.cost.manage.mapper.CostStandardDetailMapper">
|
|
||||||
|
|
||||||
<!-- 通用查询映射结果 -->
|
|
||||||
<resultMap id="CostStandardDetailVOResultMap" type="com.zzsmart.qomo.kn.cost.manage.vo.CostStandardDetailVO">
|
|
||||||
<id column="id" property="id" />
|
|
||||||
<result column="material_number" property="materialNumber" />
|
|
||||||
<result column="material_name" property="materialName" />
|
|
||||||
<result column="parent_material_number" property="parentMaterialNumber" />
|
|
||||||
<result column="version_number_id" property="versionNumberId" />
|
|
||||||
<result column="version_number" property="versionNumber" />
|
|
||||||
<result column="level" property="level" />
|
|
||||||
<result column="figure_number" property="figureNumber" />
|
|
||||||
<result column="dosage" property="dosage" />
|
|
||||||
<result column="unit" property="unit" />
|
|
||||||
<result column="specification" property="specification" />
|
|
||||||
<result column="bom_cost" property="bomCost" />
|
|
||||||
<result column="packing_cost" property="packingCost" />
|
|
||||||
<result column="auxiliary_cost" property="auxiliaryCost" />
|
|
||||||
<result column="labor_cost" property="laborCost" />
|
|
||||||
<result column="euip_depreciation_cost" property="euipDepreciationCost" />
|
|
||||||
<result column="equip_consume_cost" property="equipConsumeCost" />
|
|
||||||
<result column="hydroelectricity_cost" property="hydroelectricityCost" />
|
|
||||||
<result column="other_cost" property="otherCost" />
|
|
||||||
<result column="trail_cost" property="trailCost" />
|
|
||||||
<result column="manufacture_cost" property="manufactureCost" />
|
|
||||||
<result column="total_labor_cost" property="totalLaborCost" />
|
|
||||||
<result column="total_equip_consume_cost" property="totalEquipConsumeCost" />
|
|
||||||
<result column="total_euip_depreciation_cost" property="totalEuipDepreciationCost" />
|
|
||||||
<result column="total_hydroelectricity_cost" property="totalHydroelectricityCost" />
|
|
||||||
<result column="total_other_cost" property="totalOtherCost" />
|
|
||||||
<result column="create_by" property="createBy" />
|
|
||||||
<result column="create_time" property="createTime" />
|
|
||||||
<result column="update_by" property="updateBy" />
|
|
||||||
<result column="update_time" property="updateTime" />
|
|
||||||
<result column="remark" property="remark" />
|
|
||||||
<result column="sort" property="sort" />
|
|
||||||
</resultMap>
|
|
||||||
<select id="pageList" resultMap="CostStandardDetailVOResultMap">
|
|
||||||
select c1.*, c2.version_number, c2.version_status, c2.stage,c2.version_year
|
|
||||||
from
|
|
||||||
app_scene_cost_standard_detail c1
|
|
||||||
left join app_scene_cost_standard_version c2 on c1.version_number_id = c2.id
|
|
||||||
${ew.customSqlSegment}
|
|
||||||
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
|
|
||||||
app_scene_cost_standard_detail c1
|
|
||||||
left join app_scene_cost_standard_version c2 on c1.version_number_id = c2.id
|
|
||||||
${ew.customSqlSegment}
|
|
||||||
ORDER BY c1.create_time desc
|
|
||||||
|
|
||||||
</select>
|
|
||||||
|
|
||||||
</mapper>
|
|
||||||
+9
-14
@@ -490,7 +490,7 @@ public class StandardCostService {
|
|||||||
List<AppSceneCostResultValue> appSceneCostResultValues = materialNoMap.get(key);
|
List<AppSceneCostResultValue> appSceneCostResultValues = materialNoMap.get(key);
|
||||||
//按照费用类别进行分组
|
//按照费用类别进行分组
|
||||||
Map<String, List<AppSceneCostResultValue>> costTypeMap = appSceneCostResultValues.stream().filter(s -> s.getCostType() != null).collect(Collectors.groupingBy(AppSceneCostResultValue::getCostType));
|
Map<String, List<AppSceneCostResultValue>> costTypeMap = appSceneCostResultValues.stream().filter(s -> s.getCostType() != null).collect(Collectors.groupingBy(AppSceneCostResultValue::getCostType));
|
||||||
//本阶标准成本
|
//【本阶标准成本】
|
||||||
BigDecimal currentCost = new BigDecimal("0.0");
|
BigDecimal currentCost = new BigDecimal("0.0");
|
||||||
//1.本阶物料成本
|
//1.本阶物料成本
|
||||||
BigDecimal materialCost = new BigDecimal("0.0");
|
BigDecimal materialCost = new BigDecimal("0.0");
|
||||||
@@ -606,7 +606,7 @@ public class StandardCostService {
|
|||||||
}
|
}
|
||||||
//3.计算出所有的单个物料的累计标准成本
|
//3.计算出所有的单个物料的累计标准成本
|
||||||
List<AppSceneCostResultValue> standardCostList = standardCostService.iAppSceneCostResultValueService.getResultValueByTopMaterialNo(topMaterialCode, taskType, flowInstanceId);
|
List<AppSceneCostResultValue> standardCostList = standardCostService.iAppSceneCostResultValueService.getResultValueByTopMaterialNo(topMaterialCode, taskType, flowInstanceId);
|
||||||
//TODO 优化累计成本的计算
|
//【累计成本】的计算
|
||||||
totalCountCost(standardCostList, topMaterialCode, taskType, taskCode, flowInstanceId);
|
totalCountCost(standardCostList, topMaterialCode, taskType, taskCode, flowInstanceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -631,6 +631,7 @@ public class StandardCostService {
|
|||||||
//循环计算出当前节点的累计成本
|
//循环计算出当前节点的累计成本
|
||||||
String costDetail = oldAppSceneCostResultValue.getCostDetail();
|
String costDetail = oldAppSceneCostResultValue.getCostDetail();
|
||||||
//查询当前节点各个类型的成本
|
//查询当前节点各个类型的成本
|
||||||
|
BigDecimal totalMaterialCost = new BigDecimal(0);
|
||||||
BigDecimal totalLabourCost = new BigDecimal(0);
|
BigDecimal totalLabourCost = new BigDecimal(0);
|
||||||
BigDecimal totalEquipmentCost = new BigDecimal(0);
|
BigDecimal totalEquipmentCost = new BigDecimal(0);
|
||||||
BigDecimal totalSupplyMaterialCost = new BigDecimal(0);
|
BigDecimal totalSupplyMaterialCost = new BigDecimal(0);
|
||||||
@@ -638,15 +639,8 @@ public class StandardCostService {
|
|||||||
BigDecimal totalLogisticsCost = new BigDecimal(0);
|
BigDecimal totalLogisticsCost = new BigDecimal(0);
|
||||||
BigDecimal totalOtherCost = new BigDecimal(0);
|
BigDecimal totalOtherCost = new BigDecimal(0);
|
||||||
JSONObject costDetailJson = JSON.parseObject(costDetail);
|
JSONObject costDetailJson = JSON.parseObject(costDetail);
|
||||||
if (costDetailJson != null) {
|
TotalResultValue hourOrRateResultValue = loopCount(oldAppSceneCostResultValue, parentMaterialNoMap, totalMaterialCost, totalLabourCost, totalEquipmentCost, totalSupplyMaterialCost, totalDriveCost, totalLogisticsCost, totalOtherCost, totalCost);
|
||||||
totalLabourCost = costDetailJson.getBigDecimal(FeeTypeEnum.LaborCost.getCode());
|
costDetailJson.put(TotalCostEnum.TotalMaterialCost.getCode(), hourOrRateResultValue.getTotalMaterialCost());
|
||||||
totalEquipmentCost = costDetailJson.getBigDecimal(FeeTypeEnum.EquipmentFee.getCode());
|
|
||||||
totalSupplyMaterialCost = costDetailJson.getBigDecimal(FeeTypeEnum.SupplyMaterialFee.getCode());
|
|
||||||
totalDriveCost = costDetailJson.getBigDecimal(FeeTypeEnum.DriverFee.getCode());
|
|
||||||
totalLogisticsCost = costDetailJson.getBigDecimal(FeeTypeEnum.LogisticsFee.getCode());
|
|
||||||
totalOtherCost = costDetailJson.getBigDecimal(FeeTypeEnum.OtherFee.getCode());
|
|
||||||
}
|
|
||||||
TotalResultValue hourOrRateResultValue = loopCount(oldAppSceneCostResultValue, parentMaterialNoMap, totalLabourCost, totalEquipmentCost, totalSupplyMaterialCost, totalDriveCost, totalLogisticsCost, totalOtherCost, totalCost);
|
|
||||||
costDetailJson.put(TotalCostEnum.TotalLaborCost.getCode(), hourOrRateResultValue.getTotalLabourCost());
|
costDetailJson.put(TotalCostEnum.TotalLaborCost.getCode(), hourOrRateResultValue.getTotalLabourCost());
|
||||||
costDetailJson.put(TotalCostEnum.TotalEquipmentFee.getCode(), hourOrRateResultValue.getTotalEquipmentCost());
|
costDetailJson.put(TotalCostEnum.TotalEquipmentFee.getCode(), hourOrRateResultValue.getTotalEquipmentCost());
|
||||||
costDetailJson.put(TotalCostEnum.TotalSupplyMaterialFee.getCode(), hourOrRateResultValue.getTotalSupplyMaterialCost());
|
costDetailJson.put(TotalCostEnum.TotalSupplyMaterialFee.getCode(), hourOrRateResultValue.getTotalSupplyMaterialCost());
|
||||||
@@ -677,7 +671,7 @@ public class StandardCostService {
|
|||||||
* @param appSceneCostResultValue
|
* @param appSceneCostResultValue
|
||||||
* @param parentMaterialNoMap
|
* @param parentMaterialNoMap
|
||||||
*/
|
*/
|
||||||
private static TotalResultValue loopCount(AppSceneCostResultValue appSceneCostResultValue, Map<String, List<AppSceneCostResultValue>> parentMaterialNoMap, BigDecimal totalLabourCost, BigDecimal totalEquipmentCost, BigDecimal totalSupplyMaterialCost, BigDecimal totalDriveCost, BigDecimal totalLogisticsCost, BigDecimal totalOtherCost, BigDecimal totalCost) {
|
private static TotalResultValue loopCount(AppSceneCostResultValue appSceneCostResultValue, Map<String, List<AppSceneCostResultValue>> parentMaterialNoMap, BigDecimal totalMaterialCost, BigDecimal totalLabourCost, BigDecimal totalEquipmentCost, BigDecimal totalSupplyMaterialCost, BigDecimal totalDriveCost, BigDecimal totalLogisticsCost, BigDecimal totalOtherCost, BigDecimal totalCost) {
|
||||||
String marterialNo = appSceneCostResultValue.getMarterialNo();
|
String marterialNo = appSceneCostResultValue.getMarterialNo();
|
||||||
if (parentMaterialNoMap.containsKey(marterialNo)) {
|
if (parentMaterialNoMap.containsKey(marterialNo)) {
|
||||||
//获取当前节点的子节点并遍历
|
//获取当前节点的子节点并遍历
|
||||||
@@ -693,6 +687,7 @@ public class StandardCostService {
|
|||||||
if (appSceneCostResultValue1.getCostDetail() != null) {
|
if (appSceneCostResultValue1.getCostDetail() != null) {
|
||||||
JSONObject costDetailJson = JSON.parseObject(appSceneCostResultValue1.getCostDetail());
|
JSONObject costDetailJson = JSON.parseObject(appSceneCostResultValue1.getCostDetail());
|
||||||
if (costDetailJson != null) {
|
if (costDetailJson != null) {
|
||||||
|
totalMaterialCost = totalMaterialCost.add(costDetailJson.getBigDecimal(FeeTypeEnum.MaterialCost.getCode()));
|
||||||
totalLabourCost = totalLabourCost.add(costDetailJson.getBigDecimal(FeeTypeEnum.LaborCost.getCode()));
|
totalLabourCost = totalLabourCost.add(costDetailJson.getBigDecimal(FeeTypeEnum.LaborCost.getCode()));
|
||||||
totalEquipmentCost = totalEquipmentCost.add(costDetailJson.getBigDecimal(FeeTypeEnum.EquipmentFee.getCode()));
|
totalEquipmentCost = totalEquipmentCost.add(costDetailJson.getBigDecimal(FeeTypeEnum.EquipmentFee.getCode()));
|
||||||
totalSupplyMaterialCost = totalSupplyMaterialCost.add(costDetailJson.getBigDecimal(FeeTypeEnum.SupplyMaterialFee.getCode()));
|
totalSupplyMaterialCost = totalSupplyMaterialCost.add(costDetailJson.getBigDecimal(FeeTypeEnum.SupplyMaterialFee.getCode()));
|
||||||
@@ -704,11 +699,11 @@ public class StandardCostService {
|
|||||||
//判断当前子节点是否还有子节点
|
//判断当前子节点是否还有子节点
|
||||||
if (parentMaterialNoMap.containsKey(appSceneCostResultValue1.getMarterialNo())) {
|
if (parentMaterialNoMap.containsKey(appSceneCostResultValue1.getMarterialNo())) {
|
||||||
//如果还有子节点则继续递归
|
//如果还有子节点则继续递归
|
||||||
loopCount(appSceneCostResultValue1, parentMaterialNoMap, totalLabourCost, totalEquipmentCost, totalSupplyMaterialCost, totalDriveCost, totalLogisticsCost, totalOtherCost, totalCost);
|
loopCount(appSceneCostResultValue1, parentMaterialNoMap, totalMaterialCost, totalLabourCost, totalEquipmentCost, totalSupplyMaterialCost, totalDriveCost, totalLogisticsCost, totalOtherCost, totalCost);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
TotalResultValue hourOrRateResultValue = TotalResultValue.builder().totalLabourCost(totalLabourCost).totalEquipmentCost(totalEquipmentCost).totalSupplyMaterialCost(totalSupplyMaterialCost).totalDriveCost(totalDriveCost).totalLogisticsCost(totalLogisticsCost).totalOtherCost(totalOtherCost).totalCost(totalCost).build();
|
TotalResultValue hourOrRateResultValue = TotalResultValue.builder().totalMaterialCost(totalMaterialCost).totalLabourCost(totalLabourCost).totalEquipmentCost(totalEquipmentCost).totalSupplyMaterialCost(totalSupplyMaterialCost).totalDriveCost(totalDriveCost).totalLogisticsCost(totalLogisticsCost).totalOtherCost(totalOtherCost).totalCost(totalCost).build();
|
||||||
appSceneCostResultValue.setTotalValue(totalCost.toString());
|
appSceneCostResultValue.setTotalValue(totalCost.toString());
|
||||||
return hourOrRateResultValue;
|
return hourOrRateResultValue;
|
||||||
}
|
}
|
||||||
|
|||||||
+28
-25
@@ -2,7 +2,8 @@ package com.zzsmart.qomo.kn.cost.manage.service.impl;
|
|||||||
|
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.zzsmart.qomo.kn.cost.manage.mapper.CostStandardDetailMapper;
|
import com.zzsmart.qomo.kn.cost.manage.entity.AppSceneCostStandardDetail;
|
||||||
|
import com.zzsmart.qomo.kn.cost.manage.mapper.AppSceneCostStandardDetailMapper;
|
||||||
import com.zzsmart.qomo.kn.cost.manage.service.BomTreeService;
|
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.util.BomTreeBuilder;
|
||||||
import com.zzsmart.qomo.kn.cost.manage.vo.BomTreeInfoVO;
|
import com.zzsmart.qomo.kn.cost.manage.vo.BomTreeInfoVO;
|
||||||
@@ -21,7 +22,7 @@ import java.util.stream.Collectors;
|
|||||||
@Transactional
|
@Transactional
|
||||||
public class BomTreeServiceImpl implements BomTreeService {
|
public class BomTreeServiceImpl implements BomTreeService {
|
||||||
@Autowired
|
@Autowired
|
||||||
CostStandardDetailMapper costStandardDetailMapper;
|
AppSceneCostStandardDetailMapper costStandardDetailMapper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据物料号查询物料树
|
* 根据物料号查询物料树
|
||||||
@@ -31,35 +32,35 @@ public class BomTreeServiceImpl implements BomTreeService {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public List<BomTreeInfoVO> getBomTreeByMaterialNumber(String materialNumber, String version_number) {
|
public List<BomTreeInfoVO> getBomTreeByMaterialNumber(String materialNumber, String version_number) {
|
||||||
QueryWrapper<CostStandardDetailVO> wrapper = new QueryWrapper<>();
|
QueryWrapper<AppSceneCostStandardDetail> wrapper = new QueryWrapper<>();
|
||||||
//设置条件
|
//设置条件
|
||||||
if (StrUtil.isNotEmpty(materialNumber)) {
|
if (StrUtil.isNotEmpty(materialNumber)) {
|
||||||
// 物料号
|
// 物料号
|
||||||
wrapper.like("c1.material_number", materialNumber);
|
wrapper.like("material_number", materialNumber);
|
||||||
}
|
}
|
||||||
if (StrUtil.isNotEmpty(version_number)) {
|
if (StrUtil.isNotEmpty(version_number)) {
|
||||||
// 版本号
|
// 版本号
|
||||||
wrapper.like("c2.version_number", version_number);
|
wrapper.like("version_number", version_number);
|
||||||
}
|
}
|
||||||
//查询所有满足条件的父节点
|
//查询所有满足条件的父节点
|
||||||
List<CostStandardDetailVO> parentNodeList = costStandardDetailMapper.queryListResult(wrapper);
|
List<AppSceneCostStandardDetail> parentNodeList = costStandardDetailMapper.selectList(wrapper);
|
||||||
//所有子类节点
|
//所有子类节点
|
||||||
List<CostStandardDetailVO> childrenNodeList = new ArrayList<>();
|
List<AppSceneCostStandardDetail> childrenNodeList = new ArrayList<>();
|
||||||
Map<String, CostStandardDetailVO> parentDataMap = new TreeMap<>();
|
Map<String, AppSceneCostStandardDetail> parentDataMap = new TreeMap<>();
|
||||||
if (parentNodeList.size() > 0) {
|
if (parentNodeList.size() > 0) {
|
||||||
//父类结果只有1个
|
//父类结果只有1个
|
||||||
if (parentNodeList.size() == 1) {
|
if (parentNodeList.size() == 1) {
|
||||||
parentDataMap = parentNodeList.stream().collect(Collectors.toMap(CostStandardDetailVO::getMaterialNumber, vo -> vo));
|
parentDataMap = parentNodeList.stream().collect(Collectors.toMap(AppSceneCostStandardDetail::getMaterialNumber, vo -> vo));
|
||||||
} else {
|
} else {
|
||||||
//父类结果有多个(找出最上级节点)
|
//父类结果有多个(找出最上级节点)
|
||||||
Map<Integer, List<CostStandardDetailVO>> levelGroupMap = parentNodeList.stream().collect(Collectors.groupingBy(CostStandardDetailVO::getLevel));
|
Map<Integer, List<AppSceneCostStandardDetail>> levelGroupMap = parentNodeList.stream().collect(Collectors.groupingBy(AppSceneCostStandardDetail::getLevel));
|
||||||
TreeMap<Integer, List<CostStandardDetailVO>> levelTreeMap = new TreeMap<>(levelGroupMap);
|
TreeMap<Integer, List<AppSceneCostStandardDetail>> levelTreeMap = new TreeMap<>(levelGroupMap);
|
||||||
parentDataMap = levelTreeMap.firstEntry().getValue().stream().collect(Collectors.toMap(CostStandardDetailVO::getMaterialNumber, vo -> vo));
|
parentDataMap = levelTreeMap.firstEntry().getValue().stream().collect(Collectors.toMap(AppSceneCostStandardDetail::getMaterialNumber, vo -> vo));
|
||||||
}
|
}
|
||||||
//查询所有父节点下的子节点(即第二层叶子节点)
|
//查询所有父节点下的子节点(即第二层叶子节点)
|
||||||
List<CostStandardDetail> costStandardDetails = new ArrayList<>();
|
List<AppSceneCostStandardDetail> costStandardDetails = new ArrayList<>();
|
||||||
if (parentDataMap.size() > 0) {
|
if (parentDataMap.size() > 0) {
|
||||||
QueryWrapper<CostStandardDetail> wrapper1 = new QueryWrapper<>();
|
QueryWrapper<AppSceneCostStandardDetail> wrapper1 = new QueryWrapper<>();
|
||||||
int num = 0;
|
int num = 0;
|
||||||
for (String materialNumber1 : parentDataMap.keySet()) {
|
for (String materialNumber1 : parentDataMap.keySet()) {
|
||||||
num = num + 1;
|
num = num + 1;
|
||||||
@@ -72,26 +73,28 @@ public class BomTreeServiceImpl implements BomTreeService {
|
|||||||
costStandardDetails = costStandardDetailMapper.selectList(wrapper1);
|
costStandardDetails = costStandardDetailMapper.selectList(wrapper1);
|
||||||
}
|
}
|
||||||
//第三层叶子节点
|
//第三层叶子节点
|
||||||
List<CostStandardDetail> threeNodes = new ArrayList<>();
|
List<AppSceneCostStandardDetail> threeNodes = new ArrayList<>();
|
||||||
if (costStandardDetails != null && costStandardDetails.size() > 0) {
|
if (costStandardDetails != null && costStandardDetails.size() > 0) {
|
||||||
List<String> materialNoList = costStandardDetails.stream().map(CostStandardDetail::getMaterialNumber).collect(Collectors.toList());
|
List<String> materialNoList = costStandardDetails.stream().map(AppSceneCostStandardDetail::getMaterialNumber).collect(Collectors.toList());
|
||||||
QueryWrapper<CostStandardDetail> wrapper2 = new QueryWrapper<>();
|
QueryWrapper<AppSceneCostStandardDetail> wrapper2 = new QueryWrapper<>();
|
||||||
wrapper2.in("parent_material_number", materialNoList);
|
wrapper2.in("parent_material_number", materialNoList);
|
||||||
threeNodes = costStandardDetailMapper.selectList(wrapper2);
|
threeNodes = costStandardDetailMapper.selectList(wrapper2);
|
||||||
}
|
}
|
||||||
//把第二层叶子节点转化为bomtreeinfoVO对象集合
|
//把第二层叶子节点转化为bomtreeinfoVO对象集合
|
||||||
for (int i = 0; i < costStandardDetails.size(); i++) {
|
for (int i = 0; i < costStandardDetails.size(); i++) {
|
||||||
CostStandardDetail costStandardDetail = costStandardDetails.get(i);
|
AppSceneCostStandardDetail costStandardDetail = costStandardDetails.get(i);
|
||||||
CostStandardDetailVO vo = new CostStandardDetailVO();
|
// AppSceneCostStandardDetail vo = new AppSceneCostStandardDetail();
|
||||||
BeanUtils.copyProperties(costStandardDetail, vo);
|
// BeanUtils.copyProperties(costStandardDetail, vo);
|
||||||
childrenNodeList.add(vo);
|
// childrenNodeList.add(vo);
|
||||||
|
childrenNodeList.add(costStandardDetail);
|
||||||
}
|
}
|
||||||
//把第三层叶子节点转化为bomtreeinfoVO对象集合
|
//把第三层叶子节点转化为bomtreeinfoVO对象集合
|
||||||
for (int i = 0; i < threeNodes.size(); i++) {
|
for (int i = 0; i < threeNodes.size(); i++) {
|
||||||
CostStandardDetail costStandardDetail = threeNodes.get(i);
|
AppSceneCostStandardDetail costStandardDetail = threeNodes.get(i);
|
||||||
CostStandardDetailVO vo = new CostStandardDetailVO();
|
// CostStandardDetailVO vo = new CostStandardDetailVO();
|
||||||
BeanUtils.copyProperties(costStandardDetail, vo);
|
// BeanUtils.copyProperties(costStandardDetail, vo);
|
||||||
childrenNodeList.add(vo);
|
// childrenNodeList.add(vo);
|
||||||
|
childrenNodeList.add(costStandardDetail);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
List<BomTreeInfoVO> bomTreeInfoVOS = BomTreeBuilder.buildBomTree(childrenNodeList, parentDataMap);
|
List<BomTreeInfoVO> bomTreeInfoVOS = BomTreeBuilder.buildBomTree(childrenNodeList, parentDataMap);
|
||||||
|
|||||||
+15
-14
@@ -1,5 +1,6 @@
|
|||||||
package com.zzsmart.qomo.kn.cost.manage.util;
|
package com.zzsmart.qomo.kn.cost.manage.util;
|
||||||
|
|
||||||
|
import com.zzsmart.qomo.kn.cost.manage.entity.AppSceneCostStandardDetail;
|
||||||
import com.zzsmart.qomo.kn.cost.manage.vo.BomTreeInfoVO;
|
import com.zzsmart.qomo.kn.cost.manage.vo.BomTreeInfoVO;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -9,32 +10,32 @@ import java.util.Map;
|
|||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class BomTreeBuilder {
|
public class BomTreeBuilder {
|
||||||
public static List<BomTreeInfoVO> buildBomTree(List<CostStandardDetailVO> sourceData, Map<String, CostStandardDetailVO> parentDataMap) {
|
public static List<BomTreeInfoVO> buildBomTree(List<AppSceneCostStandardDetail> sourceData, Map<String, AppSceneCostStandardDetail> parentDataMap) {
|
||||||
List<BomTreeInfoVO> result = new ArrayList<>();
|
List<BomTreeInfoVO> result = new ArrayList<>();
|
||||||
if ((sourceData == null || (sourceData != null && sourceData.size() < 1)) && (parentDataMap == null || (parentDataMap != null && parentDataMap.size() < 1))) {
|
if ((sourceData == null || (sourceData != null && sourceData.size() < 1)) && (parentDataMap == null || (parentDataMap != null && parentDataMap.size() < 1))) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
//1.把BOM信息分成按照物料号分组
|
//1.把BOM信息分成按照物料号分组
|
||||||
Map<String, CostStandardDetailVO> materialMap = sourceData.stream().filter(s -> s.getMaterialNumber() != null).collect(Collectors.toMap(CostStandardDetailVO::getMaterialNumber, vo -> vo));
|
Map<String, AppSceneCostStandardDetail> materialMap = sourceData.stream().filter(s -> s.getMaterialNumber() != null).collect(Collectors.toMap(AppSceneCostStandardDetail::getMaterialNumber, vo -> vo));
|
||||||
//查找最顶端的父类节点
|
//查找最顶端的父类节点
|
||||||
if (parentDataMap == null || (parentDataMap != null && parentDataMap.size() < 1)) {
|
if (parentDataMap == null || (parentDataMap != null && parentDataMap.size() < 1)) {
|
||||||
parentDataMap = sourceData.stream().filter(s -> s.getParentMaterialNumber() == null).collect(Collectors.toMap(CostStandardDetailVO::getMaterialNumber, vo -> vo));
|
parentDataMap = sourceData.stream().filter(s -> s.getParentMaterialNumber() == null).collect(Collectors.toMap(AppSceneCostStandardDetail::getMaterialNumber, vo -> vo));
|
||||||
}
|
}
|
||||||
//查找有父节点的子节点
|
//查找有父节点的子节点
|
||||||
Map<String, List<CostStandardDetailVO>> childDataMap = sourceData.stream().filter(s -> s.getParentMaterialNumber() != null).collect(Collectors.groupingBy(CostStandardDetailVO::getParentMaterialNumber));
|
Map<String, List<AppSceneCostStandardDetail>> childDataMap = sourceData.stream().filter(s -> s.getParentMaterialNumber() != null).collect(Collectors.groupingBy(AppSceneCostStandardDetail::getParentMaterialNumber));
|
||||||
//查找有父节点的子节点
|
//查找有父节点的子节点
|
||||||
// //1.把BOM信息分成按照层级分组
|
// //1.把BOM信息分成按照层级分组
|
||||||
// Map<Integer, List<CostStandardDetailVO>> levelMap = sourceData.stream().filter(s -> s.getLevel() != null).collect(Collectors.groupingBy(CostStandardDetail::getLevel));
|
// Map<Integer, List<AppSceneCostStandardDetail>> levelMap = sourceData.stream().filter(s -> s.getLevel() != null).collect(Collectors.groupingBy(CostStandardDetail::getLevel));
|
||||||
// //2.对每层进行排序
|
// //2.对每层进行排序
|
||||||
// for (Integer level : levelMap.keySet()) {
|
// for (Integer level : levelMap.keySet()) {
|
||||||
// List<CostStandardDetailVO> levelList = levelMap.get(level);
|
// List<AppSceneCostStandardDetail> levelList = levelMap.get(level);
|
||||||
// List<CostStandardDetailVO> sortedCostDetails = levelList.stream().sorted(Comparator.comparing(CostStandardDetailVO::getSort)).collect(Collectors.toList());
|
// List<AppSceneCostStandardDetail> sortedCostDetails = levelList.stream().sorted(Comparator.comparing(AppSceneCostStandardDetail::getSort)).collect(Collectors.toList());
|
||||||
// levelMap.put(level, sortedCostDetails);
|
// levelMap.put(level, sortedCostDetails);
|
||||||
// }
|
// }
|
||||||
// TreeMap<Integer, List<CostStandardDetailVO>> levelTreeMap = new TreeMap<>(levelMap);
|
// TreeMap<Integer, List<AppSceneCostStandardDetail>> levelTreeMap = new TreeMap<>(levelMap);
|
||||||
//3.构建BOM树
|
//3.构建BOM树
|
||||||
if (parentDataMap.size() > 0) {
|
if (parentDataMap.size() > 0) {
|
||||||
for (CostStandardDetailVO parent : parentDataMap.values()) {
|
for (AppSceneCostStandardDetail parent : parentDataMap.values()) {
|
||||||
BomTreeInfoVO parentBomTreeInfoVO = costStandardDetailChangeToBomTreeInfoVO(parent);
|
BomTreeInfoVO parentBomTreeInfoVO = costStandardDetailChangeToBomTreeInfoVO(parent);
|
||||||
parentBomTreeInfoVO = loopFindChildrenBuild(parentBomTreeInfoVO, materialMap, childDataMap, result);
|
parentBomTreeInfoVO = loopFindChildrenBuild(parentBomTreeInfoVO, materialMap, childDataMap, result);
|
||||||
if (parentBomTreeInfoVO != null) {
|
if (parentBomTreeInfoVO != null) {
|
||||||
@@ -48,10 +49,10 @@ public class BomTreeBuilder {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static BomTreeInfoVO loopFindChildrenBuild(BomTreeInfoVO parentBomTreeInfoVO, Map<String, CostStandardDetailVO> materialMap, Map<String, List<CostStandardDetailVO>> childDataMap, List<BomTreeInfoVO> result) {
|
private static BomTreeInfoVO loopFindChildrenBuild(BomTreeInfoVO parentBomTreeInfoVO, Map<String, AppSceneCostStandardDetail> materialMap, Map<String, List<AppSceneCostStandardDetail>> childDataMap, List<BomTreeInfoVO> result) {
|
||||||
if (parentBomTreeInfoVO != null) {
|
if (parentBomTreeInfoVO != null) {
|
||||||
//4.根据物料号查找子节点
|
//4.根据物料号查找子节点
|
||||||
List<CostStandardDetailVO> childs = childDataMap.get(parentBomTreeInfoVO.getMaterialNumber());
|
List<AppSceneCostStandardDetail> childs = childDataMap.get(parentBomTreeInfoVO.getMaterialNumber());
|
||||||
if (childs != null && childs.size() > 0) {
|
if (childs != null && childs.size() > 0) {
|
||||||
parentBomTreeInfoVO.setHasChildren(true);
|
parentBomTreeInfoVO.setHasChildren(true);
|
||||||
} else {
|
} else {
|
||||||
@@ -60,7 +61,7 @@ public class BomTreeBuilder {
|
|||||||
//构造父节点下的bomtree结构数据
|
//构造父节点下的bomtree结构数据
|
||||||
List<BomTreeInfoVO> children = new ArrayList<>();
|
List<BomTreeInfoVO> children = new ArrayList<>();
|
||||||
for (int j = 0; childs != null && childs.size() > 0 && j < childs.size(); j++) {
|
for (int j = 0; childs != null && childs.size() > 0 && j < childs.size(); j++) {
|
||||||
CostStandardDetailVO child = childs.get(j);
|
AppSceneCostStandardDetail child = childs.get(j);
|
||||||
BomTreeInfoVO childBomTreeInfoVO = costStandardDetailChangeToBomTreeInfoVO(child);
|
BomTreeInfoVO childBomTreeInfoVO = costStandardDetailChangeToBomTreeInfoVO(child);
|
||||||
childBomTreeInfoVO = loopFindChildrenBuild(childBomTreeInfoVO, materialMap, childDataMap, result);
|
childBomTreeInfoVO = loopFindChildrenBuild(childBomTreeInfoVO, materialMap, childDataMap, result);
|
||||||
children.add(childBomTreeInfoVO);
|
children.add(childBomTreeInfoVO);
|
||||||
@@ -78,8 +79,8 @@ public class BomTreeBuilder {
|
|||||||
* @param parent
|
* @param parent
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
static BomTreeInfoVO costStandardDetailChangeToBomTreeInfoVO(CostStandardDetail parent) {
|
static BomTreeInfoVO costStandardDetailChangeToBomTreeInfoVO(AppSceneCostStandardDetail 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();
|
BomTreeInfoVO bomTreeInfoVO = BomTreeInfoVO.builder().materialNumber(parent.getMaterialNumber()).materialName(parent.getMaterialName()).level(parent.getLevel()).parentMaterialNumber(parent.getParentMaterialNumber()).quantity(parent.getDosage()).unit(parent.getUnit()).auxiliaryCost(parent.getSupplyMaterialCost()).equipCost(parent.getEquipmentCost()).otherCost(parent.getOtherCost()).laborCost(parent.getLaborCost()).accumulatedEquipCost(parent.getTotalEquipmentCost()).accumulatedOtherCost(parent.getTotalOtherCost()).accumulatedLaborCost(parent.getTotalLaborCost()).accumulatedMaterialCost(parent.getTotalMaterialCost()).accumulatedFuelCost(parent.getTotalDriveCost()).sort(parent.getSort()).build();
|
||||||
return bomTreeInfoVO;
|
return bomTreeInfoVO;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -5,6 +5,7 @@ import com.alibaba.excel.annotation.ExcelProperty;
|
|||||||
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
|
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
|
||||||
import com.alibaba.excel.write.metadata.style.WriteFont;
|
import com.alibaba.excel.write.metadata.style.WriteFont;
|
||||||
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
|
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
|
||||||
|
import com.zzsmart.qomo.kn.cost.manage.entity.AppSceneCostStandardDetail;
|
||||||
import org.apache.poi.ss.usermodel.*;
|
import org.apache.poi.ss.usermodel.*;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
@@ -124,7 +125,7 @@ public class EasyExcelUtil {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public static Set<String> getIncludeFields(Class<?> clazz) {
|
public static Set<String> getIncludeFields(Class<?> clazz) {
|
||||||
Field[] excelPropertyAnnotatedFields = getExcelPropertyAnnotatedFields(CostStandardDetail.class);
|
Field[] excelPropertyAnnotatedFields = getExcelPropertyAnnotatedFields(AppSceneCostStandardDetail.class);
|
||||||
Set<String> includeColumnFiledNames = new HashSet<String>();
|
Set<String> includeColumnFiledNames = new HashSet<String>();
|
||||||
for (int i = 0; i < excelPropertyAnnotatedFields.length; i++) {
|
for (int i = 0; i < excelPropertyAnnotatedFields.length; i++) {
|
||||||
includeColumnFiledNames.add(excelPropertyAnnotatedFields[i].getName());
|
includeColumnFiledNames.add(excelPropertyAnnotatedFields[i].getName());
|
||||||
|
|||||||
+4
@@ -19,6 +19,10 @@ import java.math.BigDecimal;
|
|||||||
* @Version: 1.0
|
* @Version: 1.0
|
||||||
*/
|
*/
|
||||||
public class TotalResultValue {
|
public class TotalResultValue {
|
||||||
|
/**
|
||||||
|
* 总物料成本
|
||||||
|
*/
|
||||||
|
private BigDecimal totalMaterialCost;
|
||||||
/**
|
/**
|
||||||
* 总人工成本
|
* 总人工成本
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user