From 7486f6d6a93d98f96f45f0cc4846be9c8a2345df Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期二, 09 六月 2026 15:39:20 +0800
Subject: [PATCH] 增加废品库详情接口
---
src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java | 243 +++++++++++++++++++++++++++++++++++++-----------
1 files changed, 188 insertions(+), 55 deletions(-)
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
index 91bce0d..81e6ae9 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
@@ -13,6 +13,8 @@
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
+
+import java.time.LocalDateTime;
import com.ruoyi.stock.dto.StockInRecordDto;
import com.ruoyi.stock.dto.StockInventoryDto;
import com.ruoyi.stock.dto.StockUninventoryDto;
@@ -28,16 +30,21 @@
import com.ruoyi.stock.service.StockInRecordService;
import jakarta.servlet.http.HttpServletResponse;
import lombok.AllArgsConstructor;
+import org.jspecify.annotations.NonNull;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
+import java.math.RoundingMode;
import java.util.List;
@Service
@AllArgsConstructor
public class StockInRecordServiceImpl extends ServiceImpl<StockInRecordMapper, StockInRecord> implements StockInRecordService {
+
+ private static final String UNQUALIFIED_TYPE = "unqualified";
+ private static final String WASTE_TYPE = "waste";
private StockInRecordMapper stockInRecordMapper;
private StockInventoryMapper stockInventoryMapper;
@@ -53,7 +60,7 @@
@Override
@Transactional(rollbackFor = Exception.class)
public int add(StockInRecordDto stockInRecordDto) {
- String no = OrderUtils.countTodayByCreateTime(stockInRecordMapper, "RK","inbound_batches");
+ String no = OrderUtils.countTodayByCreateTime(stockInRecordMapper, "RK","inbound_batches", stockInRecordDto.getCreateTime() != null ? stockInRecordDto.getCreateTime() : LocalDateTime.now());
stockInRecordDto.setInboundBatches(no);
StockInRecord stockInRecord = new StockInRecord();
BeanUtils.copyProperties(stockInRecordDto, stockInRecord);
@@ -97,9 +104,11 @@
stockInRecordDto.setQualitity(stockInRecord.getStockInNum());
stockInventoryMapper.updateSubtractStockInventory(stockInRecordDto);
}
- }else if (stockInRecord.getType().equals("1")) {
+ }else if (stockInRecord.getType().equals("1") || stockInRecord.getType().equals("2")) {
+ String uninventoryType = resolveUninventoryTypeByInRecordType(stockInRecord.getType());
LambdaQueryWrapper<StockUninventory> eq = new LambdaQueryWrapper<StockUninventory>()
- .eq(StockUninventory::getProductModelId, stockInRecord.getProductModelId());
+ .eq(StockUninventory::getProductModelId, stockInRecord.getProductModelId())
+ .eq(StockUninventory::getType, uninventoryType);
if (StringUtils.isEmpty(stockInRecord.getBatchNo())) {
eq.isNull(StockUninventory::getBatchNo);
} else {
@@ -113,6 +122,7 @@
stockUninventoryDto.setProductModelId(stockUninventory.getProductModelId());
stockUninventoryDto.setBatchNo(stockUninventory.getBatchNo());
stockUninventoryDto.setQualitity(stockInRecord.getStockInNum());
+ stockUninventoryDto.setType(uninventoryType);
stockUninventoryMapper.updateSubtractStockUnInventory(stockUninventoryDto);
}
}
@@ -145,15 +155,44 @@
return stockInventoryMapper.selectOne(eq);
}
- private StockUninventory getStockUninventory(Long productModelId, String batchNo) {
+ private StockUninventory getStockUninventory(Long productModelId, String batchNo, String uninventoryType) {
LambdaQueryWrapper<StockUninventory> eq = new LambdaQueryWrapper<>();
eq.eq(StockUninventory::getProductModelId, productModelId);
+ if (StringUtils.isNotEmpty(uninventoryType)) {
+ eq.eq(StockUninventory::getType, uninventoryType);
+ }
if (StringUtils.isEmpty(batchNo)) {
eq.isNull(StockUninventory::getBatchNo);
} else {
eq.eq(StockUninventory::getBatchNo, batchNo);
}
return stockUninventoryMapper.selectOne(eq);
+ }
+
+ /**
+ * 鍥炴粴鐢熶骇閫�鏂欏叆搴撶殑棰嗘枡璁板綍閫�鏂欐暟閲�
+ * @param stockInRecord 鍏ュ簱璁板綍
+ */
+ private void rollbackFeedReturnQty(StockInRecord stockInRecord) {
+ ProductionOrderPick productionOrderPick = productionOrderPickMapper.selectById(stockInRecord.getRecordId());
+ if (productionOrderPick != null) {
+ BigDecimal returnQty = productionOrderPick.getReturnQty();
+ if (returnQty == null) {
+ returnQty = BigDecimal.ZERO;
+ }
+ BigDecimal newReturnQty = returnQty.subtract(stockInRecord.getStockInNum());
+ if (newReturnQty.compareTo(BigDecimal.ZERO) < 0) {
+ newReturnQty = BigDecimal.ZERO;
+ }
+ productionOrderPick.setReturnQty(newReturnQty);
+ // 閲嶆柊璁$畻瀹為檯鐢ㄩ噺
+ BigDecimal actualQty = productionOrderPick.getQuantity().add(
+ productionOrderPick.getFeedingQty() != null ? productionOrderPick.getFeedingQty() : BigDecimal.ZERO)
+ .subtract(newReturnQty);
+ productionOrderPick.setActualQty(actualQty);
+ productionOrderPick.setReturned(newReturnQty.compareTo(BigDecimal.ZERO) > 0);
+ productionOrderPickMapper.updateById(productionOrderPick);
+ }
}
@Override
@@ -167,20 +206,29 @@
if (stockInRecord.getApprovalStatus() != null && !ReviewStatusEnum.PENDING_REVIEW.getCode().equals(stockInRecord.getApprovalStatus())) {
throw new BaseException("鍙湁寰呭鎵圭姸鎬佺殑璁板綍鎵嶈兘鍒犻櫎,鍏ュ簱鎵规:" + stockInRecord.getInboundBatches());
}
+
+ // 濡傛灉鏄敓浜ч��鏂欏叆搴擄紝鍒犻櫎鏃堕渶瑕佸洖婊氶鏂欒褰曠殑閫�鏂欐暟閲�
+ if (StockInQualifiedRecordTypeEnum.FEED_RETURN_IN.getCode().equals(stockInRecord.getRecordType())) {
+ rollbackFeedReturnQty(stockInRecord);
+ }
}
return stockInRecordMapper.deleteBatchIds(ids);
}
@Override
@Transactional(rollbackFor = Exception.class)
- public int batchApprove(List<Long> ids, Integer approvalStatus) {
- if (CollectionUtils.isEmpty(ids)) {
+ public int batchApprove(Integer approvalStatus, List<StockInRecordDto.StockInRecordApproveItemDto> items) {
+ if (CollectionUtils.isEmpty(items)) {
throw new BaseException("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
}
if (approvalStatus == null || (!ReviewStatusEnum.APPROVED.getCode().equals(approvalStatus) && !ReviewStatusEnum.REJECTED.getCode().equals(approvalStatus))) {
throw new BaseException("瀹℃壒鐘舵�佸�兼棤鏁�");
}
- for (Long id : ids) {
+ for (StockInRecordDto.StockInRecordApproveItemDto item : items) {
+ Long id = item.getId();
+ if (id == null) {
+ throw new BaseException("鍏ュ簱璁板綍ID涓嶈兘涓虹┖");
+ }
StockInRecord stockInRecord = stockInRecordMapper.selectById(id);
if (stockInRecord == null) {
throw new BaseException("鍏ュ簱璁板綍涓嶅瓨鍦�,鏃犳硶瀹℃壒!!!");
@@ -188,24 +236,147 @@
if (stockInRecord.getApprovalStatus() != null && !ReviewStatusEnum.PENDING_REVIEW.getCode().equals(stockInRecord.getApprovalStatus())) {
throw new BaseException("鍙湁寰呭鎵圭姸鎬佺殑璁板綍鎵嶈兘瀹℃壒,鍏ュ簱鎵规:" + stockInRecord.getInboundBatches());
}
+
+ // 鑾峰彇瀹℃壒鏃朵慨鏀圭殑鍏ュ簱鏁伴噺锛屽鏋滄病鏈変慨鏀瑰垯浣跨敤鍘熸暟閲�
+ final BigDecimal finalStockInNum;
+ if (item.getStockInNum() != null && item.getStockInNum().compareTo(BigDecimal.ZERO) > 0) {
+ finalStockInNum = item.getStockInNum();
+ adjustPurchaseInboundAuditFields(stockInRecord, finalStockInNum);
+ // 鏇存柊鍏ュ簱璁板綍鐨勫叆搴撴暟閲�
+ stockInRecord.setStockInNum(finalStockInNum);
+ } else {
+ finalStockInNum = stockInRecord.getStockInNum();
+ }
+
stockInRecord.setApprovalStatus(approvalStatus);
stockInRecordMapper.updateById(stockInRecord);
// 瀹℃壒椹冲洖鏃讹紝濡傛灉鏄敓浜ч��鏂欏叆搴擄紝闇�瑕佸洖婊氶鏂欒褰曠殑閫�鏂欐暟閲�
if (ReviewStatusEnum.REJECTED.getCode().equals(approvalStatus) &&
StockInQualifiedRecordTypeEnum.FEED_RETURN_IN.getCode().equals(stockInRecord.getRecordType())) {
- // 鎵惧埌瀵瑰簲鐨勯鏂欒褰�
+ rollbackFeedReturnQty(stockInRecord);
+ }
+
+ // 瀹℃壒閫氳繃鏃讹紝搴撳瓨澧炲姞
+ if (ReviewStatusEnum.APPROVED.getCode().equals(approvalStatus)) {
+ if ("0".equals(stockInRecord.getType())) {
+ // 鍚堟牸鍏ュ簱 -> 鍏堟煡搴撳瓨锛屽瓨鍦ㄥ垯鏇存柊锛屼笉瀛樺湪鍒欐柊澧�
+ StockInventory stockInventory = getStockInventory(stockInRecord.getProductModelId(), stockInRecord.getBatchNo());
+ StockInventoryDto stockInventoryDto = getStockInventoryDto(stockInRecord);
+ stockInventoryDto.setQualitity(finalStockInNum);
+ if (stockInventory == null) {
+ stockInventoryMapper.insert(new StockInventory() {{
+ setProductModelId(stockInRecord.getProductModelId());
+ setQualitity(finalStockInNum);
+ setBatchNo(stockInRecord.getBatchNo());
+ setRemark(stockInRecord.getRemark());
+ setWarnNum(stockInRecord.getWarnNum());
+ setManufacturerId(stockInRecord.getManufacturerId());
+ setSource(stockInRecord.getSource());
+ setVersion(1);
+ }});
+ } else {
+ stockInventoryMapper.updateAddStockInventory(stockInventoryDto);
+ }
+ } else if ("1".equals(stockInRecord.getType()) || "2".equals(stockInRecord.getType())) {
+ // 涓嶅悎鏍煎叆搴� -> 鍏堟煡搴撳瓨锛屽瓨鍦ㄥ垯鏇存柊锛屼笉瀛樺湪鍒欐柊澧�
+ String uninventoryType = resolveUninventoryTypeByInRecordType(stockInRecord.getType());
+ StockUninventory stockUninventory = getStockUninventory(stockInRecord.getProductModelId(), stockInRecord.getBatchNo(), uninventoryType);
+ StockUninventoryDto stockUninventoryDto = new StockUninventoryDto();
+ stockUninventoryDto.setProductModelId(stockInRecord.getProductModelId());
+ stockUninventoryDto.setBatchNo(stockInRecord.getBatchNo());
+ stockUninventoryDto.setQualitity(finalStockInNum);
+ stockUninventoryDto.setRemark(stockInRecord.getRemark());
+ stockUninventoryDto.setManufacturerId(stockInRecord.getManufacturerId());
+ stockUninventoryDto.setSource(stockInRecord.getSource());
+ stockUninventoryDto.setType(uninventoryType);
+ if (stockUninventory == null) {
+ stockUninventoryMapper.insert(new StockUninventory() {{
+ setProductModelId(stockInRecord.getProductModelId());
+ setQualitity(finalStockInNum);
+ setBatchNo(stockInRecord.getBatchNo());
+ setType(uninventoryType);
+ setRemark(stockInRecord.getRemark());
+ setManufacturerId(stockInRecord.getManufacturerId());
+ setSource(stockInRecord.getSource());
+ setVersion(1);
+ }});
+ } else {
+ stockUninventoryMapper.updateAddStockUnInventory(stockUninventoryDto);
+ }
+ }
+ }
+ }
+ return items.size();
+ }
+
+ private String resolveUninventoryTypeByInRecordType(String stockInType) {
+ if ("2".equals(stockInType)) {
+ return WASTE_TYPE;
+ }
+ return UNQUALIFIED_TYPE;
+ }
+
+ private void adjustPurchaseInboundAuditFields(StockInRecord stockInRecord, BigDecimal finalStockInNum) {
+ if (stockInRecord == null || finalStockInNum == null) {
+ return;
+ }
+ if (!StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode().equals(stockInRecord.getRecordType())) {
+ return;
+ }
+ BigDecimal theoryStockInNum = stockInRecord.getTheoryStockInNum();
+ if (theoryStockInNum == null || theoryStockInNum.compareTo(BigDecimal.ZERO) <= 0) {
+ return;
+ }
+ if (finalStockInNum.compareTo(theoryStockInNum) > 0) {
+ throw new BaseException("閲囪喘鍏ュ簱瀹℃牳鏃讹紝瀹為檯鍏ュ簱鏁伴噺涓嶈兘澶т簬鐞嗚鍏ュ簱鏁伴噺");
+ }
+ if (Boolean.TRUE.equals(stockInRecord.getIsContainsWater())) {
+ BigDecimal waterContent = theoryStockInNum.subtract(finalStockInNum)
+ .multiply(new BigDecimal("100"))
+ .divide(theoryStockInNum, 4, RoundingMode.HALF_UP);
+ stockInRecord.setWaterContent(waterContent);
+ }
+ }
+
+ private static @NonNull StockInventoryDto getStockInventoryDto(StockInRecord stockInRecord) {
+ StockInventoryDto stockInventoryDto = new StockInventoryDto();
+ stockInventoryDto.setProductModelId(stockInRecord.getProductModelId());
+ stockInventoryDto.setBatchNo(stockInRecord.getBatchNo());
+ stockInventoryDto.setQualitity(stockInRecord.getStockInNum());
+ stockInventoryDto.setRemark(stockInRecord.getRemark());
+ stockInventoryDto.setManufacturerId(stockInRecord.getManufacturerId());
+ stockInventoryDto.setSource(stockInRecord.getSource());
+ return stockInventoryDto;
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public int batchReAudit(List<Long> ids) {
+ if (CollectionUtils.isEmpty(ids)) {
+ throw new BaseException("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+ }
+
+ for (Long id : ids) {
+ StockInRecord stockInRecord = stockInRecordMapper.selectById(id);
+ if (stockInRecord == null) {
+ throw new BaseException("鍏ュ簱璁板綍涓嶅瓨鍦�,鏃犳硶閲嶆柊瀹℃牳!!!");
+ }
+ // 鍙湁椹冲洖鐘舵�佹墠鑳介噸鏂板鏍�
+ if (!ReviewStatusEnum.REJECTED.getCode().equals(stockInRecord.getApprovalStatus())) {
+ throw new BaseException("鍙湁椹冲洖鐘舵�佺殑璁板綍鎵嶈兘閲嶆柊瀹℃牳,鍏ュ簱鎵规:" + stockInRecord.getInboundBatches());
+ }
+
+ // 濡傛灉鏄敓浜ч��鏂欏叆搴擄紝鎭㈠閫�鏂欐暟閲忥紙鍥犱负椹冲洖鏃跺凡鎵e噺锛�
+ if (StockInQualifiedRecordTypeEnum.FEED_RETURN_IN.getCode().equals(stockInRecord.getRecordType())) {
ProductionOrderPick productionOrderPick = productionOrderPickMapper.selectById(stockInRecord.getRecordId());
if (productionOrderPick != null) {
- // 鍥炴粴閫�鏂欐暟閲�
BigDecimal returnQty = productionOrderPick.getReturnQty();
if (returnQty == null) {
returnQty = BigDecimal.ZERO;
}
- BigDecimal newReturnQty = returnQty.subtract(stockInRecord.getStockInNum());
- if (newReturnQty.compareTo(BigDecimal.ZERO) < 0) {
- newReturnQty = BigDecimal.ZERO;
- }
+ // 閲嶆柊瀹℃牳鏃舵仮澶嶉��鏂欐暟閲�
+ BigDecimal newReturnQty = returnQty.add(stockInRecord.getStockInNum());
productionOrderPick.setReturnQty(newReturnQty);
// 閲嶆柊璁$畻瀹為檯鐢ㄩ噺
BigDecimal actualQty = productionOrderPick.getQuantity().add(
@@ -217,49 +388,11 @@
}
}
- // 瀹℃壒閫氳繃鏃讹紝搴撳瓨澧炲姞
- if (ReviewStatusEnum.APPROVED.getCode().equals(approvalStatus)) {
- if ("0".equals(stockInRecord.getType())) {
- // 鍚堟牸鍏ュ簱 -> 鍏堟煡搴撳瓨锛屽瓨鍦ㄥ垯鏇存柊锛屼笉瀛樺湪鍒欐柊澧�
- StockInventory stockInventory = getStockInventory(stockInRecord.getProductModelId(), stockInRecord.getBatchNo());
- StockInventoryDto stockInventoryDto = new StockInventoryDto();
- stockInventoryDto.setProductModelId(stockInRecord.getProductModelId());
- stockInventoryDto.setBatchNo(stockInRecord.getBatchNo());
- stockInventoryDto.setQualitity(stockInRecord.getStockInNum());
- stockInventoryDto.setRemark(stockInRecord.getRemark());
- if (stockInventory == null) {
- stockInventoryMapper.insert(new StockInventory() {{
- setProductModelId(stockInRecord.getProductModelId());
- setQualitity(stockInRecord.getStockInNum());
- setBatchNo(stockInRecord.getBatchNo());
- setRemark(stockInRecord.getRemark());
- setVersion(1);
- }});
- } else {
- stockInventoryMapper.updateAddStockInventory(stockInventoryDto);
- }
- } else if ("1".equals(stockInRecord.getType())) {
- // 涓嶅悎鏍煎叆搴� -> 鍏堟煡搴撳瓨锛屽瓨鍦ㄥ垯鏇存柊锛屼笉瀛樺湪鍒欐柊澧�
- StockUninventory stockUninventory = getStockUninventory(stockInRecord.getProductModelId(), stockInRecord.getBatchNo());
- StockUninventoryDto stockUninventoryDto = new StockUninventoryDto();
- stockUninventoryDto.setProductModelId(stockInRecord.getProductModelId());
- stockUninventoryDto.setBatchNo(stockInRecord.getBatchNo());
- stockUninventoryDto.setQualitity(stockInRecord.getStockInNum());
- stockUninventoryDto.setRemark(stockInRecord.getRemark());
- if (stockUninventory == null) {
- stockUninventoryMapper.insert(new StockUninventory() {{
- setProductModelId(stockInRecord.getProductModelId());
- setQualitity(stockInRecord.getStockInNum());
- setBatchNo(stockInRecord.getBatchNo());
- setRemark(stockInRecord.getRemark());
- setVersion(1);
- }});
- } else {
- stockUninventoryMapper.updateAddStockUnInventory(stockUninventoryDto);
- }
- }
- }
+ // 灏嗙姸鎬佹敼涓哄緟瀹℃牳
+ stockInRecord.setApprovalStatus(ReviewStatusEnum.PENDING_REVIEW.getCode());
+ stockInRecordMapper.updateById(stockInRecord);
}
+
return ids.size();
}
}
--
Gitblit v1.9.3