From 22bf895d09f68e8bbfac3d4e387c8dd1f08d7984 Mon Sep 17 00:00:00 2001
From: fangyang2021 <3020949587@qq.com>
Date: Tue, 12 Aug 2025 13:26:26 +0800
Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E8=AE=AD=E5=8A=9F=E8=83=BD=E4=B8=8Ebu?=
=?UTF-8?q?g=E5=AE=8C=E5=96=8420250812?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
diet-core/pom.xml | 29 +
.../diet/service/DemoEnvLimitService.java | 70 +
.../mathvision/diet/service/DishService.java | 7 +
.../diet/service/MenuDishService.java | 111 +-
.../mathvision/diet/service/UserService.java | 1 -
.../mathvision/diet/word/ServerTableData.java | 25 +
.../diet/word/ServerTablePolicy.java | 80 +
.../diet/repository/DishRepository.java | 2 +
.../diet/repository/MenuDishRepository.java | 4 +
.../diet/aspect/GlobalRequestAspect.java | 6 +
.../diet/controller/DishController.java | 13 +-
.../diet/controller/IconController.java | 7 +
.../diet/controller/MenuController.java | 12 +-
.../diet/controller/MenuDishController.java | 81 +-
.../controller/MenuReleaseController.java | 2 -
.../src/main/resources/application-dev.yml | 12 +-
.../src/main/resources/application-local.yml | 17 +-
sql/diet.sql | 260 +-
sql/init.sql | 2181 ++++++++++++++++-
19 files changed, 2631 insertions(+), 289 deletions(-)
create mode 100644 diet-core/src/main/java/com/mathvision/diet/service/DemoEnvLimitService.java
create mode 100644 diet-core/src/main/java/com/mathvision/diet/word/ServerTableData.java
create mode 100644 diet-core/src/main/java/com/mathvision/diet/word/ServerTablePolicy.java
diff --git a/diet-core/pom.xml b/diet-core/pom.xml
index de56be8..e60c0e8 100644
--- a/diet-core/pom.xml
+++ b/diet-core/pom.xml
@@ -24,6 +24,35 @@
com.alibaba
easyexcel
3.3.2
+
+
+ org.apache.poi
+ poi-ooxml
+
+
+ org.apache.poi
+ poi-ooxml-schemas
+
+
+ org.apache.poi
+ poi
+
+
+
+
+ com.deepoove
+ poi-tl
+ 1.12.2
+
+
+ org.apache.poi
+ poi
+ 5.2.2
+
+
+ io.github.draco1023
+ poi-tl-ext
+ 0.4.15
\ No newline at end of file
diff --git a/diet-core/src/main/java/com/mathvision/diet/service/DemoEnvLimitService.java b/diet-core/src/main/java/com/mathvision/diet/service/DemoEnvLimitService.java
new file mode 100644
index 0000000..0700310
--- /dev/null
+++ b/diet-core/src/main/java/com/mathvision/diet/service/DemoEnvLimitService.java
@@ -0,0 +1,70 @@
+package com.mathvision.diet.service;
+
+import com.google.common.util.concurrent.RateLimiter;
+import com.mathvision.diet.repository.DishRepository;
+import com.mathvision.diet.repository.MenuRepository;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import java.util.concurrent.TimeUnit;
+
+@Slf4j
+@Service
+public class DemoEnvLimitService {
+ @Value(value = "${demo.is-demo:false}")
+ private boolean isDemo;
+
+ @Value(value = "${demo.params.img-enable:false}")
+ private boolean imgEnable;
+
+ @Value(value = "${demo.params.dish-num:10}")
+ private long dishNum;
+
+ @Value(value = "${demo.params.menu-num:5}")
+ private long menuNum;
+
+ @Value(value = "${demo.params.rate-block:true}")
+ private boolean rateBlock;
+
+ @Value(value = "${demo.params.rate-limit:500}")
+ private int rateLimit;
+
+ private static RateLimiter apiRateLimiter;
+
+ @Resource
+ private DishRepository dishRepository;
+
+ @Resource
+ private MenuRepository menuRepository;
+
+ @PostConstruct
+ public void init() {
+ if (isDemo) apiRateLimiter = RateLimiter.create(rateLimit, 10, TimeUnit.SECONDS);
+ }
+
+ public boolean checkImgEnable() {
+ return isDemo ? imgEnable : true;
+ }
+
+ public boolean checkDishNum(Long vendor) {
+ return !isDemo || dishRepository.countByVender(vendor) < dishNum;
+ }
+
+ public boolean checkMenuNum(Long vendor) {
+ return !isDemo || menuRepository.countByVender(vendor) < menuNum;
+ }
+
+ public boolean checkRateLimit() {
+ if (isDemo) {
+ if (rateBlock){
+ apiRateLimiter.acquire();
+ }else {
+ return apiRateLimiter.tryAcquire();
+ }
+ }
+ return true;
+ }
+}
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 68dfddf..4e6d31f 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
@@ -8,6 +8,7 @@ import com.mathvision.diet.entity.Dish;
import com.mathvision.diet.entity.FoodNutrient;
import com.mathvision.diet.entity.Ingredient;
import com.mathvision.diet.repository.DishRepository;
+import com.mathvision.diet.repository.MenuDishRepository;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.BooleanUtils;
@@ -48,6 +49,9 @@ public class DishService {
@Resource
private DishRepository dishRepository;
+ @Resource
+ private MenuDishRepository menuDishRepository;
+
@Scheduled(cron = "0/2 * * * * *")
public void init() {
if (!UPDATE_LABEL_LOCK.tryLock()) {
@@ -112,8 +116,11 @@ public class DishService {
public void delete(List ids, Long venderId, String operator) {
if (venderId > 0) {
dishRepository.deleteByIdInAndVender(ids, venderId);
+ //食谱菜品空数据优化
+ menuDishRepository.deleteByDishInAndVender(ids, venderId);
} else {
dishRepository.deleteAllByIdInBatch(ids);
+ menuDishRepository.deleteByDishIn(ids);
}
log.info("[DishService] delete ids = " + ids + ", operator = " + operator);
}
diff --git a/diet-core/src/main/java/com/mathvision/diet/service/MenuDishService.java b/diet-core/src/main/java/com/mathvision/diet/service/MenuDishService.java
index 6304184..692eebd 100644
--- a/diet-core/src/main/java/com/mathvision/diet/service/MenuDishService.java
+++ b/diet-core/src/main/java/com/mathvision/diet/service/MenuDishService.java
@@ -2,6 +2,11 @@ package com.mathvision.diet.service;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+import com.deepoove.poi.data.RowRenderData;
+import com.deepoove.poi.data.Rows;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.mathvision.diet.domian.MealType;
@@ -11,6 +16,8 @@ import com.mathvision.diet.entity.Menu;
import com.mathvision.diet.entity.MenuDish;
import com.mathvision.diet.repository.DishRepository;
import com.mathvision.diet.repository.MenuDishRepository;
+import com.mathvision.diet.word.ServerTableData;
+import com.mathvision.diet.word.ServerTablePolicy;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.tuple.Pair;
@@ -19,11 +26,13 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
+import java.io.*;
+import java.math.RoundingMode;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.time.Instant;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;
@@ -140,7 +149,7 @@ public class MenuDishService {
if (dish == null || dish.size() < dishIndex) {
return MenuDish.builder().meal(meal).day(day).ingredient(Lists.newArrayList()).build();
} else {
- return dish.get(dishIndex -1);
+ return dish.get(dishIndex - 1);
}
}).collect(Collectors.toList());
@@ -169,4 +178,96 @@ public class MenuDishService {
});
excelWriter.write(contents, EasyExcel.writerSheet(menu.getName()).head(headers).build());
}
+
+ public byte[] exportWord(Menu menu) {
+ Map>> menuDishes = Optional.ofNullable(menuDishRepository.findByMenu(menu.getId())).orElseGet(Collections::emptyList).stream().collect(Collectors.groupingBy(MenuDish::getMeal, Collectors.groupingBy(MenuDish::getDay)));
+ List allMeals = menuDishes.keySet().stream().sorted(Comparator.comparing(MealType::toType)).collect(Collectors.toList());
+ List allDays = menuDishes.values().stream().flatMap(dayMap -> dayMap.keySet().stream()).distinct().sorted().collect(Collectors.toList());
+
+ if (CollectionUtils.isEmpty(allDays)) {
+ allDays = Optional.ofNullable(menu.getDay()).orElseGet(Collections::emptyList);
+ }
+
+ List allCrows = Optional.ofNullable(menu.getCrows()).orElseGet(Collections::emptyList);
+ Map ingredientKeyToName = ingredientService.getByKeys();
+ List