|
@@ -0,0 +1,134 @@
|
|
|
+package com.fjhx.admin.service.stock.impl;
|
|
|
+
|
|
|
+import cn.hutool.core.util.ObjectUtil;
|
|
|
+import com.fjhx.admin.entity.stock.dto.StockJournalDetailsDto;
|
|
|
+import com.fjhx.admin.entity.stock.po.Stock;
|
|
|
+import com.fjhx.admin.entity.stock.po.StockJournal;
|
|
|
+import com.fjhx.admin.entity.stock.po.StockJournalDetails;
|
|
|
+import com.fjhx.admin.mapper.stock.StockMapper;
|
|
|
+import com.fjhx.admin.service.stock.StockJournalDetailsService;
|
|
|
+import com.fjhx.admin.service.stock.StockJournalService;
|
|
|
+import com.fjhx.admin.service.stock.StockService;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.obs.services.internal.ServiceException;
|
|
|
+import org.apache.logging.log4j.core.util.Assert;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
+import com.fjhx.admin.entity.stock.vo.StockVo;
|
|
|
+import com.fjhx.admin.entity.stock.dto.StockSelectDto;
|
|
|
+import com.ruoyi.common.utils.wrapper.IWrapper;
|
|
|
+import com.fjhx.admin.entity.stock.dto.StockDto;
|
|
|
+import cn.hutool.core.bean.BeanUtil;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * <p>
|
|
|
+ * 库存 服务实现类
|
|
|
+ * </p>
|
|
|
+ *
|
|
|
+ * @author
|
|
|
+ * @since 2023-03-20
|
|
|
+ */
|
|
|
+@Service
|
|
|
+public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements StockService {
|
|
|
+ @Autowired
|
|
|
+ StockJournalService stockJournalService;
|
|
|
+ @Autowired
|
|
|
+ StockJournalDetailsService stockJournalDetailsService;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Page<StockVo> getPage(StockSelectDto dto) {
|
|
|
+ IWrapper<Stock> wrapper = getWrapper();
|
|
|
+ wrapper.orderByDesc("s", Stock::getId);
|
|
|
+ Page<StockVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
|
|
|
+ return page;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public StockVo detail(Long id) {
|
|
|
+ Stock Stock = this.getById(id);
|
|
|
+ StockVo result = BeanUtil.toBean(Stock, StockVo.class);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void add(StockDto stockDto) {
|
|
|
+ ModifyInventory(1, stockDto);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void edit(StockDto stockDto) {
|
|
|
+ ModifyInventory(2, stockDto);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void delete(Long id) {
|
|
|
+ this.removeById(id);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 操作库存通用方法
|
|
|
+ *
|
|
|
+ * @param type 1为手动入库操作 2为手动出库操作
|
|
|
+ */
|
|
|
+ public void ModifyInventory(int type, StockDto stockDto) {
|
|
|
+ //创建出入库记录
|
|
|
+ StockJournal stockJournal = new StockJournal();
|
|
|
+ stockJournal.setType(type);
|
|
|
+ stockJournal.setWarehouseId(stockDto.getWarehouseId());
|
|
|
+ stockJournalService.save(stockJournal);
|
|
|
+
|
|
|
+ //获取现有库存
|
|
|
+ List<Long> productIds = stockDto.getList().stream().map(Stock::getProductId).collect(Collectors.toList());
|
|
|
+ List<Stock> stockList = list(q->q.in(Stock::getProductId,productIds).eq(Stock::getWarehouseId,stockDto.getWarehouseId()));
|
|
|
+ Map<Long, Stock> stockMap = stockList.stream().collect(Collectors.groupingBy(Stock::getProductId,
|
|
|
+ Collectors.collectingAndThen(Collectors.toList(), value -> value.get(0))));
|
|
|
+
|
|
|
+ List<StockJournalDetails> stockJournalDetailsList = new ArrayList<>();
|
|
|
+ for (Stock stock : stockDto.getList()) {
|
|
|
+ stock.setWarehouseId(stockDto.getWarehouseId());
|
|
|
+
|
|
|
+ //合并库存数量
|
|
|
+ Stock oldStocks = stockMap.get(stock.getProductId());
|
|
|
+ if (ObjectUtil.isNotEmpty(oldStocks)) {
|
|
|
+ BigDecimal quantity = oldStocks.getQuantity();
|
|
|
+ if (type == 1) {
|
|
|
+ //入库库存相加
|
|
|
+ quantity = quantity.add(stock.getQuantity());
|
|
|
+ } else if (type == 2) {
|
|
|
+ //出库库存相减
|
|
|
+ quantity = quantity.subtract(stock.getQuantity());
|
|
|
+ if (quantity.compareTo(BigDecimal.ZERO) < 0) {
|
|
|
+ throw new ServiceException("库存不足无法出库");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ throw new ServiceException("未知库存操作类型");
|
|
|
+ }
|
|
|
+ stock.setId(oldStocks.getId());
|
|
|
+ stock.setQuantity(quantity);
|
|
|
+ } else if (type == 2) {
|
|
|
+ throw new ServiceException("以下商品库存不存在,无法出库:" + stock.getProductId());
|
|
|
+ }
|
|
|
+ //创建出入库明细
|
|
|
+ StockJournalDetails stockJournalDetails = new StockJournalDetailsDto();
|
|
|
+ stockJournalDetails.setStockJournalId(stockJournal.getId());
|
|
|
+ stockJournalDetails.setProductId(stock.getProductId());
|
|
|
+ stockJournalDetails.setQuantity(stock.getQuantity());
|
|
|
+ stockJournalDetailsList.add(stockJournalDetails);
|
|
|
+ }
|
|
|
+ stockJournalDetailsService.saveBatch(stockJournalDetailsList);
|
|
|
+ //操作库存
|
|
|
+ saveOrUpdateBatch(stockDto.getList());
|
|
|
+ }
|
|
|
+
|
|
|
+}
|