|
@@ -4,17 +4,17 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.jeecg.common.util.oConvertUtils;
|
|
|
-import org.jeecg.modules.sparePartsConsumables.inventoryManagement.dto.InventoryLedgerQueryDTO;
|
|
|
-import org.jeecg.modules.sparePartsConsumables.inventoryManagement.entity.InboundManagement;
|
|
|
-import org.jeecg.modules.sparePartsConsumables.inventoryManagement.entity.InventoryLedger;
|
|
|
-import org.jeecg.modules.sparePartsConsumables.inventoryManagement.mapper.InboundManagementMapper;
|
|
|
-import org.jeecg.modules.sparePartsConsumables.inventoryManagement.mapper.InventoryLedgerMapper;
|
|
|
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.dto.InventoryInboundAddDTO;
|
|
|
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.dto.InventoryOutboundAddDTO;
|
|
|
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.entity.*;
|
|
|
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.mapper.*;
|
|
|
import org.jeecg.modules.sparePartsConsumables.inventoryManagement.service.IInventoryLedgerService;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import java.time.LocalDate;
|
|
|
import java.time.format.DateTimeFormatter;
|
|
|
+import java.util.Optional;
|
|
|
|
|
|
/**
|
|
|
* @Description: 库存台账
|
|
@@ -32,19 +32,29 @@ public class InventoryLedgerServiceImpl extends ServiceImpl<InventoryLedgerMappe
|
|
|
@Autowired
|
|
|
private InboundManagementMapper inboundManagementMapper;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private OutboundManagementMapper outboundManagementMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private InventoryOutboundDetailMapper inventoryOutboundDetailMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private InventoryInboundDetailMapper inventoryInboundDetailMapper;
|
|
|
+
|
|
|
+
|
|
|
@Override
|
|
|
- public void addInventoryLedgers(InventoryLedgerQueryDTO inventoryLedgerQueryDTO) {
|
|
|
+ public void addInbound(InventoryInboundAddDTO addDTO) {
|
|
|
|
|
|
- if (oConvertUtils.listIsNotEmpty(inventoryLedgerQueryDTO.getInventoryLedgerList())) {
|
|
|
+ if (oConvertUtils.listIsNotEmpty(addDTO.getInventoryLedgerList())) {
|
|
|
|
|
|
InboundManagement inboundManagement = new InboundManagement();
|
|
|
|
|
|
- inboundManagement.setInboundDate(inventoryLedgerQueryDTO.getInboundDate());
|
|
|
- inboundManagement.setInboundPerson(inventoryLedgerQueryDTO.getInboundPerson());
|
|
|
- inboundManagement.setInboundType(inventoryLedgerQueryDTO.getInboundType());
|
|
|
- inboundManagement.setInboundWarehouse(inventoryLedgerQueryDTO.getInboundWarehouse());
|
|
|
- inboundManagement.setRelatedOrderNo(inventoryLedgerQueryDTO.getRelatedOrderNo());
|
|
|
- inboundManagement.setReturnPerson(inventoryLedgerQueryDTO.getReturnPerson());
|
|
|
+ inboundManagement.setInboundDate(addDTO.getInboundDate());
|
|
|
+ inboundManagement.setInboundPerson(addDTO.getInboundPerson());
|
|
|
+ inboundManagement.setInboundType(addDTO.getInboundType());
|
|
|
+ inboundManagement.setInboundWarehouse(addDTO.getInboundWarehouse());
|
|
|
+ inboundManagement.setRelatedOrderNo(addDTO.getRelatedOrderNo());
|
|
|
+ inboundManagement.setReturnPerson(addDTO.getReturnPerson());
|
|
|
|
|
|
// 入库单号生成
|
|
|
String prefix = "RK";
|
|
@@ -52,10 +62,13 @@ public class InventoryLedgerServiceImpl extends ServiceImpl<InventoryLedgerMappe
|
|
|
String baseCode = prefix + datePart;
|
|
|
|
|
|
String inboundOrderNo = null;
|
|
|
- int maxRetries = 10;
|
|
|
- for (int i = 1; i <= maxRetries; i++) {
|
|
|
- String serial = String.format("%04d", i);
|
|
|
+ int maxRetries = 20; // 尝试 20 次随机生成
|
|
|
+
|
|
|
+ for (int i = 0; i < maxRetries; i++) {
|
|
|
+ int randomNum = (int)(Math.random() * 10000); // 0 ~ 9999
|
|
|
+ String serial = String.format("%04d", randomNum);
|
|
|
String fullCode = baseCode + serial;
|
|
|
+
|
|
|
boolean exists = inboundManagementMapper.existsByCode(fullCode);
|
|
|
if (!exists) {
|
|
|
inboundOrderNo = fullCode;
|
|
@@ -70,7 +83,7 @@ public class InventoryLedgerServiceImpl extends ServiceImpl<InventoryLedgerMappe
|
|
|
inboundManagement.setInboundOrderNo(inboundOrderNo);
|
|
|
inboundManagementMapper.insert(inboundManagement);
|
|
|
|
|
|
- for (InventoryLedgerQueryDTO.InventoryLedgerSingle inventoryLedgerSingle : inventoryLedgerQueryDTO.getInventoryLedgerList()) {
|
|
|
+ for (InventoryInboundAddDTO.InventoryLedgerSingle inventoryLedgerSingle : addDTO.getInventoryLedgerList()) {
|
|
|
|
|
|
LambdaQueryWrapper<InventoryLedger> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
queryWrapper.eq(InventoryLedger::getId, inventoryLedgerSingle.getMaterialId()).last("limit 1");
|
|
@@ -79,7 +92,80 @@ public class InventoryLedgerServiceImpl extends ServiceImpl<InventoryLedgerMappe
|
|
|
|
|
|
if (inventoryLedger != null) {
|
|
|
inventoryLedger.setQuantity(inventoryLedgerSingle.getCount());
|
|
|
- inventoryLedger.setInboundId(inboundManagement.getId());
|
|
|
+
|
|
|
+ InventoryInboundDetail detail = new InventoryInboundDetail();
|
|
|
+ detail.setInboundId(inboundManagement.getId());
|
|
|
+ detail.setInventoryLedgerId(inventoryLedger.getId());
|
|
|
+ detail.setQuantity(inventoryLedgerSingle.getCount());
|
|
|
+ inventoryInboundDetailMapper.insert(detail);
|
|
|
+
|
|
|
+ inventoryLedgerMapper.updateById(inventoryLedger);
|
|
|
+ } else {
|
|
|
+ log.warn("未找到物料ID为 {} 的库存记录", inventoryLedgerSingle.getMaterialId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void addOutbound(InventoryOutboundAddDTO addDTO) {
|
|
|
+
|
|
|
+ if (oConvertUtils.listIsNotEmpty(addDTO.getInventoryLedgerList())) {
|
|
|
+
|
|
|
+ OutboundManagement outboundManagement = new OutboundManagement();
|
|
|
+
|
|
|
+ outboundManagement.setOutboundDate(addDTO.getOutboundDate());
|
|
|
+ outboundManagement.setOutboundPerson(addDTO.getOutboundPerson());
|
|
|
+ outboundManagement.setOutboundType(addDTO.getOutboundType());
|
|
|
+ outboundManagement.setWarehouseName(addDTO.getWarehouseName());
|
|
|
+ outboundManagement.setRelatedOrderNo(addDTO.getRelatedOrderNo());
|
|
|
+
|
|
|
+ // 出库单号生成
|
|
|
+ String prefix = "CK";
|
|
|
+ String datePart = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
|
|
|
+ String baseCode = prefix + datePart;
|
|
|
+
|
|
|
+ String outboundOrderNo = null;
|
|
|
+ int maxRetries = 20;
|
|
|
+ for (int i = 1; i <= maxRetries; i++) {
|
|
|
+ int randomNum = (int)(Math.random() * 10000); // 0 ~ 9999
|
|
|
+ String serial = String.format("%04d", randomNum);
|
|
|
+ String fullCode = baseCode + serial;
|
|
|
+
|
|
|
+ boolean exists = outboundManagementMapper.existsByCode(fullCode);
|
|
|
+ if (!exists) {
|
|
|
+ outboundOrderNo = fullCode;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (outboundOrderNo == null) {
|
|
|
+ throw new RuntimeException("生成唯一出库单号失败,请稍后重试");
|
|
|
+ }
|
|
|
+
|
|
|
+ outboundManagement.setOutboundOrderNo(outboundOrderNo);
|
|
|
+ outboundManagementMapper.insert(outboundManagement);
|
|
|
+
|
|
|
+ for (InventoryOutboundAddDTO.InventoryLedgerSingle inventoryLedgerSingle : addDTO.getInventoryLedgerList()) {
|
|
|
+
|
|
|
+ LambdaQueryWrapper<InventoryLedger> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ queryWrapper.eq(InventoryLedger::getId, inventoryLedgerSingle.getMaterialId()).last("limit 1");
|
|
|
+
|
|
|
+ InventoryLedger inventoryLedger = inventoryLedgerMapper.selectOne(queryWrapper);
|
|
|
+
|
|
|
+ if (inventoryLedger != null) {
|
|
|
+ int quantity = Optional.ofNullable(inventoryLedger.getQuantity()).orElse(0);
|
|
|
+ int count = Optional.ofNullable(inventoryLedgerSingle.getCount()).orElse(0);
|
|
|
+ if (quantity < count) {
|
|
|
+ throw new IllegalArgumentException("库存不足,不能减少这么多数量");
|
|
|
+ }
|
|
|
+ inventoryLedger.setQuantity(quantity - count);
|
|
|
+
|
|
|
+ InventoryOutboundDetail detail = new InventoryOutboundDetail();
|
|
|
+ detail.setOutboundId(outboundManagement.getId());
|
|
|
+ detail.setInventoryLedgerId(inventoryLedger.getId());
|
|
|
+ detail.setQuantity(count);
|
|
|
+ inventoryOutboundDetailMapper.insert(detail);
|
|
|
|
|
|
inventoryLedgerMapper.updateById(inventoryLedger);
|
|
|
} else {
|