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);
}
}