From c92aa3899e11a355cddfcfeaececcc843d7ad1bb Mon Sep 17 00:00:00 2001 From: xuhy <3313886187@qq.com> Date: 星期三, 04 九月 2024 19:14:18 +0800 Subject: [PATCH] 修改 --- ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TDataGeneratorServiceImpl.java | 306 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 299 insertions(+), 7 deletions(-) diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TDataGeneratorServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TDataGeneratorServiceImpl.java index 527d183..b1e5abd 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TDataGeneratorServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TDataGeneratorServiceImpl.java @@ -1,22 +1,28 @@ package com.ruoyi.system.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.core.redis.RedisCache; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.CodeGenerateUtils; import com.ruoyi.system.domain.*; import com.ruoyi.system.dto.OrderMealGeneratorCountDTO; import com.ruoyi.system.dto.OrderMealGeneratorDTO; -import com.ruoyi.system.dto.TOrderMealDTO; +import com.ruoyi.system.dto.OrderSaleGeneratorDTO; import com.ruoyi.system.mapper.TDataGeneratorMapper; +import com.ruoyi.system.query.TDataGeneratorQuery; import com.ruoyi.system.service.*; +import com.ruoyi.system.vo.TDataGeneratorVO; import com.ruoyi.system.vo.TFoundationConfigVO; -import org.apache.poi.ss.formula.functions.T; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.math.RoundingMode; +import java.time.LocalDate; import java.util.*; import java.util.stream.Collectors; @@ -41,9 +47,40 @@ private TOrderMealService orderMealService; @Autowired private TOrderMealGoodsService orderMealGoodsService; + @Autowired + private TOrderSaleService orderSaleService; + @Autowired + private TOrderSaleGoodsService orderSaleGoodsService; + @Autowired + private TOrderStockService orderStockService; + @Autowired + private TOrderStockGoodsService orderStockGoodsService; + @Autowired + private TStockDataSetService stockDataSetService; + @Autowired + private TGoodsTypeService goodsTypeService; + @Autowired + private RedisCache redisCache; @Override - public void dataGenerator(OrderMealGeneratorDTO dto) { + public void mealDataGenerator(OrderMealGeneratorDTO dto) { + // 存储数据生成数据 + TDataGenerator dataGenerator = new TDataGenerator(); + dataGenerator.setUserId(dto.getUserId()); + dataGenerator.setUserName(dto.getNickName()); + dataGenerator.setShopId(dataGenerator.getShopId()); + dataGenerator.setStartTime(dto.getStartTime()); + dataGenerator.setEndTime(dto.getEndTime()); + dataGenerator.setMinMoney(dto.getMinMoney()); + dataGenerator.setMaxMoney(dto.getMaxMoney()); + dataGenerator.setStatus(2); + dataGenerator.setOrderType(1); + dataGenerator.setWeiXinPay(dto.getWeiXinProportion()); + dataGenerator.setAliPay(dto.getAliProportion()); + dataGenerator.setCardPay(dto.getCardProportion()); + dataGenerator.setMoneyPay(dto.getMoneyProportion()); + dataGenerator.setOtherPay(dto.getOtherProportion()); + this.save(dataGenerator); long start = System.currentTimeMillis(); // 查询所有的人数用餐标准 List<TFoundationConfigVO> foundationConfigs = foundationConfigService.getList(); @@ -99,7 +136,7 @@ } } BigDecimal sumMoney = orderMeals.stream().map(TOrderMeal::getPayMoney).reduce(BigDecimal::add).get(); - if(sumMoney.compareTo(dto.getMinTurnover()) >= 0 || sumMoney.compareTo(dto.getMaxTurnover()) <= 0){ + if(sumMoney.compareTo(dto.getMinMoney()) >= 0 || sumMoney.compareTo(dto.getMaxMoney()) <= 0){ int weiXin = getRandomPayType(orderMeals.size(), dto.getWeiXinProportion()); int ali = getRandomPayType(orderMeals.size(), dto.getAliProportion()); int card = getRandomPayType(orderMeals.size(), dto.getCardProportion()); @@ -148,12 +185,28 @@ allOrderMeals.addAll(cardOrderMeals); allOrderMeals.addAll(moneyOrderMeals); allOrderMeals.addAll(otherOrderMeals); + allOrderMeals.forEach(e->{ + e.setIsCover(0); + e.setShopId(dataGenerator.getShopId()); + e.setGeneratorId(dataGenerator.getId()); + }); + + // 判断是否进行了终止操作 + if(redisCache.hasKey(OrderNumConstants.MEAL+"_"+dto.getShopId())){ + redisCache.deleteObject(OrderNumConstants.MEAL+"_"+dto.getShopId()); + return; + } + orderMealService.saveBatch(allOrderMeals); - for (TOrderMeal weiXinOrderMeal : allOrderMeals) { - weiXinOrderMeal.getMealOrderGoods().forEach(e->e.setOrderId(weiXinOrderMeal.getId())); + for (TOrderMeal orderMeal : allOrderMeals) { + orderMeal.getMealOrderGoods().forEach(e->e.setOrderId(orderMeal.getId())); } - orderMealGoodsService.saveBatch(allOrderMeals.stream().map(TOrderMeal::getMealOrderGoods).flatMap(Collection::stream).collect(Collectors.toList())); + List<TGoodsType> list = goodsTypeService.list(); + List<TOrderMealGoods> collect = allOrderMeals.stream().map(TOrderMeal::getMealOrderGoods).flatMap(Collection::stream).collect(Collectors.toList()); + collect.forEach(e->e.setTypeName(list.stream().filter(m->m.getId().equals(e.getTypeId())).findFirst().get().getTypeName())); + orderMealGoodsService.saveBatch(collect); + // 存储 long end = System.currentTimeMillis() - start; System.err.println("相差时间========="+end); }else { @@ -162,6 +215,245 @@ } + @Override + public void saleDataGenerator(OrderSaleGeneratorDTO dto) { + // 查询上一次的数据生成时间 + TDataGenerator lastDataGenerator = this.getOne(new LambdaQueryWrapper<TDataGenerator>().eq(TDataGenerator::getShopId, dto.getShopId()).orderByDesc(TDataGenerator::getCreateTime).last("limit 1")); + if(Objects.nonNull(lastDataGenerator) && lastDataGenerator.getEndTime().isAfter(dto.getStartTime())){ + throw new ServiceException("数据生成时间不能小于上次生成时间"); + } + // 查询上次生成最后一次的时间 后续涛哥不用这个类,可以改成TOrderStock的最后一条数据 + TStockDataSet stockDataSet = stockDataSetService.getOne(new LambdaQueryWrapper<TStockDataSet>() + .eq(TStockDataSet::getShopId, dto.getShopId()) + .orderByDesc(TStockDataSet::getStockDate) + .last("limit 1")); + // 存储数据生成数据 + TDataGenerator dataGenerator = new TDataGenerator(); + dataGenerator.setUserId(dto.getUserId()); + dataGenerator.setUserName(dto.getNickName()); + dataGenerator.setShopId(dataGenerator.getShopId()); + dataGenerator.setStartTime(dto.getStartTime()); + dataGenerator.setEndTime(dto.getEndTime()); + dataGenerator.setStatus(2); + dataGenerator.setOrderType(2); + this.save(dataGenerator); + + // 存储进货数据设置 + List<TStockDataSet> stockDataSets = dto.getStockDataSets(); + stockDataSets.forEach(e->e.setGeneratorId(dataGenerator.getId())); + stockDataSetService.saveBatch(stockDataSets); + + // 添加销售订单数 + List<TOrderSale> orderSales = dto.getOrderSales(); + List<TOrderSaleGoods> orderSaleGoods = orderSales.stream().map(TOrderSale::getOrderSaleGoods).flatMap(Collection::stream).collect(Collectors.toList()); + + // 生成进货数据 + List<TOrderStock> stockList = new ArrayList<>(); + stockDataSets.stream().sorted(Comparator.comparing(TStockDataSet::getStockDate)); + for (int i = 0; i < stockDataSets.size(); i++) { + TStockDataSet start = stockDataSets.get(i); + LocalDate startTime = start.getStockDate(); + if(i==stockDataSets.size()-1){ + // 最后一次 + LocalDate endTime = LocalDate.now(); + List<Long> saleIds = orderSales.stream().filter(e -> e.getOrderTime().compareTo(startTime) >= 0 && e.getOrderTime().compareTo(endTime) <= 0).map(TOrderSale::getId).collect(Collectors.toList()); + List<TOrderSaleGoods> orderSaleGoodsList = orderSaleGoods.stream().filter(e -> saleIds.contains(e.getOrderId())).collect(Collectors.toList()); + // 根据商品新生成一条数据 + TOrderStock orderStock = new TOrderStock(); + orderStock.setStockNum(OrderNumConstants.STOCK + CodeGenerateUtils.generateVolumeSn()); + orderStock.setStockTime(startTime); + orderStock.setIsCover(0); + orderStock.setGeneratorId(dataGenerator.getId()); + orderStock.setShopId(dto.getShopId()); + + Map<String, List<TOrderSaleGoods>> goodsList = orderSaleGoodsList.stream().collect(Collectors.groupingBy(TOrderSaleGoods::getGoodsName)); + List<TOrderStockGoods> orderStockGoods = new ArrayList<>(); + goodsList.forEach((k,v)->{ + TOrderStockGoods tOrderStockGoods = new TOrderStockGoods(); + tOrderStockGoods.setGoodsName(k); + tOrderStockGoods.setGoodsNum(v.get(0).getGoodsNum()); + tOrderStockGoods.setCostPrice(v.get(0).getGoodsCostPrice()); + tOrderStockGoods.setSalePrice(v.get(0).getSalePrice()); + tOrderStockGoods.setGoodsPicture(v.get(0).getGoodsPicture()); + tOrderStockGoods.setStockCount(v.stream().mapToInt(TOrderSaleGoods::getGoodsCount).sum()); + orderStockGoods.add(tOrderStockGoods); + }); + orderStock.setOrderStockGoods(orderStockGoods); + stockList.add(orderStock); + + }else if(i==0 && Objects.nonNull(stockDataSet)){ + // 第一次 第一次的进货时间为上一次的结束时间 开始时间为上一次的开始时间 + LocalDate startTime1 = stockDataSet.getStockDate(); + List<Long> saleIds = orderSales.stream().filter(e -> e.getOrderTime().compareTo(startTime) < 0).map(TOrderSale::getId).collect(Collectors.toList()); + List<TOrderSaleGoods> orderSaleGoodsList = orderSaleGoods.stream().filter(e -> saleIds.contains(e.getOrderId())).collect(Collectors.toList()); + // 查询上一次开始之后的订单数据 + List<TOrderSale> orderSales1 = orderSaleService.list(new LambdaQueryWrapper<TOrderSale>().gt(TOrderSale::getOrderTime, startTime1)); + List<Long> saleIds1 = orderSales1.stream().map(TOrderSale::getId).collect(Collectors.toList()); + // 查询上一次的商品 + List<TOrderSaleGoods> list = orderSaleGoodsService.list(new LambdaQueryWrapper<TOrderSaleGoods>().in(TOrderSaleGoods::getOrderId, saleIds1)); + // 结合上次最后一次的数据 + list.addAll(orderSaleGoodsList); + // 删除上一次的数据生成 新生成一条数据 + TOrderStock orderStock = new TOrderStock(); + orderStock.setStockNum(OrderNumConstants.STOCK + CodeGenerateUtils.generateVolumeSn()); + orderStock.setStockTime(startTime); + orderStock.setIsCover(0); + orderStock.setGeneratorId(dataGenerator.getId()); + orderStock.setShopId(dto.getShopId()); + + Map<String, List<TOrderSaleGoods>> goodsList = list.stream().collect(Collectors.groupingBy(TOrderSaleGoods::getGoodsName)); + List<TOrderStockGoods> orderStockGoods = new ArrayList<>(); + goodsList.forEach((k,v)->{ + TOrderStockGoods tOrderStockGoods = new TOrderStockGoods(); + tOrderStockGoods.setGoodsName(k); + tOrderStockGoods.setGoodsNum(v.get(0).getGoodsNum()); + tOrderStockGoods.setCostPrice(v.get(0).getGoodsCostPrice()); + tOrderStockGoods.setSalePrice(v.get(0).getSalePrice()); + tOrderStockGoods.setGoodsPicture(v.get(0).getGoodsPicture()); + tOrderStockGoods.setStockCount(v.stream().mapToInt(TOrderSaleGoods::getGoodsCount).sum()); + orderStockGoods.add(tOrderStockGoods); + }); + orderStock.setOrderStockGoods(orderStockGoods); + stockList.add(orderStock); + + // 处理第一次到下一次的数据 + TStockDataSet end = stockDataSets.get(i + 1); + LocalDate endTime = end.getStockDate(); + List<Long> saleIds2 = orderSales.stream().filter(e -> e.getOrderTime().compareTo(startTime) >= 0 && e.getOrderTime().compareTo(endTime) < 0).map(TOrderSale::getId).collect(Collectors.toList()); + List<TOrderSaleGoods> orderSaleGoodsList2 = orderSaleGoods.stream().filter(e -> saleIds2.contains(e.getOrderId())).collect(Collectors.toList()); + // 根据商品新生成一条数据 + TOrderStock orderStock1 = new TOrderStock(); + orderStock1.setStockNum(OrderNumConstants.STOCK + CodeGenerateUtils.generateVolumeSn()); + orderStock1.setStockTime(startTime); + orderStock1.setIsCover(0); + orderStock1.setGeneratorId(dataGenerator.getId()); + orderStock1.setShopId(dto.getShopId()); + + Map<String, List<TOrderSaleGoods>> goodsList1 = orderSaleGoodsList2.stream().collect(Collectors.groupingBy(TOrderSaleGoods::getGoodsName)); + List<TOrderStockGoods> orderStockGoods1 = new ArrayList<>(); + goodsList1.forEach((k,v)->{ + TOrderStockGoods tOrderStockGoods = new TOrderStockGoods(); + tOrderStockGoods.setGoodsName(k); + tOrderStockGoods.setGoodsNum(v.get(0).getGoodsNum()); + tOrderStockGoods.setCostPrice(v.get(0).getGoodsCostPrice()); + tOrderStockGoods.setSalePrice(v.get(0).getSalePrice()); + tOrderStockGoods.setGoodsPicture(v.get(0).getGoodsPicture()); + tOrderStockGoods.setStockCount(v.stream().mapToInt(TOrderSaleGoods::getGoodsCount).sum()); + orderStockGoods1.add(tOrderStockGoods); + }); + orderStock1.setOrderStockGoods(orderStockGoods1); + stockList.add(orderStock1); + + }else { + TStockDataSet end = stockDataSets.get(i + 1); + LocalDate endTime = end.getStockDate(); + List<Long> saleIds = orderSales.stream().filter(e -> e.getOrderTime().compareTo(startTime) >= 0 && e.getOrderTime().compareTo(endTime) < 0).map(TOrderSale::getId).collect(Collectors.toList()); + List<TOrderSaleGoods> orderSaleGoodsList = orderSaleGoods.stream().filter(e -> saleIds.contains(e.getOrderId())).collect(Collectors.toList()); + // 根据商品新生成一条数据 + TOrderStock orderStock = new TOrderStock(); + orderStock.setStockNum(OrderNumConstants.STOCK + CodeGenerateUtils.generateVolumeSn()); + orderStock.setStockTime(startTime); + orderStock.setIsCover(0); + orderStock.setGeneratorId(dataGenerator.getId()); + orderStock.setShopId(dto.getShopId()); + + Map<String, List<TOrderSaleGoods>> goodsList = orderSaleGoodsList.stream().collect(Collectors.groupingBy(TOrderSaleGoods::getGoodsName)); + List<TOrderStockGoods> orderStockGoods = new ArrayList<>(); + goodsList.forEach((k,v)->{ + TOrderStockGoods tOrderStockGoods = new TOrderStockGoods(); + tOrderStockGoods.setGoodsName(k); + tOrderStockGoods.setGoodsNum(v.get(0).getGoodsNum()); + tOrderStockGoods.setCostPrice(v.get(0).getGoodsCostPrice()); + tOrderStockGoods.setSalePrice(v.get(0).getSalePrice()); + tOrderStockGoods.setGoodsPicture(v.get(0).getGoodsPicture()); + tOrderStockGoods.setStockCount(v.stream().mapToInt(TOrderSaleGoods::getGoodsCount).sum()); + orderStockGoods.add(tOrderStockGoods); + }); + orderStock.setOrderStockGoods(orderStockGoods); + stockList.add(orderStock); + } + } + // 判断是否进行了终止操作 + if(redisCache.hasKey(OrderNumConstants.STOCK+"_"+dto.getShopId())){ + redisCache.deleteObject(OrderNumConstants.STOCK+"_"+dto.getShopId()); + return; + } + // 删除上一次的数据生成 + TOrderStock orderStock = orderStockService.getOne(Wrappers.lambdaQuery(TOrderStock.class) + .eq(TOrderStock::getShopId, dto.getShopId()) + .orderByDesc(TOrderStock::getStockTime) + .last("LIMIT 1")); + if(Objects.nonNull(orderStock)){ + orderStockService.removeById(orderStock); + } + orderSaleService.saveBatch(orderSales); + for (TOrderSale orderSale : orderSales) { + orderSale.getOrderSaleGoods().forEach(e->e.setOrderId(orderSale.getId())); + } + List<TGoodsType> list = goodsTypeService.list(); + orderSaleGoods.forEach(e->e.setTypeName(list.stream().filter(m->m.getId().equals(e.getTypeId())).findFirst().get().getTypeName())); + orderSaleGoodsService.saveBatch(orderSaleGoods); + // 添加数据 + stockList.forEach(e->e.setShopId(dataGenerator.getShopId())); + orderStockService.saveBatch(stockList); + for (TOrderStock stock : stockList) { + stock.getOrderStockGoods().forEach(e->e.setOrderId(stock.getId())); + } + List<TOrderStockGoods> orderStockGoods = stockList.stream().map(TOrderStock::getOrderStockGoods).flatMap(Collection::stream).collect(Collectors.toList()); + orderStockGoodsService.saveBatch(orderStockGoods); + } + + @Override + public PageInfo<TDataGeneratorVO> pageList(TDataGeneratorQuery query) { + PageInfo<TDataGeneratorVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize()); + List<TDataGeneratorVO> list = this.baseMapper.pageList(query,pageInfo); + List<Long> ids = list.stream().map(TDataGeneratorVO::getId).collect(Collectors.toList()); + if(query.getOrderType() == 1){ + List<TOrderMeal> orderMeals = orderMealService.list(Wrappers.lambdaQuery(TOrderMeal.class) + .in(TOrderMeal::getGeneratorId, ids)); + List<Long> mealIds = orderMeals.stream().map(TOrderMeal::getId).collect(Collectors.toList()); + 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); + } + }else { + List<TOrderStock> orderStocks = orderStockService.list(Wrappers.lambdaQuery(TOrderStock.class) + .in(TOrderStock::getGeneratorId, ids)); + List<Long> stockIds = orderStocks.stream().map(TOrderStock::getId).collect(Collectors.toList()); + List<TOrderStockGoods> stockGoods = orderStockGoodsService.list(Wrappers.lambdaQuery(TOrderStockGoods.class) + .in(TOrderStockGoods::getOrderId, stockIds)); + for (TDataGeneratorVO tDataGeneratorVO : list) { + List<Long> collect = orderStocks.stream().filter(e -> e.getGeneratorId().equals(tDataGeneratorVO.getId())).map(TOrderStock::getId).collect(Collectors.toList()); + BigDecimal money = stockGoods.stream().filter(e -> collect.contains(e.getOrderId())) + .reduce(BigDecimal.ZERO, (x, y) -> x.add(y.getStockPrice().multiply(new BigDecimal(y.getStockCount()))), BigDecimal::add); + tDataGeneratorVO.setTotalRevenue(money); + } + } + pageInfo.setRecords(list); + return pageInfo; + } + + @Override + public void dataCoverage(Long id) { + TDataGenerator dataGenerator = this.getOne(Wrappers.lambdaQuery(TDataGenerator.class) + .eq(TDataGenerator::getId, id)); + if(dataGenerator.getOrderType() == 1){ + // 删除时间段的数据 + orderMealService.remove(Wrappers.lambdaQuery(TOrderMeal.class) + .gt(TOrderMeal::getCreateTime, dataGenerator.getStartTime()) + .lt(TOrderMeal::getCreateTime, dataGenerator.getEndTime())); + // 修改覆盖类型为已覆盖 + orderMealService.update(Wrappers.lambdaUpdate(TOrderMeal.class).set(TOrderMeal::getIsCover, 1).eq(TOrderMeal::getGeneratorId, id)); + }else { + // 修改覆盖类型为已覆盖 + orderStockService.update(Wrappers.lambdaUpdate(TOrderStock.class).set(TOrderStock::getIsCover, 1).eq(TOrderStock::getGeneratorId, id)); + } + } + private int getRandomPayType(Integer size,BigDecimal count) { BigDecimal bigDecimal = new BigDecimal(size).multiply(count.divide(new BigDecimal(100))).setScale(0, RoundingMode.HALF_UP); return Integer.parseInt(bigDecimal.toString()); -- Gitblit v1.7.1