昨天 b22ebe8fad1691b35adcf321fe2e136795b3f81d
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;
@@ -62,6 +64,8 @@
import com.ruoyi.sales.service.impl.CommonFileServiceImpl;
import com.ruoyi.stock.pojo.StockInRecord;
import com.ruoyi.stock.service.StockInRecordService;
import com.ruoyi.device.mapper.DeviceLedgerMapper;
import com.ruoyi.device.pojo.DeviceLedger;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
@@ -116,6 +120,8 @@
    private final StockInRecordService stockInRecordService;
    private final StockUtils stockUtils;
    private final ApprovalTemplateMapper approvalTemplateMapper;
    private final SparePartsMapper sparePartsMapper;
    private final DeviceLedgerMapper deviceLedgerMapper;
    @Override
    public List<PurchaseLedger> selectPurchaseLedgerList(PurchaseLedger purchaseLedger) {
@@ -162,6 +168,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 +338,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 +373,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);
@@ -384,10 +424,30 @@
        qualityInspect.setProductModelId(saleProduct.getProductModelId());
        qualityInspect.setUnit(saleProduct.getUnit());
        qualityInspect.setQuantity(saleProduct.getQuantity());
        qualityInspect.setWarehouse(saleProduct.getStorageLocation());
        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()))
@@ -439,13 +499,18 @@
        if (CollectionUtils.isEmpty(stockRecords)
                && qualityInspect.getQualifiedQuantity() != null
                && qualityInspect.getQualifiedQuantity().compareTo(BigDecimal.ZERO) > 0) {
            // 优先使用质检单中的库位,如果没有则使用产品明细中的库位
            String warehouse = StringUtils.hasText(qualityInspect.getWarehouse())
                    ? qualityInspect.getWarehouse()
                    : product.getStorageLocation();
            stockUtils.addStockWithBatchNo(
                    product.getProductModelId(),
                    qualityInspect.getQualifiedQuantity(),
                    StockInQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_OUT.getCode(),
                    qualityInspect.getId(),
                    null,
                    purchaseInspectTime == null ? null : purchaseInspectTime.plusDays(1)
                    purchaseInspectTime == null ? null : purchaseInspectTime.plusDays(1),
                    warehouse
            );
            stockRecords = findQualityStockRecords(qualityInspect.getId(), product.getProductModelId());
        }
@@ -492,7 +557,8 @@
                    StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(),
                    purchaseLedger.getId(),
                    purchaseLedger.getPurchaseContractNumber() + "-" + product.getId(),
                    stockCreateTime
                    stockCreateTime,
                    product.getStorageLocation()
            );
            stockRecords = findDirectStockRecords(purchaseLedger.getId(), purchaseLedger.getPurchaseContractNumber(), product.getProductModelId(), product.getId());
        }
@@ -515,6 +581,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 +738,21 @@
            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());
                }
            }
            // 如果有设备ID但没有库位,从设备表自动填充库位
            if (product.getDeviceId() != null && StringUtils.isEmpty(product.getStorageLocation())) {
                DeviceLedger device = deviceLedgerMapper.selectById(product.getDeviceId());
                if (device != null && StringUtils.isNotEmpty(device.getStorageLocation())) {
                    product.setStorageLocation(device.getStorageLocation());
                }
            }
        }
        // 分组处理