diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java index b3a580c9..2e4027ce 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java @@ -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 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 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 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 orderDetailDOS = orderDetailMapper.selectList(new LambdaQueryWrapperX() .inIfPresent(OrderDetailDO::getOrderId, collect)); + Map> 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 collect1 = orderDetailDOS.stream() - .map(OrderDetailDO::getDishesId) - .collect(Collectors.toList()); - //获取菜品营养信息 - List dishesList=new ArrayList<>(); - collect1.forEach(x-> dishesList.addAll(dishesNutritionApil.getDishesList(x))); - //根据营养名称进行分组 - Map> map = dishesList.stream() - .collect(Collectors.groupingBy(DishesNutritionRespDTO::getNutritionName)); List list=new ArrayList<>(); - for (Map.Entry> entry : map.entrySet()) { - DishesNutritionRespDTO dto = new DishesNutritionRespDTO(); - //计算当前菜品 - List 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> entry1 : collect2.entrySet()) { + List value1 = entry1.getValue(); + //获取菜品id + List collect1 = value1.stream() + .map(OrderDetailDO::getDishesId) + .collect(Collectors.toList()); + //获取菜品营养信息 + List 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> map = dishesList.stream() + .collect(Collectors.groupingBy(DishesNutritionRespDTO::getNutritionName)); + for (Map.Entry> entry : map.entrySet()) { + DishesNutritionRespDTO dto = getDishesNutritionRespDTO(entry, reduce); + list.add(dto); + } + } } + list = this.groupingBy(list); this.computePercentage(list); //转map List maps = BeanUtil.copyToList(list, Map.class); @@ -587,10 +586,51 @@ public class MemberUserServiceImpl implements MemberUserService { } return maps; } + + private static DishesNutritionRespDTO getDishesNutritionRespDTO(Map.Entry> entry, BigDecimal reduce) { + DishesNutritionRespDTO dto = new DishesNutritionRespDTO(); + //计算当前菜品 + List 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 groupingBy(List list){ + List list1=new ArrayList<>(); + Map> collect = list.stream() + .collect(Collectors.groupingBy(DishesNutritionRespDTO::getNutritionName)); + for (Map.Entry> 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 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)){