package com.ruoyi.procurementrecord.utils;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
|
import com.ruoyi.common.enums.ReviewStatusEnum;
|
import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
|
import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
|
import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
|
import com.ruoyi.sales.mapper.ShippingProductDetailMapper;
|
import com.ruoyi.sales.pojo.ShippingProductDetail;
|
import com.ruoyi.stock.dto.StockInventoryDto;
|
import com.ruoyi.stock.dto.StockOutRecordDto;
|
import com.ruoyi.stock.dto.StockUninventoryDto;
|
import com.ruoyi.stock.pojo.StockInRecord;
|
import com.ruoyi.stock.pojo.StockOutRecord;
|
import com.ruoyi.stock.service.StockInRecordService;
|
import com.ruoyi.stock.service.StockInventoryService;
|
import com.ruoyi.stock.service.StockOutRecordService;
|
import com.ruoyi.stock.service.StockUninventoryService;
|
import lombok.RequiredArgsConstructor;
|
import org.springframework.stereotype.Component;
|
|
import java.math.BigDecimal;
|
import java.time.LocalDateTime;
|
import java.util.Collections;
|
import java.util.List;
|
|
@Component
|
@RequiredArgsConstructor
|
public class StockUtils {
|
private final ProcurementRecordOutMapper procurementRecordOutMapper;
|
private final ProcurementRecordMapper procurementRecordMapper;
|
private final StockUninventoryService stockUninventoryService;
|
private final StockInventoryService stockInventoryService;
|
private final StockInRecordService stockInRecordService;
|
private final StockOutRecordService stockOutRecordService;
|
private final ShippingProductDetailMapper shippingProductDetailMapper;
|
|
/**
|
* 不合格入库
|
*
|
* @param productModelId
|
* @param quantity
|
* @param recordType
|
* @param recordId
|
*/
|
public void addUnStock(Long productModelId, BigDecimal quantity, String recordType, Long recordId) {
|
StockUninventoryDto stockUninventoryDto = new StockUninventoryDto();
|
stockUninventoryDto.setRecordId(recordId);
|
stockUninventoryDto.setRecordType(String.valueOf(recordType));
|
stockUninventoryDto.setQualitity(quantity);
|
stockUninventoryDto.setProductModelId(productModelId);
|
stockUninventoryService.addStockInRecordOnly(stockUninventoryDto);
|
}
|
|
/**
|
* 不合格入库带批次号
|
*
|
* @param productModelId
|
* @param quantity
|
* @param recordType
|
* @param recordId
|
*/
|
public void addUnStockWithBatchNo(Long productModelId, BigDecimal quantity, String recordType, Long recordId, String batchNo) {
|
StockUninventoryDto stockUninventoryDto = new StockUninventoryDto();
|
stockUninventoryDto.setRecordId(recordId);
|
stockUninventoryDto.setRecordType(String.valueOf(recordType));
|
stockUninventoryDto.setQualitity(quantity);
|
stockUninventoryDto.setProductModelId(productModelId);
|
stockUninventoryDto.setBatchNo(batchNo);
|
stockUninventoryService.addStockInRecordOnly(stockUninventoryDto);
|
}
|
|
/**
|
* 不合格出库
|
*
|
* @param productModelId
|
* @param quantity
|
* @param recordType
|
* @param recordId
|
*/
|
public void subtractUnStock(Long productModelId, BigDecimal quantity, Integer recordType, Long recordId) {
|
StockUninventoryDto stockUninventoryDto = new StockUninventoryDto();
|
stockUninventoryDto.setRecordId(recordId);
|
stockUninventoryDto.setRecordType(String.valueOf(recordType));
|
stockUninventoryDto.setQualitity(quantity);
|
stockUninventoryDto.setProductModelId(productModelId);
|
stockUninventoryService.subtractStockUninventory(stockUninventoryDto);
|
}
|
|
/**
|
* 合格入库
|
* @param recordType
|
* @param recordId
|
*/
|
public void addStock(Long productModelId, BigDecimal quantity, String recordType, Long recordId) {
|
addStock(productModelId, quantity, recordType, recordId, null);
|
}
|
|
/**
|
* 合格入库
|
* @param recordType
|
* @param recordId
|
*/
|
public void addStock(Long productModelId, BigDecimal quantity, String recordType, Long recordId, LocalDateTime createTime) {
|
StockInventoryDto stockInventoryDto = new StockInventoryDto();
|
stockInventoryDto.setRecordId(recordId);
|
stockInventoryDto.setRecordType(String.valueOf(recordType));
|
stockInventoryDto.setQualitity(quantity);
|
stockInventoryDto.setProductModelId(productModelId);
|
stockInventoryDto.setCreateTime(createTime);
|
stockInventoryService.addStockInRecordOnly(stockInventoryDto);
|
}
|
|
/**
|
* 合格入库带批次号
|
* @param productModelId
|
* @param quantity
|
* @param recordType
|
* @param recordId
|
*/
|
public void addStockWithBatchNo(Long productModelId, BigDecimal quantity, String recordType, Long recordId, String batchNo) {
|
addStockWithBatchNo(productModelId, quantity, recordType, recordId, batchNo, null);
|
}
|
|
/**
|
* 合格入库带批次号
|
* @param recordType
|
* @param recordId
|
*/
|
public void addStockWithBatchNo(Long productModelId, BigDecimal quantity, String recordType, Long recordId, String batchNo, LocalDateTime createTime) {
|
StockInventoryDto stockInventoryDto = new StockInventoryDto();
|
stockInventoryDto.setRecordId(recordId);
|
stockInventoryDto.setRecordType(String.valueOf(recordType));
|
stockInventoryDto.setQualitity(quantity);
|
stockInventoryDto.setProductModelId(productModelId);
|
stockInventoryDto.setBatchNo(batchNo);
|
stockInventoryDto.setCreateTime(createTime);
|
stockInventoryService.addStockInRecordOnly(stockInventoryDto);
|
}
|
|
/**
|
* 合格出库
|
*
|
* @param productModelId
|
* @param quantity
|
* @param recordType
|
* @param recordId
|
*/
|
public void substractStock(Long productModelId, BigDecimal quantity, String recordType, Long recordId, String batchNo) {
|
StockInventoryDto stockInventoryDto = new StockInventoryDto();
|
stockInventoryDto.setRecordId(recordId);
|
stockInventoryDto.setRecordType(String.valueOf(recordType));
|
stockInventoryDto.setQualitity(quantity);
|
stockInventoryDto.setProductModelId(productModelId);
|
stockInventoryDto.setBatchNo(batchNo);
|
stockInventoryService.addStockOutRecordOnly(stockInventoryDto);
|
}
|
|
/**
|
* 只登记出库流水,不校验、不扣减库存。
|
* 用于未启用仓储模块、发货没有库存批号的场景。
|
*
|
* @param productModelId
|
* @param quantity
|
* @param recordType
|
* @param recordId
|
* @param batchNo
|
*/
|
public void recordStockOutWithoutInventory(Long productModelId, BigDecimal quantity, String recordType, Long recordId, String batchNo) {
|
StockOutRecordDto stockOutRecordDto = new StockOutRecordDto();
|
stockOutRecordDto.setRecordId(recordId);
|
stockOutRecordDto.setRecordType(String.valueOf(recordType));
|
stockOutRecordDto.setStockOutNum(quantity);
|
stockOutRecordDto.setProductModelId(productModelId);
|
stockOutRecordDto.setBatchNo(batchNo);
|
stockOutRecordDto.setType("0");
|
stockOutRecordService.add(stockOutRecordDto);
|
}
|
|
/**
|
* 发货审批状态更改。
|
* 没有库存批号的发货(未启用仓储模块)没有出库审核环节,审批通过即视为已出库,
|
* 否则发货数量统计不到。
|
*
|
* @param recordType
|
* @param recordId
|
*/
|
public void shipmentStatus(String recordType, Long recordId) {
|
Long inventoryBatchCount = shippingProductDetailMapper.selectCount(new LambdaQueryWrapper<ShippingProductDetail>()
|
.eq(ShippingProductDetail::getShippingInfoId, recordId)
|
.isNotNull(ShippingProductDetail::getStockInventoryId));
|
boolean withoutInventoryBatch = StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode().equals(recordType)
|
&& inventoryBatchCount == 0;
|
Integer approvalStatus = withoutInventoryBatch
|
? ReviewStatusEnum.APPROVED.getCode()
|
: ReviewStatusEnum.PENDING_REVIEW.getCode();
|
LambdaQueryWrapper<StockOutRecord> queryWrapper = new LambdaQueryWrapper<StockOutRecord>().eq(StockOutRecord::getRecordType, recordType)
|
.eq(StockOutRecord::getRecordId, recordId);
|
stockOutRecordService.list(queryWrapper).stream().forEach(stockOutRecord -> {
|
stockOutRecord.setApprovalStatus(approvalStatus);
|
stockOutRecordService.updateById(stockOutRecord);
|
});
|
}
|
|
//不合格库存删除
|
public void deleteStockInRecord(Long recordId, String recordType) {
|
StockInRecord one = stockInRecordService.getOne(new QueryWrapper<StockInRecord>()
|
.lambda().eq(StockInRecord::getRecordId, recordId)
|
.eq(StockInRecord::getRecordType, recordType), false);
|
if (ObjectUtils.isNotEmpty(one)) {
|
if (ReviewStatusEnum.APPROVED.getCode().equals(one.getApprovalStatus())) {
|
stockInRecordService.batchDelete(Collections.singletonList(one.getId()));
|
} else {
|
stockInRecordService.removeById(one.getId());
|
}
|
}
|
|
}
|
|
//删除出库记录
|
public void deleteStockOutRecord(Long recordId, String recordType) {
|
List<StockOutRecord> records = stockOutRecordService.list(new QueryWrapper<StockOutRecord>()
|
.lambda().eq(StockOutRecord::getRecordId, recordId)
|
.eq(StockOutRecord::getRecordType, recordType));
|
if (ObjectUtils.isEmpty(records)) {
|
return;
|
}
|
List<Long> approvedIds = records.stream()
|
.filter(one -> ReviewStatusEnum.APPROVED.getCode().equals(one.getApprovalStatus()))
|
.map(StockOutRecord::getId)
|
.toList();
|
List<Long> pendingIds = records.stream()
|
.filter(one -> !ReviewStatusEnum.APPROVED.getCode().equals(one.getApprovalStatus()))
|
.map(StockOutRecord::getId)
|
.toList();
|
if (!approvedIds.isEmpty()) {
|
stockOutRecordService.batchDelete(approvedIds);
|
}
|
if (!pendingIds.isEmpty()) {
|
stockOutRecordService.removeByIds(pendingIds);
|
}
|
|
}
|
}
|