caoyiwen 2 years ago
parent
commit
552663d22e
  1. 33
      diet-core/src/main/java/com/mathvision/diet/service/MenuReportService.java
  2. 9
      diet-web/src/main/java/com/mathvision/diet/controller/MenuReportController.java
  3. 33
      diet-web/src/main/resources/static/menu/report.html
  4. 37
      doc/menu/report.md

33
diet-core/src/main/java/com/mathvision/diet/service/MenuReportService.java

@ -11,6 +11,7 @@ import com.mathvision.diet.domian.RuleItemDTO;
import com.mathvision.diet.entity.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.commons.lang3.tuple.Triple;
import org.springframework.stereotype.Service;
@ -243,6 +244,38 @@ public class MenuReportService {
return result;
}
public JSONObject sugar(String crow, List<MenuDish> dishes) {
Map<String, Ingredient> ingredientMap = ingredientService.getFullByKeys(dishes.stream().filter(x -> CollectionUtils.isNotEmpty(x.getIngredient())).flatMap(x -> x.getIngredient().stream().map(MenuDishItemDTO::getKey)).collect(Collectors.toSet())).stream().collect(Collectors.toMap(Ingredient::getKey, v -> v));
Map<Long, BigDecimal> salt = dishes.stream().collect(Collectors.groupingBy(MenuDish::getDay)).entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey,
entry -> entry.getValue().stream().flatMap(dish -> dish.getIngredient().stream().filter(item -> item.getValue().containsKey(crow) && item.getValue().get(crow).doubleValue() > 0 && ingredientMap.containsKey(item.getKey())))
.flatMap(x -> ingredientMap.get(x.getKey()).getNutrient().entrySet().stream().map(n -> Pair.of(n.getKey(), n.getValue().multiply(x.getValue().get(crow)).divide(new BigDecimal(100), RoundingMode.HALF_UP))))
.filter(x -> StringUtils.equalsIgnoreCase("sodium", x.getKey()))
.map(x -> x.getValue().multiply(new BigDecimal("0.0025")))
.reduce(BigDecimal :: add)
.orElse(BigDecimal.ZERO)));
Map<Long, BigDecimal> sugar = dishes.stream().collect(Collectors.groupingBy(MenuDish::getDay)).entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey,
entry -> entry.getValue().stream().flatMap(dish -> dish.getIngredient().stream().filter(item -> item.getValue().containsKey(crow) && item.getValue().get(crow).doubleValue() > 0 && ingredientMap.containsKey(item.getKey()))
.map(x -> Pair.of(ingredientMap.get(x.getKey()), x.getValue()))
.filter(x -> StringUtils.equals("糖类", x.getKey().getType()))
.map(x -> x.getValue().values().stream().reduce(BigDecimal::add).orElse(BigDecimal.ZERO))
).reduce(BigDecimal::add).orElse(BigDecimal.ZERO)));
Map<Long, BigDecimal> oil = dishes.stream().collect(Collectors.groupingBy(MenuDish::getDay)).entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey,
entry -> entry.getValue().stream().flatMap(dish -> dish.getIngredient().stream().filter(item -> item.getValue().containsKey(crow) && item.getValue().get(crow).doubleValue() > 0 && ingredientMap.containsKey(item.getKey()))
.map(x -> Pair.of(ingredientMap.get(x.getKey()), x.getValue()))
.filter(x -> StringUtils.equals("烹调油", x.getKey().getType()))
.map(x -> x.getValue().values().stream().reduce(BigDecimal::add).orElse(BigDecimal.ZERO))
).reduce(BigDecimal::add).orElse(BigDecimal.ZERO)));
JSONObject result = new JSONObject();
result.put("crow", crow);
result.put("salt", salt);
result.put("sugar", sugar);
result.put("oil", oil);
return result;
}
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);

9
diet-web/src/main/java/com/mathvision/diet/controller/MenuReportController.java

@ -69,6 +69,15 @@ public class MenuReportController extends BaseController {
return menuReportService.energy(day, crow, dishes);
}
@ResponseBody
@RequestMapping(value = "sugar", method = RequestMethod.GET)
public JSONObject sugar(@RequestParam Long id, @RequestParam(required = false) String crow) {
Menu menu = checkAndGetMenu(id);
crow = checkAndGetCrow(crow, menu.getCrows());
List<MenuDish> dishes = menuDishService.query(id, menu.getVender());
return menuReportService.sugar(crow, dishes);
}
private Menu checkAndGetMenu(Long id) {
Menu menu = isAdmin() ? menuService.get(id) : menuService.get(id, getVender());
Assert.notNull(menu, "[参数错误]食谱不存在!");

33
diet-web/src/main/resources/static/menu/report.html

@ -254,4 +254,37 @@ crow=xxx //
&quot;success&quot;: true
}
</code></pre>
<h1>4. 烹饪方式分析</h1>
<blockquote>
<p>GET /api/menu/analysis/sugar</p>
</blockquote>
<h3>输入:</h3>
<pre><code class="text">id=1 // 食谱ID, 必填
crow=xxx //人群,默认第一个人群
</code></pre>
<h3>输出:</h3>
<pre><code class="json">{
&quot;body&quot;: {
&quot;crow&quot;: &quot;6岁~8岁 女&quot;,
&quot;salt&quot;: { // 盐
&quot;1&quot;: 10,
&quot;2&quot;: 20,
&quot;3&quot;: 15
},
&quot;oil&quot;: { // 油
&quot;1&quot;: 10,
&quot;2&quot;: 20,
&quot;3&quot;: 15
},
&quot;sugar&quot;: { // 糖
&quot;1&quot;: 10,
&quot;2&quot;: 20,
&quot;3&quot;: 15
},
},
&quot;code&quot;: 200,
&quot;desc&quot;: &quot;成功&quot;,
&quot;success&quot;: true
}
</code></pre>

37
doc/menu/report.md

@ -271,3 +271,40 @@ crow=xxx //
"success": true
}
~~~
# 4. 烹饪方式分析
> GET /api/menu/analysis/sugar
### 输入:
```text
id=1 // 食谱ID, 必填
crow=xxx //人群,默认第一个人群
```
### 输出:
~~~json
{
"body": {
"crow": "6岁~8岁 女",
"salt": { // 盐
"1": 10,
"2": 20,
"3": 15
},
"oil": { // 油
"1": 10,
"2": 20,
"3": 15
},
"sugar": { // 糖
"1": 10,
"2": 20,
"3": 15
},
},
"code": 200,
"desc": "成功",
"success": true
}
~~~

Loading…
Cancel
Save