|
|
@@ -0,0 +1,259 @@
|
|
|
+package com.cyksj.service.mange.stock.impl;
|
|
|
+
|
|
|
+import cn.hutool.core.bean.BeanUtil;
|
|
|
+import cn.hutool.core.math.MathUtil;
|
|
|
+import cn.hutool.core.util.NumberUtil;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
+import com.cyksj.common.exception.BusinessRuntimeException;
|
|
|
+import com.cyksj.mapper.stock.GoodsDonStockMapper;
|
|
|
+import com.cyksj.mapper.stock.GoodsDonStockRecordMapper;
|
|
|
+import com.cyksj.mapper.stock.GoodsSkuStockRelateMapper;
|
|
|
+import com.cyksj.mapper.stock.OrderDonStockMapper;
|
|
|
+import com.cyksj.model.entity.GoodsDonStock;
|
|
|
+import com.cyksj.model.entity.GoodsDonStockRecord;
|
|
|
+import com.cyksj.model.entity.GoodsSkuStockRelate;
|
|
|
+import com.cyksj.model.entity.OrderDonStock;
|
|
|
+import com.cyksj.model.request.StockUpReq;
|
|
|
+import com.cyksj.service.mange.stock.GoodsDonStockService;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author chan
|
|
|
+ * @date 2022/12/7 5:55 PM
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+@RequiredArgsConstructor
|
|
|
+public class GoodsDonStockServiceImpl implements GoodsDonStockService {
|
|
|
+
|
|
|
+ private final GoodsDonStockMapper stockMapper;
|
|
|
+
|
|
|
+ private final GoodsDonStockRecordMapper stockRecordMapper;
|
|
|
+
|
|
|
+ private final OrderDonStockMapper orderDonStockMapper;
|
|
|
+
|
|
|
+ private final GoodsSkuStockRelateMapper skuStockRelateMapper;
|
|
|
+
|
|
|
+ @Transactional(rollbackFor = Throwable.class)
|
|
|
+ @Override
|
|
|
+ public void upStockRelate(Long stockId, Long orderId, String status) {
|
|
|
+ if ("refund".equals(status)) {
|
|
|
+ List<OrderDonStock> orderDonStocks = orderDonStockMapper.selectList(Wrappers.lambdaQuery(OrderDonStock.class).eq(OrderDonStock::getOrderId, orderId));
|
|
|
+
|
|
|
+ //退款
|
|
|
+ orderDonStocks.forEach((orderDonStock)->{
|
|
|
+ orderDonStock.setStatus("refund");
|
|
|
+ orderDonStockMapper.updateById(orderDonStock);
|
|
|
+ GoodsDonStockRecord putRecord = stockRecordMapper.selectById(orderDonStock.getRecordId());
|
|
|
+
|
|
|
+ GoodsDonStock stock = stockMapper.selectById(putRecord.getStockId());
|
|
|
+ //新增库存记录
|
|
|
+ GoodsDonStockRecord record = new GoodsDonStockRecord();
|
|
|
+ record.setNum(1);
|
|
|
+ record.setStockId(putRecord.getStockId());
|
|
|
+ record.setThenTotal(stock.getTotal());
|
|
|
+ record.setType("refund");
|
|
|
+ record.setPrice(putRecord.getPrice());
|
|
|
+ stockRecordMapper.insert(record);
|
|
|
+
|
|
|
+ //修改批次可用库存数
|
|
|
+ putRecord.setAvailable(putRecord.getAvailable() + 1);
|
|
|
+ stockRecordMapper.updateById(putRecord);
|
|
|
+ //修改库存商品可用数
|
|
|
+ stock.setTotal(stock.getTotal() + 1);
|
|
|
+ stock.setStock(stock.getStock() + 1);
|
|
|
+ stock.setUpgrade(stock.getUpgrade() + 1);
|
|
|
+ stockMapper.updateById(stock);
|
|
|
+ });
|
|
|
+ //1.修改退款状态
|
|
|
+ //2.退回库存
|
|
|
+
|
|
|
+ }else {
|
|
|
+ //发货
|
|
|
+ GoodsDonStockRecord putRecord = stockRecordMapper.selectOne(Wrappers.lambdaQuery(GoodsDonStockRecord.class)
|
|
|
+ .eq(GoodsDonStockRecord::getStockId, stockId)
|
|
|
+ .eq(GoodsDonStockRecord::getType, "put")
|
|
|
+ .gt(GoodsDonStockRecord::getAvailable, 0)
|
|
|
+ .orderByAsc(GoodsDonStockRecord::getCreatedTime)
|
|
|
+ .last(" limit 1")
|
|
|
+ );
|
|
|
+ if (putRecord == null) {
|
|
|
+ throw BusinessRuntimeException.getInstance("该库存商品不足.");
|
|
|
+ }
|
|
|
+
|
|
|
+ //储存发货库存信息
|
|
|
+ OrderDonStock orderDonStock = new OrderDonStock();
|
|
|
+ orderDonStock.setOrderId(orderId);
|
|
|
+ orderDonStock.setRecordId(putRecord.getId());
|
|
|
+ orderDonStock.setStatus(status);
|
|
|
+ orderDonStockMapper.insert(orderDonStock);
|
|
|
+
|
|
|
+ GoodsDonStock stock = stockMapper.selectById(putRecord.getStockId());
|
|
|
+ //新增库存记录
|
|
|
+ GoodsDonStockRecord record = new GoodsDonStockRecord();
|
|
|
+ record.setNum(-1);
|
|
|
+ record.setStockId(stockId);
|
|
|
+ record.setThenTotal(stock.getTotal());
|
|
|
+ record.setType("transport");
|
|
|
+ record.setPrice(putRecord.getPrice());
|
|
|
+ stockRecordMapper.insert(record);
|
|
|
+
|
|
|
+ //修改批次可用库存数
|
|
|
+ putRecord.setAvailable(putRecord.getAvailable() - 1);
|
|
|
+ stockRecordMapper.updateById(putRecord);
|
|
|
+ //修改库存商品可用数
|
|
|
+ stock.setTotal(stock.getTotal() - 1);
|
|
|
+ stock.setStock(stock.getStock() - 1);
|
|
|
+ stock.setUpgrade(stock.getUpgrade() - 1);
|
|
|
+ stockMapper.updateById(stock);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Transactional(rollbackFor = Throwable.class)
|
|
|
+ @Override
|
|
|
+ public void incr(StockUpReq stock) {
|
|
|
+ GoodsDonStock goodsDonStock = stockMapper.selectById(stock.getId());
|
|
|
+
|
|
|
+ //新增库存明细
|
|
|
+ GoodsDonStockRecord record = new GoodsDonStockRecord();
|
|
|
+ record.setVoucher(stock.getVoucher());
|
|
|
+ record.setNum(stock.getNum());
|
|
|
+ record.setPrice(stock.getPrice());
|
|
|
+ record.setAvailable(stock.getNum());
|
|
|
+ record.setStockId(stock.getId());
|
|
|
+ record.setThenTotal(goodsDonStock.getTotal());
|
|
|
+ record.setType("put");
|
|
|
+ stockRecordMapper.insert(record);
|
|
|
+
|
|
|
+ //增加总库存数,可用库存数
|
|
|
+ goodsDonStock.setTotal(goodsDonStock.getTotal() + stock.getNum());
|
|
|
+ goodsDonStock.setStock(goodsDonStock.getStock() + stock.getNum());
|
|
|
+ stockMapper.updateById(goodsDonStock);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Transactional(rollbackFor = Throwable.class)
|
|
|
+ @Override
|
|
|
+ public void sub(StockUpReq stock) {
|
|
|
+ GoodsDonStock goodsDonStock = stockMapper.selectById(stock.getId());
|
|
|
+ GoodsDonStockRecord putRecord = stockRecordMapper.selectOne(
|
|
|
+ Wrappers.lambdaQuery(GoodsDonStockRecord.class)
|
|
|
+ .eq(GoodsDonStockRecord::getStockId,stock.getId())
|
|
|
+ .eq(GoodsDonStockRecord::getType,"put")
|
|
|
+ .gt(GoodsDonStockRecord::getAvailable,0)
|
|
|
+ .orderByAsc(GoodsDonStockRecord::getId)
|
|
|
+ .last(" limit 1")
|
|
|
+ );
|
|
|
+ if(putRecord == null){
|
|
|
+ throw BusinessRuntimeException.getInstance("没有库存>0的批次");
|
|
|
+ }
|
|
|
+ if(putRecord.getAvailable() - stock.getNum() < 0){
|
|
|
+ throw BusinessRuntimeException.getInstance("该批次货物仅可扣减" + putRecord.getAvailable() + "数");
|
|
|
+ }
|
|
|
+ putRecord.setAvailable(putRecord.getAvailable() - stock.getNum());
|
|
|
+ stockRecordMapper.updateById(putRecord);
|
|
|
+ //扣减库存明细
|
|
|
+ GoodsDonStockRecord record = new GoodsDonStockRecord();
|
|
|
+ record.setNum(stock.getNum());
|
|
|
+ record.setPrice(putRecord.getPrice());
|
|
|
+ record.setStockId(stock.getId());
|
|
|
+ record.setThenTotal(goodsDonStock.getTotal());
|
|
|
+ record.setType("out");
|
|
|
+ record.setRemark(stock.getRemark());
|
|
|
+ stockRecordMapper.insert(record);
|
|
|
+
|
|
|
+ //增加总库存数,可用库存数
|
|
|
+ goodsDonStock.setTotal(goodsDonStock.getTotal() - stock.getNum());
|
|
|
+ goodsDonStock.setStock(goodsDonStock.getStock() - stock.getNum());
|
|
|
+ stockMapper.updateById(goodsDonStock);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Transactional(rollbackFor = Throwable.class)
|
|
|
+ @Override
|
|
|
+ public void upUnavailable(StockUpReq stock) {
|
|
|
+ GoodsDonStock goodsDonStock = stockMapper.selectById(stock.getId());
|
|
|
+ if (stock.getNum() > 0) {
|
|
|
+ //增加
|
|
|
+ if (goodsDonStock.getStock() <= stock.getNum()) {
|
|
|
+ throw BusinessRuntimeException.getInstance("新增数量不可超过总库存数");
|
|
|
+ }
|
|
|
+ GoodsDonStockRecord putRecord = stockRecordMapper.selectOne(
|
|
|
+ Wrappers.lambdaQuery(GoodsDonStockRecord.class)
|
|
|
+ .eq(GoodsDonStockRecord::getStockId,stock.getId())
|
|
|
+ .eq(GoodsDonStockRecord::getType,"put")
|
|
|
+ .gt(GoodsDonStockRecord::getAvailable,0)
|
|
|
+ .orderByAsc(GoodsDonStockRecord::getStockId)
|
|
|
+ .last(" limit 1")
|
|
|
+ );
|
|
|
+ if(putRecord == null){
|
|
|
+ throw BusinessRuntimeException.getInstance("没有库存>0的批次");
|
|
|
+ }
|
|
|
+ putRecord.setAvailable(putRecord.getAvailable() - stock.getNum());
|
|
|
+ stockRecordMapper.updateById(putRecord);
|
|
|
+ goodsDonStock.setUnavailable(goodsDonStock.getUnavailable() + Math.abs(stock.getNum()));
|
|
|
+ goodsDonStock.setStock(goodsDonStock.getStock() - stock.getNum());
|
|
|
+ stockMapper.updateById(goodsDonStock);
|
|
|
+ //新增库存明细
|
|
|
+ GoodsDonStockRecord record = new GoodsDonStockRecord();
|
|
|
+ record.setNum(stock.getNum());
|
|
|
+ record.setPrice(stock.getPrice());
|
|
|
+ record.setStockId(stock.getId());
|
|
|
+ record.setThenTotal(goodsDonStock.getTotal());
|
|
|
+ record.setType("out");
|
|
|
+ record.setRemark(stock.getRemark());
|
|
|
+
|
|
|
+ }else if(stock.getNum() < 0){
|
|
|
+ //扣减
|
|
|
+ if (goodsDonStock.getUnavailable() <= stock.getNum()) {
|
|
|
+ throw BusinessRuntimeException.getInstance("扣减数量不可超过目前不可用数量");
|
|
|
+ }
|
|
|
+
|
|
|
+ }else {
|
|
|
+ //清库
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Transactional(rollbackFor = Throwable.class)
|
|
|
+ @Override
|
|
|
+ public void upgrade(StockUpReq stock) {
|
|
|
+ GoodsDonStock goodsDonStock = stockMapper.selectById(stock.getId());
|
|
|
+ goodsDonStock.setUpgrade(goodsDonStock.getUpgrade() + stock.getNum());
|
|
|
+ stockMapper.updateById(goodsDonStock);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Transactional(rollbackFor = Throwable.class)
|
|
|
+ @Override
|
|
|
+ public void save(GoodsDonStock stock) {
|
|
|
+ stockMapper.insert(stock);
|
|
|
+ GoodsDonStockRecord record = stock.getRecord();
|
|
|
+ record.setStockId(stock.getId());
|
|
|
+ record.setType("put");
|
|
|
+ record.setAvailable(record.getNum());
|
|
|
+ stockRecordMapper.insert(record);
|
|
|
+
|
|
|
+ stock.getRelateList().forEach((relate)->{
|
|
|
+ relate.setStockId(stock.getId());
|
|
|
+ skuStockRelateMapper.insert(relate);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void upRecord(GoodsDonStockRecord record) {
|
|
|
+ stockRecordMapper.update(null,Wrappers.lambdaUpdate(GoodsDonStockRecord.class).eq(GoodsDonStockRecord::getId,record.getId()).set(GoodsDonStockRecord::getRemark,record.getRemark()));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void del(Long stockId) {
|
|
|
+ stockMapper.deleteById(stockId);
|
|
|
+ skuStockRelateMapper.delete(Wrappers.lambdaQuery(GoodsSkuStockRelate.class).eq(GoodsSkuStockRelate::getStockId,stockId));
|
|
|
+ }
|
|
|
+}
|