diff --git a/diet-core/src/main/java/com/mathvision/diet/service/DishService.java b/diet-core/src/main/java/com/mathvision/diet/service/DishService.java index 411cf25..4ad47f4 100644 --- a/diet-core/src/main/java/com/mathvision/diet/service/DishService.java +++ b/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 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 vendors, String operator) { + Instant instant = Instant.now(); + List 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 dishes, String operator) { dishRepository.saveAll(dishes); log.info("[DishService] add dishes count = " + dishes.size() + ", operator = " + operator); diff --git a/diet-core/src/main/java/com/mathvision/diet/service/MenuService.java b/diet-core/src/main/java/com/mathvision/diet/service/MenuService.java index f2d8caa..5d6d5fb 100644 --- a/diet-core/src/main/java/com/mathvision/diet/service/MenuService.java +++ b/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.MenuStatus; import com.mathvision.diet.entity.Menu; +import com.mathvision.diet.entity.MenuDish; import com.mathvision.diet.repository.MenuDishRepository; import com.mathvision.diet.repository.MenuRepository; import lombok.extern.slf4j.Slf4j; @@ -16,6 +17,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import javax.persistence.criteria.Predicate; +import java.time.Instant; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -25,6 +27,10 @@ import java.util.stream.Collectors; @Slf4j @Service public class MenuService { + + @Resource + DishService dishService; + @Resource private MenuRepository menuRepository; @@ -35,6 +41,17 @@ public class MenuService { return menuRepository.saveAll(menuList); } + @Transactional + public List copy(Menu menu, String name, List vendors, String operator) { + Instant dateTime = Instant.now(); + List menuDishes= menuDishRepository.findByMenu(menu.getId()); + List 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 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 public void delete(Long id, Long vender, String operator) { if (vender == null || vender <= 0) { diff --git a/diet-dao/src/main/java/com/mathvision/diet/repository/DishRepository.java b/diet-dao/src/main/java/com/mathvision/diet/repository/DishRepository.java index 63a3dbe..5a18d7f 100644 --- a/diet-dao/src/main/java/com/mathvision/diet/repository/DishRepository.java +++ b/diet-dao/src/main/java/com/mathvision/diet/repository/DishRepository.java @@ -28,4 +28,5 @@ public interface DishRepository extends JpaRepository, JpaSpecificat List findByVender(Long vender); Dish findByIdAndVender(Long id, Long vender); boolean existsByVenderAndName(Long vender, String name); + List findByVenderAndName(Long vender, String name); } \ No newline at end of file diff --git a/diet-web/src/main/java/com/mathvision/diet/controller/DishController.java b/diet-web/src/main/java/com/mathvision/diet/controller/DishController.java index aef8f5d..39aee8a 100644 --- a/diet-web/src/main/java/com/mathvision/diet/controller/DishController.java +++ b/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.domian.DishItemDTO; 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.EnumService; import com.mathvision.diet.service.IngredientService; @@ -24,6 +26,7 @@ import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; import java.time.Instant; +import java.util.HashSet; import java.util.List; 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()); } + @ResponseBody + @RequestMapping(path = "copy", method = RequestMethod.PUT) + public void copy(@RequestParam Long id, @RequestParam(required = false) List 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 @RequestMapping(method = RequestMethod.DELETE) public void delete(@RequestParam List ids) { diff --git a/diet-web/src/main/java/com/mathvision/diet/controller/MenuController.java b/diet-web/src/main/java/com/mathvision/diet/controller/MenuController.java index fc56f71..373aab1 100644 --- a/diet-web/src/main/java/com/mathvision/diet/controller/MenuController.java +++ b/diet-web/src/main/java/com/mathvision/diet/controller/MenuController.java @@ -46,7 +46,7 @@ public class MenuController extends BaseController { @RequestMapping(method = RequestMethod.PUT) public List add(@RequestParam String name, @RequestParam(required = false) List vendors, @RequestParam Long nutrient, @RequestParam List day, @RequestParam List meals, @RequestParam List month, @RequestParam List crows) { 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(month) && Range.closed(1, 12).containsAll(month), "[参数错误]请选择正确的月份!"); 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"))); } + + @ResponseBody + @RequestMapping(path = "copy", method = RequestMethod.PUT) + public List copy(@RequestParam Long id, @RequestParam(required = false) String name, @RequestParam(required = false) List 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()); + } } \ No newline at end of file diff --git a/diet-web/src/main/java/com/mathvision/diet/controller/MenuReleaseController.java b/diet-web/src/main/java/com/mathvision/diet/controller/MenuReleaseController.java index 35a631a..dde1ee3 100644 --- a/diet-web/src/main/java/com/mathvision/diet/controller/MenuReleaseController.java +++ b/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.entity.Menu; +import com.mathvision.diet.service.MenuDishService; import com.mathvision.diet.service.MenuReleaseService; import com.mathvision.diet.service.MenuService; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.time.DateUtils; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -25,6 +27,8 @@ public class MenuReleaseController extends BaseController { @Resource MenuService menuService; @Resource + MenuDishService menuDishService; + @Resource MenuReleaseService menuReleaseService; @ResponseBody @@ -34,6 +38,7 @@ public class MenuReleaseController extends BaseController { Assert.notNull(menu, "[参数错误]食谱不存在!"); Assert.isTrue(menu.getVender().equals(getVender()) || isAdmin(), "[参数错误]食谱不存在!"); 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))); menuReleaseService.publish(id, menu.getScale(), parseDate(startTime, new Date()), parseDate(endTime, DateUtils.addDays(new Date(), 7)), getUid()); } diff --git a/diet-web/src/main/resources/static/change.html b/diet-web/src/main/resources/static/change.html index 5bf2f06..61e2ace 100644 --- a/diet-web/src/main/resources/static/change.html +++ b/diet-web/src/main/resources/static/change.html @@ -61,7 +61,9 @@

12.10

  • ʾ: ѯЩʳ, ӿְ֧ѯ;
  • -
  • ʳ׷: ӪطӿӲѯƽֵ(day=0), +
  • ʳ׷: ӪطӿںӿӲѯƽֵ(day=0), ӪطѯĽӿڷֵdaysֶ,ʶʳЩвƷ
  • +
  • Ʒӿ: ӲƷƽӿ, ԽһƷƵλ;
  • +
  • ʳ׽ӿ: ʳ׸ƽӿ, Խһʳ׸Ƶλλ;
diff --git a/diet-web/src/main/resources/static/dish.html b/diet-web/src/main/resources/static/dish.html index 5d0d1e8..0657304 100644 --- a/diet-web/src/main/resources/static/dish.html +++ b/diet-web/src/main/resources/static/dish.html @@ -243,4 +243,19 @@ ids=9,10 // "success": true } +

8. ƲƷ

+
+

PUT /api/dish/copy

+
+

:

+
vendors=1,2,3   // Чҵ˲
+id=1            // ԴƷ, 
+
+

:

+
{
+  "code": 200,
+  "desc": "ɹ",
+  "success": true
+}
+
diff --git a/diet-web/src/main/resources/static/menu/menu.html b/diet-web/src/main/resources/static/menu/menu.html index 45bbb49..7867d26 100644 --- a/diet-web/src/main/resources/static/menu/menu.html +++ b/diet-web/src/main/resources/static/menu/menu.html @@ -169,4 +169,25 @@ crows= "success": true } +

6. ʳ

+
+

PUT /api/menu/copy

+
+

:

+
vendors=1,2,3   // Чҵ˲
+name=Ѽ   // , ѡ
+id=1            // Դʳױ, 
+
+

:

+
{
+  "body": [
+      1,
+      2,
+      3
+  ],
+  "code": 200,
+  "desc": "ɹ",
+  "success": true
+}
+
diff --git a/doc/change.md b/doc/change.md index 328e802..1de5692 100644 --- a/doc/change.md +++ b/doc/change.md @@ -57,5 +57,7 @@ 新增和修改协议变更以上两个字段; 查询接口返回增加以上两个字段; ### 12.10 * 大屏显示: 新增查询本周那些天有食谱, 其他两个接口支持按天查询; -* 食谱分析: 营养素分析接口增加查询日平均值(day=0), +* 食谱分析: 营养素分析接口和能量分析接口增加查询日平均值(day=0), 营养素分析和能量分析两个按天查询的接口返回值增加days字段,标识该食谱上那些天有菜品有数据 +* 菜品接口: 增加菜品复制接口, 可以将一个菜品复制到多个单位; +* 食谱接口: 增加食谱复制接口, 可以将一个食谱复制到本单位或者其他单位; diff --git a/doc/dish.md b/doc/dish.md index b3be04e..74ab10e 100644 --- a/doc/dish.md +++ b/doc/dish.md @@ -264,4 +264,25 @@ ids=9,10 // 必填 "desc": "成功", "success": true } -``` \ No newline at end of file +``` + + +# 8. 复制菜品 + + +> PUT /api/dish/copy + +### 输入: +```text +vendors=1,2,3 // 管理端有效,业务端不用 +id=1 // 源菜品编号, 必填 +``` + +### 输出: +~~~json +{ + "code": 200, + "desc": "成功", + "success": true +} +~~~ \ No newline at end of file diff --git a/doc/menu/menu.md b/doc/menu/menu.md index 371df18..84f6b57 100644 --- a/doc/menu/menu.md +++ b/doc/menu/menu.md @@ -191,4 +191,30 @@ id=1 // 食谱ID "desc": "成功", "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 +} ~~~ \ No newline at end of file diff --git a/sql/update.sql b/sql/update.sql index 753c366..5b6dfd0 100644 --- a/sql/update.sql +++ b/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 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`.`nutrition` ADD COLUMN `crows` json NULL COMMENT '人群' AFTER `vendors`, - ADD COLUMN `overflows` json NULL COMMENT '溢出范围(分营养素)' AFTER `overflow`; \ No newline at end of file + 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; \ No newline at end of file