From 508f3e225df87e0da974424981e7782fc5ce875c Mon Sep 17 00:00:00 2001 From: xuhy <3313886187@qq.com> Date: 星期一, 19 五月 2025 14:21:39 +0800 Subject: [PATCH] 修改 --- ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TOrderSaleServiceImpl.java | 470 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 460 insertions(+), 10 deletions(-) diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TOrderSaleServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TOrderSaleServiceImpl.java index 27ea1da..8c0cfa0 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TOrderSaleServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TOrderSaleServiceImpl.java @@ -1,18 +1,32 @@ package com.ruoyi.system.service.impl; +import cn.afterturn.easypoi.excel.annotation.Excel; +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.utils.CodeGenerateUtils; -import com.ruoyi.system.domain.TOrderSale; -import com.ruoyi.system.domain.TOrderSaleGoods; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.system.domain.*; +import com.ruoyi.system.dto.CheckoutDTO; import com.ruoyi.system.dto.TOrderSaleDTO; +import com.ruoyi.system.export.SumGeneratorClient; +import com.ruoyi.system.export.SumGeneratorDetailClient; +import com.ruoyi.system.mapper.TOrderSaleGoodsMapper; import com.ruoyi.system.mapper.TOrderSaleMapper; -import com.ruoyi.system.service.TOrderSaleGoodsService; -import com.ruoyi.system.service.TOrderSaleService; +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.util.List; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; /** * <p> @@ -27,18 +41,454 @@ @Autowired private TOrderSaleGoodsService orderSaleGoodsService; - + @Autowired + private TOrderStockGoodsService orderStockGoodsService; + @Autowired + private TOrderSaleGoodsMapper orderSaleGoodsMapper; + @Autowired + private TGoodsService goodsService; @Override public void add(TOrderSaleDTO dto) { + // 查询菜品分类 +// List<TGoodsType> list1 = goodsTypeService.list(); // 销售单号 - dto.setOrderNum("XS" + CodeGenerateUtils.generateOrderSn()); + dto.setOrderNum(OrderNumConstants.SALE + CodeGenerateUtils.generateVolumeSn()); + List<TOrderSaleGoods> orderSaleGoods = dto.getOrderSaleGoods(); + BigDecimal sum = BigDecimal.ZERO; + for (TOrderSaleGoods orderSaleGood : orderSaleGoods) { + sum = sum.add(orderSaleGood.getThisSalePrice().multiply(new BigDecimal(orderSaleGood.getGoodsCount()))); + } + dto.setOrderMoney(sum); + this.save(dto); + + List<TGoods> goods = goodsService.list(Wrappers.lambdaQuery(TGoods.class).eq(TGoods::getShopId,dto.getShopId())); + List<TGoods> goodsList = new ArrayList<>(); + for (TOrderSaleGoods orderSaleGood : orderSaleGoods) { + goods.forEach(good -> { + if(orderSaleGood.getGoodsNum().equals(good.getGoodsNum())){ + good.setInventory(good.getInventory()-orderSaleGood.getGoodsCount()); + goodsList.add(good); + } + }); + } + goodsService.updateBatchById(goodsList); + + // 查询进货数据 + List<TOrderStockGoods> orderStockGoodsList = orderStockGoodsService.getListByTimeAndShopId(DateUtils.localDateToString(dto.getOrderTime()), dto.getShopId()); + + // 添加商品 + orderSaleGoods.forEach(orderSaleGoods1 -> { + orderSaleGoods1.setOrderId(dto.getId()); + orderSaleGoods1.setId(null); + TOrderStockGoods orderStockGoods = orderStockGoodsList.stream().filter(m -> m.getGoodsNum().equals(orderSaleGoods1.getGoodsNum())).findFirst().orElse(null); + if(Objects.nonNull(orderStockGoods)){ + orderSaleGoods1.setGoodsCostPrice(orderStockGoods.getThisCostPrice()); + }else { + orderSaleGoods1.setGoodsCostPrice(BigDecimal.ZERO); + } + }); + orderSaleGoodsService.saveBatch(orderSaleGoods); + } + + @Override + public PageInfo<TOrderSaleVO> pageList(TOrderSaleQuery query) { + if(StringUtils.isEmpty(query.getStartTime()) && StringUtils.isEmpty(query.getEndTime())){ + 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<TOrderSaleVO> pageInfo = new PageInfo<>(query.getPageNum(),query.getPageSize()); + List<TOrderSaleVO> list = this.baseMapper.pageList(query,pageInfo); + List<Long> ids = list.stream().map(TOrderSaleVO::getId).collect(Collectors.toList()); + if(!CollectionUtils.isEmpty(ids)){ + List<TOrderSaleGoods> list1 = orderSaleGoodsService.list(Wrappers.lambdaQuery(TOrderSaleGoods.class) + .in(TOrderSaleGoods::getOrderId, ids)); + list.forEach(e->{ + List<TOrderSaleGoods> collect = list1.stream().filter(m -> m.getOrderId().equals(e.getId())).collect(Collectors.toList()); + if(!CollectionUtils.isEmpty(collect)){ + BigDecimal goodsAmount = BigDecimal.ZERO; + Integer count = 0; + for (TOrderSaleGoods tOrderSaleGoods : collect) { + goodsAmount = goodsAmount.add(tOrderSaleGoods.getThisSalePrice().multiply(new BigDecimal(tOrderSaleGoods.getGoodsCount()))); + count = count+tOrderSaleGoods.getGoodsCount(); + } + e.setGoodsAmount(goodsAmount); + e.setGoodsCount(count); + e.setOrderSaleGoods(collect); + } + }); + } + pageInfo.setRecords(list); + return pageInfo; + } + + @Override + public AmountSumVO amountSum(TOrderSaleQuery query) { + if(StringUtils.isEmpty(query.getStartTime()) && StringUtils.isEmpty(query.getEndTime())){ + 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)); + } + } + AmountSumVO amountSumVO = this.baseMapper.amountSum(query); + if(amountSumVO.getObligation().compareTo(BigDecimal.ZERO) < 0){ + amountSumVO.setObligation(BigDecimal.ZERO); + } + return amountSumVO; + } + + @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<TOrderSale> list = this.list(Wrappers.lambdaQuery(TOrderSale.class) + .eq(TOrderSale::getShopId, query.getShopId()) + .ge(TOrderSale::getOrderTime, query.getStartTime()) + .le(TOrderSale::getOrderTime, query.getEndTime()) + .eq(TOrderSale::getStatus,2)); + List<Long> ids = list.stream().map(TOrderSale::getId).collect(Collectors.toList()); + if(!CollectionUtils.isEmpty(ids)){ + BigDecimal costTotal = orderSaleGoodsService.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<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()); + if(CollectionUtils.isEmpty(ids)){ + return new PageInfo<>(); + } + List<SalesRankingVO> salesRankingVOS = orderSaleGoodsMapper.salesRanking(ids,pageInfo); + pageInfo.setRecords(salesRankingVOS); + return pageInfo; + } + + @Override + public List<TOrderSaleVO> exportOrderSale(TOrderMealQuery query) { + if(StringUtils.isEmpty(query.getStartTime()) && StringUtils.isEmpty(query.getEndTime())){ + 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<TOrderSaleVO> list = this.baseMapper.exportOrderSale(query); + List<Long> ids = list.stream().map(TOrderSaleVO::getId).collect(Collectors.toList()); + if(!CollectionUtils.isEmpty(ids)){ + List<TOrderSaleGoods> list1 = orderSaleGoodsService.list(Wrappers.lambdaQuery(TOrderSaleGoods.class) + .in(TOrderSaleGoods::getOrderId, ids)); + list.forEach(e->{ + List<TOrderSaleGoods> collect = list1.stream().filter(m -> m.getOrderId().equals(e.getId())).collect(Collectors.toList()); + if(!CollectionUtils.isEmpty(collect)){ + BigDecimal goodsAmount = BigDecimal.ZERO; + Integer count = 0; + for (TOrderSaleGoods tOrderSaleGoods : collect) { + goodsAmount = goodsAmount.add(tOrderSaleGoods.getThisSalePrice().multiply(new BigDecimal(tOrderSaleGoods.getGoodsCount()))); + count = count+tOrderSaleGoods.getGoodsCount(); + } + e.setGoodsAmount(goodsAmount); + e.setGoodsCount(count); + e.setOrderSaleGoods(collect); + } + }); + } + return list; + } + + @Override + public List<OrderTrendsVO> orderingTrends(TDataStatisticsQuery query) { + List<OrderTrendsVO> orderTrendsVOS = this.baseMapper.orderingTrends(query); + LocalDate localDate = DateUtils.stringToLocalDateTime(query.getEndTime()).toLocalDate(); + for (int i = 0; i < 7; i++) { + if(i == 0){ + LocalDate finalLocalDate = localDate; + OrderTrendsVO orderTrendsVO = orderTrendsVOS.stream().filter(e -> finalLocalDate.compareTo(DateUtils.stringToLocalDate(e.getDayTime())) == 0).findFirst().orElse(null); + if(Objects.isNull(orderTrendsVO)){ + orderTrendsVO = new OrderTrendsVO(); + orderTrendsVO.setDayTime(DateUtils.localDateToString(localDate)); + orderTrendsVO.setOrderCount(0); + orderTrendsVOS.add(orderTrendsVO); + } + }else { + localDate = localDate.minusDays(1); + LocalDate finalLocalDate1 = localDate; + OrderTrendsVO orderTrendsVO = orderTrendsVOS.stream().filter(e -> finalLocalDate1.compareTo(DateUtils.stringToLocalDate(e.getDayTime())) == 0).findFirst().orElse(null); + if(Objects.isNull(orderTrendsVO)){ + orderTrendsVO = new OrderTrendsVO(); + orderTrendsVO.setDayTime(DateUtils.localDateToString(finalLocalDate1)); + orderTrendsVO.setOrderCount(0); + orderTrendsVOS.add(orderTrendsVO); + } + } + } + return orderTrendsVOS.stream().sorted(Comparator.comparing(OrderTrendsVO::getDayTime)).collect(Collectors.toList()); + } + + @Override + public Map<String, Double> getDataGeneratorSaleDetail(TDataGeneratorSaleQuery query) { + if(StringUtils.isEmpty(query.getStartTime()) && StringUtils.isEmpty(query.getEndTime())){ + if(Objects.nonNull(query.getTimeType())){ + LocalDateTime startTime = null; + LocalDateTime endTime = null; + switch (query.getTimeType()){ + case 1: + // 今日 + startTime = DateUtils.getDayStart(LocalDateTime.now()); + endTime = DateUtils.getDayEnd(LocalDateTime.now()); + break; + case 2: + // 昨日 + startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(1)); + endTime = DateUtils.getDayEnd(LocalDateTime.now().minusDays(1)); + break; + case 3: + // 近7天 + startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(7)); + endTime = DateUtils.getDayEnd(LocalDateTime.now()); + break; + case 4: + // 近30天 + startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(30)); + endTime = DateUtils.getDayEnd(LocalDateTime.now()); + break; + } + query.setStartTime(DateUtils.localDateTimeToDate(startTime)); + query.setEndTime(DateUtils.localDateTimeToDate(endTime)); + } + } + return this.baseMapper.getDataGeneratorSaleDetail(query); + } + + @Override + public List<TOrderSaleVO> saleGeneratorExport(TDataGeneratorSaleQuery 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<TOrderSaleVO> list = this.baseMapper.saleGeneratorExport(query); + List<Long> ids = list.stream().map(TOrderSaleVO::getId).collect(Collectors.toList()); + List<TOrderSaleGoods> list1 = orderSaleGoodsService.list(Wrappers.lambdaQuery(TOrderSaleGoods.class) + .in(TOrderSaleGoods::getOrderId,ids)); + // 查询商品信息 + for (TOrderSaleVO orderSaleVO : list) { + List<TOrderSaleGoods> collect = list1.stream().filter(e -> e.getOrderId().equals(orderSaleVO.getId())).collect(Collectors.toList()); + orderSaleVO.setOrderSaleGoods(collect); + } + return list; + } + + @Override + public void checkout(CheckoutDTO dto) { + TOrderSale orderSale = this.getById(dto.getOrderId()); + orderSale.setPayType(dto.getPayType()); + orderSale.setPayMoney(dto.getPayMoney()); + orderSale.setStatus(2); + this.updateById(orderSale); + } + + @Override + public void edit(TOrderSaleDTO dto) { + // 销售单号 List<TOrderSaleGoods> orderSaleGoods = dto.getOrderSaleGoods(); BigDecimal sum = orderSaleGoods.stream().map(TOrderSaleGoods::getGoodsSalePrice).reduce(BigDecimal::add).get(); dto.setOrderMoney(sum); - dto.setPayMoney(sum); - this.save(dto); + this.updateById(dto); + // 删除商品 + orderSaleGoodsService.remove(Wrappers.lambdaQuery(TOrderSaleGoods.class) + .eq(TOrderSaleGoods::getOrderId,dto.getId())); // 添加商品 - orderSaleGoods.forEach(orderSaleGoods1 -> orderSaleGoods1.setOrderId(dto.getId())); + orderSaleGoods.forEach(orderSaleGoods1 -> { + orderSaleGoods1.setOrderId(dto.getId()); + orderSaleGoods1.setId(null); + }); orderSaleGoodsService.saveBatch(orderSaleGoods); } + + @Override + public List<TDataGeneratorVO> saleGeneratorListExport(TDataGeneratorQuery query) { + List<TDataGeneratorVO> list = this.baseMapper.saleGeneratorListExport(query); + List<Long> ids = list.stream().map(TDataGeneratorVO::getId).collect(Collectors.toList()); + if(CollectionUtils.isEmpty(ids)){ + return new ArrayList<>(); + } + List<TOrderSale> orderSales = this.list(Wrappers.lambdaQuery(TOrderSale.class) + .in(TOrderSale::getGeneratorId, ids)); + for (TDataGeneratorVO tDataGeneratorVO : list) { + List<TOrderSale> collect = orderSales.stream().filter(e -> e.getGeneratorId().equals(tDataGeneratorVO.getId())).collect(Collectors.toList()); + BigDecimal money = BigDecimal.ZERO; + if(!CollectionUtils.isEmpty(collect)){ + money = collect.stream().map(TOrderSale::getPayMoney).reduce(BigDecimal::add).get(); + } + 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); + } + + @Override + public void deleteByShopId(Long shopId) { + this.baseMapper.deleteByShopId(shopId); + } + + @Override + public Map<String, Double> getDataGeneratorSaleDetailOrderMoney(TDataGeneratorSaleQuery query) { + if(StringUtils.isEmpty(query.getStartTime()) && StringUtils.isEmpty(query.getEndTime())){ + if(Objects.nonNull(query.getTimeType())){ + LocalDateTime startTime = null; + LocalDateTime endTime = null; + switch (query.getTimeType()){ + case 1: + // 今日 + startTime = DateUtils.getDayStart(LocalDateTime.now()); + endTime = DateUtils.getDayEnd(LocalDateTime.now()); + break; + case 2: + // 昨日 + startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(1)); + endTime = DateUtils.getDayEnd(LocalDateTime.now().minusDays(1)); + break; + case 3: + // 近7天 + startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(7)); + endTime = DateUtils.getDayEnd(LocalDateTime.now()); + break; + case 4: + // 近30天 + startTime = DateUtils.getDayStart(LocalDateTime.now().minusDays(30)); + endTime = DateUtils.getDayEnd(LocalDateTime.now()); + break; + } + query.setStartTime(DateUtils.localDateTimeToDate(startTime)); + query.setEndTime(DateUtils.localDateTimeToDate(endTime)); + } + } + return this.baseMapper.getDataGeneratorSaleDetailOrderMoney(query); + } + } -- Gitblit v1.7.1