package com.ruoyi.system.service.impl;
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.ruoyi.common.basic.PageInfo;
|
import com.ruoyi.common.constant.OrderNumConstants;
|
import com.ruoyi.common.enums.BoardEnum;
|
import com.ruoyi.common.utils.CodeGenerateUtils;
|
import com.ruoyi.common.utils.DateUtils;
|
import com.ruoyi.system.domain.*;
|
import com.ruoyi.system.dto.*;
|
import com.ruoyi.system.mapper.TOrderMealGoodsMapper;
|
import com.ruoyi.system.mapper.TOrderMealMapper;
|
import com.ruoyi.system.query.*;
|
import com.ruoyi.system.service.*;
|
import com.ruoyi.system.vo.*;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.util.CollectionUtils;
|
|
import java.math.BigDecimal;
|
import java.time.LocalDate;
|
import java.time.LocalDateTime;
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
/**
|
* <p>
|
* 餐饮订单 服务实现类
|
* </p>
|
*
|
* @author xiaochen
|
* @since 2024-08-14
|
*/
|
@Service
|
public class TOrderMealServiceImpl extends ServiceImpl<TOrderMealMapper, TOrderMeal> implements TOrderMealService {
|
|
@Autowired
|
private TOrderMealGoodsService orderMealGoodsService;
|
@Autowired
|
private TOrderMealGoodsMapper orderMealGoodsMapper;
|
@Autowired
|
private TOrderRemarkService orderRemarkService;
|
@Autowired
|
private TBoardService boardService;
|
@Autowired
|
private TGoodsTypeService goodsTypeService;
|
@Autowired
|
private TGoodsService goodsService;
|
|
@Override
|
public void add(TOrderMealDTO dto) {
|
if(Objects.isNull(dto.getBoardId())){
|
throw new RuntimeException("餐桌不能为空");
|
}
|
TOrderMeal orderMeal = this.getById(dto.getId());
|
orderMeal.setRemark(orderMeal.getRemark()+dto.getRemark());
|
orderMeal.setMealType(dto.getMealType());
|
orderMeal.setMealPerson(dto.getMealPerson());
|
orderMeal.setMealTime(dto.getMealTime());
|
orderMeal.setOrderMoney(dto.getOrderMoney());
|
|
// 查询菜品分类
|
List<TGoodsType> list1 = goodsTypeService.list();
|
// 查询餐桌
|
TBoard board = boardService.getById(dto.getBoardId());
|
if(!CollectionUtils.isEmpty(dto.getMealOrderGoodsDTOS())){
|
board.setStatus(BoardEnum.DURING_MEAL.getCode());
|
boardService.updateById(board);
|
// 订单金额,订单编号
|
String orderNum = OrderNumConstants.MEAL+CodeGenerateUtils.generateVolumeSn();
|
dto.setOrderNum(orderNum);
|
List<TOrderMealGoods> orderMealGoods = new ArrayList<>();
|
// 查询商品
|
List<Long> goodsIds = dto.getMealOrderGoodsDTOS().stream().map(MealOrderGoodsDTO::getGoodsId).collect(Collectors.toList());
|
List<TGoods> list = goodsService.list(Wrappers.lambdaQuery(TGoods.class)
|
.in(TGoods::getId, goodsIds));
|
dto.getMealOrderGoodsDTOS().forEach(item -> {
|
list.stream().filter(item1 -> item1.getId().equals(item.getGoodsId())).findFirst().ifPresent(item1 -> {
|
TOrderMealGoods orderMealGood = new TOrderMealGoods();
|
orderMealGood.setGoodsName(item1.getGoodsName());
|
orderMealGood.setGoodsNum(item1.getGoodsNum());
|
orderMealGood.setGoodsPicture(item1.getGoodsPicture());
|
orderMealGood.setGoodsCount(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());
|
orderMealGoods.add(orderMealGood);
|
});
|
});
|
BigDecimal orderMoney = BigDecimal.ZERO;
|
// 添加菜品
|
for (TOrderMealGoods orderMealGood : orderMealGoods) {
|
orderMealGood.setOrderId(dto.getId());
|
orderMoney = orderMoney.add(orderMealGood.getGoodsSalePrice().multiply(new BigDecimal(orderMealGood.getGoodsCount())));
|
}
|
orderMealGoodsService.saveBatch(orderMealGoods);
|
orderMeal.setOrderMoney(orderMoney);
|
this.updateById(orderMeal);
|
// 添加备注
|
// TOrderRemark tOrderRemark = new TOrderRemark();
|
// tOrderRemark.setOrderId(dto.getId());
|
// tOrderRemark.setRemark(dto.getRemark());
|
// tOrderRemark.setCreateTime(LocalDateTime.now());
|
// orderRemarkService.save(tOrderRemark);
|
}
|
}
|
|
@Override
|
public void addDish(AddDishDTO dto) {
|
List<TOrderMealGoods> orderMealGoods = new ArrayList<>();
|
// 查询菜品分类
|
List<TGoodsType> list1 = goodsTypeService.list();
|
// 查询商品
|
List<Long> goodsIds = dto.getMealOrderGoodsDTOS().stream().map(MealOrderGoodsDTO::getGoodsId).collect(Collectors.toList());
|
List<TOrderMealGoods> list = orderMealGoodsService.list(Wrappers.lambdaQuery(TOrderMealGoods.class)
|
.in(TOrderMealGoods::getId, goodsIds));
|
dto.getMealOrderGoodsDTOS().forEach(item -> {
|
list.stream().filter(item1 -> item1.getId().equals(item.getGoodsId())).findFirst().ifPresent(item1 -> {
|
TOrderMealGoods orderMealGood = new TOrderMealGoods();
|
orderMealGood.setGoodsName(item1.getGoodsName());
|
orderMealGood.setGoodsNum(item1.getGoodsNum());
|
orderMealGood.setGoodsPicture(item1.getGoodsPicture());
|
orderMealGood.setGoodsCount(item.getGoodsCount());
|
orderMealGood.setGoodsSalePrice(item1.getGoodsSalePrice().multiply(new BigDecimal(item.getGoodsCount())));
|
orderMealGood.setTypeId(item1.getTypeId());
|
orderMealGood.setGoodsId(item1.getId());
|
orderMealGood.setTypeName(list1.stream().filter(item2 -> item2.getId().equals(item1.getTypeId())).findFirst().get().getTypeName());
|
orderMealGoods.add(orderMealGood);
|
});
|
});
|
// 添加菜品
|
orderMealGoods.forEach(item -> {
|
item.setOrderId(dto.getOrderId());
|
});
|
orderMealGoodsService.saveBatch(orderMealGoods);
|
// 添加备注
|
// TOrderRemark tOrderRemark = new TOrderRemark();
|
// tOrderRemark.setOrderId(dto.getOrderId());
|
// tOrderRemark.setRemark(dto.getRemark());
|
// tOrderRemark.setCreateTime(LocalDateTime.now());
|
// orderRemarkService.save(tOrderRemark);
|
}
|
|
@Override
|
public void checkout(CheckoutDTO dto) {
|
TOrderMeal orderMeal = this.getById(dto.getOrderId());
|
orderMeal.setPayType(dto.getPayType());
|
orderMeal.setPayMoney(dto.getPayMoney());
|
orderMeal.setStatus(2);
|
this.updateById(orderMeal);
|
TBoard board = boardService.getById(orderMeal.getBoardId());
|
board.setStatus(BoardEnum.FREE.getCode());
|
boardService.updateById(board);
|
}
|
|
@Override
|
public PageInfo<TOrderMealVO> pageList(TOrderMealQuery query) {
|
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));
|
}
|
PageInfo<TOrderMealVO> pageInfo = new PageInfo<>(query.getPageNum(),query.getPageSize());
|
List<TOrderMealVO> list = this.baseMapper.pageList(query,pageInfo);
|
// 查询商品信息
|
for (TOrderMealVO tOrderMealVO : list) {
|
List<TOrderMealGoods> list1 = orderMealGoodsService.list(Wrappers.lambdaQuery(TOrderMealGoods.class)
|
.eq(TOrderMealGoods::getOrderId, tOrderMealVO.getId()));
|
tOrderMealVO.setOrderMealGoods(list1);
|
if(!CollectionUtils.isEmpty(list1)){
|
Map<String, List<TOrderMealGoods>> map = list1.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);
|
}
|
}
|
pageInfo.setRecords(list);
|
return pageInfo;
|
}
|
|
@Override
|
public AmountSumVO amountSum(TOrderMealQuery query) {
|
return this.baseMapper.amountSum(query);
|
}
|
|
|
@Override
|
public SalesVolumeVO salesVolume(TDataStatisticsQuery query) {
|
SalesVolumeVO salesVolumeVO = this.baseMapper.salesVolume(query);
|
salesVolumeVO.setSalesVolumeTotal(salesVolumeVO.getWeiXinPay().add(salesVolumeVO.getOtherPay()).add(salesVolumeVO.getCardPay())
|
.add(salesVolumeVO.getMoneyPay()).add(salesVolumeVO.getAliPay()));
|
// 查询成本
|
List<TOrderMeal> list = this.list(Wrappers.lambdaQuery(TOrderMeal.class)
|
.eq(TOrderMeal::getShopId, query.getShopId())
|
.ge(TOrderMeal::getMealTime, query.getStartTime())
|
.le(TOrderMeal::getMealTime, query.getEndTime()));
|
List<Long> ids = list.stream().map(TOrderMeal::getId).collect(Collectors.toList());
|
if(!CollectionUtils.isEmpty(ids)){
|
BigDecimal costTotal = orderMealGoodsService.costTotal(ids);
|
salesVolumeVO.setCostTotal(costTotal);
|
salesVolumeVO.setProfitTotal(salesVolumeVO.getSalesVolumeTotal().subtract(costTotal));
|
}
|
return salesVolumeVO;
|
}
|
|
@Override
|
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::getMealTime, query.getStartTime(), query.getEndTime()));
|
List<Long> ids = list.stream().map(TOrderMeal::getId).collect(Collectors.toList());
|
if(CollectionUtils.isEmpty(ids)){
|
return new PageInfo<>();
|
}
|
List<SalesRankingVO> salesRankingVOS = orderMealGoodsMapper.salesRanking(ids, pageInfo);
|
pageInfo.setRecords(salesRankingVOS);
|
return pageInfo;
|
}
|
|
@Override
|
public List<TOrderMealVO> exportOrderMeal(TOrderMealQuery query) {
|
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<TOrderMealVO> list = this.baseMapper.exportOrderMeal(query);
|
List<Long> ids = list.stream().map(TOrderMealVO::getId).collect(Collectors.toList());
|
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;
|
}
|
|
@Override
|
public List<OrderTrendsVO> orderingTrends(TDataStatisticsQuery query) {
|
return this.baseMapper.orderingTrends(query);
|
}
|
|
@Override
|
public List<PersonnelStatisticsVO> personnelStatistics(TDataStatisticsQuery query) {
|
return this.baseMapper.personnelStatistics(query);
|
}
|
|
@Override
|
public PageInfo<TOrderMealVO> pageListGenerator(TDataGeneratorMealQuery query) {
|
PageInfo<TOrderMealVO> pageInfo = new PageInfo<>(query.getPageNum(),query.getPageSize());
|
List<TOrderMealVO> list = this.baseMapper.pageListGenerator(query,pageInfo);
|
// 查询商品信息
|
for (TOrderMealVO tOrderMealVO : list) {
|
List<TOrderMealGoods> list1 = orderMealGoodsService.list(Wrappers.lambdaQuery(TOrderMealGoods.class)
|
.eq(TOrderMealGoods::getOrderId, tOrderMealVO.getId()));
|
tOrderMealVO.setOrderMealGoods(list1);
|
Map<String, List<TOrderMealGoods>> map = list1.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);
|
}
|
pageInfo.setRecords(list);
|
return pageInfo;
|
}
|
|
@Override
|
public Map<String, Double> getDataGeneratorMealDetail(TDataGeneratorMealQuery query) {
|
return this.baseMapper.getDataGeneratorMealDetail(query);
|
}
|
|
@Override
|
public List<TOrderMealVO> mealGeneratorExport(TDataGeneratorMealQuery query) {
|
List<TOrderMealVO> list = this.baseMapper.mealGeneratorExport(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);
|
}
|
return list;
|
}
|
|
@Override
|
public void startMeal(TOrderMeal dto) {
|
// 查询餐桌
|
TBoard board = boardService.getById(dto.getBoardId());
|
// 开台
|
board.setStatus(BoardEnum.WAITING_ORDER.getCode());
|
boardService.updateById(board);
|
dto.setMealTime(LocalDate.now());
|
dto.setOrderNum(OrderNumConstants.MEAL + CodeGenerateUtils.generateVolumeSn());
|
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,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()));
|
return profitDetailsVO;
|
}
|
|
@Override
|
public List<GoodsProfitVO> profitDetailsExport(ProfitDetailsQuery query) {
|
return this.baseMapper.profitDetailsExport(query);
|
}
|
|
}
|