|
|
@ -1,7 +1,9 @@ |
|
|
|
package com.ruoyi.system.service.impl; |
|
|
|
|
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.List; |
|
|
|
import java.math.BigDecimal; |
|
|
|
import java.math.RoundingMode; |
|
|
|
import java.util.*; |
|
|
|
import java.util.stream.Collectors; |
|
|
|
|
|
|
|
import cn.hutool.core.collection.CollectionUtil; |
|
|
|
import com.ruoyi.common.utils.DateUtils; |
|
|
@ -237,4 +239,44 @@ public class SysMakeorderBomServiceImpl implements ISysMakeorderBomService |
|
|
|
{ |
|
|
|
return sysMakeorderBomMapper.restoreSysMakeorderBomById(id); |
|
|
|
} |
|
|
|
|
|
|
|
/*根据时间区间获取订单成品bom*/ |
|
|
|
@Override |
|
|
|
public List<SysMakeorderBom> selectSysMakeorderBomListByDateRange(Date beginDate, Date endDate, Integer limit) { |
|
|
|
List<SysMakeorderBom> list = sysMakeorderBomMapper.selectByDateRange(beginDate, endDate, limit); |
|
|
|
// 合并相同料号的数据,并将订单量数相加
|
|
|
|
Map<String, SysMakeorderBom> mergedList = new HashMap<>(); |
|
|
|
for (SysMakeorderBom makeorderBom : list) { |
|
|
|
String materialNo = makeorderBom.getMaterialNo(); |
|
|
|
if (mergedList.containsKey(materialNo)) { |
|
|
|
SysMakeorderBom existingOrderBom = mergedList.get(materialNo); |
|
|
|
existingOrderBom.setOrderNum(existingOrderBom.getOrderNum() + makeorderBom.getOrderNum()); |
|
|
|
} else { |
|
|
|
mergedList.put(materialNo, makeorderBom); |
|
|
|
} |
|
|
|
} |
|
|
|
// 将Map的值转换为列表
|
|
|
|
List<SysMakeorderBom> result = new ArrayList<>(mergedList.values()); |
|
|
|
|
|
|
|
// 根据需要应用限制条数
|
|
|
|
if (limit != null && limit > 0) { |
|
|
|
result = result.stream().limit(limit).collect(Collectors.toList()); |
|
|
|
} |
|
|
|
Integer totalNum = result.stream() |
|
|
|
.map(e -> Optional.ofNullable(e.getOrderNum()).orElse(0)) // 使用0作为orderNum的默认值
|
|
|
|
.mapToInt(Integer::intValue) |
|
|
|
.sum(); |
|
|
|
// 计算每个物料的百分比并格式化
|
|
|
|
for (SysMakeorderBom material : result) { |
|
|
|
double percentage = ((double) material.getOrderNum() / totalNum) * 100; |
|
|
|
BigDecimal bd = new BigDecimal(percentage).setScale(2, RoundingMode.HALF_UP); |
|
|
|
material.setOrderRate(bd); |
|
|
|
} |
|
|
|
// 按占比从大到小排序
|
|
|
|
List<SysMakeorderBom> sortedMaterials = result.stream() |
|
|
|
.sorted(Comparator.comparing(SysMakeorderBom::getOrderRate, Comparator.reverseOrder())) |
|
|
|
.collect(Collectors.toList()); |
|
|
|
|
|
|
|
return sortedMaterials; |
|
|
|
} |
|
|
|
} |
|
|
|