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.utils.CodeGenerateUtils; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.domain.*; import com.ruoyi.system.dto.TOrderSaleDTO; import com.ruoyi.system.dto.TOrderStockDTO; import com.ruoyi.system.mapper.*; import com.ruoyi.system.query.TDataGeneratorQuery; import com.ruoyi.system.query.TDataGeneratorStockQuery; import com.ruoyi.system.query.TOrderStockQuery; import com.ruoyi.system.service.*; import com.ruoyi.system.vo.TDataGeneratorVO; import com.ruoyi.system.vo.TOrderStockVO; 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; /** *

* 进货单 服务实现类 *

* * @author xiaochen * @since 2024-08-14 */ @Service public class TOrderStockServiceImpl extends ServiceImpl implements TOrderStockService { @Autowired private TOrderStockGoodsService tOrderStockGoodsService; @Autowired private TOrderSaleMapper orderSaleMapper; @Autowired private TOrderSaleGoodsService orderSaleGoodsService; @Autowired private TStockDataSetService stockDataSetService; @Autowired private TDataGeneratorMapper dataGeneratorMapper; @Autowired private TGoodsService goodsService; @Override public void add(TOrderStockDTO dto) { // 进货单号 dto.setStockNum(OrderNumConstants.STOCK + CodeGenerateUtils.generateVolumeSn()); List orderStockGoods = dto.getOrderStockGoods(); // BigDecimal sum = orderStockGoods.stream().map(TOrderStockGoods::getStockPrice).reduce(BigDecimal::add).get(); // dto.setStockTotalPrice(sum); if(dto.getIsGenerator().equals(2)){ dto.setIsCover(0); } this.save(dto); List goods = goodsService.list(Wrappers.lambdaQuery(TGoods.class).eq(TGoods::getShopId,dto.getShopId())); List goodsUpdateList = new ArrayList<>(); // 添加商品 orderStockGoods.forEach(orderSaleGoods1 -> { orderSaleGoods1.setId(null); orderSaleGoods1.setOrderId(dto.getId()); for (TGoods good : goods) { if(good.getGoodsNum().equals(orderSaleGoods1.getGoodsNum())){ good.setInventory(orderSaleGoods1.getStockCount()+good.getInventory()); goodsUpdateList.add(good); } } }); goodsService.updateBatchById(goodsUpdateList); tOrderStockGoodsService.saveBatch(orderStockGoods); } @Override public void edit(TOrderStockDTO dto) { List orderStockGoods = dto.getOrderStockGoods(); // BigDecimal sum = orderStockGoods.stream().map(TOrderStockGoods::getStockPrice).reduce(BigDecimal::add).get(); // dto.setStockTotalPrice(sum); this.updateById(dto); // 刪除原有商品 tOrderStockGoodsService.remove(Wrappers.lambdaQuery(TOrderStockGoods.class) .eq(TOrderStockGoods::getOrderId,dto.getId())); // 添加商品 orderStockGoods.forEach(orderSaleGoods1 -> { orderSaleGoods1.setId(null); orderSaleGoods1.setOrderId(dto.getId()); }); tOrderStockGoodsService.saveBatch(orderStockGoods); } @Override public PageInfo pageList(TOrderStockQuery 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 pageInfo = new PageInfo<>(query.getPageNum(),query.getPageSize()); List list = this.baseMapper.pageList(query,pageInfo); // 查询商品 List orderIds = list.stream().map(TOrderStockVO::getId).collect(Collectors.toList()); if(!CollectionUtils.isEmpty(orderIds)){ List orderStockGoods = tOrderStockGoodsService.list(Wrappers.lambdaQuery(TOrderStockGoods.class) .in(TOrderStockGoods::getOrderId, orderIds)); list.forEach(orderStockVO -> { List collect = orderStockGoods.stream().filter(orderSaleGoods -> orderSaleGoods.getOrderId().equals(orderStockVO.getId())).collect(Collectors.toList()); if(!CollectionUtils.isEmpty(collect)){ orderStockVO.setOrderStockGoods(collect); int sum = collect.stream().mapToInt(TOrderStockGoods::getStockCount).sum(); orderStockVO.setOrderStockCount(sum); BigDecimal money = BigDecimal.ZERO; for (TOrderStockGoods tOrderStockGoods : collect) { money = money.add(tOrderStockGoods.getThisCostPrice().multiply(new BigDecimal(tOrderStockGoods.getStockCount()))); } orderStockVO.setTotalPrice(money); } }); } pageInfo.setRecords(list); return pageInfo; } @Override public Map getDataGeneratorStockDetail(TDataGeneratorStockQuery 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.getDataGeneratorStockDetail(query); } @Override public List stockGeneratorExport(TDataGeneratorStockQuery 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 list = this.baseMapper.stockGeneratorExport(query); // 查询商品 List orderIds = list.stream().map(TOrderStockVO::getId).collect(Collectors.toList()); List orderStockGoods = tOrderStockGoodsService.list(Wrappers.lambdaQuery(TOrderStockGoods.class) .in(TOrderStockGoods::getOrderId, orderIds)); list.forEach(orderSale -> { List collect = orderStockGoods.stream().filter(orderSaleGoods -> orderSaleGoods.getOrderId().equals(orderSale.getId())).collect(Collectors.toList()); orderSale.setOrderStockGoods(collect); }); return list; } @Override public void editGenerator(TOrderStockDTO dto) { TDataGenerator dataGenerator = dataGeneratorMapper.selectById(dto.getGeneratorId()); // 查询生成数据的配置 List list = stockDataSetService.list(Wrappers.lambdaQuery(TStockDataSet.class) .eq(TStockDataSet::getGeneratorId, dto.getGeneratorId())); list = list.stream().sorted(Comparator.comparing(TStockDataSet::getStockDate)).collect(Collectors.toList()); String startTime = null; String endTime = null; Iterator iterator = list.iterator(); while (iterator.hasNext()){ TStockDataSet next = iterator.next(); if(next.getStockDate().compareTo(dto.getStockTime()) == 0){ startTime = DateUtils.localDateToString(next.getStockDate()); } if(Objects.nonNull(startTime)){ endTime = DateUtils.localDateToString(next.getStockDate()); } if(Objects.nonNull(endTime)){ break; } } if(Objects.isNull(endTime)){ endTime = DateUtils.localDateToString(dataGenerator.getEndTime()); } // 查询该数据生成的销售单的数据 List orderSales = orderSaleMapper.selectList(Wrappers.lambdaQuery(TOrderSale.class) .eq(TOrderSale::getGeneratorId, dto.getGeneratorId()) .between(TOrderSale::getOrderTime, startTime + " 00:00:00", endTime + " 23:59:59")); List saleOrderIds = orderSales.stream().map(TOrderSale::getId).collect(Collectors.toList()); List orderStockGoods = dto.getOrderStockGoods(); if(!CollectionUtils.isEmpty(saleOrderIds)){ List orderSaleGoods = orderSaleGoodsService.list(Wrappers.lambdaQuery(TOrderSaleGoods.class) .in(TOrderSaleGoods::getOrderId, saleOrderIds)); for (TOrderStockGoods orderStockGood : orderStockGoods) { orderSaleGoods.stream().filter(e->e.getGoodsName().equals(orderStockGood.getGoodsName())).forEach(e->e.setGoodsCostPrice(orderStockGood.getThisCostPrice())); } orderSaleGoodsService.updateBatchById(orderSaleGoods); } this.updateById(dto); // 刪除原有商品 tOrderStockGoodsService.remove(Wrappers.lambdaQuery(TOrderStockGoods.class) .eq(TOrderStockGoods::getOrderId,dto.getId())); // 添加商品 orderStockGoods.forEach(orderSaleGoods1 -> { orderSaleGoods1.setId(null); orderSaleGoods1.setOrderId(dto.getId()); }); tOrderStockGoodsService.saveBatch(orderStockGoods); } @Override public void deleteByShopId(Long shopId) { this.baseMapper.deleteByShopId(shopId); } }