修改营养周报

This commit is contained in:
qjq
2024-04-12 15:04:07 +08:00
parent 21856a348d
commit 861707acd5

View File

@ -6,11 +6,7 @@ import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.*;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
@ -435,7 +431,10 @@ public class MemberUserServiceImpl implements MemberUserService {
if(CollectionUtil.isNotEmpty(moIds)){
List<OrderDetailDO> orderDetailDOS = orderDetailService.selectListByOrderIds(moIds);
AppNutritionDayVo appNutritionDayVo = new AppNutritionDayVo();
Double reduce = orderDetailDOS.stream().map(OrderDetailDO::getHeat).reduce(0d, Double::sum);
Double reduce = orderDetailDOS.stream()
.filter(f-> ObjectUtil.isNotEmpty(f.getHeat()))
.map(m->BigDecimal.valueOf(m.getHeat()))
.reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, RoundingMode.HALF_UP).doubleValue();
appNutritionDayVo.setIntake(reduce);
appNutritionDayVo.setProposeIntake(proposeMorning);
appNutritionDayVo.setTimePeriod("1");
@ -445,7 +444,10 @@ public class MemberUserServiceImpl implements MemberUserService {
if(CollectionUtil.isNotEmpty(miIds)){
List<OrderDetailDO> orderDetailDOS = orderDetailService.selectListByOrderIds(miIds);
AppNutritionDayVo appNutritionDayVo = new AppNutritionDayVo();
Double reduce = orderDetailDOS.stream().map(OrderDetailDO::getHeat).reduce(0d, Double::sum);
Double reduce = orderDetailDOS.stream()
.filter(f-> ObjectUtil.isNotEmpty(f.getHeat()))
.map(m->BigDecimal.valueOf(m.getHeat()))
.reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, RoundingMode.HALF_UP).doubleValue();
appNutritionDayVo.setIntake(reduce);
appNutritionDayVo.setProposeIntake(proposeNoon);
appNutritionDayVo.setTimePeriod("2");
@ -455,7 +457,10 @@ public class MemberUserServiceImpl implements MemberUserService {
if(CollectionUtil.isNotEmpty(niIds)){
List<OrderDetailDO> orderDetailDOS = orderDetailService.selectListByOrderIds(niIds);
AppNutritionDayVo appNutritionDayVo = new AppNutritionDayVo();
Double reduce = orderDetailDOS.stream().map(OrderDetailDO::getHeat).reduce(0d, Double::sum);
Double reduce = orderDetailDOS.stream()
.filter(f-> ObjectUtil.isNotEmpty(f.getHeat()))
.map(m->BigDecimal.valueOf(m.getHeat()))
.reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, RoundingMode.HALF_UP).doubleValue();
appNutritionDayVo.setIntake(reduce);
appNutritionDayVo.setProposeIntake(proposeNight);
appNutritionDayVo.setTimePeriod("3");
@ -534,42 +539,36 @@ public class MemberUserServiceImpl implements MemberUserService {
//获取今天购买的菜品id
List<OrderDetailDO> orderDetailDOS = orderDetailMapper.selectList(new LambdaQueryWrapperX<OrderDetailDO>()
.inIfPresent(OrderDetailDO::getOrderId, collect));
Map<Long, List<OrderDetailDO>> collect2 = orderDetailDOS.stream().collect(Collectors.groupingBy(OrderDetailDO::getDishesId));
//热量求和统计方便 科学膳食小建议
double sum = orderDetailDOS
.stream().filter(vo->vo!=null && vo.getHeat()!=null)
.mapToDouble(OrderDetailDO::getHeat).sum();
//获取菜品id
List<Long> collect1 = orderDetailDOS.stream()
.map(OrderDetailDO::getDishesId)
.collect(Collectors.toList());
//获取菜品营养信息
List<DishesNutritionRespDTO> dishesList=new ArrayList<>();
collect1.forEach(x-> dishesList.addAll(dishesNutritionApil.getDishesList(x)));
//根据营养名称进行分组
Map<String, List<DishesNutritionRespDTO>> map = dishesList.stream()
.collect(Collectors.groupingBy(DishesNutritionRespDTO::getNutritionName));
List<DishesNutritionRespDTO> list=new ArrayList<>();
for (Map.Entry<String, List<DishesNutritionRespDTO>> entry : map.entrySet()) {
DishesNutritionRespDTO dto = new DishesNutritionRespDTO();
//计算当前菜品
List<DishesNutritionRespDTO> value = entry.getValue();
//当前营养的总和
BigDecimal sum1 = value.stream()
.map(x -> new BigDecimal(x.getNutritionNumber()))
// 使用reduce聚合函数,实现累加器
.reduce(BigDecimal.ZERO, BigDecimal::add);
//获取菜品总量总和
BigDecimal reduce = value.stream()
.map(x -> new BigDecimal(x.getDishesNumber()))
.reduce(BigDecimal.ZERO, BigDecimal::add);
//计算营养乘数 菜品总量/100g=营养乘数
BigDecimal divide = reduce.divide(BigDecimal.valueOf(100), 4, RoundingMode.HALF_UP);
BigDecimal bigDecimal = sum1.multiply(divide).setScale(0, RoundingMode.HALF_UP);
dto.setNutritionName(entry.getKey());
dto.setNutritionNumber(bigDecimal.toString());
list.add(dto);
for (Map.Entry<Long, List<OrderDetailDO>> entry1 : collect2.entrySet()) {
List<OrderDetailDO> value1 = entry1.getValue();
//获取菜品id
List<Long> collect1 = value1.stream()
.map(OrderDetailDO::getDishesId)
.collect(Collectors.toList());
//获取菜品营养信息
List<DishesNutritionRespDTO> dishesList=new ArrayList<>();
collect1.forEach(x-> dishesList.addAll(dishesNutritionApil.getDishesList(x)));
//根据营养名称进行分组
if(ObjUtil.isNotEmpty(dishesList)){
BigDecimal reduce = value1.stream()
.map(OrderDetailDO::getWeight)
.filter(ObjectUtil::isNotEmpty)
.reduce(BigDecimal.ZERO, BigDecimal::add);
Map<String, List<DishesNutritionRespDTO>> map = dishesList.stream()
.collect(Collectors.groupingBy(DishesNutritionRespDTO::getNutritionName));
for (Map.Entry<String, List<DishesNutritionRespDTO>> entry : map.entrySet()) {
DishesNutritionRespDTO dto = getDishesNutritionRespDTO(entry, reduce);
list.add(dto);
}
}
}
list = this.groupingBy(list);
this.computePercentage(list);
//转map
List<Map> maps = BeanUtil.copyToList(list, Map.class);
@ -587,10 +586,51 @@ public class MemberUserServiceImpl implements MemberUserService {
}
return maps;
}
private static DishesNutritionRespDTO getDishesNutritionRespDTO(Map.Entry<String, List<DishesNutritionRespDTO>> entry, BigDecimal reduce) {
DishesNutritionRespDTO dto = new DishesNutritionRespDTO();
//计算当前菜品
List<DishesNutritionRespDTO> value = entry.getValue();
//当前营养的总和
BigDecimal sum1 = new BigDecimal(value.get(0).getNutritionNumber());
//计算营养乘数 菜品总量/100g=营养乘数
BigDecimal divide = reduce.divide(BigDecimal.valueOf(100), 4, RoundingMode.HALF_UP);
BigDecimal bigDecimal = sum1.multiply(divide).setScale(0, RoundingMode.HALF_UP);
dto.setNutritionName(entry.getKey());
dto.setNutritionNumber(bigDecimal.toString());
return dto;
}
/**
* @Description: 根据营养名称进行分组计算值
* @Author: qjq
* @Date: 2024/4/12 下午2:44
* @return
*/
public List<DishesNutritionRespDTO> groupingBy(List<DishesNutritionRespDTO> list){
List<DishesNutritionRespDTO> list1=new ArrayList<>();
Map<String, List<DishesNutritionRespDTO>> collect = list.stream()
.collect(Collectors.groupingBy(DishesNutritionRespDTO::getNutritionName));
for (Map.Entry<String, List<DishesNutritionRespDTO>> entry : collect.entrySet()) {
DishesNutritionRespDTO dto=new DishesNutritionRespDTO();
BigDecimal reduce = entry.getValue()
.stream()
.filter(f -> ObjectUtil.isNotEmpty(f.getNutritionNumber()))
.map(m -> new BigDecimal(m.getNutritionNumber()))
.reduce(BigDecimal.ZERO, BigDecimal::add);
String key = entry.getKey();
dto.setNutritionName(key);
dto.setNutritionNumber(reduce.setScale(0, RoundingMode.HALF_UP).toString());
list1.add(dto);
}
return list1;
}
public void computePercentage(List<DishesNutritionRespDTO> list){
//获取所有营养数量
double sum1 = list.stream().mapToDouble(m -> Double.parseDouble(m.getNutritionNumber())).sum();
BigDecimal sum= BigDecimal.valueOf(sum1);
BigDecimal sum = list.stream()
.filter(f-> ObjectUtil.isNotEmpty(f.getNutritionNumber()))
.map(m-> new BigDecimal(m.getNutritionNumber()))
.reduce(BigDecimal.ZERO,BigDecimal::add);
BigDecimal bigDecimal = new BigDecimal(0);
for (int i = 0; i < list.size(); i++) {
if(i < (list.size()-1)){