caoyiwen 2 years ago
parent
commit
3c524d0569
  1. 18
      diet-core/src/main/java/com/mathvision/diet/service/DishService.java
  2. 17
      diet-core/src/main/java/com/mathvision/diet/service/MenuService.java
  3. 1
      diet-dao/src/main/java/com/mathvision/diet/repository/DishRepository.java
  4. 17
      diet-web/src/main/java/com/mathvision/diet/controller/DishController.java
  5. 23
      diet-web/src/main/java/com/mathvision/diet/controller/MenuController.java
  6. 5
      diet-web/src/main/java/com/mathvision/diet/controller/MenuReleaseController.java
  7. 4
      diet-web/src/main/resources/static/change.html
  8. 15
      diet-web/src/main/resources/static/dish.html
  9. 21
      diet-web/src/main/resources/static/menu/menu.html
  10. 4
      doc/change.md
  11. 23
      doc/dish.md
  12. 26
      doc/menu/menu.md
  13. 9
      sql/update.sql

18
diet-core/src/main/java/com/mathvision/diet/service/DishService.java

@ -86,6 +86,24 @@ public class DishService {
} }
} }
public Dish copy(Long id, Long vender, String operator, Instant instant) {
Dish dish = get(id);
List<Dish> dishes = dishRepository.findByVenderAndName(vender, dish.getName());
if (CollectionUtils.isNotEmpty(dishes)) {
return dishes.get(0);
}
dish = dishRepository.save(Dish.builder().name(dish.getName()).vender(vender).marks(dish.getMarks()).poly(dish.getPoly()).month(dish.getMonth()).icon(dish.getIcon()).ingredient(dish.getIngredient()).operate(operator).created(instant).modify(instant).build());
log.info("[DishService] copy dish name = " + dish.getName() + ", operator = " + operator);
return dish;
}
public void copy(Dish dish, List<Long> vendors, String operator) {
Instant instant = Instant.now();
List<Dish> dishes = vendors.stream().filter(vender -> exists(null, dish.getName(), vender)).map(vender -> Dish.builder().name(dish.getName()).vender(vender).marks(dish.getMarks()).poly(dish.getPoly()).month(dish.getMonth()).icon(dish.getIcon()).ingredient(dish.getIngredient()).operate(operator).created(instant).modify(instant).build()).collect(Collectors.toList());
dishRepository.saveAll(dishes);
log.info("[DishService] copy dishes count = " + dishes.size() + ", operator = " + operator);
}
public void add(List<Dish> dishes, String operator) { public void add(List<Dish> dishes, String operator) {
dishRepository.saveAll(dishes); dishRepository.saveAll(dishes);
log.info("[DishService] add dishes count = " + dishes.size() + ", operator = " + operator); log.info("[DishService] add dishes count = " + dishes.size() + ", operator = " + operator);

17
diet-core/src/main/java/com/mathvision/diet/service/MenuService.java

@ -3,6 +3,7 @@ package com.mathvision.diet.service;
import com.mathvision.diet.domian.MenuDishItemDTO; import com.mathvision.diet.domian.MenuDishItemDTO;
import com.mathvision.diet.domian.MenuStatus; import com.mathvision.diet.domian.MenuStatus;
import com.mathvision.diet.entity.Menu; import com.mathvision.diet.entity.Menu;
import com.mathvision.diet.entity.MenuDish;
import com.mathvision.diet.repository.MenuDishRepository; import com.mathvision.diet.repository.MenuDishRepository;
import com.mathvision.diet.repository.MenuRepository; import com.mathvision.diet.repository.MenuRepository;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -16,6 +17,7 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Predicate;
import java.time.Instant;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -25,6 +27,10 @@ import java.util.stream.Collectors;
@Slf4j @Slf4j
@Service @Service
public class MenuService { public class MenuService {
@Resource
DishService dishService;
@Resource @Resource
private MenuRepository menuRepository; private MenuRepository menuRepository;
@ -35,6 +41,17 @@ public class MenuService {
return menuRepository.saveAll(menuList); return menuRepository.saveAll(menuList);
} }
@Transactional
public List<Long> copy(Menu menu, String name, List<Long> vendors, String operator) {
Instant dateTime = Instant.now();
List<MenuDish> menuDishes= menuDishRepository.findByMenu(menu.getId());
List<Menu> menus = vendors.stream().map(v -> Menu.builder().name(name).meals(menu.getMeals()).crows(menu.getCrows()).scale(menu.getCrows().stream().collect(Collectors.toMap(x -> x, x -> 0))).day(menu.getDay()).nutrient(menu.getNutrient()).month(menu.getMonth()).vender(v).status(MenuStatus.draft).operate(operator).created(dateTime).modify(dateTime).build()).collect(Collectors.toList());
menus = add(menus);
List<MenuDish> dishes = menus.stream().map(v -> menuDishes.stream().map(dish -> MenuDish.builder().vender(v.getVender()).menu(v.getId()).dish(dish.getVender().equals(v.getVender()) ? dishService.copy(dish.getDish(), v.getVender(), operator, dateTime).getId() : dish.getDish()).day(dish.getDay()).meal(dish.getMeal()).name(dish.getName()).marks(dish.getMarks()).poly(dish.getPoly()).ingredient(dish.getIngredient()).operate(operator).created(dateTime).modify(dateTime).build()).collect(Collectors.toList())).flatMap(List::stream).collect(Collectors.toList());
menuDishRepository.saveAll(dishes);
return menus.stream().map(Menu::getId).collect(Collectors.toList());
}
@Transactional @Transactional
public void delete(Long id, Long vender, String operator) { public void delete(Long id, Long vender, String operator) {
if (vender == null || vender <= 0) { if (vender == null || vender <= 0) {

1
diet-dao/src/main/java/com/mathvision/diet/repository/DishRepository.java

@ -28,4 +28,5 @@ public interface DishRepository extends JpaRepository<Dish, Long>, JpaSpecificat
List<Dish> findByVender(Long vender); List<Dish> findByVender(Long vender);
Dish findByIdAndVender(Long id, Long vender); Dish findByIdAndVender(Long id, Long vender);
boolean existsByVenderAndName(Long vender, String name); boolean existsByVenderAndName(Long vender, String name);
List<Dish> findByVenderAndName(Long vender, String name);
} }

17
diet-web/src/main/java/com/mathvision/diet/controller/DishController.java

@ -7,6 +7,8 @@ import com.google.common.collect.Range;
import com.mathvision.diet.domain.DishLabelDO; import com.mathvision.diet.domain.DishLabelDO;
import com.mathvision.diet.domian.DishItemDTO; import com.mathvision.diet.domian.DishItemDTO;
import com.mathvision.diet.entity.Dish; import com.mathvision.diet.entity.Dish;
import com.mathvision.diet.entity.Menu;
import com.mathvision.diet.entity.Nutrition;
import com.mathvision.diet.service.DishService; import com.mathvision.diet.service.DishService;
import com.mathvision.diet.service.EnumService; import com.mathvision.diet.service.EnumService;
import com.mathvision.diet.service.IngredientService; import com.mathvision.diet.service.IngredientService;
@ -24,6 +26,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.time.Instant; import java.time.Instant;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -67,6 +70,20 @@ public class DishController extends BaseController {
dishService.add(vendors.stream().map(vender -> Dish.builder().name(name).vender(vender).marks(mark).poly(poly).month(month).icon(icon).ingredient(items).operate(getUid()).created(dateTime).modify(dateTime).build()).collect(Collectors.toList()), getUid()); dishService.add(vendors.stream().map(vender -> Dish.builder().name(name).vender(vender).marks(mark).poly(poly).month(month).icon(icon).ingredient(items).operate(getUid()).created(dateTime).modify(dateTime).build()).collect(Collectors.toList()), getUid());
} }
@ResponseBody
@RequestMapping(path = "copy", method = RequestMethod.PUT)
public void copy(@RequestParam Long id, @RequestParam(required = false) List<Long> vendors) {
Dish dish = isAdmin() ? dishService.get(id) : dishService.get(id, getVender());
Assert.notNull(dish, "[参数错误]菜品不存在, 复制失败!");
if(isAdmin()) {
vendors = vendors == null ? Lists.newArrayList() : vendors.stream().filter(venderService::exists).collect(Collectors.toList());
} else {
vendors = Lists.newArrayList(getVender());
}
dishService.copy(dish, vendors, getUid());
}
@ResponseBody @ResponseBody
@RequestMapping(method = RequestMethod.DELETE) @RequestMapping(method = RequestMethod.DELETE)
public void delete(@RequestParam List<Long> ids) { public void delete(@RequestParam List<Long> ids) {

23
diet-web/src/main/java/com/mathvision/diet/controller/MenuController.java

@ -46,7 +46,7 @@ public class MenuController extends BaseController {
@RequestMapping(method = RequestMethod.PUT) @RequestMapping(method = RequestMethod.PUT)
public List<Long> add(@RequestParam String name, @RequestParam(required = false) List<Long> vendors, @RequestParam Long nutrient, @RequestParam List<Long> day, @RequestParam List<String> meals, @RequestParam List<Integer> month, @RequestParam List<String> crows) { public List<Long> add(@RequestParam String name, @RequestParam(required = false) List<Long> vendors, @RequestParam Long nutrient, @RequestParam List<Long> day, @RequestParam List<String> meals, @RequestParam List<Integer> month, @RequestParam List<String> crows) {
Assert.isTrue(StringUtils.isNotBlank(name), "[参数错误]食谱名称必填!"); Assert.isTrue(StringUtils.isNotBlank(name), "[参数错误]食谱名称必填!");
Assert.isTrue(!name.matches("[\\[\\]:?*/\\\\]") && name.length() < 31, "[参数错误]食谱名称小于31个字符,且不能包含特殊字符!"); Assert.isTrue(!name.matches("[\\[\\]:?*/\\\\]") && name.length() < 31, "[参数错误]食谱名称小于30个字符,且不能包含特殊字符!");
Assert.isTrue(CollectionUtils.isNotEmpty(day) && Range.closed(1L, 7L).containsAll(day), "[参数错误]星期取值[周一~周日]!"); Assert.isTrue(CollectionUtils.isNotEmpty(day) && Range.closed(1L, 7L).containsAll(day), "[参数错误]星期取值[周一~周日]!");
Assert.isTrue(CollectionUtils.isNotEmpty(month) && Range.closed(1, 12).containsAll(month), "[参数错误]请选择正确的月份!"); Assert.isTrue(CollectionUtils.isNotEmpty(month) && Range.closed(1, 12).containsAll(month), "[参数错误]请选择正确的月份!");
Assert.isTrue(CollectionUtils.isNotEmpty(meals), "[参数错误]餐次必填!"); Assert.isTrue(CollectionUtils.isNotEmpty(meals), "[参数错误]餐次必填!");
@ -142,4 +142,25 @@ public class MenuController extends BaseController {
} }
return menuService.list(isAdmin() ? vender : getVender(), name, MenuStatus.toType(status), parseDate(startTime), parseDate(endTime), PageRequest.of(pageNo, pageSize).withSort(Sort.by(Sort.Direction.DESC, "id"))); return menuService.list(isAdmin() ? vender : getVender(), name, MenuStatus.toType(status), parseDate(startTime), parseDate(endTime), PageRequest.of(pageNo, pageSize).withSort(Sort.by(Sort.Direction.DESC, "id")));
} }
@ResponseBody
@RequestMapping(path = "copy", method = RequestMethod.PUT)
public List<Long> copy(@RequestParam Long id, @RequestParam(required = false) String name, @RequestParam(required = false) List<Long> vendors) {
Menu menu = isAdmin() ? menuService.get(id) : menuService.get(id, getVender());
Assert.notNull(menu, "[参数错误]食谱不存在, 复制失败!");
name = StringUtils.isBlank(name) ? "复制-" + menu.getName() : name;
Assert.isTrue(!name.matches("[\\[\\]:?*/\\\\]") && name.length() < 31, "[参数错误]食谱名称小于30个字符,且不能包含特殊字符!");
if(isAdmin()) {
vendors = vendors == null ? Lists.newArrayList() : vendors.stream().filter(venderService::exists).collect(Collectors.toList());
} else {
vendors = Lists.newArrayList(getVender());
}
Nutrition nutrition = nutritionService.get(menu.getNutrient());
Assert.notNull(nutrition, "[参数错误]营养计划已经不存在,请重新编辑食谱后再复制!");
Assert.isTrue(CollectionUtils.isNotEmpty(vendors) && new HashSet<>(nutrition.getVendors()).containsAll(vendors), "[参数错误]营养计划不适用于所选单位!");
return menuService.copy(menu, name, vendors, getUid());
}
} }

5
diet-web/src/main/java/com/mathvision/diet/controller/MenuReleaseController.java

@ -2,8 +2,10 @@ package com.mathvision.diet.controller;
import com.mathvision.diet.domian.MenuStatus; import com.mathvision.diet.domian.MenuStatus;
import com.mathvision.diet.entity.Menu; import com.mathvision.diet.entity.Menu;
import com.mathvision.diet.service.MenuDishService;
import com.mathvision.diet.service.MenuReleaseService; import com.mathvision.diet.service.MenuReleaseService;
import com.mathvision.diet.service.MenuService; import com.mathvision.diet.service.MenuService;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.time.DateUtils; import org.apache.commons.lang3.time.DateUtils;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.PageRequest;
@ -25,6 +27,8 @@ public class MenuReleaseController extends BaseController {
@Resource @Resource
MenuService menuService; MenuService menuService;
@Resource @Resource
MenuDishService menuDishService;
@Resource
MenuReleaseService menuReleaseService; MenuReleaseService menuReleaseService;
@ResponseBody @ResponseBody
@ -34,6 +38,7 @@ public class MenuReleaseController extends BaseController {
Assert.notNull(menu, "[参数错误]食谱不存在!"); Assert.notNull(menu, "[参数错误]食谱不存在!");
Assert.isTrue(menu.getVender().equals(getVender()) || isAdmin(), "[参数错误]食谱不存在!"); Assert.isTrue(menu.getVender().equals(getVender()) || isAdmin(), "[参数错误]食谱不存在!");
Assert.isTrue(menu.getStatus() == MenuStatus.draft, "[参数错误]该食谱当前非草稿状态,不可发布!"); Assert.isTrue(menu.getStatus() == MenuStatus.draft, "[参数错误]该食谱当前非草稿状态,不可发布!");
Assert.isTrue(CollectionUtils.isNotEmpty(menuDishService.query(id)), "[参数错误]该食谱未添加任何菜品,不可发布!");
menu.getScale().entrySet().forEach(x -> x.setValue(scale.getOrDefault(x.getKey(), 0))); menu.getScale().entrySet().forEach(x -> x.setValue(scale.getOrDefault(x.getKey(), 0)));
menuReleaseService.publish(id, menu.getScale(), parseDate(startTime, new Date()), parseDate(endTime, DateUtils.addDays(new Date(), 7)), getUid()); menuReleaseService.publish(id, menu.getScale(), parseDate(startTime, new Date()), parseDate(endTime, DateUtils.addDays(new Date(), 7)), getUid());
} }

4
diet-web/src/main/resources/static/change.html

@ -61,7 +61,9 @@
<h3>12.10</h3> <h3>12.10</h3>
<ul> <ul>
<li>大屏显示: 新增查询本周那些天有食谱, 其他两个接口支持按天查询;</li> <li>大屏显示: 新增查询本周那些天有食谱, 其他两个接口支持按天查询;</li>
<li>食谱分析: 营养素分析接口增加查询日平均值(day=0), <li>食谱分析: 营养素分析接口和能量分析接口增加查询日平均值(day=0),
营养素分析和能量分析两个按天查询的接口返回值增加days字段,标识该食谱上那些天有菜品有数据</li> 营养素分析和能量分析两个按天查询的接口返回值增加days字段,标识该食谱上那些天有菜品有数据</li>
<li>菜品接口: 增加菜品复制接口, 可以将一个菜品复制到多个单位;</li>
<li>食谱接口: 增加食谱复制接口, 可以将一个食谱复制到本单位或者其他单位;</li>
</ul> </ul>

15
diet-web/src/main/resources/static/dish.html

@ -243,4 +243,19 @@ ids=9,10 //
&quot;success&quot;: true &quot;success&quot;: true
} }
</code></pre> </code></pre>
<h1>8. 复制菜品</h1>
<blockquote>
<p>PUT /api/dish/copy</p>
</blockquote>
<h3>输入:</h3>
<pre><code class="text">vendors=1,2,3 // 管理端有效,业务端不用
id=1 // 源菜品编号, 必填
</code></pre>
<h3>输出:</h3>
<pre><code class="json">{
&quot;code&quot;: 200,
&quot;desc&quot;: &quot;成功&quot;,
&quot;success&quot;: true
}
</code></pre>

21
diet-web/src/main/resources/static/menu/menu.html

@ -169,4 +169,25 @@ crows=
&quot;success&quot;: true &quot;success&quot;: true
} }
</code></pre> </code></pre>
<h1>6. 复制食谱</h1>
<blockquote>
<p>PUT /api/menu/copy</p>
</blockquote>
<h3>输入:</h3>
<pre><code class="text">vendors=1,2,3 // 管理端有效,业务端不用
name=番茄鸡蛋汤 // 名称, 选填
id=1 // 源食谱编号, 必填
</code></pre>
<h3>输出:</h3>
<pre><code class="json">{
&quot;body&quot;: [
1,
2,
3
],
&quot;code&quot;: 200,
&quot;desc&quot;: &quot;成功&quot;,
&quot;success&quot;: true
}
</code></pre>

4
doc/change.md

@ -57,5 +57,7 @@
新增和修改协议变更以上两个字段; 查询接口返回增加以上两个字段; 新增和修改协议变更以上两个字段; 查询接口返回增加以上两个字段;
### 12.10 ### 12.10
* 大屏显示: 新增查询本周那些天有食谱, 其他两个接口支持按天查询; * 大屏显示: 新增查询本周那些天有食谱, 其他两个接口支持按天查询;
* 食谱分析: 营养素分析接口增加查询日平均值(day=0), * 食谱分析: 营养素分析接口和能量分析接口增加查询日平均值(day=0),
营养素分析和能量分析两个按天查询的接口返回值增加days字段,标识该食谱上那些天有菜品有数据 营养素分析和能量分析两个按天查询的接口返回值增加days字段,标识该食谱上那些天有菜品有数据
* 菜品接口: 增加菜品复制接口, 可以将一个菜品复制到多个单位;
* 食谱接口: 增加食谱复制接口, 可以将一个食谱复制到本单位或者其他单位;

23
doc/dish.md

@ -264,4 +264,25 @@ ids=9,10 // 必填
"desc": "成功", "desc": "成功",
"success": true "success": true
} }
``` ```
# 8. 复制菜品
> PUT /api/dish/copy
### 输入:
```text
vendors=1,2,3 // 管理端有效,业务端不用
id=1 // 源菜品编号, 必填
```
### 输出:
~~~json
{
"code": 200,
"desc": "成功",
"success": true
}
~~~

26
doc/menu/menu.md

@ -191,4 +191,30 @@ id=1 // 食谱ID
"desc": "成功", "desc": "成功",
"success": true "success": true
} }
~~~
# 6. 复制食谱
> PUT /api/menu/copy
### 输入:
```text
vendors=1,2,3 // 管理端有效,业务端不用
name=番茄鸡蛋汤 // 名称, 选填
id=1 // 源食谱编号, 必填
```
### 输出:
~~~json
{
"body": [
1,
2,
3
],
"code": 200,
"desc": "成功",
"success": true
}
~~~ ~~~

9
sql/update.sql

@ -4,8 +4,15 @@ ALTER TABLE `diet`.`dish` ADD INDEX `idx_marks`(`marks`);
ALTER TABLE `diet`.`dish` ADD INDEX `idx_modify`(`modify`); ALTER TABLE `diet`.`dish` ADD INDEX `idx_modify`(`modify`);
ALTER TABLE `diet`.`dish` ADD COLUMN `label` json NULL COMMENT '标签' AFTER `poly`; ALTER TABLE `diet`.`dish` ADD COLUMN `label` json NULL COMMENT '标签' AFTER `poly`;
ALTER TABLE `diet`.`menu`
MODIFY COLUMN `scale` json NULL COMMENT '人群规模' AFTER `crows`;
ALTER TABLE `diet`.`menu_dish` ADD COLUMN `label` json NULL COMMENT '标签' AFTER `poly`; ALTER TABLE `diet`.`menu_dish` ADD COLUMN `label` json NULL COMMENT '标签' AFTER `poly`;
ALTER TABLE `diet`.`nutrition` ALTER TABLE `diet`.`nutrition`
ADD COLUMN `crows` json NULL COMMENT '人群' AFTER `vendors`, ADD COLUMN `crows` json NULL COMMENT '人群' AFTER `vendors`,
ADD COLUMN `overflows` json NULL COMMENT '溢出范围(分营养素)' AFTER `overflow`; ADD COLUMN `overflows` json NULL COMMENT '溢出范围(分营养素)' AFTER `overflow`;
UPDATE `diet`.`role_item` SET `item_value` = '[post,put,delete]:menu|menu/copy|menu/dish|menu/dish/batch' WHERE `id` = 6;
UPDATE `diet`.`role_item` SET `item_value` = '[post,put,delete]:menu|menu/copy|menu/dish|menu/dish/batch' WHERE `id` = 28;
UPDATE `diet`.`role_item` SET `item_value` = '[post,put,delete]:dish|dish/copy' WHERE `id` = 4;
Loading…
Cancel
Save