ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TDataStatisticsController.java
@@ -3,6 +3,7 @@ import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; import com.ruoyi.common.basic.PageInfo; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.WebUtils; @@ -195,7 +196,7 @@ @ApiOperation( value = "商品分类销售排行") @PostMapping(value = "/salesRanking") public AjaxResult<List<SalesRankingVO>> salesRanking(@RequestBody TDataStatisticsQuery query) { public AjaxResult<PageInfo<SalesRankingVO>> salesRanking(@RequestBody TDataStatisticsQuery query) { Integer roleType = tokenService.getLoginUser().getRoleType(); Long objectId = tokenService.getLoginUser().getObjectId(); query.setShopId(objectId); @@ -228,7 +229,7 @@ } query.setStartTime(DateUtils.localDateTimeToDate(startTime)); query.setEndTime(DateUtils.localDateTimeToDate(endTime)); List<SalesRankingVO> salesRankingVOS; PageInfo<SalesRankingVO> salesRankingVOS; if(roleType == 2){ salesRankingVOS = orderMealService.salesRanking(query); }else{ ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TOrderMealController.java
@@ -5,17 +5,19 @@ import cn.afterturn.easypoi.excel.entity.ExportParams; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.common.basic.PageInfo; import com.ruoyi.common.constant.OrderNumConstants; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.CodeGenerateUtils; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.WebUtils; import com.ruoyi.framework.web.service.TokenService; import com.ruoyi.system.domain.TGoodsType; import com.ruoyi.system.domain.TOrderMeal; import com.ruoyi.system.domain.TOrderMealGoods; import com.ruoyi.system.domain.*; import com.ruoyi.system.dto.CheckoutDTO; import com.ruoyi.system.dto.MealOrderGoodsDTO; import com.ruoyi.system.dto.TOrderMealDTO; import com.ruoyi.system.export.TOrderMealExportExcel; import com.ruoyi.system.query.TOrderMealQuery; import com.ruoyi.system.service.TGoodsService; import com.ruoyi.system.service.TGoodsTypeService; import com.ruoyi.system.service.TOrderMealGoodsService; import com.ruoyi.system.service.TOrderMealService; @@ -56,13 +58,15 @@ private final TOrderMealService orderMealService; private final TOrderMealGoodsService orderMealGoodsService; private final TGoodsTypeService goodsTypeService; private final TGoodsService goodsService; private final TokenService tokenService; @Autowired public TOrderMealController(TOrderMealService orderMealService, TOrderMealGoodsService orderMealGoodsService, TGoodsTypeService goodsTypeService, TokenService tokenService) { public TOrderMealController(TOrderMealService orderMealService, TOrderMealGoodsService orderMealGoodsService, TGoodsTypeService goodsTypeService, TGoodsService goodsService, TokenService tokenService) { this.orderMealService = orderMealService; this.orderMealGoodsService = orderMealGoodsService; this.goodsTypeService = goodsTypeService; this.goodsService = goodsService; this.tokenService = tokenService; } @@ -124,6 +128,24 @@ orderMealGoodsService.saveBatch(dto.getMealOrderGoods()); return AjaxResult.success(); } @ApiOperation( value = "列表详情结账") @PostMapping(value = "/detailUpdate") public AjaxResult<String> detailUpdate(@RequestBody TOrderMealDTO dto) { // 删除所有菜品 orderMealGoodsService.remove(Wrappers.lambdaQuery(TOrderMealGoods.class) .eq(TOrderMealGoods::getOrderId, dto.getId())); orderMealService.updateById(dto); // 查询餐桌 List<TOrderMealGoods> mealOrderGoods = dto.getMealOrderGoods(); if (!CollectionUtils.isEmpty(mealOrderGoods)) { for (TOrderMealGoods mealOrderGood : mealOrderGoods) { // 设置商品类型和类型id mealOrderGood.setId(null); } orderMealGoodsService.saveBatch(mealOrderGoods); } return AjaxResult.success(); } @ApiOperation( value = "删除餐饮订单") @GetMapping(value = "/deleteById") @@ -175,6 +197,7 @@ @PostMapping("/exportOrderMeal") public void exportOrderMeal(@RequestBody TOrderMealQuery query) { query.setShopId(tokenService.getLoginUser().getObjectId()); List<TOrderMealVO> list = orderMealService.exportOrderMeal(query); List<TOrderMealExportExcel> orderMeals = new ArrayList<>(); for (TOrderMealVO orderMealVO : list) { @@ -182,6 +205,7 @@ BeanUtils.copyProperties(orderMealVO, tOrderMealExportExcel); tOrderMealExportExcel.setCreateStrTime(DateUtils.localDateTimeToString(orderMealVO.getCreateTime())); tOrderMealExportExcel.setGoodsList(orderMealVO.getGoodsList().stream().collect(Collectors.joining("\n"))); orderMeals.add(tOrderMealExportExcel); } Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), TOrderMealExportExcel.class, orderMeals); HttpServletResponse response = WebUtils.response(); ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TOrderSaleController.java
@@ -139,16 +139,18 @@ @PostMapping("/exportOrderSale") public void exportOrderSale(@RequestBody TOrderMealQuery query) { query.setShopId(tokenService.getLoginUser().getObjectId()); List<TOrderSaleVO> list = orderSaleService.exportOrderSale(query); List<TOrderMealExportExcel> orderMeals = new ArrayList<>(); List<TOrderSaleExportExcel> orderMeals = new ArrayList<>(); for (TOrderSaleVO orderSaleVO : list) { TOrderSaleExportExcel orderSaleExportExcel = new TOrderSaleExportExcel(); BeanUtils.copyProperties(orderSaleVO, orderSaleExportExcel); orderSaleExportExcel.setCreateStrTime(DateUtils.localDateTimeToString(orderSaleVO.getCreateTime())); orderSaleExportExcel.setGoodsAmount(orderSaleVO.getOrderSaleGoods().stream().map(TOrderSaleGoods::getThisSalePrice).reduce(BigDecimal::add).get()); orderSaleExportExcel.setGoodsCount(orderSaleVO.getOrderSaleGoods().size()); orderMeals.add(orderSaleExportExcel); } Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), TOrderMealExportExcel.class, orderMeals); Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), TOrderSaleExportExcel.class, orderMeals); HttpServletResponse response = WebUtils.response(); response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TaskUtil.java
@@ -80,18 +80,18 @@ @Scheduled(cron = "0 0 0 * * *") public void taskDay(){ List<SysRole> sysRoles = roleService.selectListByDelFlag(2); if(CollectionUtils.isEmpty(sysRoles)){ return; } for (SysRole sysRole : sysRoles) { if(sysRole.getRemoveDays()>0){ sysRole.setRemoveDays(sysRole.getRemoveDays()-1); roleService.updateRole(sysRole); }else { roleService.deleteRoleById(sysRole.getRoleId()); } } // List<SysRole> sysRoles = roleService.selectListByDelFlag(2); // if(CollectionUtils.isEmpty(sysRoles)){ // return; // } // for (SysRole sysRole : sysRoles) { // if(sysRole.getRemoveDays()>0){ // sysRole.setRemoveDays(sysRole.getRemoveDays()-1); // roleService.updateRole(sysRole); // }else { // roleService.deleteRoleById(sysRole.getRoleId()); // } // } } /** ruoyi-system/src/main/java/com/ruoyi/system/mapper/TOrderMealGoodsMapper.java
@@ -1,7 +1,9 @@ package com.ruoyi.system.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.common.basic.PageInfo; import com.ruoyi.system.domain.TOrderMealGoods; import com.ruoyi.system.vo.SalesRankingVO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -25,4 +27,13 @@ * @return */ BigDecimal costTotal(@Param("ids") List<Long> ids); /** * 获取销售 * @param ids * @param pageInfo * @return */ List<SalesRankingVO> salesRanking(@Param("ids")List<Long> ids, @Param("pageInfo")PageInfo<SalesRankingVO> pageInfo); } ruoyi-system/src/main/java/com/ruoyi/system/mapper/TOrderMealMapper.java
@@ -107,7 +107,7 @@ * @param query * @return */ Map<String, BigDecimal> profitDetailsStatistics(@Param("query")ProfitDetailsQuery query); Map<String, Double> profitDetailsStatistics(@Param("query")ProfitDetailsQuery query); /** * 导出盈利明细 ruoyi-system/src/main/java/com/ruoyi/system/mapper/TOrderSaleGoodsMapper.java
@@ -1,7 +1,9 @@ package com.ruoyi.system.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.common.basic.PageInfo; import com.ruoyi.system.domain.TOrderSaleGoods; import com.ruoyi.system.vo.SalesRankingVO; import org.apache.ibatis.annotations.Param; import java.math.BigDecimal; @@ -23,4 +25,13 @@ * @return */ BigDecimal costTotal(@Param("ids") List<Long> ids); /** * 商品分类销售排行 * @param ids * @param pageInfo * @return */ List<SalesRankingVO> salesRanking(@Param("ids")List<Long> ids, @Param("pageInfo")PageInfo<SalesRankingVO> pageInfo); } ruoyi-system/src/main/java/com/ruoyi/system/service/TOrderMealService.java
@@ -69,7 +69,7 @@ * @param query * @return */ List<SalesRankingVO> salesRanking(TDataStatisticsQuery query); PageInfo<SalesRankingVO> salesRanking(TDataStatisticsQuery query); /** * 餐饮列表 ruoyi-system/src/main/java/com/ruoyi/system/service/TOrderSaleGoodsService.java
@@ -1,7 +1,9 @@ package com.ruoyi.system.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.basic.PageInfo; import com.ruoyi.system.domain.TOrderSaleGoods; import com.ruoyi.system.vo.SalesRankingVO; import java.math.BigDecimal; import java.util.List; ruoyi-system/src/main/java/com/ruoyi/system/service/TOrderSaleService.java
@@ -54,7 +54,7 @@ * @param query * @return */ List<SalesRankingVO> salesRanking(TDataStatisticsQuery query); PageInfo<SalesRankingVO> salesRanking(TDataStatisticsQuery query); /** * 导出销售列表 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TOrderMealServiceImpl.java
@@ -38,6 +38,8 @@ @Autowired private TOrderMealGoodsService orderMealGoodsService; @Autowired private TOrderMealGoodsMapper orderMealGoodsMapper; @Autowired private TOrderRemarkService orderRemarkService; @Autowired private TBoardService boardService; @@ -80,8 +82,8 @@ orderMealGood.setGoodsNum(item1.getGoodsNum()); orderMealGood.setGoodsPicture(item1.getGoodsPicture()); orderMealGood.setGoodsCount(item.getGoodsCount()); orderMealGood.setGoodsSalePrice(item1.getSalePrice().multiply(new BigDecimal(item.getGoodsCount()))); orderMealGood.setCostPrice(item1.getCostPrice().multiply(new BigDecimal(item.getGoodsCount()))); orderMealGood.setGoodsSalePrice(item1.getSalePrice()); orderMealGood.setCostPrice(item1.getCostPrice()); orderMealGood.setTypeId(item1.getTypeId()); orderMealGood.setGoodsId(item1.getId()); orderMealGood.setTypeName(list1.stream().filter(item2 -> item2.getId().equals(item1.getTypeId())).findFirst().get().getTypeName()); @@ -92,7 +94,7 @@ // 添加菜品 for (TOrderMealGoods orderMealGood : orderMealGoods) { orderMealGood.setOrderId(dto.getId()); orderMoney = orderMoney.add(orderMealGood.getGoodsSalePrice()); orderMoney = orderMoney.add(orderMealGood.getGoodsSalePrice().multiply(new BigDecimal(orderMealGood.getGoodsCount()))); } orderMealGoodsService.saveBatch(orderMealGoods); orderMeal.setOrderMoney(orderMoney); @@ -228,24 +230,18 @@ } @Override public List<SalesRankingVO> salesRanking(TDataStatisticsQuery query) { public PageInfo<SalesRankingVO> salesRanking(TDataStatisticsQuery query) { PageInfo<SalesRankingVO> pageInfo = new PageInfo<>(query.getPageNum(),query.getPageSize()); List<TOrderMeal> list = this.list(Wrappers.lambdaQuery(TOrderMeal.class) .eq(TOrderMeal::getShopId, query.getShopId()) .between(TOrderMeal::getCreateTime, query.getStartTime(), query.getEndTime())); List<Long> ids = list.stream().map(TOrderMeal::getId).collect(Collectors.toList()); List<SalesRankingVO> salesRankingVOS = new ArrayList<>(); if(!CollectionUtils.isEmpty(ids)){ List<TOrderMealGoods> list1 = orderMealGoodsService.list(Wrappers.lambdaQuery(TOrderMealGoods.class) .in(TOrderMealGoods::getOrderId, ids)); Map<String, List<TOrderMealGoods>> listMap = list1.stream().collect(Collectors.groupingBy(TOrderMealGoods::getTypeName)); listMap.forEach((k,v)->{ SalesRankingVO salesRankingVO = new SalesRankingVO(); salesRankingVO.setTypeName(k); salesRankingVO.setSalesVolume(v.stream().map(item->item.getGoodsSalePrice().multiply(new BigDecimal(item.getGoodsCount()))).reduce(BigDecimal.ZERO, BigDecimal::add)); salesRankingVOS.add(salesRankingVO); }); if(CollectionUtils.isEmpty(ids)){ return new PageInfo<>(); } return salesRankingVOS; List<SalesRankingVO> salesRankingVOS = orderMealGoodsMapper.salesRanking(ids, pageInfo); pageInfo.setRecords(salesRankingVOS); return pageInfo; } @Override @@ -280,18 +276,20 @@ } List<TOrderMealVO> list = this.baseMapper.exportOrderMeal(query); List<Long> ids = list.stream().map(TOrderMealVO::getId).collect(Collectors.toList()); List<TOrderMealGoods> list1 = orderMealGoodsService.list(Wrappers.lambdaQuery(TOrderMealGoods.class) .in(TOrderMealGoods::getOrderId,ids)); // 查询商品信息 for (TOrderMealVO tOrderMealVO : list) { List<TOrderMealGoods> collect = list1.stream().filter(e -> e.getOrderId().equals(tOrderMealVO.getId())).collect(Collectors.toList()); tOrderMealVO.setOrderMealGoods(collect); Map<String, List<TOrderMealGoods>> map = collect.stream().collect(Collectors.groupingBy(TOrderMealGoods::getTypeName)); List<String> goodsList = new ArrayList<>(); map.forEach((k,v)->{ goodsList.add(k+":"+v.stream().map(item->item.getGoodsName()+" "+(item.getGoodsSalePrice().multiply(new BigDecimal(item.getGoodsCount())))).collect(Collectors.joining(","))); }); tOrderMealVO.setGoodsList(goodsList); if(!CollectionUtils.isEmpty(ids)){ List<TOrderMealGoods> list1 = orderMealGoodsService.list(Wrappers.lambdaQuery(TOrderMealGoods.class) .in(TOrderMealGoods::getOrderId,ids)); // 查询商品信息 for (TOrderMealVO tOrderMealVO : list) { List<TOrderMealGoods> collect = list1.stream().filter(e -> e.getOrderId().equals(tOrderMealVO.getId())).collect(Collectors.toList()); tOrderMealVO.setOrderMealGoods(collect); Map<String, List<TOrderMealGoods>> map = collect.stream().collect(Collectors.groupingBy(TOrderMealGoods::getTypeName)); List<String> goodsList = new ArrayList<>(); map.forEach((k,v)->{ goodsList.add(k+":"+v.stream().map(item->item.getGoodsName()+" "+(item.getGoodsSalePrice().multiply(new BigDecimal(item.getGoodsCount())))).collect(Collectors.joining(","))); }); tOrderMealVO.setGoodsList(goodsList); } } return list; } @@ -397,7 +395,7 @@ profitDetailsVO.setGoodsProfitVOS(pageInfo); // 统计商品金额 Map<String,BigDecimal> map = this.baseMapper.profitDetailsStatistics(query); Map<String,Double> 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())); ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TOrderSaleServiceImpl.java
@@ -9,6 +9,7 @@ import com.ruoyi.system.domain.*; import com.ruoyi.system.dto.CheckoutDTO; import com.ruoyi.system.dto.TOrderSaleDTO; import com.ruoyi.system.mapper.TOrderSaleGoodsMapper; import com.ruoyi.system.mapper.TOrderSaleMapper; import com.ruoyi.system.query.*; import com.ruoyi.system.service.TGoodsService; @@ -42,6 +43,8 @@ @Autowired private TOrderSaleGoodsService orderSaleGoodsService; @Autowired private TOrderSaleGoodsMapper orderSaleGoodsMapper; @Autowired private TGoodsTypeService goodsTypeService; @Autowired @@ -135,25 +138,18 @@ } @Override public List<SalesRankingVO> salesRanking(TDataStatisticsQuery query) { public PageInfo<SalesRankingVO> salesRanking(TDataStatisticsQuery query) { PageInfo<SalesRankingVO> pageInfo = new PageInfo<>(query.getPageNum(),query.getPageSize()); List<TOrderSale> list = this.list(Wrappers.lambdaQuery(TOrderSale.class) .eq(TOrderSale::getShopId, query.getShopId()) .between(TOrderSale::getOrderTime, query.getStartTime(), query.getEndTime())); List<Long> ids = list.stream().map(TOrderSale::getId).collect(Collectors.toList()); List<SalesRankingVO> salesRankingVOS = new ArrayList<>(); if(!CollectionUtils.isEmpty(ids)){ List<TOrderSaleGoods> list1 = orderSaleGoodsService.list(Wrappers.lambdaQuery(TOrderSaleGoods.class) .in(TOrderSaleGoods::getOrderId, ids)); Map<Long, List<TOrderSaleGoods>> listMap = list1.stream().collect(Collectors.groupingBy(TOrderSaleGoods::getTypeId)); List<TGoodsType> list2 = goodsTypeService.list(); listMap.forEach((k,v)->{ SalesRankingVO salesRankingVO = new SalesRankingVO(); salesRankingVO.setTypeName(list2.stream().filter(e->e.getId().equals(k)).findFirst().get().getTypeName()); salesRankingVO.setSalesVolume(v.stream().map(item->item.getGoodsSalePrice().multiply(new BigDecimal(item.getGoodsCount()))).reduce(BigDecimal.ZERO, BigDecimal::add)); salesRankingVOS.add(salesRankingVO); }); if(CollectionUtils.isEmpty(ids)){ return new PageInfo<>(); } return salesRankingVOS; List<SalesRankingVO> salesRankingVOS = orderSaleGoodsMapper.salesRanking(ids,pageInfo); pageInfo.setRecords(salesRankingVOS); return pageInfo; } @Override ruoyi-system/src/main/resources/mapper/system/TOrderMealGoodsMapper.xml
@@ -32,5 +32,18 @@ </if> </where> </select> <select id="salesRanking" resultType="com.ruoyi.system.vo.SalesRankingVO"> SELECT typeName,SUM(goodsSalePrice*goodsCount) AS salesVolume from t_order_meal_goods <where> <if test="ids != null and ids.size()>0"> AND orderId IN <foreach collection="ids" item="id" open="(" separator="," close=")"> #{id} </foreach> </if> </where> GROUP BY typeName </select> </mapper> ruoyi-system/src/main/resources/mapper/system/TOrderMealMapper.xml
@@ -47,7 +47,7 @@ and tom.status = #{query.status} </if> <if test="query.orderNum != null and query.orderNum != ''"> and tom.orderNum LIKE concat('%',#{query.status},'%') and tom.orderNum LIKE concat('%',#{query.orderNum},'%') </if> <if test="query.shopId != null"> and tom.shopId = #{query.shopId} @@ -124,7 +124,7 @@ and tom.status = #{query.status} </if> <if test="query.orderNum != null and query.orderNum"> and tom.orderNum LIKE concat('%',#{query.status},'%') and tom.orderNum LIKE concat('%',#{query.orderNum},'%') </if> <if test="query.shopId != null"> and tom.shopId = #{query.shopId} ruoyi-system/src/main/resources/mapper/system/TOrderSaleGoodsMapper.xml
@@ -32,5 +32,19 @@ </if> </where> </select> <select id="salesRanking" resultType="com.ruoyi.system.vo.SalesRankingVO"> SELECT tgt.typeName,SUM(tosg.goodsSalePrice*tosg.goodsCount) AS salesVolume FROM t_order_sale_goods tosg LEFT JOIN t_goods_type tgt ON tosg.typeId = tgt.id <where> <if test="ids != null and ids.size()>0"> AND tosg.orderId IN <foreach collection="ids" item="id" open="(" separator="," close=")"> #{id} </foreach> </if> </where> GROUP BY tgt.typeName </select> </mapper>