From 9ca97fd558700e7054c5f54192a9db7a1e6b8230 Mon Sep 17 00:00:00 2001
From: xuhy <3313886187@qq.com>
Date: 星期三, 11 九月 2024 16:31:47 +0800
Subject: [PATCH] 完善导出等接口

---
 ruoyi-system/src/main/java/com/ruoyi/system/service/TOrderStockService.java           |    2 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TDataGeneratorController.java  |   79 ++++
 ruoyi-system/src/main/java/com/ruoyi/system/service/TOrderMealService.java            |   25 +
 ruoyi-system/src/main/java/com/ruoyi/system/domain/TOrderStock.java                   |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/TOrderMealMapper.java              |   33 ++
 ruoyi-system/src/main/java/com/ruoyi/system/export/SaleGeneratorListExport.java       |   29 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TOrderStockServiceImpl.java  |   34 +-
 ruoyi-system/src/main/java/com/ruoyi/system/export/MealGeneratorListExport.java       |   34 ++
 ruoyi-system/src/main/java/com/ruoyi/system/export/TOrderStockExportExcel.java        |    2 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TOrderSaleController.java      |   10 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/TOrderStockGoods.java              |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/TOrderSaleMapper.java              |   17 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TOrderSaleServiceImpl.java   |   91 ++++--
 ruoyi-system/src/main/resources/mapper/system/TOrderSaleMapper.xml                    |   34 ++
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TOrderMealServiceImpl.java   |   82 ++++-
 ruoyi-system/src/main/java/com/ruoyi/system/service/TOrderSaleService.java            |   18 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TDataStatisticsController.java |  177 +++++++++--
 ruoyi-system/src/main/java/com/ruoyi/system/vo/GoodsProfitVO.java                     |   38 ++
 ruoyi-system/src/main/java/com/ruoyi/system/query/TDataGeneratorQuery.java            |    3 
 ruoyi-system/src/main/resources/mapper/system/TOrderMealMapper.xml                    |  118 +++++++
 ruoyi-system/src/main/resources/mapper/system/TOrderStockMapper.xml                   |   13 
 ruoyi-system/src/main/java/com/ruoyi/system/query/ProfitDetailsQuery.java             |   22 +
 ruoyi-system/src/main/java/com/ruoyi/system/vo/ProfitDetailsVO.java                   |   28 +
 23 files changed, 761 insertions(+), 136 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TDataGeneratorController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TDataGeneratorController.java
index dfcf093..180b21c 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TDataGeneratorController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TDataGeneratorController.java
@@ -14,9 +14,7 @@
 import com.ruoyi.system.domain.TOrderStockGoods;
 import com.ruoyi.system.dto.OrderMealGeneratorDTO;
 import com.ruoyi.system.dto.OrderSaleGeneratorDTO;
-import com.ruoyi.system.export.TOrderMealExportExcel;
-import com.ruoyi.system.export.TOrderSaleAndGoodsExportExcel;
-import com.ruoyi.system.export.TOrderStockExportExcel;
+import com.ruoyi.system.export.*;
 import com.ruoyi.system.query.TDataGeneratorMealQuery;
 import com.ruoyi.system.query.TDataGeneratorQuery;
 import com.ruoyi.system.query.TDataGeneratorSaleQuery;
@@ -214,7 +212,6 @@
         for (TOrderStockVO orderStockVO : list) {
             TOrderStockExportExcel orderStockExportExcel = new TOrderStockExportExcel();
             BeanUtils.copyProperties(orderStockVO, orderStockExportExcel);
-            orderStockExportExcel.setGoodsAmount(orderStockVO.getOrderStockGoods().stream().map(TOrderStockGoods::getSalePrice).reduce(BigDecimal::add).get());
             orderStockExportExcel.setStockTime(DateUtils.localDateToString(orderStockVO.getStockTime()));
             orderStockExportExcels.add(orderStockExportExcel);
         }
@@ -224,7 +221,7 @@
         response.setCharacterEncoding("utf-8");
         ServletOutputStream outputStream = null;
         try {
-            String fileName = URLEncoder.encode("销售生成列表.xls", "utf-8");
+            String fileName = URLEncoder.encode("进货生成列表.xls", "utf-8");
             response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
             response.setContentType("application/vnd.ms-excel;charset=UTF-8");
             response.setHeader("Pragma", "no-cache");
@@ -242,6 +239,78 @@
         }
     }
 
+    @ApiOperation( value = "餐饮数据生成列表导出")
+    @PostMapping(value = "/mealGeneratorListExport")
+    public void mealGeneratorListExport(@RequestBody TDataGeneratorQuery query) {
+        List<TDataGeneratorVO> list = orderMealService.mealGeneratorListExport(query);
+        List<MealGeneratorListExport> mealGeneratorListExports = new ArrayList<>();
+        for (TDataGeneratorVO dataGeneratorVO : list) {
+            MealGeneratorListExport mealGeneratorListExport = new MealGeneratorListExport();
+            BeanUtils.copyProperties(dataGeneratorVO, mealGeneratorListExport);
+            mealGeneratorListExport.setGeneratorTime(DateUtils.localDateTimeToString(dataGeneratorVO.getCreateTime()));
+            mealGeneratorListExport.setStartTimeStr(DateUtils.localDateToString(dataGeneratorVO.getStartTime()) + " ~ " + DateUtils.localDateToString(dataGeneratorVO.getEndTime()));
+            mealGeneratorListExport.setRevenueRange(dataGeneratorVO.getMinMoney() + " ~ " + dataGeneratorVO.getMaxMoney());
+            mealGeneratorListExports.add(mealGeneratorListExport);
+        }
+        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), MealGeneratorListExport.class, mealGeneratorListExports);
+        HttpServletResponse response = WebUtils.response();
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("utf-8");
+        ServletOutputStream outputStream = null;
+        try {
+            String fileName = URLEncoder.encode("餐饮数据生成列表.xls", "utf-8");
+            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
+            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
+            response.setHeader("Pragma", "no-cache");
+            response.setHeader("Cache-Control", "no-cache");
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                outputStream.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    @ApiOperation( value = "销售数据生成列表导出")
+    @PostMapping(value = "/saleGeneratorListExport")
+    public void saleGeneratorListExport(@RequestBody TDataGeneratorQuery query) {
+        List<TDataGeneratorVO> list = orderSaleService.saleGeneratorListExport(query);
+        List<SaleGeneratorListExport> saleGeneratorListExports = new ArrayList<>();
+        for (TDataGeneratorVO dataGeneratorVO : list) {
+            SaleGeneratorListExport saleGeneratorListExport = new SaleGeneratorListExport();
+            BeanUtils.copyProperties(dataGeneratorVO, saleGeneratorListExport);
+            saleGeneratorListExport.setGeneratorTime(DateUtils.localDateTimeToString(dataGeneratorVO.getCreateTime()));
+            saleGeneratorListExport.setStartTimeStr(DateUtils.localDateToString(dataGeneratorVO.getStartTime()) + " ~ " + DateUtils.localDateToString(dataGeneratorVO.getEndTime()));
+            saleGeneratorListExports.add(saleGeneratorListExport);
+        }
+        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), SaleGeneratorListExport.class, saleGeneratorListExports);
+        HttpServletResponse response = WebUtils.response();
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("utf-8");
+        ServletOutputStream outputStream = null;
+        try {
+            String fileName = URLEncoder.encode("销售数据生成列表.xls", "utf-8");
+            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
+            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
+            response.setHeader("Pragma", "no-cache");
+            response.setHeader("Cache-Control", "no-cache");
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                outputStream.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
 
 }
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TDataStatisticsController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TDataStatisticsController.java
index 2f9c3ec..6abf2f8 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TDataStatisticsController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TDataStatisticsController.java
@@ -1,22 +1,33 @@
 package com.ruoyi.web.controller.api;
 
 
+import cn.afterturn.easypoi.excel.ExcelExportUtil;
+import cn.afterturn.easypoi.excel.entity.ExportParams;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.WebUtils;
 import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.system.export.SaleGeneratorListExport;
+import com.ruoyi.system.query.ProfitDetailsQuery;
+import com.ruoyi.system.query.TDataGeneratorQuery;
 import com.ruoyi.system.query.TDataStatisticsQuery;
 import com.ruoyi.system.service.TOrderMealService;
 import com.ruoyi.system.service.TOrderSaleService;
-import com.ruoyi.system.vo.OrderTrendsVO;
-import com.ruoyi.system.vo.PersonnelStatisticsVO;
-import com.ruoyi.system.vo.SalesRankingVO;
-import com.ruoyi.system.vo.SalesVolumeVO;
+import com.ruoyi.system.vo.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.net.URLEncoder;
 import java.time.LocalDateTime;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 
@@ -58,23 +69,23 @@
         switch (query.getTimeType()){
             case 1:
                 // 今日
-                startTime = LocalDateTime.MIN;
-                endTime = LocalDateTime.MAX;
+                startTime = DateUtils.getDayStart(LocalDateTime.now());
+                endTime = DateUtils.getDayEnd(LocalDateTime.now());
                 break;
             case 2:
                 // 昨日
-                startTime = LocalDateTime.now().minusDays(1);
-                endTime = LocalDateTime.now().minusDays(1);
+                startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(1));
+                endTime = DateUtils.getDayEnd(LocalDateTime.now().minusDays(1));
                 break;
             case 3:
                 // 近7天
-                startTime = LocalDateTime.now().minusDays(7);
-                endTime = LocalDateTime.now();
+                startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(7));
+                endTime = DateUtils.getDayEnd(LocalDateTime.now());
                 break;
             case 4:
                 // 近30天
-                startTime = LocalDateTime.now().minusDays(30);
-                endTime = LocalDateTime.now();
+                startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(30));
+                endTime = DateUtils.getDayEnd(LocalDateTime.now());
                 break;
         }
         query.setStartTime(DateUtils.localDateTimeToDate(startTime));
@@ -86,6 +97,100 @@
             salesVolumeVO = orderSaleService.salesVolume(query);
         }
         return AjaxResult.success(salesVolumeVO);
+    }
+
+    @ApiOperation( value = "盈利明细")
+    @PostMapping(value = "/profitDetails")
+    public AjaxResult<ProfitDetailsVO> profitDetails(@RequestBody ProfitDetailsQuery query) {
+        Long objectId = tokenService.getLoginUser().getObjectId();
+        query.setShopId(objectId);
+        if(Objects.nonNull(query.getTimeType())){
+            LocalDateTime startTime = null;
+            LocalDateTime endTime = null;
+            switch (query.getTimeType()){
+                case 1:
+                    // 今日
+                    startTime = DateUtils.getDayStart(LocalDateTime.now());
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now());
+                    break;
+                case 2:
+                    // 昨日
+                    startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(1));
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now().minusDays(1));
+                    break;
+                case 3:
+                    // 近7天
+                    startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(7));
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now());
+                    break;
+                case 4:
+                    // 近30天
+                    startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(30));
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now());
+                    break;
+            }
+            query.setStartTime(DateUtils.localDateTimeToDate(startTime));
+            query.setEndTime(DateUtils.localDateTimeToDate(endTime));
+        }
+        return AjaxResult.success(orderMealService.profitDetails(query));
+    }
+
+    @ApiOperation( value = "盈利明细导出")
+    @PostMapping(value = "/profitDetailsExport")
+    public void profitDetailsExport(@RequestBody ProfitDetailsQuery query) {
+        Long objectId = tokenService.getLoginUser().getObjectId();
+        query.setShopId(objectId);
+        if(Objects.nonNull(query.getTimeType())){
+            LocalDateTime startTime = null;
+            LocalDateTime endTime = null;
+            switch (query.getTimeType()){
+                case 1:
+                    // 今日
+                    startTime = DateUtils.getDayStart(LocalDateTime.now());
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now());
+                    break;
+                case 2:
+                    // 昨日
+                    startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(1));
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now().minusDays(1));
+                    break;
+                case 3:
+                    // 近7天
+                    startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(7));
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now());
+                    break;
+                case 4:
+                    // 近30天
+                    startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(30));
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now());
+                    break;
+            }
+            query.setStartTime(DateUtils.localDateTimeToDate(startTime));
+            query.setEndTime(DateUtils.localDateTimeToDate(endTime));
+        }
+        List<GoodsProfitVO> list  = orderMealService.profitDetailsExport(query);
+        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), GoodsProfitVO.class, list);
+        HttpServletResponse response = WebUtils.response();
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("utf-8");
+        ServletOutputStream outputStream = null;
+        try {
+            String fileName = URLEncoder.encode("盈利明细.xls", "utf-8");
+            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
+            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
+            response.setHeader("Pragma", "no-cache");
+            response.setHeader("Cache-Control", "no-cache");
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                outputStream.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
     }
 
     @ApiOperation( value = "商品分类销售排行")
@@ -102,23 +207,23 @@
         switch (query.getTimeType()){
             case 1:
                 // 今日
-                startTime = LocalDateTime.MIN;
-                endTime = LocalDateTime.MAX;
+                startTime = DateUtils.getDayStart(LocalDateTime.now());
+                endTime = DateUtils.getDayEnd(LocalDateTime.now());
                 break;
             case 2:
                 // 昨日
-                startTime = LocalDateTime.now().minusDays(1);
-                endTime = LocalDateTime.now().minusDays(1);
+                startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(1));
+                endTime = DateUtils.getDayEnd(LocalDateTime.now().minusDays(1));
                 break;
             case 3:
                 // 近7天
-                startTime = LocalDateTime.now().minusDays(7);
-                endTime = LocalDateTime.now();
+                startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(7));
+                endTime = DateUtils.getDayEnd(LocalDateTime.now());
                 break;
             case 4:
                 // 近30天
-                startTime = LocalDateTime.now().minusDays(30);
-                endTime = LocalDateTime.now();
+                startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(30));
+                endTime = DateUtils.getDayEnd(LocalDateTime.now());
                 break;
         }
         query.setStartTime(DateUtils.localDateTimeToDate(startTime));
@@ -146,23 +251,23 @@
         switch (query.getTimeType()){
             case 1:
                 // 今日
-                startTime = LocalDateTime.MIN;
-                endTime = LocalDateTime.MAX;
+                startTime = DateUtils.getDayStart(LocalDateTime.now());
+                endTime = DateUtils.getDayEnd(LocalDateTime.now());
                 break;
             case 2:
                 // 昨日
-                startTime = LocalDateTime.now().minusDays(1);
-                endTime = LocalDateTime.now().minusDays(1);
+                startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(1));
+                endTime = DateUtils.getDayEnd(LocalDateTime.now().minusDays(1));
                 break;
             case 3:
                 // 近7天
-                startTime = LocalDateTime.now().minusDays(7);
-                endTime = LocalDateTime.now();
+                startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(7));
+                endTime = DateUtils.getDayEnd(LocalDateTime.now());
                 break;
             case 4:
                 // 近30天
-                startTime = LocalDateTime.now().minusDays(30);
-                endTime = LocalDateTime.now();
+                startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(30));
+                endTime = DateUtils.getDayEnd(LocalDateTime.now());
                 break;
         }
         query.setStartTime(DateUtils.localDateTimeToDate(startTime));
@@ -189,23 +294,23 @@
         switch (query.getTimeType()){
             case 1:
                 // 今日
-                startTime = LocalDateTime.MIN;
-                endTime = LocalDateTime.MAX;
+                startTime = DateUtils.getDayStart(LocalDateTime.now());
+                endTime = DateUtils.getDayEnd(LocalDateTime.now());
                 break;
             case 2:
                 // 昨日
-                startTime = LocalDateTime.now().minusDays(1);
-                endTime = LocalDateTime.now().minusDays(1);
+                startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(1));
+                endTime = DateUtils.getDayEnd(LocalDateTime.now().minusDays(1));
                 break;
             case 3:
                 // 近7天
-                startTime = LocalDateTime.now().minusDays(7);
-                endTime = LocalDateTime.now();
+                startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(7));
+                endTime = DateUtils.getDayEnd(LocalDateTime.now());
                 break;
             case 4:
                 // 近30天
-                startTime = LocalDateTime.now().minusDays(30);
-                endTime = LocalDateTime.now();
+                startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(30));
+                endTime = DateUtils.getDayEnd(LocalDateTime.now());
                 break;
         }
         query.setStartTime(DateUtils.localDateTimeToDate(startTime));
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TOrderSaleController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TOrderSaleController.java
index 1eeffce..bb611bb 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TOrderSaleController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TOrderSaleController.java
@@ -115,6 +115,16 @@
         return AjaxResult.success();
     }
 
+    /**
+     * 销售下单接口
+     */
+    @ApiOperation( value = "销售单修改接口")
+    @PostMapping(value = "/edit")
+    public AjaxResult<String> edit(@RequestBody TOrderSaleDTO dto) {
+        orderSaleService.edit(dto);
+        return AjaxResult.success();
+    }
+
     @ApiOperation( value = "结账接口")
     @PostMapping(value = "/checkout")
     public AjaxResult<String> checkout(@Validated @RequestBody CheckoutDTO dto) {
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/TOrderStock.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/TOrderStock.java
index e7e3a14..c3057ba 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/TOrderStock.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/TOrderStock.java
@@ -42,9 +42,9 @@
     @TableField("stockTime")
     private LocalDate stockTime;
 
-//    @ApiModelProperty(value = "进货总价")
-//    @TableField("stockTotalPrice")
-//    private BigDecimal stockTotalPrice;
+    @ApiModelProperty(value = "进货总价")
+    @TableField("stockTotalPrice")
+    private BigDecimal stockTotalPrice;
     @ApiModelProperty(value = "是否覆盖 1=是 0=否")
     @TableField("isCover")
     private Integer isCover;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/TOrderStockGoods.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/TOrderStockGoods.java
index 25bb6eb..525f2b3 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/TOrderStockGoods.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/TOrderStockGoods.java
@@ -46,7 +46,6 @@
     private String goodsName;
 
     @ApiModelProperty(value = "成本价")
-    @Excel(name = "进货价格",width = 15)
     @TableField("costPrice")
     private BigDecimal costPrice;
 
@@ -55,6 +54,7 @@
     private BigDecimal salePrice;
 
     @ApiModelProperty(value = "本次进货价格")
+    @Excel(name = "进货价格",width = 15)
     @TableField("thisSalePrice")
     private BigDecimal thisSalePrice;
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/export/MealGeneratorListExport.java b/ruoyi-system/src/main/java/com/ruoyi/system/export/MealGeneratorListExport.java
new file mode 100644
index 0000000..670d1ee
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/export/MealGeneratorListExport.java
@@ -0,0 +1,34 @@
+package com.ruoyi.system.export;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+public class MealGeneratorListExport implements Serializable {
+
+    @Excel(name = "营业数据生成时间",width = 30)
+    private String generatorTime;
+
+    @Excel(name = "操作人",width = 30)
+    private String userName;
+
+    @Excel(name = "店铺名称",width = 30)
+    private String shopName;
+
+    @Excel(name = "覆盖时间段",width = 30)
+    private String startTimeStr;
+
+    @Excel(name = "营业额范围",width = 30)
+    private String revenueRange;
+
+    @Excel(name = "生成营业额合计(元)",width = 30)
+    private BigDecimal totalRevenue;
+
+    @Excel(name = "状态",width = 30,replace = {"生成中_1","待覆盖_2","已覆盖_3"})
+    private Integer status;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/export/SaleGeneratorListExport.java b/ruoyi-system/src/main/java/com/ruoyi/system/export/SaleGeneratorListExport.java
new file mode 100644
index 0000000..641c9db
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/export/SaleGeneratorListExport.java
@@ -0,0 +1,29 @@
+package com.ruoyi.system.export;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+public class SaleGeneratorListExport implements Serializable {
+
+    @Excel(name = "营业数据生成时间",width = 30)
+    private String generatorTime;
+
+    @Excel(name = "操作人",width = 30)
+    private String userName;
+
+    @Excel(name = "店铺名称",width = 30)
+    private String shopName;
+
+    @Excel(name = "覆盖时间段",width = 30)
+    private String startTimeStr;
+
+    @Excel(name = "生成营业额合计(元)",width = 30)
+    private BigDecimal totalRevenue;
+
+    @Excel(name = "状态",width = 30,replace = {"生成中_1","待覆盖_2","已覆盖_3"})
+    private Integer status;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/export/TOrderStockExportExcel.java b/ruoyi-system/src/main/java/com/ruoyi/system/export/TOrderStockExportExcel.java
index 198c2df..99ad705 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/export/TOrderStockExportExcel.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/export/TOrderStockExportExcel.java
@@ -24,6 +24,6 @@
     private List<TOrderStockGoods> orderStockGoods;
 
     @Excel(width = 30,name = "商品总价",needMerge = true)
-    private BigDecimal goodsAmount;
+    private BigDecimal stockTotalPrice;
 
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TOrderMealMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TOrderMealMapper.java
index c4e6829..5b9d652 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TOrderMealMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TOrderMealMapper.java
@@ -3,9 +3,7 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.system.domain.TOrderMeal;
-import com.ruoyi.system.query.TDataGeneratorMealQuery;
-import com.ruoyi.system.query.TDataStatisticsQuery;
-import com.ruoyi.system.query.TOrderMealQuery;
+import com.ruoyi.system.query.*;
 import com.ruoyi.system.vo.*;
 import org.apache.ibatis.annotations.Param;
 
@@ -88,4 +86,33 @@
      * @return
      */
     List<TOrderMealVO> mealGeneratorExport(@Param("query")TDataGeneratorMealQuery query);
+
+    /**
+     * 导出数据生成列表
+     * @param query
+     * @return
+     */
+    List<TDataGeneratorVO> mealGeneratorListExport(@Param("query")TDataGeneratorQuery query);
+
+    /**
+     * 盈利明细分页
+     * @param query
+     * @param pageInfo
+     * @return
+     */
+    List<GoodsProfitVO> profitDetails(@Param("query") ProfitDetailsQuery query, @Param("pageInfo")PageInfo<GoodsProfitVO> pageInfo);
+
+    /**
+     * 统计商品金额
+     * @param query
+     * @return
+     */
+    Map<String, BigDecimal> profitDetailsStatistics(@Param("query")ProfitDetailsQuery query);
+
+    /**
+     * 导出盈利明细
+     * @param query
+     * @return
+     */
+    List<GoodsProfitVO> profitDetailsExport(@Param("query")ProfitDetailsQuery query);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TOrderSaleMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TOrderSaleMapper.java
index dbbb291..29f161e 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TOrderSaleMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TOrderSaleMapper.java
@@ -3,14 +3,8 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.system.domain.TOrderSale;
-import com.ruoyi.system.query.TDataGeneratorSaleQuery;
-import com.ruoyi.system.query.TDataStatisticsQuery;
-import com.ruoyi.system.query.TOrderMealQuery;
-import com.ruoyi.system.query.TOrderSaleQuery;
-import com.ruoyi.system.vo.AmountSumVO;
-import com.ruoyi.system.vo.OrderTrendsVO;
-import com.ruoyi.system.vo.SalesVolumeVO;
-import com.ruoyi.system.vo.TOrderSaleVO;
+import com.ruoyi.system.query.*;
+import com.ruoyi.system.vo.*;
 import org.apache.ibatis.annotations.Param;
 
 import java.math.BigDecimal;
@@ -76,4 +70,11 @@
      * @return
      */
     List<TOrderSaleVO> saleGeneratorExport(@Param("query")TDataGeneratorSaleQuery query);
+
+    /**
+     * 销售生成数据详情导出
+     * @param query
+     * @return
+     */
+    List<TDataGeneratorVO> saleGeneratorListExport(@Param("query")TDataGeneratorQuery query);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/ProfitDetailsQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/ProfitDetailsQuery.java
new file mode 100644
index 0000000..b395dbc
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/ProfitDetailsQuery.java
@@ -0,0 +1,22 @@
+package com.ruoyi.system.query;
+
+import com.ruoyi.common.core.domain.model.TimeRangeQueryBody;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "营业数据统计营业明细Query")
+public class ProfitDetailsQuery extends TimeRangeQueryBody {
+
+    @ApiModelProperty(value = "时间类型 1=今日 2=昨日 3=近7天 4=近30天")
+    private Integer timeType;
+
+    @ApiModelProperty(value = "店铺id")
+    private Long shopId;
+    @ApiModelProperty(value = "分类id")
+    private Long typeId;
+    @ApiModelProperty(value = "商品名称")
+    private String goodsName;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/TDataGeneratorQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/TDataGeneratorQuery.java
index adcfdb9..23e868f 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/query/TDataGeneratorQuery.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/TDataGeneratorQuery.java
@@ -6,6 +6,7 @@
 import lombok.Data;
 
 import javax.validation.constraints.NotNull;
+import java.util.List;
 
 @Data
 @ApiModel(value = "数据生成分页")
@@ -19,5 +20,7 @@
     @ApiModelProperty(value = "订单类型 1=餐饮 2=销售")
     @NotNull(message = "订单类型不能为空")
     private Integer orderType;
+    @ApiModelProperty(value = "id集合")
+    private List<Long> ids;
 
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TOrderMealService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TOrderMealService.java
index 16429f4..afac273 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TOrderMealService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TOrderMealService.java
@@ -7,9 +7,7 @@
 import com.ruoyi.system.dto.CheckoutDTO;
 import com.ruoyi.system.dto.OrderMealGeneratorDTO;
 import com.ruoyi.system.dto.TOrderMealDTO;
-import com.ruoyi.system.query.TDataGeneratorMealQuery;
-import com.ruoyi.system.query.TDataStatisticsQuery;
-import com.ruoyi.system.query.TOrderMealQuery;
+import com.ruoyi.system.query.*;
 import com.ruoyi.system.vo.*;
 
 import java.math.BigDecimal;
@@ -120,4 +118,25 @@
      * @param dto
      */
     void startMeal(TOrderMeal dto);
+
+    /**
+     * 餐饮数据生成列表导出
+     * @param query
+     * @return
+     */
+    List<TDataGeneratorVO> mealGeneratorListExport(TDataGeneratorQuery query);
+
+    /**
+     * 盈利明细
+     * @param query
+     * @return
+     */
+    ProfitDetailsVO profitDetails(ProfitDetailsQuery query);
+
+    /**
+     * 盈利明细导出
+     * @param query
+     * @return
+     */
+    List<GoodsProfitVO> profitDetailsExport(ProfitDetailsQuery query);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TOrderSaleService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TOrderSaleService.java
index 5919843..d731266 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TOrderSaleService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TOrderSaleService.java
@@ -5,10 +5,7 @@
 import com.ruoyi.system.domain.TOrderSale;
 import com.ruoyi.system.dto.CheckoutDTO;
 import com.ruoyi.system.dto.TOrderSaleDTO;
-import com.ruoyi.system.query.TDataGeneratorSaleQuery;
-import com.ruoyi.system.query.TDataStatisticsQuery;
-import com.ruoyi.system.query.TOrderMealQuery;
-import com.ruoyi.system.query.TOrderSaleQuery;
+import com.ruoyi.system.query.*;
 import com.ruoyi.system.vo.*;
 
 import java.math.BigDecimal;
@@ -92,4 +89,17 @@
      * @param dto
      */
     void checkout(CheckoutDTO dto);
+
+    /**
+     * 修改订单
+     * @param dto
+     */
+    void edit(TOrderSaleDTO dto);
+
+    /**
+     * 销售数据生成列表导出
+     * @param query
+     * @return
+     */
+    List<TDataGeneratorVO> saleGeneratorListExport(TDataGeneratorQuery query);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TOrderStockService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TOrderStockService.java
index 78171a2..78f95d2 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TOrderStockService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TOrderStockService.java
@@ -5,8 +5,10 @@
 import com.ruoyi.system.domain.TOrderStock;
 import com.ruoyi.system.dto.TOrderSaleDTO;
 import com.ruoyi.system.dto.TOrderStockDTO;
+import com.ruoyi.system.query.TDataGeneratorQuery;
 import com.ruoyi.system.query.TDataGeneratorStockQuery;
 import com.ruoyi.system.query.TOrderStockQuery;
+import com.ruoyi.system.vo.TDataGeneratorVO;
 import com.ruoyi.system.vo.TOrderStockVO;
 
 import java.util.List;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TOrderMealServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TOrderMealServiceImpl.java
index e0a983f..af90473 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TOrderMealServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TOrderMealServiceImpl.java
@@ -11,9 +11,7 @@
 import com.ruoyi.system.dto.*;
 import com.ruoyi.system.mapper.TOrderMealGoodsMapper;
 import com.ruoyi.system.mapper.TOrderMealMapper;
-import com.ruoyi.system.query.TDataGeneratorMealQuery;
-import com.ruoyi.system.query.TDataStatisticsQuery;
-import com.ruoyi.system.query.TOrderMealQuery;
+import com.ruoyi.system.query.*;
 import com.ruoyi.system.service.*;
 import com.ruoyi.system.vo.*;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -164,23 +162,23 @@
             switch (query.getTimeType()){
                 case 1:
                     // 今日
-                    startTime = LocalDateTime.MIN;
-                    endTime = LocalDateTime.MAX;
+                    startTime = DateUtils.getDayStart(LocalDateTime.now());
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now());
                     break;
                 case 2:
                     // 昨日
-                    startTime = LocalDateTime.now().minusDays(1);
-                    endTime = LocalDateTime.now().minusDays(1);
+                    startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(1));
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now().minusDays(1));
                     break;
                 case 3:
                     // 近7天
-                    startTime = LocalDateTime.now().minusDays(7);
-                    endTime = LocalDateTime.now();
+                    startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(7));
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now());
                     break;
                 case 4:
                     // 近30天
-                    startTime = LocalDateTime.now().minusDays(30);
-                    endTime = LocalDateTime.now();
+                    startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(30));
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now());
                     break;
             }
             query.setStartTime(DateUtils.localDateTimeToDate(startTime));
@@ -258,23 +256,23 @@
             switch (query.getTimeType()){
                 case 1:
                     // 今日
-                    startTime = LocalDateTime.MIN;
-                    endTime = LocalDateTime.MAX;
+                    startTime = DateUtils.getDayStart(LocalDateTime.now());
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now());
                     break;
                 case 2:
                     // 昨日
-                    startTime = LocalDateTime.now().minusDays(1);
-                    endTime = LocalDateTime.now().minusDays(1);
+                    startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(1));
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now().minusDays(1));
                     break;
                 case 3:
                     // 近7天
-                    startTime = LocalDateTime.now().minusDays(7);
-                    endTime = LocalDateTime.now();
+                    startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(7));
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now());
                     break;
                 case 4:
                     // 近30天
-                    startTime = LocalDateTime.now().minusDays(30);
-                    endTime = LocalDateTime.now();
+                    startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(30));
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now());
                     break;
             }
             query.setStartTime(DateUtils.localDateTimeToDate(startTime));
@@ -365,4 +363,50 @@
         this.save(dto);
     }
 
+    @Override
+    public List<TDataGeneratorVO> mealGeneratorListExport(TDataGeneratorQuery query) {
+        List<TDataGeneratorVO> list = this.baseMapper.mealGeneratorListExport(query);
+        List<Long> ids = list.stream().map(TDataGeneratorVO::getId).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty(ids)){
+            return new ArrayList<>();
+        }
+        List<TOrderMeal> orderMeals = this.list(Wrappers.lambdaQuery(TOrderMeal.class)
+                .in(TOrderMeal::getGeneratorId, ids));
+        List<Long> mealIds = orderMeals.stream().map(TOrderMeal::getId).collect(Collectors.toList());
+        if(!CollectionUtils.isEmpty(mealIds)){
+            List<TOrderMealGoods> mealGoods = orderMealGoodsService.list(Wrappers.lambdaQuery(TOrderMealGoods.class)
+                    .in(TOrderMealGoods::getOrderId, mealIds));
+            for (TDataGeneratorVO tDataGeneratorVO : list) {
+                List<Long> collect = orderMeals.stream().filter(e -> e.getGeneratorId().equals(tDataGeneratorVO.getId())).map(TOrderMeal::getId).collect(Collectors.toList());
+                BigDecimal money = mealGoods.stream().filter(e -> collect.contains(e.getOrderId()))
+                        .reduce(BigDecimal.ZERO, (x, y) -> x.add(y.getGoodsSalePrice().multiply(new BigDecimal(y.getGoodsCount()))), BigDecimal::add);
+                tDataGeneratorVO.setTotalRevenue(money);
+            }
+        }
+        return list;
+    }
+
+    @Override
+    public ProfitDetailsVO profitDetails(ProfitDetailsQuery query) {
+
+        ProfitDetailsVO profitDetailsVO = new ProfitDetailsVO();
+        // 查询商品盈利明细
+        PageInfo<GoodsProfitVO> pageInfo = new PageInfo<>(query.getPageNum(),query.getPageSize());
+        List<GoodsProfitVO> list = this.baseMapper.profitDetails(query,pageInfo);
+        pageInfo.setRecords(list);
+        profitDetailsVO.setGoodsProfitVOS(pageInfo);
+
+        // 统计商品金额
+        Map<String,BigDecimal> map = this.baseMapper.profitDetailsStatistics(query);
+        profitDetailsVO.setTotalProfits(new BigDecimal(map.get("totalProfits").toString()));
+        profitDetailsVO.setTotalCosts(new BigDecimal(map.get("totalCosts").toString()));
+        profitDetailsVO.setTotalSales(new BigDecimal(map.get("totalSales").toString()));
+        return profitDetailsVO;
+    }
+
+    @Override
+    public List<GoodsProfitVO> profitDetailsExport(ProfitDetailsQuery query) {
+        return this.baseMapper.profitDetailsExport(query);
+    }
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TOrderSaleServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TOrderSaleServiceImpl.java
index 6285a20..62f8b4b 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TOrderSaleServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TOrderSaleServiceImpl.java
@@ -10,10 +10,7 @@
 import com.ruoyi.system.dto.CheckoutDTO;
 import com.ruoyi.system.dto.TOrderSaleDTO;
 import com.ruoyi.system.mapper.TOrderSaleMapper;
-import com.ruoyi.system.query.TDataGeneratorSaleQuery;
-import com.ruoyi.system.query.TDataStatisticsQuery;
-import com.ruoyi.system.query.TOrderMealQuery;
-import com.ruoyi.system.query.TOrderSaleQuery;
+import com.ruoyi.system.query.*;
 import com.ruoyi.system.service.TGoodsService;
 import com.ruoyi.system.service.TGoodsTypeService;
 import com.ruoyi.system.service.TOrderSaleGoodsService;
@@ -58,8 +55,6 @@
         List<TOrderSaleGoods> orderSaleGoods = dto.getOrderSaleGoods();
         BigDecimal sum = orderSaleGoods.stream().map(TOrderSaleGoods::getGoodsSalePrice).reduce(BigDecimal::add).get();
         dto.setOrderMoney(sum);
-        BigDecimal sum1 = orderSaleGoods.stream().map(TOrderSaleGoods::getThisSalePrice).reduce(BigDecimal::add).get();
-        dto.setPayMoney(sum1);
         this.save(dto);
         // 添加商品
         orderSaleGoods.forEach(orderSaleGoods1 -> {
@@ -77,23 +72,23 @@
             switch (query.getTimeType()){
                 case 1:
                     // 今日
-                    startTime = LocalDateTime.MIN;
-                    endTime = LocalDateTime.MAX;
+                    startTime = DateUtils.getDayStart(LocalDateTime.now());
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now());
                     break;
                 case 2:
                     // 昨日
-                    startTime = LocalDateTime.now().minusDays(1);
-                    endTime = LocalDateTime.now().minusDays(1);
+                    startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(1));
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now().minusDays(1));
                     break;
                 case 3:
                     // 近7天
-                    startTime = LocalDateTime.now().minusDays(7);
-                    endTime = LocalDateTime.now();
+                    startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(7));
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now());
                     break;
                 case 4:
                     // 近30天
-                    startTime = LocalDateTime.now().minusDays(30);
-                    endTime = LocalDateTime.now();
+                    startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(30));
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now());
                     break;
             }
             query.setStartTime(DateUtils.localDateTimeToDate(startTime));
@@ -169,23 +164,23 @@
             switch (query.getTimeType()){
                 case 1:
                     // 今日
-                    startTime = LocalDateTime.MIN;
-                    endTime = LocalDateTime.MAX;
+                    startTime = DateUtils.getDayStart(LocalDateTime.now());
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now());
                     break;
                 case 2:
                     // 昨日
-                    startTime = LocalDateTime.now().minusDays(1);
-                    endTime = LocalDateTime.now().minusDays(1);
+                    startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(1));
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now().minusDays(1));
                     break;
                 case 3:
                     // 近7天
-                    startTime = LocalDateTime.now().minusDays(7);
-                    endTime = LocalDateTime.now();
+                    startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(7));
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now());
                     break;
                 case 4:
                     // 近30天
-                    startTime = LocalDateTime.now().minusDays(30);
-                    endTime = LocalDateTime.now();
+                    startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(30));
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now());
                     break;
             }
             query.setStartTime(DateUtils.localDateTimeToDate(startTime));
@@ -221,23 +216,23 @@
             switch (query.getTimeType()){
                 case 1:
                     // 今日
-                    startTime = LocalDateTime.MIN;
-                    endTime = LocalDateTime.MAX;
+                    startTime = DateUtils.getDayStart(LocalDateTime.now());
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now());
                     break;
                 case 2:
                     // 昨日
-                    startTime = LocalDateTime.now().minusDays(1);
-                    endTime = LocalDateTime.now().minusDays(1);
+                    startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(1));
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now().minusDays(1));
                     break;
                 case 3:
                     // 近7天
-                    startTime = LocalDateTime.now().minusDays(7);
-                    endTime = LocalDateTime.now();
+                    startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(7));
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now());
                     break;
                 case 4:
                     // 近30天
-                    startTime = LocalDateTime.now().minusDays(30);
-                    endTime = LocalDateTime.now();
+                    startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(30));
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now());
                     break;
             }
             query.setStartTime(DateUtils.localDateTimeToDate(startTime));
@@ -263,4 +258,40 @@
         orderSale.setStatus(2);
         this.updateById(orderSale);
     }
+
+    @Override
+    public void edit(TOrderSaleDTO dto) {
+        // 销售单号
+        List<TOrderSaleGoods> orderSaleGoods = dto.getOrderSaleGoods();
+        BigDecimal sum = orderSaleGoods.stream().map(TOrderSaleGoods::getGoodsSalePrice).reduce(BigDecimal::add).get();
+        dto.setOrderMoney(sum);
+        this.updateById(dto);
+        // 删除商品
+        orderSaleGoodsService.remove(Wrappers.lambdaQuery(TOrderSaleGoods.class)
+                .eq(TOrderSaleGoods::getOrderId,dto.getId()));
+        // 添加商品
+        orderSaleGoods.forEach(orderSaleGoods1 -> {
+            orderSaleGoods1.setOrderId(dto.getId());
+            orderSaleGoods1.setId(null);
+        });
+        orderSaleGoodsService.saveBatch(orderSaleGoods);
+    }
+
+    @Override
+    public List<TDataGeneratorVO> saleGeneratorListExport(TDataGeneratorQuery query) {
+        List<TDataGeneratorVO> list = this.baseMapper.saleGeneratorListExport(query);
+        List<Long> ids = list.stream().map(TDataGeneratorVO::getId).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty(ids)){
+            return new ArrayList<>();
+        }
+        List<TOrderSale> orderSales = this.list(Wrappers.lambdaQuery(TOrderSale.class)
+                .in(TOrderSale::getGeneratorId, ids));
+        for (TDataGeneratorVO tDataGeneratorVO : list) {
+            if(!CollectionUtils.isEmpty(orderSales)){
+                BigDecimal money = orderSales.stream().map(TOrderSale::getPayMoney).reduce(BigDecimal::add).get();
+                tDataGeneratorVO.setTotalRevenue(money);
+            }
+        }
+        return list;
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TOrderStockServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TOrderStockServiceImpl.java
index f52f708..156ac73 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TOrderStockServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TOrderStockServiceImpl.java
@@ -12,10 +12,12 @@
 import com.ruoyi.system.dto.TOrderSaleDTO;
 import com.ruoyi.system.dto.TOrderStockDTO;
 import com.ruoyi.system.mapper.TOrderStockMapper;
+import com.ruoyi.system.query.TDataGeneratorQuery;
 import com.ruoyi.system.query.TDataGeneratorStockQuery;
 import com.ruoyi.system.query.TOrderStockQuery;
 import com.ruoyi.system.service.TOrderStockGoodsService;
 import com.ruoyi.system.service.TOrderStockService;
+import com.ruoyi.system.vo.TDataGeneratorVO;
 import com.ruoyi.system.vo.TOrderStockVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -84,23 +86,23 @@
             switch (query.getTimeType()){
                 case 1:
                     // 今日
-                    startTime = LocalDateTime.MIN;
-                    endTime = LocalDateTime.MAX;
+                    startTime = DateUtils.getDayStart(LocalDateTime.now());
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now());
                     break;
                 case 2:
                     // 昨日
-                    startTime = LocalDateTime.now().minusDays(1);
-                    endTime = LocalDateTime.now().minusDays(1);
+                    startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(1));
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now().minusDays(1));
                     break;
                 case 3:
                     // 近7天
-                    startTime = LocalDateTime.now().minusDays(7);
-                    endTime = LocalDateTime.now();
+                    startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(7));
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now());
                     break;
                 case 4:
                     // 近30天
-                    startTime = LocalDateTime.now().minusDays(30);
-                    endTime = LocalDateTime.now();
+                    startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(30));
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now());
                     break;
             }
             query.setStartTime(DateUtils.localDateTimeToDate(startTime));
@@ -138,23 +140,23 @@
             switch (query.getTimeType()){
                 case 1:
                     // 今日
-                    startTime = LocalDateTime.MIN;
-                    endTime = LocalDateTime.MAX;
+                    startTime = DateUtils.getDayStart(LocalDateTime.now());
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now());
                     break;
                 case 2:
                     // 昨日
-                    startTime = LocalDateTime.now().minusDays(1);
-                    endTime = LocalDateTime.now().minusDays(1);
+                    startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(1));
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now().minusDays(1));
                     break;
                 case 3:
                     // 近7天
-                    startTime = LocalDateTime.now().minusDays(7);
-                    endTime = LocalDateTime.now();
+                    startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(7));
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now());
                     break;
                 case 4:
                     // 近30天
-                    startTime = LocalDateTime.now().minusDays(30);
-                    endTime = LocalDateTime.now();
+                    startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(30));
+                    endTime = DateUtils.getDayEnd(LocalDateTime.now());
                     break;
             }
             query.setStartTime(DateUtils.localDateTimeToDate(startTime));
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/GoodsProfitVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/GoodsProfitVO.java
new file mode 100644
index 0000000..565ff91
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/GoodsProfitVO.java
@@ -0,0 +1,38 @@
+package com.ruoyi.system.vo;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+@ApiModel(value = "商品盈利明细")
+public class GoodsProfitVO implements Serializable {
+
+    @ApiModelProperty(value = "商品分类")
+    @Excel(name = "商品分类",width = 30)
+    private String typeName;
+
+    @ApiModelProperty(value = "商品名称")
+    @Excel(name = "商品名称",width = 30)
+    private String goodsName;
+
+    @ApiModelProperty(value = "商品销售数量")
+    @Excel(name = "商品销售数量",width = 30)
+    private Integer totalSalesCount;
+
+    @ApiModelProperty(value = "商品成本")
+    @Excel(name = "商品成本",width = 30)
+    private BigDecimal goodsCostAmount;
+
+    @ApiModelProperty(value = "商品售价")
+    @Excel(name = "商品售价",width = 30)
+    private BigDecimal goodsSaleAmount;
+
+    @ApiModelProperty(value = "商品盈利")
+    @Excel(name = "商品盈利",width = 30)
+    private BigDecimal goodsProfitAmount;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProfitDetailsVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProfitDetailsVO.java
new file mode 100644
index 0000000..dbb5483
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/ProfitDetailsVO.java
@@ -0,0 +1,28 @@
+package com.ruoyi.system.vo;
+
+import com.ruoyi.common.basic.PageInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+@ApiModel(value = "盈利明细")
+public class ProfitDetailsVO implements Serializable {
+
+    @ApiModelProperty(value = "总销售额")
+    private BigDecimal totalSales;
+
+    @ApiModelProperty(value = "总成本")
+    private BigDecimal totalCosts;
+
+    @ApiModelProperty(value = "总盈利")
+    private BigDecimal totalProfits;
+
+    @ApiModelProperty(value = "商品盈利明细")
+    private PageInfo<GoodsProfitVO> goodsProfitVOS;
+
+}
diff --git a/ruoyi-system/src/main/resources/mapper/system/TOrderMealMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TOrderMealMapper.xml
index 5db7eb4..87a82ee 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TOrderMealMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TOrderMealMapper.xml
@@ -230,5 +230,123 @@
         </where>
         ORDER BY tom.createTime DESC
     </select>
+    <select id="mealGeneratorListExport" resultType="com.ruoyi.system.vo.TDataGeneratorVO">
+        select tdg.id, tdg.userId, tdg.userName, tdg.shopId, tdg.startTime, tdg.endTime, tdg.minMoney, tdg.maxMoney, tdg.status, tdg.createTime,
+        tdg.updateTime, tdg.disabled, tdg.createBy, tdg.updateBy,tdg.orderType,tdg.weiXinPay,tdg.aliPay,tdg.cardPay,tdg.moneyPay,tdg.otherPay,
+        ts.shopName
+        from t_data_generator tdg
+        left join t_shop ts on tdg.shopId = ts.id
+        <where>
+            <if test="query.shopName != null and query.shopName != ''">
+                and ts.shopName like concat('%', #{query.shopName}, '%')
+            </if>
+            <if test="query.userName != null and query.userName != ''">
+                and tdg.shopName like concat('%', #{query.userName}, '%')
+            </if>
+            <if test="query.status != null">
+                and tdg.status = #{query.status}
+            </if>
+            <if test="query.ids != null and query.ids.size()>0">
+                and tdg.id IN
+                <foreach collection="query.ids" item="id" open="(" separator="," close=")">
+                    #{id}
+                </foreach>
+            </if>
+            <if test="query.orderType != null">
+                and tdg.orderType = #{query.orderType}
+            </if>
+            <if test="query.startTime != null and query.startTime != '' and query.endTime != null and query.endTime != ''">
+                AND (tdg.createTime BETWEEN #{query.startTime} AND #{query.endTime})
+            </if>
+            AND tdg.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
+            and tdg.orderType = 1
+        </where>
+    </select>
+    <select id="profitDetails" resultType="com.ruoyi.system.vo.GoodsProfitVO">
+        SELECT
+        tomg.goodsName,
+        tomg.typeName,
+        IFNULL(SUM( tomg.goodsCount ),0) AS totalSalesCount,
+        IFNULL(SUM( tomg.goodsCount * tomg.goodsSalePrice ),0) AS goodsSaleAmount,
+        IFNULL(SUM( tomg.goodsCount * tomg.costPrice ),0) AS goodsCostAmount,
+        IFNULL(SUM(tomg.goodsCount *(tomg.goodsSalePrice - tomg.costPrice)),0) AS goodsProfitAmount
+        FROM t_order_meal_goods tomg
+        LEFT JOIN t_order_meal tom ON tom.id = tomg.orderId
+        <where>
+            <if test="query.startTime != null and query.startTime != '' and query.endTime != null and query.endTime != ''">
+                AND (tom.createTime BETWEEN #{query.startTime} AND #{query.endTime})
+            </if>
+            <if test="query.goodsName != null and query.goodsName != ''">
+                AND tomg.goodsName like concat('%', #{query.goodsName}, '%')
+            </if>
+            <if test="query.typeId != null and query.typeId != ''">
+                AND tomg.typeId = #{query.typeId}
+            </if>
+            <if test="query.shopId != null">
+                AND tom.shopId = #{query.shopId}
+            </if>
+            AND tom.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
+        </where>
+        GROUP BY tomg.goodsName
+    </select>
+    <select id="profitDetailsStatistics" resultType="java.util.Map">
+        SELECT
+        IFNULL(SUM(a.goodsSaleAmount),0) AS totalSales,
+        IFNULL(SUM(a.goodsCostAmount),0) AS totalCosts,
+        IFNULL(SUM(a.goodsProfitAmount),0) AS totalProfits
+        FROM (
+        SELECT
+        tomg.goodsName,
+        tomg.typeName,
+        IFNULL(SUM( tomg.goodsCount ),0) AS totalSalesCount,
+        IFNULL(SUM( tomg.goodsCount * tomg.goodsSalePrice ),0) AS goodsSaleAmount,
+        IFNULL(SUM( tomg.goodsCount * tomg.costPrice ),0) AS goodsCostAmount,
+        IFNULL(SUM(tomg.goodsCount *(tomg.goodsSalePrice - tomg.costPrice)),0) AS goodsProfitAmount
+        FROM t_order_meal_goods tomg
+        LEFT JOIN t_order_meal tom ON tom.id = tomg.orderId
+        <where>
+            <if test="query.startTime != null and query.startTime != '' and query.endTime != null and query.endTime != ''">
+                AND (tom.createTime BETWEEN #{query.startTime} AND #{query.endTime})
+            </if>
+            <if test="query.goodsName != null and query.goodsName != ''">
+                AND tomg.goodsName like concat('%', #{query.goodsName}, '%')
+            </if>
+            <if test="query.typeId != null and query.typeId != ''">
+                AND tomg.typeId = #{query.typeId}
+            </if>
+            <if test="query.shopId != null">
+                AND tom.shopId = #{query.shopId}
+            </if>
+            AND tom.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
+        </where>
+        GROUP BY tomg.goodsName) a
+    </select>
+    <select id="profitDetailsExport" resultType="com.ruoyi.system.vo.GoodsProfitVO">
+        SELECT
+        tomg.goodsName,
+        tomg.typeName,
+        IFNULL(SUM( tomg.goodsCount ),0) AS totalSalesCount,
+        IFNULL(SUM( tomg.goodsCount * tomg.goodsSalePrice ),0) AS goodsSaleAmount,
+        IFNULL(SUM( tomg.goodsCount * tomg.costPrice ),0) AS goodsCostAmount,
+        IFNULL(SUM(tomg.goodsCount *(tomg.goodsSalePrice - tomg.costPrice)),0) AS goodsProfitAmount
+        FROM t_order_meal_goods tomg
+        LEFT JOIN t_order_meal tom ON tom.id = tomg.orderId
+        <where>
+            <if test="query.startTime != null and query.startTime != '' and query.endTime != null and query.endTime != ''">
+                AND (tom.createTime BETWEEN #{query.startTime} AND #{query.endTime})
+            </if>
+            <if test="query.goodsName != null and query.goodsName != ''">
+                AND tomg.goodsName like concat('%', #{query.goodsName}, '%')
+            </if>
+            <if test="query.typeId != null and query.typeId != ''">
+                AND tomg.typeId = #{query.typeId}
+            </if>
+            <if test="query.shopId != null">
+                AND tom.shopId = #{query.shopId}
+            </if>
+            AND tom.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
+        </where>
+        GROUP BY tomg.goodsName
+    </select>
 
 </mapper>
diff --git a/ruoyi-system/src/main/resources/mapper/system/TOrderSaleMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TOrderSaleMapper.xml
index db02481..7c615fa 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TOrderSaleMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TOrderSaleMapper.xml
@@ -133,7 +133,7 @@
             AND disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
         </where>
     </select>
-    <select id="getDataGeneratorMealDetail" resultType="java.util.Map">
+    <select id="getDataGeneratorSaleDetail" resultType="java.util.Map">
         SELECT
        IFNULL(SUM(CASE WHEN payType = 1 THEN payMoney ELSE 0 END),0) AS moneyPay,
        IFNULL(SUM(CASE WHEN payType = 2 THEN payMoney ELSE 0 END),0) AS aliPay,
@@ -177,5 +177,37 @@
         </where>
         ORDER BY orderTime DESC
     </select>
+    <select id="saleGeneratorListExport" resultType="com.ruoyi.system.vo.TDataGeneratorVO">
+        select tdg.id, tdg.userId, tdg.userName, tdg.shopId, tdg.startTime, tdg.endTime, tdg.minMoney, tdg.maxMoney, tdg.status, tdg.createTime,
+        tdg.updateTime, tdg.disabled, tdg.createBy, tdg.updateBy,tdg.orderType,tdg.weiXinPay,tdg.aliPay,tdg.cardPay,tdg.moneyPay,tdg.otherPay,
+        ts.shopName
+        from t_data_generator tdg
+        left join t_shop ts on tdg.shopId = ts.id
+        <where>
+            <if test="query.shopName != null and query.shopName != ''">
+                and ts.shopName like concat('%', #{query.shopName}, '%')
+            </if>
+            <if test="query.userName != null and query.userName != ''">
+                and tdg.shopName like concat('%', #{query.userName}, '%')
+            </if>
+            <if test="query.status != null">
+                and tdg.status = #{query.status}
+            </if>
+            <if test="query.ids != null and query.ids.size()>0">
+                and tdg.id IN
+                <foreach collection="query.ids" item="id" open="(" separator="," close=")">
+                    #{id}
+                </foreach>
+            </if>
+            <if test="query.orderType != null">
+                and tdg.orderType = #{query.orderType}
+            </if>
+            <if test="query.startTime != null and query.startTime != '' and query.endTime != null and query.endTime != ''">
+                AND (tdg.createTime BETWEEN #{query.startTime} AND #{query.endTime})
+            </if>
+            AND tdg.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
+            and tdg.orderType = 2
+        </where>
+    </select>
 
 </mapper>
diff --git a/ruoyi-system/src/main/resources/mapper/system/TOrderStockMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TOrderStockMapper.xml
index c11c696..cf4c8da 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TOrderStockMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TOrderStockMapper.xml
@@ -15,11 +15,12 @@
         <result column="isCover" property="isCover" />
         <result column="shopId" property="shopId" />
         <result column="generatorId" property="generatorId" />
+        <result column="stockTotalPrice" property="stockTotalPrice" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, stockNum, stockTime, createTime, updateTime, disabled, createBy, updateBy,isCover,shopId,generatorId
+        id, stockNum, stockTime, createTime, updateTime, disabled, createBy, updateBy,isCover,shopId,generatorId,stockTotalPrice
     </sql>
     <select id="pageList" resultType="com.ruoyi.system.vo.TOrderStockVO">
         SELECT <include refid="Base_Column_List"></include>
@@ -43,12 +44,12 @@
     </select>
     <select id="getDataGeneratorStockDetail" resultType="java.util.Map">
         SELECT
-        SUM(payMoney) AS stockAmountSum,
+        IFNULL(SUM(stockTotalPrice),0) AS stockAmountSum,
         COUNT(id) AS totalStock
         from t_order_stock
         <where>
-            <if test="query.stockNum != null and query.stockNum != ''">
-                AND stockNum LIKE concat('%',#{query.stockNum},'%')
+            <if test="query.orderNum != null and query.orderNum != ''">
+                AND stockNum LIKE concat('%',#{query.orderNum},'%')
             </if>
             <if test="query.generatorId != null">
                 AND generatorId = #{query.generatorId}
@@ -63,8 +64,8 @@
         SELECT <include refid="Base_Column_List"></include>
         FROM t_order_stock
         <where>
-            <if test="query.stockNum != null and query.stockNum != ''">
-                AND stockNum LIKE concat('%',#{query.stockNum},'%')
+            <if test="query.orderNum != null and query.orderNum != ''">
+                AND stockNum LIKE concat('%',#{query.orderNum},'%')
             </if>
             <if test="query.generatorId != null">
                 AND generatorId = #{query.generatorId}

--
Gitblit v1.7.1