src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -33,6 +33,8 @@
import com.ruoyi.framework.security.LoginUser;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.measuringinstrumentledger.mapper.SparePartsMapper;
import com.ruoyi.measuringinstrumentledger.pojo.SpareParts;
import com.ruoyi.other.mapper.TempFileMapper;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
@@ -116,6 +118,7 @@
    private final StockInRecordService stockInRecordService;
    private final StockUtils stockUtils;
    private final ApprovalTemplateMapper approvalTemplateMapper;
    private final SparePartsMapper sparePartsMapper;
    @Override
    public List<PurchaseLedger> selectPurchaseLedgerList(PurchaseLedger purchaseLedger) {
@@ -162,6 +165,9 @@
        purchaseLedger.setRecorderId(purchaseLedgerDto.getRecorderId());
        purchaseLedger.setApprovalStatus(1);
        if (purchaseLedger.getId() == null) {
            purchaseLedger.setStatus(1);
        }
        // 3. 新增或更新主表
        if (purchaseLedger.getId() == null) {
            purchaseLedgerMapper.insert(purchaseLedger);
@@ -329,7 +335,9 @@
                for (SalesLedgerProduct product : products) {
                    try {
                        boolean processed;
                        if (Boolean.TRUE.equals(product.getIsChecked())) {
                        if (product.getProductType() != null && product.getProductType() == 2) {
                            processed = processPurchaseSparePart(purchaseLedger, product);
                        } else if (Boolean.TRUE.equals(product.getIsChecked())) {
                            processed = processPurchaseQualityProduct(purchaseLedger, product);
                        } else {
                            processed = processPurchaseDirectProduct(purchaseLedger, product);
@@ -362,6 +370,35 @@
            }
        }
        // 更新收货状态
        List<Long> processedIds = details.stream()
                .filter(d -> "SUCCESS".equals(d.get("status")) || "PARTIAL".equals(d.get("status")))
                .map(d -> (Long) d.get("purchaseLedgerId"))
                .filter(Objects::nonNull)
                .collect(Collectors.toList());
        if (!processedIds.isEmpty()) {
            PurchaseLedgerDto statusQuery = new PurchaseLedgerDto();
            statusQuery.setIds(processedIds);
            IPage<PurchaseLedgerDto> statusPage = this.selectPurchaseLedgerListPage(
                    new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(1, processedIds.size()),
                    statusQuery
            );
            if (statusPage != null && CollectionUtils.isNotEmpty(statusPage.getRecords())) {
                for (PurchaseLedgerDto dto : statusPage.getRecords()) {
                    PurchaseLedger update = new PurchaseLedger();
                    update.setId(dto.getId());
                    if ("完全入库".equals(dto.getStockInStatus())) {
                        update.setStatus(3);
                    } else if ("入库中".equals(dto.getStockInStatus())) {
                        update.setStatus(2);
                    } else {
                        update.setStatus(1);
                    }
                    purchaseLedgerMapper.updateById(update);
                }
            }
        }
        Map<String, Object> summary = new LinkedHashMap<>();
        summary.put("totalCount", distinctIds.size());
        summary.put("successCount", successCount);
@@ -387,7 +424,26 @@
        qualityInspectMapper.insert(qualityInspect);
        List<QualityTestStandard> qualityTestStandard = qualityTestStandardMapper.getQualityTestStandardByProductId(saleProduct.getProductId(), 0,null);
        if (qualityTestStandard.size()>0){
            qualityInspect.setTestStandardId(qualityTestStandard.get(0).getId());
            QualityTestStandard std = qualityTestStandard.get(0);
            qualityInspect.setTestStandardId(std.getId());
            // 根据 inspectRule 设置抽检比例和抽检数量默认值
            if (std.getInspectRule() == null || std.getInspectRule() == 0) {
                // 全检
                qualityInspect.setInspectRule(0);
                qualityInspect.setSampleRatio(java.math.BigDecimal.valueOf(100));
                qualityInspect.setSampleQuantity(saleProduct.getQuantity() != null ? saleProduct.getQuantity() : java.math.BigDecimal.ZERO);
            } else {
                // 抽检
                qualityInspect.setInspectRule(1);
                java.math.BigDecimal ratio = std.getSampleRatio() != null ? std.getSampleRatio() : java.math.BigDecimal.ZERO;
                qualityInspect.setSampleRatio(ratio);
                if (saleProduct.getQuantity() != null && ratio.compareTo(java.math.BigDecimal.ZERO) > 0) {
                    qualityInspect.setSampleQuantity(saleProduct.getQuantity().multiply(ratio)
                            .divide(java.math.BigDecimal.valueOf(100), 0, java.math.RoundingMode.CEILING));
                } else {
                    qualityInspect.setSampleQuantity(java.math.BigDecimal.ZERO);
                }
            }
            qualityInspectMapper.updateById(qualityInspect);
            qualityTestStandardParamMapper.selectList(Wrappers.<QualityTestStandardParam>lambdaQuery()
                    .eq(QualityTestStandardParam::getTestStandardId,qualityTestStandard.get(0).getId()))
@@ -515,6 +571,22 @@
        approveStockRecords(Collections.singletonList(targetStockRecord));
        stockRecords = findDirectStockRecords(purchaseLedger.getId(), purchaseLedger.getPurchaseContractNumber(), product.getProductModelId(), product.getId());
        return hasApprovedStockRecord(stockRecords);
    }
    private boolean processPurchaseSparePart(PurchaseLedger purchaseLedger, SalesLedgerProduct product) {
        if (purchaseLedger == null || product == null || product.getProductModelId() == null) {
            return false;
        }
        SpareParts spareParts = sparePartsMapper.selectById(product.getProductModelId());
        if (spareParts == null) {
            return false;
        }
        BigDecimal newQty = spareParts.getQuantity() != null
                ? spareParts.getQuantity().add(product.getQuantity())
                : product.getQuantity();
        spareParts.setQuantity(newQty);
        sparePartsMapper.updateById(spareParts);
        return true;
    }
    private LocalDateTime toStartOfDayPlusDays(Date date, int days) {
@@ -656,6 +728,13 @@
            if (productModelId != null && modelMap.containsKey(productModelId)) {
                product.setSpecificationModel(modelMap.get(productModelId));
            }
            if (product.getProductType() != null && product.getProductType() == 2) {
                SpareParts spareParts = sparePartsMapper.selectById(productModelId);
                if (spareParts != null) {
                    product.setProductCategory(spareParts.getName());
                }
            }
        }
        // 分组处理