From 62ce2a98106f3b995e4169c37fc6b25a9971a8ee Mon Sep 17 00:00:00 2001 From: jjLv <1981429112@qq.com> Date: Fri, 16 May 2025 09:24:35 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A3=9F=E5=A0=82=E6=95=B0=E6=8D=AE=E6=80=BB?= =?UTF-8?q?=E8=A7=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/DataScreeningController.java | 80 ++++++++ .../core/dataScreening/dto/DataScreenDTO.java | 13 ++ .../mapper/DataScreeningMapper.java | 26 +++ .../service/DataScreeningService.java | 16 ++ .../service/DataScreeningServiceImpl.java | 171 ++++++++++++++++++ .../core/dataScreening/vo/EchartsVO.java | 11 ++ .../core/dataScreening/vo/SingleModelVO.java | 12 ++ .../menu/controller/MenuRecipeController.java | 1 - .../service/impl/MenuRecipeServiceImpl.java | 6 +- .../DataScreening/DataScreeningMapper.xml | 109 +++++++++++ 10 files changed, 441 insertions(+), 4 deletions(-) create mode 100644 bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/dataScreening/controller/DataScreeningController.java create mode 100644 bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/dataScreening/dto/DataScreenDTO.java create mode 100644 bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/dataScreening/mapper/DataScreeningMapper.java create mode 100644 bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/dataScreening/service/DataScreeningService.java create mode 100644 bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/dataScreening/service/DataScreeningServiceImpl.java create mode 100644 bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/dataScreening/vo/EchartsVO.java create mode 100644 bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/dataScreening/vo/SingleModelVO.java create mode 100644 bonus-modules/bonus-smart-canteen/src/main/resources/mapper/DataScreening/DataScreeningMapper.xml diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/dataScreening/controller/DataScreeningController.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/dataScreening/controller/DataScreeningController.java new file mode 100644 index 0000000..87d821f --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/dataScreening/controller/DataScreeningController.java @@ -0,0 +1,80 @@ +package com.bonus.canteen.core.dataScreening.controller; + +import com.bonus.canteen.core.dataScreening.dto.DataScreenDTO; +import com.bonus.canteen.core.dataScreening.service.DataScreeningService; +import com.bonus.canteen.core.device.domain.DeviceBind; +import com.bonus.canteen.core.device.service.IDeviceBindService; +import com.bonus.common.core.utils.poi.ExcelUtil; +import com.bonus.common.core.web.controller.BaseController; +import com.bonus.common.core.web.domain.AjaxResult; +import com.bonus.common.core.web.page.TableDataInfo; +import com.bonus.common.log.annotation.SysLog; +import com.bonus.common.log.enums.OperaType; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 设备绑定多档口子Controller + * + * @author xsheng + * @date 2025-05-13 + */ +@Api(tags = "数据总览") +@RestController +@RequestMapping("/dataScreening") +public class DataScreeningController extends BaseController { + @Autowired + private DataScreeningService service; + + @ApiOperation(value = "获取数据总览(今日营业额、订单等)") + @PostMapping("/getDataScreeningModel") + public AjaxResult getDataScreeningModel() { + try { + return success(service.getDataScreeningModel()); + } catch (Exception e) { + return error("获取数据总览错误"); + } + } + + @ApiOperation(value = "获取食堂订单及销量趋势") + @PostMapping("/getCanteenOrdersAndSalesTrends") + public AjaxResult getCanteenOrdersAndSalesTrends(@RequestBody DataScreenDTO dataScreenDTO) { + try { + return service.getCanteenOrdersAndSalesTrends(dataScreenDTO); + } catch (Exception e) { + return error("获取食堂订单及销量趋势错误"); + } + } + @ApiOperation(value = "获取商超订单及销量趋势") + @PostMapping("/getSupermarketOrderAndSalesTrend") + public AjaxResult getSupermarketOrderAndSalesTrend(@RequestBody DataScreenDTO dataScreenDTO) { + try { + return service.getSupermarketOrderAndSalesTrend(dataScreenDTO); + } catch (Exception e) { + return error("获取商超订单及销量趋势错误"); + } + } + @ApiOperation(value = "获取本月菜品销量排名") + @PostMapping("/getThisMonthSDishSalesRanking") + public AjaxResult getThisMonthDishSalesRanking() { + try { + return service.getThisMonthDishSalesRanking(); + } catch (Exception e) { + return error("获取本月菜品销量排名错误"); + } + } + @ApiOperation(value = "订单类型占比") + @PostMapping("/getProportionOfOrderTypes") + public AjaxResult getProportionOfOrderTypes(@RequestBody DataScreenDTO dataScreenDTO) { + try { + return service.getProportionOfOrderTypes(dataScreenDTO); + } catch (Exception e) { + return error("获取订单类型占比错误"); + } + } +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/dataScreening/dto/DataScreenDTO.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/dataScreening/dto/DataScreenDTO.java new file mode 100644 index 0000000..2c0f779 --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/dataScreening/dto/DataScreenDTO.java @@ -0,0 +1,13 @@ +package com.bonus.canteen.core.dataScreening.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author tqzhang + */ +@Data +public class DataScreenDTO { + @ApiModelProperty(value = "类型(1-最近7天,2-最近30天)") + private String type; +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/dataScreening/mapper/DataScreeningMapper.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/dataScreening/mapper/DataScreeningMapper.java new file mode 100644 index 0000000..e1e5fc7 --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/dataScreening/mapper/DataScreeningMapper.java @@ -0,0 +1,26 @@ +package com.bonus.canteen.core.dataScreening.mapper; + +import com.bonus.canteen.core.dataScreening.vo.EchartsVO; +import com.bonus.canteen.core.dataScreening.vo.SingleModelVO; +import com.bonus.common.core.web.domain.AjaxResult; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface DataScreeningMapper { + SingleModelVO selectTurnover(@Param("date") String date,@Param("type") int type); + + SingleModelVO selectOrder(@Param("date") String date,@Param("type") int type); + + SingleModelVO selectPerson(@Param("date") String date,@Param("type") int type); + + SingleModelVO selectDish(@Param("date")String date); + + List getCanteenOrdersAndSalesTrends(@Param("startDate")String startDate, @Param("endDate")String endDate); + + List getSupermarketOrderAndSalesTrend(@Param("startDate")String startDate, @Param("endDate")String endDate); + + List getThisMonthDishSalesRanking(@Param("startDate")String startDate, @Param("endDate")String endDate); + + SingleModelVO selectOrderByDate(@Param("startDate")String startDate, @Param("endDate")String endDate, @Param("type") int type); +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/dataScreening/service/DataScreeningService.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/dataScreening/service/DataScreeningService.java new file mode 100644 index 0000000..a287e13 --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/dataScreening/service/DataScreeningService.java @@ -0,0 +1,16 @@ +package com.bonus.canteen.core.dataScreening.service; + +import com.bonus.canteen.core.dataScreening.dto.DataScreenDTO; +import com.bonus.common.core.web.domain.AjaxResult; + +public interface DataScreeningService { + AjaxResult getDataScreeningModel(); + + AjaxResult getCanteenOrdersAndSalesTrends(DataScreenDTO dataScreenDTO); + + AjaxResult getSupermarketOrderAndSalesTrend(DataScreenDTO dataScreenDTO); + + AjaxResult getThisMonthDishSalesRanking(); + + AjaxResult getProportionOfOrderTypes(DataScreenDTO dataScreenDTO); +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/dataScreening/service/DataScreeningServiceImpl.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/dataScreening/service/DataScreeningServiceImpl.java new file mode 100644 index 0000000..99802f3 --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/dataScreening/service/DataScreeningServiceImpl.java @@ -0,0 +1,171 @@ +package com.bonus.canteen.core.dataScreening.service; + +import com.bonus.canteen.core.dataScreening.dto.DataScreenDTO; +import com.bonus.canteen.core.dataScreening.mapper.DataScreeningMapper; +import com.bonus.canteen.core.dataScreening.vo.EchartsVO; +import com.bonus.canteen.core.dataScreening.vo.SingleModelVO; +import com.bonus.common.core.utils.DateUtils; +import com.bonus.common.core.web.domain.AjaxResult; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.stream.Collectors; + +@Service +public class DataScreeningServiceImpl implements DataScreeningService { + @Autowired + private DataScreeningMapper mapper; + + + @Override + public AjaxResult getDataScreeningModel() { + List list = new ArrayList<>(); + String currentDate = DateUtils.getDate(); + String yesterday = getLastDate(-1); + + // 查询各项数据 + addSingleItem("今日食堂营业额(元)", currentDate, yesterday, list, 11, "Turnover"); + addSingleItem("今日食堂订单量(个)", currentDate, yesterday, list, 11, "Order"); + addSingleItem("今日就餐人数(个)", currentDate, yesterday, list, 11, "Person"); + addSingleItem("今日菜品数量(个)", currentDate, yesterday, list, -1, "Dish"); + addSingleItem("今日超市营业额(元)", currentDate, yesterday, list, 4, "Turnover"); + addSingleItem("今日超市订单量(个)", currentDate, yesterday, list, 4, "Order"); + + return AjaxResult.success(list); + } + + private void addSingleItem(String name, String currentDate, String yesterdayData, List list, int orderType, String type) { + SingleModelVO today = fetchDataByType(currentDate, orderType, type); + SingleModelVO yesterday = fetchDataByType(yesterdayData, orderType, type); + + today.setName(name); + calculateRate(today, yesterday, type); + list.add(today); + } + + private SingleModelVO fetchDataByType(String date, int orderType, String type) { + switch (type) { + case "Order": + return mapper.selectOrder(date, orderType); + case "Turnover": + return mapper.selectTurnover(date, orderType); + case "Person": + return mapper.selectPerson(date, orderType); + case "Dish": + return mapper.selectDish(date); + default: + return new SingleModelVO(); + } + } + + private void calculateRate(SingleModelVO today, SingleModelVO yesterday, String type) { + BigDecimal yesterdayNum = Optional.ofNullable(yesterday.getNum()).orElse(BigDecimal.ZERO); + BigDecimal todayNum = Optional.ofNullable(today.getNum()).orElse(BigDecimal.ZERO); + + if (yesterdayNum.compareTo(BigDecimal.ZERO) == 0) { + today.setRate(todayNum.compareTo(BigDecimal.ZERO) == 0 ? "0.0" : "100.0"); + } else { + BigDecimal rate = todayNum.subtract(yesterdayNum) + .divide(yesterdayNum, 4, BigDecimal.ROUND_HALF_UP) + .multiply(BigDecimal.valueOf(100)); + today.setRate(String.format("%.2f", rate)); + } + + if ("Turnover".equals(type)) { + today.setNum(todayNum.divide(BigDecimal.valueOf(100))); + } + } + + + @Override + public AjaxResult getCanteenOrdersAndSalesTrends(DataScreenDTO dataScreenDTO) { + return getOrdersAndSalesTrends(dataScreenDTO, true); + } + + @Override + public AjaxResult getSupermarketOrderAndSalesTrend(DataScreenDTO dataScreenDTO) { + return getOrdersAndSalesTrends(dataScreenDTO, false); + } + + private AjaxResult getOrdersAndSalesTrends(DataScreenDTO dataScreenDTO, boolean isCanteen) { + String date = getLastDate(dataScreenDTO.getType().equals("2") ? -29 : -6); + List list = isCanteen + ? mapper.getCanteenOrdersAndSalesTrends(date, DateUtils.getDate()) + : mapper.getSupermarketOrderAndSalesTrend(date, DateUtils.getDate()); + + List dateList = getDatesBetween(date, DateUtils.getDate(), "yyyy-MM-dd"); + Map dataMap = list.stream() + .collect(Collectors.toMap(EchartsVO::getOrderDate, vo -> vo, (a, b) -> a)); + + List result = dateList.stream().map(dateStr -> { + EchartsVO echartsVO = dataMap.getOrDefault(dateStr, new EchartsVO()); + echartsVO.setOrderDate(dateStr); + echartsVO.setSalesValue(Optional.ofNullable(echartsVO.getSalesValue()) + .map(value -> new BigDecimal(value).divide(BigDecimal.valueOf(100)).toString()) + .orElse("0")); + echartsVO.setOrderValue(Optional.ofNullable(echartsVO.getOrderValue()).orElse("0")); + return echartsVO; + }).sorted(Comparator.comparing(EchartsVO::getOrderDate)).collect(Collectors.toList()); + + return AjaxResult.success(result); + } + + @Override + public AjaxResult getThisMonthDishSalesRanking() { + String date = getLastDate(-29); + return AjaxResult.success(mapper.getThisMonthDishSalesRanking(date, DateUtils.getDate())); + } + + @Override + public AjaxResult getProportionOfOrderTypes(DataScreenDTO dataScreenDTO) { + String date = getLastDate(dataScreenDTO.getType().equals("2") ? -29 : -6); + SingleModelVO superMarketOrder = mapper.selectOrderByDate(date,DateUtils.getDate(), 4); + SingleModelVO canteenOrder = mapper.selectOrderByDate(date,DateUtils.getDate(), 11); + SingleModelVO preOrderMealOrder = mapper.selectOrderByDate(date,DateUtils.getDate(), 2); + + BigDecimal total = superMarketOrder.getNum().add(canteenOrder.getNum()).add(preOrderMealOrder.getNum()); + + calculateProportion(superMarketOrder, total, "超市订单"); + calculateProportion(canteenOrder, total, "食堂订单"); + calculateProportion(preOrderMealOrder, total, "外卖订单"); + return AjaxResult.success(Arrays.asList(superMarketOrder, canteenOrder, preOrderMealOrder)); + } + private void calculateProportion(SingleModelVO order, BigDecimal total, String name) { + order.setName(name); + if (total.compareTo(BigDecimal.ZERO) == 0) { + order.setRate("0.0"); + } else { + BigDecimal rate = order.getNum().divide(total, 4, BigDecimal.ROUND_HALF_UP) + .multiply(BigDecimal.valueOf(100)); + order.setRate(String.format("%.2f", rate)); + } + } + public static String getLastDate(int day) { + Calendar calendar = Calendar.getInstance(); + // 日期减去一天 + calendar.add(Calendar.DATE, day); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + return sdf.format(calendar.getTime()); + } + + public static List getDatesBetween(String startStr, String endStr, String pattern) { + SimpleDateFormat sdf = new SimpleDateFormat(pattern); + List dates = new ArrayList<>(); + try { + Date startDate = sdf.parse(startStr); + Date endDate = sdf.parse(endStr); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + while (!calendar.getTime().after(endDate)) { + dates.add(sdf.format(calendar.getTime())); + calendar.add(Calendar.DATE, 1); + } + } catch (Exception e) { + e.printStackTrace(); + } + return dates; + } +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/dataScreening/vo/EchartsVO.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/dataScreening/vo/EchartsVO.java new file mode 100644 index 0000000..4c7e01d --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/dataScreening/vo/EchartsVO.java @@ -0,0 +1,11 @@ +package com.bonus.canteen.core.dataScreening.vo; + +import lombok.Data; + +@Data +public class EchartsVO { + private String name; + private String salesValue; + private String orderValue; + private String orderDate; +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/dataScreening/vo/SingleModelVO.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/dataScreening/vo/SingleModelVO.java new file mode 100644 index 0000000..ca0cc91 --- /dev/null +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/dataScreening/vo/SingleModelVO.java @@ -0,0 +1,12 @@ +package com.bonus.canteen.core.dataScreening.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class SingleModelVO { + private BigDecimal num; + private String rate; + private String name; +} diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/menu/controller/MenuRecipeController.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/menu/controller/MenuRecipeController.java index b9d93e0..2e56a4d 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/menu/controller/MenuRecipeController.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/menu/controller/MenuRecipeController.java @@ -8,7 +8,6 @@ import javax.validation.Valid; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bonus.canteen.core.common.utils.RedisUtil; -import com.bonus.canteen.core.common.utils.TenantContextHolder; import com.bonus.canteen.core.menu.dto.*; import com.bonus.canteen.core.menu.service.IMenuRecipeService; import com.bonus.canteen.core.menu.vo.AllocRecipeStallVO; diff --git a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/menu/service/impl/MenuRecipeServiceImpl.java b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/menu/service/impl/MenuRecipeServiceImpl.java index 9028232..cc87cfc 100644 --- a/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/menu/service/impl/MenuRecipeServiceImpl.java +++ b/bonus-modules/bonus-smart-canteen/src/main/java/com/bonus/canteen/core/menu/service/impl/MenuRecipeServiceImpl.java @@ -40,7 +40,6 @@ import com.bonus.canteen.core.menu.domain.MenuAppRecipe; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bonus.canteen.core.common.utils.RedisUtil; -import com.bonus.canteen.core.common.utils.TenantContextHolder; import com.bonus.canteen.core.menu.domain.*; import com.bonus.canteen.core.menu.dto.*; import com.bonus.canteen.core.menu.enums.*; @@ -66,6 +65,7 @@ import com.bonus.common.core.exception.ServiceException; import com.bonus.common.core.utils.StringUtils; import com.bonus.common.core.web.domain.AjaxResult; import com.bonus.common.houqin.constant.DelFlagEnum; +import com.bonus.common.houqin.constant.GlobalConstants; import com.bonus.common.houqin.i18n.I18n; import com.bonus.common.houqin.mq.constant.LeMqConstant; import com.bonus.common.houqin.utils.LeBeanUtil; @@ -527,7 +527,7 @@ public class MenuRecipeServiceImpl extends ServiceImpl + + + + + + + + + + + + \ No newline at end of file