|
|
@ -1,7 +1,10 @@ |
|
|
|
package com.mathvision.diet.service; |
|
|
|
|
|
|
|
import com.alibaba.excel.EasyExcel; |
|
|
|
import com.alibaba.excel.ExcelWriter; |
|
|
|
import com.alibaba.fastjson2.JSONArray; |
|
|
|
import com.alibaba.fastjson2.JSONObject; |
|
|
|
import com.alibaba.fastjson2.TypeReference; |
|
|
|
import com.google.common.collect.Lists; |
|
|
|
import com.google.common.collect.Maps; |
|
|
|
import com.google.common.collect.Range; |
|
|
@ -21,6 +24,7 @@ import org.springframework.stereotype.Service; |
|
|
|
import javax.annotation.Resource; |
|
|
|
import java.math.BigDecimal; |
|
|
|
import java.math.RoundingMode; |
|
|
|
import java.util.Collection; |
|
|
|
import java.util.HashMap; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Map; |
|
|
@ -305,6 +309,84 @@ public class MenuReportService { |
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
public void export(Menu menu, ExcelWriter excelWriter) { |
|
|
|
List<String> crows = menu.getCrows(); |
|
|
|
crows.forEach(crow -> { |
|
|
|
List<List<String>> headers = Lists.newArrayList(); |
|
|
|
headers.add(Lists.newArrayList("日均营养分析", "营养素")); |
|
|
|
headers.add(Lists.newArrayList("日均营养分析", "实际摄入")); |
|
|
|
headers.add(Lists.newArrayList("日均营养分析", "标准范围")); |
|
|
|
headers.add(Lists.newArrayList("日均营养分析", "UL值")); |
|
|
|
headers.add(Lists.newArrayList("日均营养分析", "溢出范围")); |
|
|
|
headers.add(Lists.newArrayList("日均营养分析", "评价")); |
|
|
|
|
|
|
|
JSONObject nutrition = nutrition(menu, 0, crow); |
|
|
|
JSONArray ingredient = nutrition.getJSONArray("ingredient"); |
|
|
|
if (ingredient == null) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
List<List<Object>> contents = ingredient.stream().map(x -> (JSONObject)x).map(x -> Lists.newArrayList(x.get("nutrition"), x.get("virtual"), x.get("standard"), x.get("ul"), x.get("overload"), x.get("conclusion"))).collect(Collectors.toList()); |
|
|
|
excelWriter.write(contents, EasyExcel.writerSheet("日均营养分析-" + crow).head(headers).build()); |
|
|
|
}); |
|
|
|
|
|
|
|
crows.forEach(crow -> { |
|
|
|
List<List<String>> headers = Lists.newArrayList(); |
|
|
|
headers.add(Lists.newArrayList("日均能量来源分布", "能量占比")); |
|
|
|
headers.add(Lists.newArrayList("日均能量来源分布", "要求(%)")); |
|
|
|
headers.add(Lists.newArrayList("日均能量来源分布", "实际摄入(%)")); |
|
|
|
headers.add(Lists.newArrayList("日均能量来源分布", "评价")); |
|
|
|
|
|
|
|
JSONArray energy = energy(0, crow, menuDishService.query(menu.getId(), menu.getVender())).getJSONArray("energy"); |
|
|
|
if (energy == null) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
List<List<Object>> contents = energy.stream().map(x -> (JSONObject)x).map(x -> Lists.newArrayList(x.get("name"), x.get("standard"), x.get("value"), x.get("conclusion"))).collect(Collectors.toList()); |
|
|
|
excelWriter.write(contents, EasyExcel.writerSheet("日均能量来源分布-" + crow).head(headers).build()); |
|
|
|
}); |
|
|
|
|
|
|
|
crows.forEach(crow -> { |
|
|
|
List<List<String>> headers = Lists.newArrayList(); |
|
|
|
headers.add(Lists.newArrayList("食材种类统计", "")); |
|
|
|
headers.add(Lists.newArrayList("食材种类统计", "种类名称")); |
|
|
|
headers.add(Lists.newArrayList("食材种类统计", "至少需要")); |
|
|
|
headers.add(Lists.newArrayList("食材种类统计", "当前含有")); |
|
|
|
headers.add(Lists.newArrayList("食材种类统计", "还需")); |
|
|
|
|
|
|
|
JSONObject types = types(menu, crow, menuDishService.query(menu.getId(), menu.getVender())); |
|
|
|
if (types == null) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
List<List<Object>> contents = Lists.newArrayList(); |
|
|
|
JSONArray weekRule = types.getJSONArray("weekRule"); |
|
|
|
if (weekRule != null) { |
|
|
|
contents.addAll(weekRule.stream().map(x -> (JSONObject)x).map(x -> Lists.newArrayList("周合计", x.get("name"), MeasurementType.quantity.name().equals(x.getString("measurement")) ? x.get("standard") + "种" : x.get("standard") + "克", x.get("supplied"), x.get("lack"))).collect(Collectors.toList())); |
|
|
|
} |
|
|
|
Map<Long, List<JSONObject>> dayRule = types.getObject("dayRule", new TypeReference<Map<Long, List<JSONObject>>>() {}); |
|
|
|
if (dayRule != null) { |
|
|
|
dayRule.forEach((k, v) -> contents.addAll(v.stream().map(x -> Lists.newArrayList("周" + x.getString("day"), x.get("name"), MeasurementType.quantity.name().equals(x.getString("measurement")) ? x.get("standard") + "种" : x.get("standard") + "克", x.get("supplied"), x.get("lack"))).collect(Collectors.toList()))); |
|
|
|
} |
|
|
|
excelWriter.write(contents, EasyExcel.writerSheet("食材种类统计-" + crow).head(headers).build()); |
|
|
|
}); |
|
|
|
|
|
|
|
crows.forEach(crow -> { |
|
|
|
List<List<String>> headers = Lists.newArrayList(); |
|
|
|
headers.add(Lists.newArrayList("烹饪方式统计", "")); |
|
|
|
headers.add(Lists.newArrayList("烹饪方式统计", "烹饪方式")); |
|
|
|
headers.add(Lists.newArrayList("烹饪方式统计", "菜品数量")); |
|
|
|
|
|
|
|
JSONObject polys = poly(crow, menuDishService.query(menu.getId(), menu.getVender())); |
|
|
|
if (polys == null) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
List<List<Object>> contents = polys.entrySet().stream().filter(kv -> !StringUtils.equals(kv.getKey(), "crow")).map(kv -> ((Map<Object, Object>)kv.getValue()).entrySet().stream().map(x -> Lists.newArrayList(kv.getKey().equals("0") ? "周合计" : "周" + kv.getKey(), x.getKey(), x.getValue())).collect(Collectors.toList())).flatMap(Collection::stream).collect(Collectors.toList()); |
|
|
|
excelWriter.write(contents, EasyExcel.writerSheet("烹饪方式统计-" + crow).head(headers).build()); |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
private JSONObject toEnergyContent(BigDecimal total, String key, BigDecimal value, Range<Integer> standard) { |
|
|
|
BigDecimal percentage = total.intValue() == 0 ? BigDecimal.ZERO : value.divide(total, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100)); |
|
|
|
percentage = percentage.setScale(2, RoundingMode.HALF_UP); |
|
|
|