From b2dad3b3fd044bbe9837bb9564953bf71551a3bf Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Thu, 26 Sep 2024 15:14:40 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E9=A6=96=E9=A1=B5=20=E7=BB=9F=E8=AE=A1=20?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=BB=9F=E8=AE=A1(=E5=8C=85=E6=8B=AC?= =?UTF-8?q?=E5=BC=B9=E7=AA=97)/=E9=94=80=E9=87=8F=E7=BB=9F=E8=AE=A1=20?= =?UTF-8?q?=E5=BF=AB=E6=8D=B7=E4=BF=AE=E6=94=B9=E6=8E=A5=E5=8F=A3=20?= =?UTF-8?q?=E6=8A=A5=E9=94=99=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shop/SummaryByDayController.java | 6 +- .../controller/shop/SummaryController.java | 38 +- .../ysk/cashier/dto/shop/TbShopUserDto.java | 19 +- .../cashier/mybatis/entity/TbShopUser.java | 3 + .../mybatis/mapper/TbShopUserFlowMapper.java | 24 +- .../cn/ysk/cashier/pojo/shop/TbShopUser.java | 20 +- .../repository/TbShopPayTypeRepository.java | 68 +-- .../order/TbOrderDetailRepository.java | 142 +++--- .../order/TbOrderInfoRepository.java | 3 +- .../repository/shop/TbShopUserRepository.java | 4 +- .../ysk/cashier/service/SummaryService.java | 5 +- .../service/impl/SummaryServiceImpl.java | 432 ++++++------------ .../impl/productimpl/StockServiceImpl.java | 4 +- .../cn/ysk/cashier/vo/CountStockByDayVo.java | 14 + .../vo/TbOrderSalesCountByDayV2Vo.java | 34 ++ .../cashier/vo/TbOrderSalesCountByDayVo.java | 100 +--- 16 files changed, 335 insertions(+), 581 deletions(-) create mode 100644 eladmin-system/src/main/java/cn/ysk/cashier/vo/CountStockByDayVo.java create mode 100644 eladmin-system/src/main/java/cn/ysk/cashier/vo/TbOrderSalesCountByDayV2Vo.java diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/controller/shop/SummaryByDayController.java b/eladmin-system/src/main/java/cn/ysk/cashier/controller/shop/SummaryByDayController.java index f00b3ea6..315888f7 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/controller/shop/SummaryByDayController.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/controller/shop/SummaryByDayController.java @@ -1,6 +1,5 @@ package cn.ysk.cashier.controller.shop; -import cn.ysk.cashier.annotation.rest.AnonymousPostMapping; import cn.ysk.cashier.dto.ShopSummaryDto; import cn.ysk.cashier.service.SummaryService; import cn.ysk.cashier.vo.TbOrderPayCountVo; @@ -9,16 +8,15 @@ import lombok.RequiredArgsConstructor; import org.apache.poi.ss.formula.functions.T; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; -import org.springframework.format.annotation.DateTimeFormat; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.io.IOException; -import java.util.Date; import java.util.List; /** - * @author lyf + * 数据报表 + * @author ww */ @RestController @RequiredArgsConstructor diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/controller/shop/SummaryController.java b/eladmin-system/src/main/java/cn/ysk/cashier/controller/shop/SummaryController.java index bcdd6f4e..7bfaa210 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/controller/shop/SummaryController.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/controller/shop/SummaryController.java @@ -25,46 +25,32 @@ public class SummaryController { private SummaryService summaryService; + //营业板块 上 @PostMapping("/trade") @AnonymousPostMapping private Object shopSummaryDate(@RequestBody BaseQueryDto param) { return summaryService.trade(param); } - - -// @GetMapping -// private Object shopSummary(@RequestParam Integer shopId) { -// return summaryService.selectSummary(shopId); -// } - - @GetMapping("/date") - private Object shopSummaryDate(@RequestParam Integer shopId, @RequestParam Integer day) { - return summaryService.selectSummaryDate(shopId, day); - } - - @GetMapping("/today") - private Object shopSummaryDate(@RequestParam Integer shopId) { - return summaryService.selectSummaryToday(shopId); - } - + //销售趋势柱状图 左下 @GetMapping("/dateAmount") private Object shopSummaryAmount(@RequestParam Integer shopId, @RequestParam Integer day) { return summaryService.selectSummaryAmount(shopId, day); } - - - @GetMapping("/dateProduct") - private Object shopSummaryProduct(@RequestParam Integer shopId, @RequestParam Integer day, - @RequestParam Integer page, @RequestParam Integer size) { - return summaryService.selectSummaryProduct(shopId, day, page, size); - } - + //支付占比饼图 左下 @GetMapping("/datePayType") private Object shopSummaryPayType(@RequestParam Integer shopId, @RequestParam Integer day) { return summaryService.selectSummaryPayType(shopId, day); } + //商品销售 右下 + @GetMapping("/productSaleDate") + private Object productSaleDate( + @RequestParam Integer shopId, @RequestParam Integer day ,@RequestParam Integer page,@RequestParam Integer size) { + return summaryService.productSaleDate(shopId, day, page, size); + } + + //台桌统计 @GetMapping("/table") @AnonymousGetMapping private Object shopSummaryTable(@RequestParam Integer shopId, @@ -72,7 +58,7 @@ public class SummaryController { @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date endTime) { return summaryService.selectSummaryTable(shopId, startTime, endTime); } - + //台桌统计导出 @PostMapping("/table/download") @AnonymousPostMapping private void downloadShopSummaryTable(HttpServletResponse response, @RequestBody ShopTableSaleInfoDto exportRequest) throws IOException { diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/dto/shop/TbShopUserDto.java b/eladmin-system/src/main/java/cn/ysk/cashier/dto/shop/TbShopUserDto.java index d29ea5b6..6d6036f7 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/dto/shop/TbShopUserDto.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/dto/shop/TbShopUserDto.java @@ -1,24 +1,9 @@ -/* -* Copyright 2019-2020 Zheng Jie -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ package cn.ysk.cashier.dto.shop; -import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.io.Serializable; +import java.sql.Timestamp; /** * @website https://eladmin.vip @@ -112,4 +97,6 @@ public class TbShopUserDto implements Serializable { /** 小程序openId */ private String miniOpenId; + + private Timestamp joinTime; } \ No newline at end of file diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/entity/TbShopUser.java b/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/entity/TbShopUser.java index 5e3d56bd..8e60c5c9 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/entity/TbShopUser.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/entity/TbShopUser.java @@ -2,6 +2,7 @@ package cn.ysk.cashier.mybatis.entity; import java.io.Serializable; import java.math.BigDecimal; +import java.sql.Timestamp; import javax.persistence.Id; import javax.persistence.Table; import lombok.Data; @@ -159,6 +160,8 @@ public class TbShopUser implements Serializable { */ private String dynamic_code; + private Timestamp joinTime; + private static final long serialVersionUID = 1L; @Override diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/mapper/TbShopUserFlowMapper.java b/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/mapper/TbShopUserFlowMapper.java index d4053259..6a818edd 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/mapper/TbShopUserFlowMapper.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/mapper/TbShopUserFlowMapper.java @@ -23,18 +23,18 @@ public interface TbShopUserFlowMapper extends BaseMapper { * @return 用户流水总金额 */ @Select("") BigDecimal sumUserFlowAmountByConditions(@Param("shopId") Long shopId, diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/pojo/shop/TbShopUser.java b/eladmin-system/src/main/java/cn/ysk/cashier/pojo/shop/TbShopUser.java index 79450ef2..61e60bae 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/pojo/shop/TbShopUser.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/pojo/shop/TbShopUser.java @@ -1,18 +1,3 @@ -/* -* Copyright 2019-2020 Zheng Jie -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ package cn.ysk.cashier.pojo.shop; import lombok.Data; @@ -23,7 +8,7 @@ import javax.persistence.*; import javax.validation.constraints.*; import java.math.BigDecimal; import java.io.Serializable; -import java.util.Date; +import java.sql.Timestamp; /** * @website https://eladmin.vip @@ -154,6 +139,9 @@ public class TbShopUser implements Serializable { @Column(name = "`dynamic_code`") private String dynamicCode; + @Column(name = "`join_time`") + private Timestamp joinTime; + public void copy(TbShopUser source){ BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true)); diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/repository/TbShopPayTypeRepository.java b/eladmin-system/src/main/java/cn/ysk/cashier/repository/TbShopPayTypeRepository.java index 6697b2e0..c93db635 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/repository/TbShopPayTypeRepository.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/repository/TbShopPayTypeRepository.java @@ -31,40 +31,40 @@ import java.util.List; **/ public interface TbShopPayTypeRepository extends JpaRepository, JpaSpecificationExecutor { @Modifying - @Query(value = "INSERT INTO `tb_shop_pay_type` ( shop_id, `pay_type`, `pay_name`, `is_show_shortcut`, `is_refundable`, `is_open_cash_drawer`, `is_system`, `is_ideal`, `is_display`, `icon` )\n" + - "VALUES\n" + - "\t( :shopId, 'cash', '现金', 1, 0, 1, 0, 1, 1, 'https://cashier-oss.oss-cn-beijing.aliyuncs.com/upload/20240302/2dab947729d640fba7709b7c0b42bfef.png' ),(\n" + - "\t\t:shopId,\n" + - "\t\t'bank',\n" + - "\t\t'银行卡',\n" + - "\t\t1,\n" + - "\t\t0,\n" + - "\t\t1,\n" + - "\t\t0,\n" + - "\t\t1,\n" + - "\t\t1,\n" + - "\t\t'https://cashier-oss.oss-cn-beijing.aliyuncs.com/upload/20240302/14b20cf721304b7fa2f01e6e75fab403.png' \n" + - "\t\t),(:shopId,\n" + - "\t\t'scanCode',\n" + - "\t\t'扫码支付',\n" + - "\t\t1,\n" + - "\t\t0,\n" + - "\t\t1,\n" + - "\t\t0,\n" + - "\t\t1,\n" + - "\t\t1,\n" + - "\t\t'https://cashier-oss.oss-cn-beijing.aliyuncs.com/upload/20240302/9ff08224680446c8b3978844da99bbaa.png' \n" + - "\t\t),(:shopId,\n" + - "\t\t'deposit',\n" + - "\t\t'储值卡',\n" + - "\t\t1,\n" + - "\t\t0,\n" + - "\t\t1,\n" + - "\t\t0,\n" + - "\t\t1,\n" + - "\t\t1,\n" + - "\t'https://cashier-oss.oss-cn-beijing.aliyuncs.com/upload/20240302/18d40f471a924d55b4eb13e5f553734d.png' \n" + - "\t)",nativeQuery = true) + @Query(value = "INSERT INTO `tb_shop_pay_type` ( shop_id, `pay_type`, `pay_name`, `is_show_shortcut`, `is_refundable`, `is_open_cash_drawer`, `is_system`, `is_ideal`, `is_display`, `icon` ) " + + "VALUES " + + " ( :shopId, 'cash', '现金', 1, 0, 1, 0, 1, 1, 'https://cashier-oss.oss-cn-beijing.aliyuncs.com/upload/20240302/2dab947729d640fba7709b7c0b42bfef.png' ),( " + + " :shopId, " + + " 'bank', " + + " '银行卡', " + + " 1, " + + " 0, " + + " 1, " + + " 0, " + + " 1, " + + " 1, " + + " 'https://cashier-oss.oss-cn-beijing.aliyuncs.com/upload/20240302/14b20cf721304b7fa2f01e6e75fab403.png' " + + " ),(:shopId, " + + " 'scanCode', " + + " '扫码支付', " + + " 1, " + + " 0, " + + " 1, " + + " 0, " + + " 1, " + + " 1, " + + " 'https://cashier-oss.oss-cn-beijing.aliyuncs.com/upload/20240302/9ff08224680446c8b3978844da99bbaa.png' " + + " ),(:shopId, " + + " 'deposit', " + + " '储值卡', " + + " 1, " + + " 0, " + + " 1, " + + " 0, " + + " 1, " + + " 1, " + + " 'https://cashier-oss.oss-cn-beijing.aliyuncs.com/upload/20240302/18d40f471a924d55b4eb13e5f553734d.png' " + + " )",nativeQuery = true) Integer creatPayType(@Param("shopId") String shopId); @Query("select t from TbShopPayType t where t.payType=:payType and t.shopId=:shopId") diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/repository/order/TbOrderDetailRepository.java b/eladmin-system/src/main/java/cn/ysk/cashier/repository/order/TbOrderDetailRepository.java index 50987792..e0ff25c2 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/repository/order/TbOrderDetailRepository.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/repository/order/TbOrderDetailRepository.java @@ -1,10 +1,8 @@ package cn.ysk.cashier.repository.order; -import cn.ysk.cashier.dto.product.StockCountDTO; -import cn.ysk.cashier.pojo.order.TbFullOrderDetail; import cn.ysk.cashier.pojo.order.TbOrderDetail; -import cn.ysk.cashier.vo.TbOrderPayCountVo; -import cn.ysk.cashier.vo.TbOrderSaleVO; +import cn.ysk.cashier.vo.CountStockByDayVo; +import cn.ysk.cashier.vo.TbOrderSalesCountByDayV2Vo; import cn.ysk.cashier.vo.TbOrderSalesCountByDayVo; import cn.ysk.cashier.vo.TbOrderSalesCountByTable; import org.apache.ibatis.annotations.Param; @@ -15,10 +13,6 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; - -import javax.persistence.Tuple; -import java.sql.Time; -import java.sql.Timestamp; import java.util.Date; import java.util.List; @@ -41,6 +35,62 @@ public interface TbOrderDetailRepository extends JpaRepository searchDetailByOrderIds(@Param("ids")List ids); + @Query("SELECT new cn.ysk.cashier.vo.TbOrderSalesCountByDayV2Vo(" + + "info.productName,pro.id, cate.name,'', " + + "SUM(CASE WHEN orders.orderType!='return' THEN info.num ELSE 0 END) as salesNum, " + + "SUM(CASE WHEN orders.orderType='return' THEN info.num ELSE 0 END), " + + "SUM(CASE WHEN orders.orderType!='return' THEN info.priceAmount ELSE 0 END), " + + "SUM(CASE WHEN orders.orderType='return' THEN info.priceAmount ELSE 0 END)) " + + "FROM TbOrderInfo orders " + + "LEFT JOIN TbOrderDetail info on orders.id=info.orderId " + + "LEFT JOIN TbProduct pro ON info.productId = pro.id " + + "LEFT JOIN TbShopCategory cate ON cate.id = pro.categoryId " + + "WHERE info.shopId = :shopId " + + "AND (:cateId IS NULL OR pro.categoryId = :cateId) " + + "AND (:proName IS NULL OR info.productName LIKE %:proName%) " + + "AND info.createTime > :startTime AND info.createTime < :endTime " + + "AND (info.status = 'closed' OR info.status = 'refund') " + + "GROUP BY info.productId " + + "ORDER BY salesNum DESC") + Page queryTbOrderSalesCountByProduct(@Param("shopId") Integer shopId,@Param("cateId")String cateId,@Param("proName")String proName, @Param("startTime") Date startTime, @Param("endTime") Date endTime, Pageable pageable); + + @Query("SELECT new cn.ysk.cashier.vo.TbOrderSalesCountByDayV2Vo(" + + "info.productName,pro.id, cate.name,pro.typeEnum, " + + "SUM(CASE WHEN orders.orderType!='return' THEN info.num ELSE 0 END) as salesNum, " + + "SUM(CASE WHEN orders.orderType='return' THEN info.num ELSE 0 END), " + + "SUM(CASE WHEN orders.orderType!='return' THEN info.priceAmount ELSE 0 END), " + + "SUM(CASE WHEN orders.orderType='return' THEN info.priceAmount ELSE 0 END)) " + + "FROM TbOrderInfo orders " + + "LEFT JOIN TbOrderDetail info on orders.id=info.orderId " + + "LEFT JOIN TbProduct pro ON info.productId = pro.id " + + "LEFT JOIN TbShopCategory cate ON cate.id = pro.categoryId " + + "WHERE info.shopId = :shopId " + + "AND (:cateId IS NULL OR pro.categoryId = :cateId) " + + "AND (:proName IS NULL OR info.productName LIKE %:proName%) " + + "AND info.createTime > :startTime AND info.createTime < :endTime " + + "AND (info.status = 'closed' OR info.status = 'refund') " + + "GROUP BY info.productId " + + "ORDER BY salesNum DESC") + List queryTbOrderSalesCountByProduct(@Param("shopId") Integer shopId,@Param("cateId")String cateId,@Param("proName")String proName, @Param("startTime") Date startTime, @Param("endTime") Date endTime); + + + @Query("SELECT new cn.ysk.cashier.vo.TbOrderSalesCountByDayV2Vo(" + + "info.productSkuName,pro.id, '',''," + + "SUM(CASE WHEN orders.orderType!='return' THEN info.num ELSE 0 END) as salesNum, " + + "SUM(CASE WHEN orders.orderType='return' THEN info.num ELSE 0 END), " + + "SUM(CASE WHEN orders.orderType!='return' THEN info.priceAmount ELSE 0 END), " + + "SUM(CASE WHEN orders.orderType='return' THEN info.priceAmount ELSE 0 END)) " + + "FROM TbOrderInfo orders " + + "LEFT JOIN TbOrderDetail info on orders.id=info.orderId " + + "INNER JOIN TbProduct pro ON info.productId = pro.id AND pro.id= :proId " + + "LEFT JOIN TbShopCategory cate ON cate.id = pro.categoryId " + + "WHERE info.shopId = :shopId " + + "AND info.createTime > :startTime AND info.createTime < :endTime " + + "AND (info.status = 'closed' OR info.status = 'refund') " + + "GROUP BY info.productId, info.productSkuId " + + "ORDER BY salesNum DESC") + List queryTbOrderSalesCountBySku(@Param("shopId") Integer shopId,@Param("proId")Integer proId, @Param("startTime") Date startTime, @Param("endTime") Date endTime); + @Query("SELECT new cn.ysk.cashier.vo.TbOrderSalesCountByDayVo(" + "info.productName, info.productSkuName, cate.name, unit.name,info.price," + "SUM(CASE WHEN orders.orderType!='return' THEN info.num ELSE 0 END) as salesNum, " + @@ -62,24 +112,6 @@ public interface TbOrderDetailRepository extends JpaRepository queryTbOrderSalesCountByDay(@Param("shopId") Integer shopId,@Param("cateId")String cateId,@Param("proName")String proName, @Param("startTime") Date startTime, @Param("endTime") Date endTime, Pageable pageable); - @Query(value = "SELECT pro.shop_id as shop_id, pro.id as pro_id, info.product_name as pro_name, info.product_sku_id as sku_id, pro.is_stock as is_stock," + - " info.product_sku_name as sku_name, unit.NAME as unit_name ," + - "SUM( CASE WHEN orders.order_type != 'return' THEN info.num ELSE 0 END )- SUM( CASE WHEN orders.order_type = 'return' THEN info.num ELSE 0 END ) as stock_count " + - "FROM " + - "tb_order_info orders " + - "LEFT JOIN tb_order_detail info ON orders.id = info.order_id " + - "LEFT JOIN tb_product pro ON info.product_id = pro.id " + - "LEFT JOIN tb_shop_unit unit ON unit.id = pro.unit_id " + - "WHERE " + - "info.create_time > :startTime " + - "AND info.create_time < :endTime " + - "AND ( info.STATUS = 'closed' OR info.STATUS = 'refund' ) " + - "GROUP BY " + - "info.product_id, " + - "info.product_sku_id ",nativeQuery = true) - List countStock(@Param("startTime") String startTime, @Param("endTime") String endTime); - - @Query("SELECT new cn.ysk.cashier.vo.TbOrderSalesCountByDayVo(" + "info.productName, info.productSkuName, cate.name, unit.name,info.price," + @@ -104,19 +136,22 @@ public interface TbOrderDetailRepository extends JpaRepository queryTbOrderSalesCountByDay(@Param("shopId") Integer shopId,@Param("cateId")String cateId,@Param("proName")String proName, @Param("startTime") Date startTime, @Param("endTime") Date endTime); - @Query(value = "SELECT " + - "new cn.ysk.cashier.vo.TbOrderSaleVO(oi.orderNo, od.num, od.price, od.status,od.productSkuId)\n" + - "FROM\n" + - "TbOrderInfo oi\n" + - "LEFT JOIN TbOrderDetail od ON oi.id = od.orderId \n" + - "WHERE\n" + - "od.shopId = :shopId \n" + - "AND ( od.status = 'closed' OR od.status = 'refund' ) \n" + - "AND od.createTime > :startTime \n" + - "AND od.createTime < :endTime \n" + - "AND (:productId is null or od.productId = :productId)\n" + - "AND (:productSkuId is null or od.productSkuId = :productSkuId)") - List querySaleOrderInfo(@Param("startTime") Timestamp startTime, @Param("endTime") Timestamp endTime, @Param("productId") Integer productId, @Param("productSkuId") Integer productSkuId, @Param("shopId") Integer shopId); + @Query(value = "SELECT" + + " SUM( CASE WHEN orders.order_type != 'return' THEN info.price_amount ELSE 0 END )-SUM( CASE WHEN orders.order_type = 'return' THEN info.price_amount ELSE 0 END ) as sale_amount," + + " SUM( CASE WHEN orders.order_type != 'return' THEN info.num ELSE 0 END )-SUM( CASE WHEN orders.order_type = 'return' THEN info.num ELSE 0 END ), as sale_num" + + " orders.trade_day " + + "FROM" + + " tb_order_info orders" + + " LEFT JOIN tb_order_detail info ON orders.id = info.order_id" + + "WHERE" + + " info.shop_id = :shopId" + + " AND info.create_time > :startTime" + + " AND info.create_time < :endTime" + + " AND ( info.STATUS = 'closed' OR info.STATUS = 'refund' ) " + + "GROUP BY orders.trade_day " + + "ORDER BY orders.trade_day DESC",nativeQuery = true) + List countStockByDay(@Param("shopId") Integer shopId,@Param("startTime") Date startTime, @Param("endTime") Date endTime); + @Query("SELECT new cn.ysk.cashier.vo.TbOrderSalesCountByDayVo(" + "SUM(CASE WHEN orders.orderType!='return' THEN info.num ELSE 0 END)," + "SUM(CASE WHEN orders.orderType='return' THEN info.num ELSE 0 END), " + @@ -144,35 +179,6 @@ public interface TbOrderDetailRepository extends JpaRepository :startTime AND info.createTime < :endTime " + - "AND ((info.status = 'closed') OR ( info.status ='refund')) " ) - TbOrderPayCountVo queryTbOrderSalesCountExt(@Param("shopId") Integer shopId, @Param("startTime") Date startTime, @Param("endTime") Date endTime); - - - @Query(value = "select sum(num),count(1) from tb_order_detail where shop_id = :shopId " + - "AND ((status = 'closed') OR (status ='refund')) " + - "AND create_time > :startTime AND create_time < :endTime",nativeQuery = true) - Tuple sumByShopId(@Param("shopId") Integer shopId, @Param("startTime") Date startTime, @Param("endTime") Date endTime); - - @Query(value = "select sum(num),count(1),DATE(create_time) from tb_order_detail where shop_id = :shopId AND status = 'closed' " + - "AND create_time > :startTime AND create_time < :endTime " + - "GROUP BY DATE(create_time)",nativeQuery = true) - List sumByShopIdGroup(@Param("shopId") Integer shopId, @Param("startTime") Date startTime, @Param("endTime") Date endTime); - - @Query(value = "SELECT COUNT( 0 ) FROM ( SELECT product_id FROM tb_order_detail WHERE shop_id = :shopId " + - "AND create_time > :startTime AND create_time < :endTime AND (( STATUS = 'closed' ) \n" + - "\t\tOR ( STATUS = 'refund' )) \n" + - "\tGROUP BY\n" + - "\t\tproduct_id,\n" + - "\t\tproduct_sku_id \n" + - "\t) AS total ", nativeQuery = true) - Tuple searchCount(@Param("shopId") Integer shopId, @Param("startTime") Date startTime, @Param("endTime") Date endTime); - @Query(value = "SELECT d.order_id \n" + " FROM tb_order_detail d \n" + " WHERE d.product_name LIKE %:productName% \n" + diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/repository/order/TbOrderInfoRepository.java b/eladmin-system/src/main/java/cn/ysk/cashier/repository/order/TbOrderInfoRepository.java index 69efbe63..36fe918a 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/repository/order/TbOrderInfoRepository.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/repository/order/TbOrderInfoRepository.java @@ -39,7 +39,7 @@ import java.util.Map; * @date 2024-03-02 **/ public interface TbOrderInfoRepository extends JpaRepository, JpaSpecificationExecutor { - @Query("SELECT new cn.ysk.cashier.vo.TbOrderPayCountVo(info.payType, SUM(info.orderAmount)) " + + @Query("SELECT new cn.ysk.cashier.vo.TbOrderPayCountVo(info.payType, SUM(info.orderAmount),sum(info.discountAmount)) " + "FROM TbOrderInfo info " + "WHERE 1=1 and (:tableName is null or info.tableName=:tableName ) and info.shopId = :shopId " + "AND info.createdAt>:start AND info.createdAt<:end " + @@ -48,6 +48,7 @@ public interface TbOrderInfoRepository extends JpaRepository queryTbOrderPayCount(@Param("shopId")String shopId,@Param("tableName") String tableName ,@Param("start") Long start, @Param("end") Long end); + @Query("SELECT new cn.ysk.cashier.vo.TbOrderPayCountVo('refund', SUM(info.orderAmount)) " + "FROM TbOrderInfo info " + "WHERE 1=1 and (:tableName is null or info.tableName=:tableName ) and info.shopId = :shopId " + diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/repository/shop/TbShopUserRepository.java b/eladmin-system/src/main/java/cn/ysk/cashier/repository/shop/TbShopUserRepository.java index 54509cc9..03bf7d80 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/repository/shop/TbShopUserRepository.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/repository/shop/TbShopUserRepository.java @@ -45,8 +45,8 @@ public interface TbShopUserRepository extends JpaRepository @Query("SELECT user.userId from TbShopUser user where user.shopId = :shopId") List getUserIdByShopId(String shopId); - - + @Query("SELECT count(1) from TbShopUser user where user.shopId = :shopId and user.joinTime BETWEEN :startTime AND :endTime") + Integer newFlow(@Param("shopId") String shopId, @Param("startTime") String startTime, @Param("endTime") String endTime); @Query(value = "select IFNULL(sum(amount),0) from tb_shop_user_flow where shop_user_id=:userId and biz_code in ('cashMemberIn','scanMemberIn')",nativeQuery = true) BigDecimal sumAmount(Integer userId); diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/SummaryService.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/SummaryService.java index 330398a8..6719c5f0 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/SummaryService.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/SummaryService.java @@ -20,13 +20,10 @@ import java.util.Map; public interface SummaryService { Map trade(BaseQueryDto param); -// SummaryVO selectSummary(Integer shop); - Map selectSummaryDate(Integer shopId, Integer day); + Map productSaleDate(Integer shopId, Integer day,Integer page,Integer size); - Map selectSummaryToday(Integer shopId); Map selectSummaryAmount(Integer shopId, Integer day); - Map selectSummaryProduct(Integer shopId, Integer day,Integer page,Integer size); Map selectSummaryPayType(Integer shopId, Integer day); diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/SummaryServiceImpl.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/SummaryServiceImpl.java index 77eac6ab..a77d2b73 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/SummaryServiceImpl.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/SummaryServiceImpl.java @@ -29,7 +29,6 @@ import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import javax.annotation.Resource; -import javax.persistence.Tuple; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.math.BigDecimal; @@ -75,6 +74,7 @@ public class SummaryServiceImpl implements SummaryService { if (ObjectUtil.isNull(param.getShopId())) { throw new BadRequestException("参数不合法"); } + Map result = new HashMap<>(); Map sale = new HashMap<>(); Map vip = new HashMap<>(); @@ -87,7 +87,8 @@ public class SummaryServiceImpl implements SummaryService { //会员 充值金额 inAmount /退款金额 outAmount /会员消费金额 useAmount /会员消费笔数 useNum Map flowMap = tbShopUserFlowMapper.tradeIndexFlow(param.getShopId(), DateUtil.getStrTime(param.getStartTime()), DateUtil.getStrTime(param.getEndTime())); // 新增会员数 - Integer newFlow = tbShopUserFlowMapper.tradeIndexNewFlow(param.getShopId(), DateUtil.getStrTime(param.getStartTime()), DateUtil.getStrTime(param.getEndTime())); + Integer newFlow = tbShopUserRepository.newFlow(param.getShopId().toString(), DateUtil.getStrTime(param.getStartTime()), DateUtil.getStrTime(param.getEndTime())); +// Integer newFlow = tbShopUserFlowMapper.tradeIndexNewFlow(param.getShopId(), DateUtil.getStrTime(param.getStartTime()), DateUtil.getStrTime(param.getEndTime())); //台桌数 int tables = tbShopTableRepository.countAllByShopId(param.getShopId()); //收款金额 @@ -100,14 +101,55 @@ public class SummaryServiceImpl implements SummaryService { sale.put("inAmount", flowMap.get("inAmount")); //会员 充值金额 sale.put("outAmount", flowMap.get("outAmount"));//会员 退款金额 - sale.put("incomeAmountAll",incomeAmount.add(new BigDecimal(flowMap.get("inAmount").toString())));//总实收 销售实收+会员实收 - + sale.put("incomeAmountAll",incomeAmount);//总实收 销售实收 + List payCountVos = initPaysCount(); + List payCounts = tbOrderInfoRepository.queryTbOrderPayCount( + param.getShopId().toString(), null, param.getStartTime().getTime(), param.getEndTime().getTime()); + Map payCountMap = payCounts.stream() + .collect(Collectors.toMap( + TbOrderPayCountVo::getPayType, + vo -> { + BigDecimal payAmount = new BigDecimal(vo.getPayAmount().toString()); + BigDecimal saveAmount = new BigDecimal(vo.getSaveAmount().toString()); + return payAmount.subtract(saveAmount); + }, + BigDecimal::add + )); + BigDecimal vipSaveAmount = tbShopUserFlowService.sumUserFlowAmountByConditions( + param.getShopId().longValue(), DateUtil.getStrTime(param.getStartTime()), DateUtil.getStrTime(param.getEndTime())); + for (TbOrderPayCountVo payCountVo : payCountVos) { + BigDecimal payAmount = new BigDecimal(payCountVo.getPayAmount().toString()); + switch (payCountVo.getPayType()){ + case "微信小程序": + payCountVo.setPayAmount(payAmount.add(payCountMap.get("wx_lite"))); + break; + case "支付宝小程序": + payCountVo.setPayAmount(payAmount.add(payCountMap.get("ali_lite"))); + break; + case "主扫收款": + payCountVo.setPayAmount(payAmount.add(payCountMap.get("scanCode"))); + break; + case "收款码收款": + payCountVo.setPayAmount(payAmount.add(payCountMap.get("ALIPAY")).add(payCountMap.get("WECHAT"))); + break; + case "现金": + payCountVo.setPayAmount(payAmount.add(payCountMap.get("cash"))); + break; + case "会员": + payCountVo.setPayAmount(payAmount.add(payCountMap.get("deposit"))); + break; + case "充值": + payCountVo.setPayAmount(payAmount.add(vipSaveAmount)); + break; + } + } + sale.put("payCount",payCountVos); result.put("sale",sale); vip.put("useAmount", flowMap.get("useAmount"));//会员消费金额 vip.put("newFlow",newFlow);//新增会员数 vip.put("useNum",flowMap.get("useNum"));//会员消费笔数 result.put("vip",vip); - BigDecimal saleAmount = new BigDecimal(orderMap.get("saleAmount").toString()).add(refundAmount); + BigDecimal saleAmount = new BigDecimal(orderMap.get("saleAmount").toString()).subtract(new BigDecimal(orderMap.get("saveAmount").toString())); //客单价 if(saleAmount.compareTo(BigDecimal.ZERO) == 0){ count.put("unitPrice",BigDecimal.ZERO); @@ -126,103 +168,23 @@ public class SummaryServiceImpl implements SummaryService { return result; } + public List initPaysCount(){ + List payCountVos = new ArrayList<>(); + payCountVos.add(new TbOrderPayCountVo("https://cashier-oss.oss-cn-beijing.aliyuncs.com/static/wx.png","微信小程序","1",BigDecimal.ZERO)); + payCountVos.add(new TbOrderPayCountVo("https://cashier-oss.oss-cn-beijing.aliyuncs.com/static/ali.png","支付宝小程序","1",BigDecimal.ZERO)); + payCountVos.add(new TbOrderPayCountVo("https://cashier-oss.oss-cn-beijing.aliyuncs.com/static/scan.png","主扫收款","1",BigDecimal.ZERO)); + payCountVos.add(new TbOrderPayCountVo("https://cashier-oss.oss-cn-beijing.aliyuncs.com/static/bscan.png","收款码收款","1",BigDecimal.ZERO)); + payCountVos.add(new TbOrderPayCountVo("https://cashier-oss.oss-cn-beijing.aliyuncs.com/static/cash.png","现金","1",BigDecimal.ZERO)); + payCountVos.add(new TbOrderPayCountVo("https://cashier-oss.oss-cn-beijing.aliyuncs.com/static/vipIn.png","充值","1",BigDecimal.ZERO)); +// payCountVos.add(new TbOrderPayCountVo("","会员支付","1",BigDecimal.ZERO)); + return payCountVos; + }; + -// @Override -// public SummaryVO selectSummary(Integer shopId) { -// SummaryVO summaryVO = new SummaryVO(); -// //支付笔数, -// Tuple result = tbOrderInfoRepository.countByShopId(shopId.toString()); -// summaryVO.setPaymentsNumber(result.get(0, Long.class) == null ? 0L : result.get(0, Long.class)); -// summaryVO.setTotalSales(result.get(1, BigDecimal.class) == null ? new BigDecimal("0") : result.get(1, BigDecimal.class)); -// if (summaryVO.getPaymentsNumber() == 0) { -// summaryVO.setAverageSales(new BigDecimal("0")); -// } else { -// summaryVO.setAverageSales(summaryVO.getTotalSales().divide(new BigDecimal(summaryVO.getPaymentsNumber()), 2, RoundingMode.DOWN)); -// } -// //用户数 -// Tuple count = tbShopUserRepository.searchByCount(shopId.toString()); -// summaryVO.setTotalUser(count == null ? 0L : count.get(0, Long.class)); -// //支付笔数柱形图 -// List objects = tbOrderInfoRepository.sumByDateOrderNum(shopId.toString(), DateUtil.getDate30DaysAgo(), DateUtil.getDayEnd()); -// List countDateList = new ArrayList<>(); -// for (Object[] o : objects) { -// CountDateVO countDateVO = new CountDateVO(); -// BigInteger integers = (BigInteger) o[0]; -// countDateVO.setCount(new BigDecimal(integers.toString())); -// countDateVO.setTradeDay((String) o[1]); -// countDateList.add(countDateVO); -// } -// //填充日期 -// Map dataMap = new HashMap<>(); -// for (CountDateVO entry : countDateList) { -// String tradeDay = entry.getTradeDay(); -// BigDecimal countOrder = entry.getCount(); -// dataMap.put(tradeDay, new CountDateVO(tradeDay, countOrder)); -// } -// // 获取今天的日期 -// LocalDate today = LocalDate.now(); -// // 定义日期格式 -// DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); -// // 转换为字符串 -// List countDateLists = new ArrayList<>(); -// for (int i = 0; i < 30; i++) { -// LocalDate tradeDayLocalDate = today.minusDays(i); -// String tradeDayString = tradeDayLocalDate.format(formatter); -// CountDateVO countDateVO; -// // 检查数据Map中是否存在该日期的数据 -// if (dataMap.containsKey(tradeDayString)) { -// countDateVO = dataMap.get(tradeDayString); -// } else { -// // 如果不存在,则创建新的SumDateVO对象,amount设为0 -// countDateVO = new CountDateVO(tradeDayString, BigDecimal.ZERO); -// } -// // 将SumDateVO对象添加到列表中 -// countDateLists.add(countDateVO); -// } -// countDateLists.sort((a, b) -> a.getTradeDay().compareTo(b.getTradeDay())); -// summaryVO.setCountDateList(countDateLists); -// //访问量 -// Tuple tuple = tbTokenRepository.countByAccountId(shopId); -// summaryVO.setTotalVisits(tuple == null ? 0L : tuple.get(0, Long.class)); -// //访问量柱状图 -// List objectsVisits = tbTokenRepository.countByMonth(shopId, DateUtil.getDate30DaysAgo(), DateUtil.getDayEnd()); -// List visitsList = new ArrayList<>(); -// for (Object[] o : objectsVisits) { -// CountVisitsVO countDateVO = new CountVisitsVO(); -// countDateVO.setCount((BigInteger) o[0]); -// countDateVO.setTradeDay((String) o[1]); -// visitsList.add(countDateVO); -// } -// //填充日期 -// Map dataVisitsMap = new HashMap<>(); -// for (CountVisitsVO entry : visitsList) { -// String tradeDay = entry.getTradeDay(); -// BigInteger countOrder = entry.getCount(); -// dataVisitsMap.put(tradeDay, new CountVisitsVO(tradeDay, countOrder)); -// } -// // 转换为字符串 -// List countVisitsLists = new ArrayList<>(); -// for (int i = 0; i < 30; i++) { -// LocalDate tradeDayLocalDate = today.minusDays(i); -// String tradeDayString = tradeDayLocalDate.format(formatter); -// CountVisitsVO countDateVO; -// // 检查数据Map中是否存在该日期的数据 -// if (dataVisitsMap.containsKey(tradeDayString)) { -// countDateVO = dataVisitsMap.get(tradeDayString); -// } else { -// // 如果不存在,则创建新的SumDateVO对象,amount设为0 -// countDateVO = new CountVisitsVO(tradeDayString, BigInteger.ZERO); -// } -// // 将SumDateVO对象添加到列表中 -// countVisitsLists.add(countDateVO); -// } -// countVisitsLists.sort((a, b) -> a.getTradeDay().compareTo(b.getTradeDay())); -// summaryVO.setVisitsCountList(countVisitsLists); -// return summaryVO; -// } @Override - public Map selectSummaryDate(Integer shopId, Integer day) { + public Map productSaleDate(Integer shopId, Integer day,Integer page,Integer size) { + Pageable pageable = PageRequest.of(page, size); Date startTime = new Date(); Date endTime = new Date(); if (day == 7) { @@ -239,86 +201,18 @@ public class SummaryServiceImpl implements SummaryService { endTime = DateUtil.getDayEnd(); } HashMap map = new HashMap<>(); - Tuple tuple = detailRepository.sumByShopId(shopId, startTime, endTime); - List objects = detailRepository.sumByShopIdGroup(shopId, startTime, endTime); - //List objects = shopUserDutyDetailRepository.searchByDutyGroup(shopId, DateUtil.getDate30DaysAgo(), DateUtil.getDayEnd()); - List numList = new ArrayList<>(); - for (Object[] o : objects) { - CountDateVO countDateVO = new CountDateVO(); - BigDecimal integers = (BigDecimal) o[0]; - countDateVO.setCount(new BigDecimal(integers.toString())); - Date date = (Date) o[2]; - countDateVO.setTradeDay(date.toString()); - numList.add(countDateVO); - } - List objects2 = tbOrderInfoRepository.queryTbOrderPaySumByDay(shopId.toString(), startTime, endTime); - List amountList = new ArrayList<>(); - for (Object[] o : objects2) { - CountDateVO countDateVO = new CountDateVO(); - countDateVO.setCount((BigDecimal) o[0]); - countDateVO.setTradeDay((String) o[1]); - amountList.add(countDateVO); - } - map.put("productCount", tuple == null ? 0 : tuple.get(0, BigDecimal.class)); - map.put("productSum", tuple == null ? 0 : tuple.get(1, BigInteger.class)); - map.put("numList", numList); - map.put("amountList", amountList); + Page tbOrderSalesCountByDayVos = detailRepository.queryTbOrderSalesCountByDay(shopId, null, null, startTime, endTime,pageable); + TbOrderSalesCountByDayVo tbOrderSalesCountByDayVo = detailRepository.queryTbOrderSalesCountByDaysummaryCount(shopId, null, null, startTime, endTime); + TbOrderPayCountVo zong =new TbOrderPayCountVo("el-icon-coin","总金额","1",tbOrderSalesCountByDayVo.getSalesAmount()); + TbOrderPayCountVo xiaoliang =new TbOrderPayCountVo("el-icon-goods","销售量","0",tbOrderSalesCountByDayVo.getSalesNum()); + List countStockByDayVos = tbOrderDetailRepository.countStockByDay(shopId, startTime, endTime); + map.put("productCount", xiaoliang); + map.put("productSum", zong); + map.put("countList", countStockByDayVos) ; + map.put("productList", tbOrderSalesCountByDayVos); return map; } - @Override - public Map selectSummaryProduct(Integer shopId, Integer day, Integer currentPage, Integer currentSize) { - //根据时间商品排行 - currentPage = (currentPage - 1) * currentSize; - HashMap map = new HashMap<>(); - Date startTime; - Date endTime; - if (day == 7) { - startTime = DateUtil.getDate7DaysAgo(); - endTime = DateUtil.getDayEnd(); - } else if (day == 30) { - startTime = DateUtil.getDate30DaysAgo(); - endTime = DateUtil.getDayEnd(); - } else if (day == 360) { - startTime = DateUtil.getBeginDayOfYear(); - endTime = DateUtil.getEndDayOfYear(); - } else if (day == 1) { - - startTime = DateUtil.getDayBegin(); - log.info("1天时间" + startTime.toString()); - endTime = DateUtil.getDayEnd(); - log.info("1天时间末" + endTime.toString()); - } else { - throw new BadRequestException("日期有误"); - } - Pageable pageable = PageRequest.of(0, 5); - List objects = tbOrderInfoRepository.queryTbOrderPayCountByDayExt(shopId, startTime, endTime, currentPage, currentSize); - - List list = new ArrayList<>(); - for (Object[] o : objects) { - ProductExtVO productVO = new ProductExtVO(); - productVO.setProductId((BigInteger) o[0]); - productVO.setProductName((String) o[1]); - productVO.setProductNum((BigDecimal) o[2]); - productVO.setAmount((BigDecimal) o[3]); - list.add(productVO); - } - - //分页数据 - Tuple tuple1 = detailRepository.searchCount(shopId, startTime, endTime); - //销售数量 - Tuple payCount = detailRepository.sumByShopId(shopId, startTime, endTime); - //销售金额 - Long startTimeLong = DateUtil.convertDateToTimestamp(startTime); - Long endTimeLong = DateUtil.convertDateToTimestamp(endTime); - Tuple paySum = tbOrderInfoRepository.queryPaySumByDayAll(shopId.toString(), startTimeLong, endTimeLong); - - map.put("productCount", payCount == null ? 0 : payCount.get(0, BigDecimal.class)); - map.put("productSum", paySum == null ? 0 : paySum.get(0, BigDecimal.class)); - map.put("totalProduct", list); - map.put("total", tuple1 == null ? 0 : tuple1.get(0, BigInteger.class)); - return map; - } @Override public Map selectSummaryAmount(Integer shopId, Integer day) { @@ -377,18 +271,6 @@ public class SummaryServiceImpl implements SummaryService { return map; } - @Override - public Map selectSummaryToday(Integer shopId) { - HashMap map = new HashMap<>(); - Tuple tuple = tbOrderInfoRepository.sumByShopIdToday(shopId.toString(), DateUtil.getDayBegin(), DateUtil.getDayEnd()); - map.put("paymentsNumberToday", tuple == null ? 0L : tuple.get(0, BigInteger.class)); - map.put("totalSalesToday", tuple == null ? new BigDecimal("0") : tuple.get(1, BigDecimal.class)); - Tuple tuple1 = tbShopUserRepository.searchByCountToday(shopId.toString(), DateUtil.getTodayStartTimestamp(), DateUtil.getTodayEndTimestamp()); - map.put("userToday", tuple1.get(0, Long.class)); - Tuple tupleToday = tbTokenRepository.countByAccountId(shopId, DateUtil.getDayBegin(), DateUtil.getDayEnd()); - map.put("totalVisitsToday", tupleToday == null ? 0 : tupleToday.get(0, Long.class)); - return map; - } @Override public Map selectSummaryPayType(Integer shopId, Integer day) { @@ -420,142 +302,94 @@ public class SummaryServiceImpl implements SummaryService { } + @Override + public List summaryCount(ShopSummaryDto summaryDto) { + List list = new ArrayList<>(); + + summaryDto.setStartTime(DateUtil.toDate(DateUtil.fromTimeStamp(1704038400L))); + summaryDto.setEndTime(new Date()); + + TbOrderSalesCountByDayVo tbOrderSalesCountByDayVo = detailRepository.queryTbOrderSalesCountByDaysummaryCount(Integer.valueOf(summaryDto.getShopId()), summaryDto.getCateId(), summaryDto.getProName(), summaryDto.getStartTime(), summaryDto.getEndTime()); + TbOrderPayCountVo zongShuLiang = new TbOrderPayCountVo("el-icon-goods", "总数量", "0", tbOrderSalesCountByDayVo.getSalesNum() + tbOrderSalesCountByDayVo.getRefNum()); + TbOrderPayCountVo zong = new TbOrderPayCountVo("el-icon-coin", "总金额", "1", tbOrderSalesCountByDayVo.getSalesAmount()); + TbOrderPayCountVo tuidan = new TbOrderPayCountVo("el-icon-goods", "退单量", "0", tbOrderSalesCountByDayVo.getRefNum()); + TbOrderPayCountVo tuikuan = new TbOrderPayCountVo("el-icon-money", "退款金额", "1", tbOrderSalesCountByDayVo.getRefAmount()); +// TbOrderPayCountVo xiaoliang =new TbOrderPayCountVo("el-icon-goods","销售量","0",tbOrderSalesCountByDayVo.getSalesNum()); + + list.add(zong); + list.add(tuikuan); +// list.add(xiaoliang); + list.add(zongShuLiang); + list.add(tuidan); + + return list; + } + @Override public Page selectSummaryByDay(ShopSummaryDto summaryDto, Integer page, Integer size) { Pageable pageable = PageRequest.of(page, size); if (StringUtils.isBlank(summaryDto.getCateId())) { summaryDto.setCateId(null); } - if (summaryDto.getType() != null && summaryDto.getType() == 1) {//金额 - Long start = 1704038400000L; - Long end = Instant.now().toEpochMilli(); - if (summaryDto.getStartTime() != null && summaryDto.getEndTime() != null) { - start = summaryDto.getStartTime().getTime(); - end = summaryDto.getEndTime().getTime(); - } - Page tPage = (Page) tbOrderInfoRepository.queryTbOrderPayCountByDay(summaryDto.getShopId(), start, end, pageable); - tPage.getContent().forEach(t -> { - TbOrderPayCountByDayVo tbOrderPayCountByDayVo = (TbOrderPayCountByDayVo) t; - - BigDecimal recharge = tbShopUserFlowService.sumUserFlowAmountByConditions(Long.valueOf(summaryDto.getShopId()), - tbOrderPayCountByDayVo.getTradeDay() + " 00:00:00", - tbOrderPayCountByDayVo.getTradeDay() + " 23:59:59"); - tbOrderPayCountByDayVo.setRecharge(recharge); - - BigDecimal decimal = tbOrderInfoRepository.queryRefundOrderAmountByTradeDay(summaryDto.getShopId(), tbOrderPayCountByDayVo.getTradeDay()); - tbOrderPayCountByDayVo.setRefund(decimal == null ? new BigDecimal("0.00") : decimal); - - BigDecimal total = (BigDecimal) tbOrderPayCountByDayVo.getTotal(); - BigDecimal refund = (BigDecimal) tbOrderPayCountByDayVo.getRefund(); - tbOrderPayCountByDayVo.setTotal(total.subtract(refund)); - }); - - return tPage; - } else {//销量 - if (summaryDto.getStartTime() == null || summaryDto.getEndTime() == null) { - summaryDto.setStartTime(DateUtil.toDate(DateUtil.fromTimeStamp(1704038400L))); - summaryDto.setEndTime(new Date()); - } - return (Page) detailRepository.queryTbOrderSalesCountByDay(Integer.valueOf(summaryDto.getShopId()), summaryDto.getCateId(), summaryDto.getProName(), summaryDto.getStartTime(), summaryDto.getEndTime(), pageable); + if (summaryDto.getStartTime() == null || summaryDto.getEndTime() == null) { + summaryDto.setStartTime(DateUtil.toDate(DateUtil.fromTimeStamp(1704038400L))); + summaryDto.setEndTime(new Date()); } + Page products = detailRepository.queryTbOrderSalesCountByProduct(Integer.valueOf(summaryDto.getShopId()), summaryDto.getCateId(), summaryDto.getProName(), summaryDto.getStartTime(), summaryDto.getEndTime(), pageable); + for (TbOrderSalesCountByDayV2Vo product : products) { + List skus = detailRepository.queryTbOrderSalesCountBySku(Integer.valueOf(summaryDto.getShopId()), product.getProductId(), summaryDto.getStartTime(), summaryDto.getEndTime()); + product.setSkus(skus); + } + return (Page)products; } - @Override public void download(ShopSummaryDto summaryDto, HttpServletResponse response) throws IOException { List> list = new ArrayList<>(); if (StringUtils.isBlank(summaryDto.getCateId())) { summaryDto.setCateId(null); } + if (summaryDto.getStartTime() == null || summaryDto.getEndTime() == null) { + summaryDto.setStartTime(DateUtil.toDate(DateUtil.fromTimeStamp(1704038400L))); + summaryDto.setEndTime(new Date()); + } - if (summaryDto.getType() != null && summaryDto.getType() == 1) {//金额 - Long start = 1704038400000L; - Long end = Instant.now().toEpochMilli(); - if (summaryDto.getStartTime() != null && summaryDto.getEndTime() != null) { - start = summaryDto.getStartTime().getTime(); - end = summaryDto.getEndTime().getTime(); + List products = detailRepository.queryTbOrderSalesCountByProduct(Integer.valueOf(summaryDto.getShopId()), summaryDto.getCateId(), summaryDto.getProName(), summaryDto.getStartTime(), summaryDto.getEndTime()); + for (TbOrderSalesCountByDayV2Vo product : products) { + if(product.getTypeEnum().equals("sku")){ + List skus = detailRepository.queryTbOrderSalesCountBySku(Integer.valueOf(summaryDto.getShopId()), product.getProductId(), summaryDto.getStartTime(), summaryDto.getEndTime()); + product.setSkus(skus); } - List tbOrderPayCountByDayVos = tbOrderInfoRepository.queryTbOrderPayCountByDay(summaryDto.getShopId(), start, end); - for (TbOrderPayCountByDayVo all : tbOrderPayCountByDayVos) { + } + for (TbOrderSalesCountByDayV2Vo product : products) { + if(product.getTypeEnum().equals("sku")){ + for (TbOrderSalesCountByDayV2Vo skus : product.getSkus()) { + Map map = new LinkedHashMap<>(); + map.put("商品分类", product.getCateName()); + map.put("商品名称", product.getName()); + map.put("商品规格", StringUtils.isBlank(skus.getName()) ? "" : skus.getName()); + map.put("销 售 额", skus.getSalesAmount()); + map.put("退 单 额", skus.getRefAmount().compareTo(BigDecimal.ZERO) == 0 ? skus.getRefAmount() : "-" + skus.getRefAmount()); + map.put("实际销量", skus.getSalesNum()); + map.put("退 单 量", skus.getRefNum()); + list.add(map); + } + }else { Map map = new LinkedHashMap<>(); - map.put("总金额", all.getTotal()); - map.put("现金", all.getCash()); - map.put("储值卡支付", all.getDeposit()); - map.put("扫码支付", all.getScanCode()); - map.put("微信小程序支付", all.getWxLite()); - map.put("日期", all.getTradeDay()); + map.put("商品分类", product.getCateName()); + map.put("商品名称", product.getName()); + map.put("商品规格", ""); + map.put("销 售 额", product.getSalesAmount()); + map.put("退 单 额", product.getRefAmount().compareTo(BigDecimal.ZERO) == 0 ? product.getRefAmount() : "-" + product.getRefAmount()); + map.put("实际销量", product.getSalesNum()); + map.put("退 单 量", product.getRefNum()); list.add(map); } - } else {//销量 - if (summaryDto.getStartTime() == null || summaryDto.getEndTime() == null) { - summaryDto.setStartTime(DateUtil.toDate(DateUtil.fromTimeStamp(1704038400L))); - summaryDto.setEndTime(new Date()); - } - List tbOrderSalesCountByDayVos = detailRepository - .queryTbOrderSalesCountByDay(Integer.valueOf(summaryDto.getShopId()), summaryDto.getCateId(), summaryDto.getProName(), summaryDto.getStartTime(), summaryDto.getEndTime()); - tbOrderSalesCountByDayVos.forEach(all -> { - Map map = new LinkedHashMap<>(); - map.put("商品分类", all.getCateName()); - map.put("商品名称", all.getProductName()); - map.put("单 位", all.getUnitName()); - map.put("商品规格", StringUtils.isBlank(all.getProductSkuName()) ? "" : all.getProductSkuName()); - map.put("单 价", all.getPrice()); - map.put("销 售 额", all.getSalesAmount()); - map.put("退 单 额", all.getRefAmount().compareTo(BigDecimal.ZERO) == 0 ? all.getRefAmount() : "-" + all.getRefAmount()); - map.put("总 销 量", all.getNum() - all.getRefNum()); - map.put("实际销量", all.getSalesNum()); - map.put("退 单 量", all.getRefNum()); - list.add(map); - }); - } FileUtil.downloadExcel(list, response); } - @Override - public List summaryCount(ShopSummaryDto summaryDto) { - List list = new ArrayList<>(); - Long start = 1704038400000L; - Long end = Instant.now().toEpochMilli(); - if (summaryDto.getStartTime() != null || summaryDto.getEndTime() != null) { - start = summaryDto.getStartTime().getTime(); - end = summaryDto.getEndTime().getTime(); - } else { - summaryDto.setStartTime(DateUtil.toDate(DateUtil.fromTimeStamp(1704038400L))); - summaryDto.setEndTime(new Date()); - } - if (summaryDto.getType() != null && summaryDto.getType() == 1) { - TbOrderPayCountVo payCount = tbOrderInfoRepository.queryOrderPayCount(summaryDto.getShopId(), start, end); - TbOrderPayCountVo refCount = tbOrderInfoRepository.queryTbOrderRefund(summaryDto.getShopId(), null,start, end); - payCount.setPayAmount(new BigDecimal(payCount.getPayAmount().toString()).subtract(new BigDecimal(refCount.getPayAmount().toString()))); - payCount.setIcon("el-icon-coin"); - list.add(payCount); - TbOrderPayCountVo cashCount = tbOrderInfoRepository.queryOrderPayCash(summaryDto.getShopId(), start, end); - cashCount.setIcon("el-icon-circle-check"); - list.add(cashCount); - refCount.setPayType("退款金额"); - refCount.setIcon("el-icon-money"); - list.add(refCount); - - TbOrderSalesCountByDayVo numCount = detailRepository.queryTbOrderSalesCount(Integer.valueOf(summaryDto.getShopId()), summaryDto.getStartTime(), summaryDto.getEndTime()); - TbOrderPayCountVo salesNum =new TbOrderPayCountVo("el-icon-goods","销售量","0",numCount.getSalesNum()-numCount.getRefNum()); - TbOrderPayCountVo refNum =new TbOrderPayCountVo("el-icon-goods","退单量","0",numCount.getRefNum()); - list.add(salesNum); - list.add(refNum); - }else { - TbOrderSalesCountByDayVo tbOrderSalesCountByDayVo = detailRepository.queryTbOrderSalesCountByDaysummaryCount(Integer.valueOf(summaryDto.getShopId()), summaryDto.getCateId(), summaryDto.getProName(), summaryDto.getStartTime(), summaryDto.getEndTime()); - TbOrderPayCountVo zong =new TbOrderPayCountVo("el-icon-coin","总金额","1",tbOrderSalesCountByDayVo.getSalesAmount()); - TbOrderPayCountVo tuikuan =new TbOrderPayCountVo("el-icon-money","退款金额","1",tbOrderSalesCountByDayVo.getRefAmount()); - TbOrderPayCountVo xiaoliang =new TbOrderPayCountVo("el-icon-goods","销售量","0",tbOrderSalesCountByDayVo.getSalesNum()); - TbOrderPayCountVo tuidan =new TbOrderPayCountVo("el-icon-goods","退单量","0",tbOrderSalesCountByDayVo.getRefNum()); - list.add(zong); - list.add(tuikuan); - list.add(xiaoliang); - list.add(tuidan); - } - return list; - } @Override public List selectSummaryTable(Integer shopId, Date startTime, Date endTime) { diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/StockServiceImpl.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/StockServiceImpl.java index c0dd7e49..cbfe7b46 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/StockServiceImpl.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/productimpl/StockServiceImpl.java @@ -355,12 +355,12 @@ public class StockServiceImpl implements StockService { TbProduct product = new TbProduct(); for (StockUpdateValueVO updateValueVO : updateValueVOs) { if (!updateValueVO.isSku()) { - if (product.getId()!=null) { + if (product.getId() == null) { product = tbProductRepository.getById(Integer.valueOf(updateValueVO.getId())); } productUp(updateValueVO, product); } else { - if (product.getId()!=null) { + if (product.getId() == null) { product = tbProductRepository.selectBySkuId(Integer.valueOf(updateValueVO.getId())); } productSkuUp(updateValueVO, product); diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/vo/CountStockByDayVo.java b/eladmin-system/src/main/java/cn/ysk/cashier/vo/CountStockByDayVo.java new file mode 100644 index 00000000..4c64609f --- /dev/null +++ b/eladmin-system/src/main/java/cn/ysk/cashier/vo/CountStockByDayVo.java @@ -0,0 +1,14 @@ +package cn.ysk.cashier.vo; + +import lombok.Data; + +import java.math.BigDecimal; + + +@Data +public class CountStockByDayVo { + private String tradeDay; + + private Integer saleNum; + private BigDecimal saleAmount; +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/vo/TbOrderSalesCountByDayV2Vo.java b/eladmin-system/src/main/java/cn/ysk/cashier/vo/TbOrderSalesCountByDayV2Vo.java new file mode 100644 index 00000000..adf50e80 --- /dev/null +++ b/eladmin-system/src/main/java/cn/ysk/cashier/vo/TbOrderSalesCountByDayV2Vo.java @@ -0,0 +1,34 @@ +package cn.ysk.cashier.vo; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + + +@Data +public class TbOrderSalesCountByDayV2Vo { + private String name; + private Integer productId; + private String cateName; + private String typeEnum; + + private Long salesNum; + private Long refNum; + private BigDecimal salesAmount; + private BigDecimal refAmount; + + List skus = new ArrayList<>(); + + public TbOrderSalesCountByDayV2Vo(String name, Integer productId, String cateName,String typeEnum, Long salesNum, Long refNum, BigDecimal salesAmount, BigDecimal refAmount) { + this.name = name; + this.productId = productId; + this.typeEnum = typeEnum; + this.cateName = cateName; + this.salesNum = salesNum; + this.refNum = refNum; + this.salesAmount = salesAmount; + this.refAmount = refAmount; + } +} diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/vo/TbOrderSalesCountByDayVo.java b/eladmin-system/src/main/java/cn/ysk/cashier/vo/TbOrderSalesCountByDayVo.java index b994e4d1..6635bad5 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/vo/TbOrderSalesCountByDayVo.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/vo/TbOrderSalesCountByDayVo.java @@ -1,8 +1,11 @@ package cn.ysk.cashier.vo; +import lombok.Data; + import java.math.BigDecimal; +@Data public class TbOrderSalesCountByDayVo { private String productName; private String productSkuName; @@ -17,103 +20,6 @@ public class TbOrderSalesCountByDayVo { private Integer productId; private Integer productSkuId; - public Integer getProductId() { - return productId; - } - - public void setProductId(Integer productId) { - this.productId = productId; - } - - public Integer getProductSkuId() { - return productSkuId; - } - - public void setProductSkuId(Integer productSkuId) { - this.productSkuId = productSkuId; - } - - public String getProductName() { - return productName; - } - - public void setProductName(String productName) { - this.productName = productName; - } - - public String getProductSkuName() { - return productSkuName; - } - - public void setProductSkuName(String productSkuName) { - this.productSkuName = productSkuName; - } - - public String getCateName() { - return cateName; - } - - public void setCateName(String cateName) { - this.cateName = cateName; - } - - public Long getSalesNum() { - return salesNum; - } - - public void setSalesNum(Long salesNum) { - this.salesNum = salesNum; - } - - public Long getRefNum() { - return refNum; - } - - public void setRefNum(Long refNum) { - this.refNum = refNum; - } - - public Long getNum() { - return num; - } - - public void setNum(Long num) { - this.num = num; - } - - public BigDecimal getSalesAmount() { - return salesAmount; - } - - public void setSalesAmount(BigDecimal salesAmount) { - this.salesAmount = salesAmount; - } - - public BigDecimal getRefAmount() { - return refAmount; - } - - public void setRefAmount(BigDecimal refAmount) { - this.refAmount = refAmount; - } - - public String getUnitName() { - return unitName; - } - - public void setUnitName(String unitName) { - this.unitName = unitName; - } - - - public BigDecimal getPrice() { - return price; - } - - public void setPrice(BigDecimal price) { - this.price = price; - } - public TbOrderSalesCountByDayVo(Long salesNum, Long refNum) { this.salesNum = salesNum; this.refNum = refNum; From 386126cb5e70d2fe3915afb892a4a642695c4d0e Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Thu, 26 Sep 2024 15:14:46 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E9=A6=96=E9=A1=B5=20=E7=BB=9F=E8=AE=A1=20?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=BB=9F=E8=AE=A1(=E5=8C=85=E6=8B=AC?= =?UTF-8?q?=E5=BC=B9=E7=AA=97)/=E9=94=80=E9=87=8F=E7=BB=9F=E8=AE=A1=20?= =?UTF-8?q?=E5=BF=AB=E6=8D=B7=E4=BF=AE=E6=94=B9=E6=8E=A5=E5=8F=A3=20?= =?UTF-8?q?=E6=8A=A5=E9=94=99=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/ysk/cashier/vo/TbOrderPayCountVo.java | 47 +++++++------------ 1 file changed, 16 insertions(+), 31 deletions(-) diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/vo/TbOrderPayCountVo.java b/eladmin-system/src/main/java/cn/ysk/cashier/vo/TbOrderPayCountVo.java index d97fe1ea..1f275449 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/vo/TbOrderPayCountVo.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/vo/TbOrderPayCountVo.java @@ -1,44 +1,17 @@ package cn.ysk.cashier.vo; +import lombok.Data; +@Data public class TbOrderPayCountVo { private String icon; private String payType; //是否展示金额标识 private String isAmount="1"; private Object payAmount; + private Object saveAmount; - public String getIcon() { - return icon; - } - - public void setIcon(String icon) { - this.icon = icon; - } - - public String getPayType() { - return payType; - } - - public void setPayType(String payType) { - this.payType = payType; - } - - public Object getPayAmount() { - return payAmount; - } - - public void setPayAmount(Object payAmount) { - this.payAmount = payAmount; - } - - - public String getIsAmount() { - return isAmount; - } - - public void setIsAmount(String isAmount) { - this.isAmount = isAmount; + public TbOrderPayCountVo() { } public TbOrderPayCountVo(String payType, Object payAmount) { @@ -49,6 +22,18 @@ public class TbOrderPayCountVo { } } + public TbOrderPayCountVo(String payType, Object payAmount, Object saveAmount) { + this.payType = payType; + this.payAmount = payAmount; + this.saveAmount = saveAmount; + if (payAmount == null) { + this.payAmount = 0; + } + if (saveAmount == null) { + this.saveAmount = 0; + } + } + public TbOrderPayCountVo(String icon, String payType, String isAmount, Object payAmount) { this.icon = icon; this.payType = payType;