liyong
2026-04-23 a228c5f91173c50ce7f94255dc9a25a7c6703e0c
src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
@@ -5,6 +5,13 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.dto.StorageBlobVO;
import com.ruoyi.basic.mapper.StorageAttachmentMapper;
import com.ruoyi.basic.mapper.StorageBlobMapper;
import com.ruoyi.basic.pojo.StorageAttachment;
import com.ruoyi.basic.pojo.StorageBlob;
import com.ruoyi.basic.utils.FileUtil;
import com.ruoyi.common.constant.StorageAttachmentConstants;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.production.bean.dto.ProductionOrderDto;
import com.ruoyi.production.bean.vo.ProductionOrderVo;
@@ -79,6 +86,8 @@
    private final ProductionOrderPickMapper productionOrderPickMapper;
    private final ProductionOrderPickRecordMapper productionOrderPickRecordMapper;
    private final ProductionPlanMapper productionPlanMapper;
    private final StorageAttachmentMapper storageAttachmentMapper;
    private final StorageBlobMapper storageBlobMapper;
    private final SalesLedgerMapper salesLedgerMapper;
    private final SalesLedgerProductMapper salesLedgerProductMapper;
    private final TechnologyRoutingMapper technologyRoutingMapper;
@@ -86,22 +95,30 @@
    private final TechnologyRoutingOperationParamMapper technologyRoutingOperationParamMapper;
    private final TechnologyBomMapper technologyBomMapper;
    private final TechnologyBomStructureMapper technologyBomStructureMapper;
    private final FileUtil fileUtil;
    @Override
    public com.baomidou.mybatisplus.core.metadata.IPage<ProductionOrderVo> pageProductionOrder(Page<ProductionOrderDto> page, ProductionOrderDto dto) {
        Page<ProductionOrder> entityPage = new Page<>(page.getCurrent(), page.getSize(), page.getTotal());
        return this.page(entityPage, buildQueryWrapper(dto)).convert(item -> BeanUtil.copyProperties(item, ProductionOrderVo.class));
        Page<ProductionOrderVo> result = (Page<ProductionOrderVo>) baseMapper.pageProductionOrder(page, dto);
        fillProductImages(result.getRecords());
        return result;
    }
    @Override
    public List<ProductionOrderVo> listProductionOrder(ProductionOrderDto dto) {
        return BeanUtil.copyToList(this.list(buildQueryWrapper(dto)), ProductionOrderVo.class);
        List<ProductionOrderVo> records = baseMapper.listProductionOrder(dto);
        fillProductImages(records);
        return records;
    }
    @Override
    public ProductionOrderVo getProductionOrderInfo(Long id) {
        ProductionOrder item = this.getById(id);
        return item == null ? null : BeanUtil.copyProperties(item, ProductionOrderVo.class);
        ProductionOrderVo item = baseMapper.getProductionOrderInfo(id);
        if (item == null) {
            return null;
        }
        fillProductImages(java.util.Collections.singletonList(item));
        return item;
    }
    @Override
@@ -585,4 +602,65 @@
    private int compareDecimal(BigDecimal left, BigDecimal right) {
        return defaultDecimal(left).compareTo(defaultDecimal(right));
    }
    private void fillProductImages(List<ProductionOrderVo> records) {
        if (records == null || records.isEmpty()) {
            return;
        }
        List<Long> productModelIds = records.stream()
                .map(ProductionOrderVo::getProductModelId)
                .filter(Objects::nonNull)
                .distinct()
                .collect(Collectors.toList());
        if (productModelIds.isEmpty()) {
            return;
        }
        List<StorageAttachment> attachments = storageAttachmentMapper.selectList(
                Wrappers.<StorageAttachment>lambdaQuery()
                        .in(StorageAttachment::getRecordId, productModelIds)
                        .eq(StorageAttachment::getApplication, StorageAttachmentConstants.StorageAttachmentImage)
                        .eq(StorageAttachment::getDeleted, 0L)
                        .orderByAsc(StorageAttachment::getId));
        if (attachments == null || attachments.isEmpty()) {
            return;
        }
        Map<Long, List<StorageAttachment>> attachmentMap = attachments.stream()
                .collect(Collectors.groupingBy(StorageAttachment::getRecordId, java.util.LinkedHashMap::new, Collectors.toList()));
        List<Long> blobIds = attachments.stream()
                .map(StorageAttachment::getStorageBlobId)
                .filter(Objects::nonNull)
                .distinct()
                .collect(Collectors.toList());
        if (blobIds.isEmpty()) {
            return;
        }
        Map<Long, StorageBlob> blobMap = storageBlobMapper.selectBatchIds(blobIds).stream()
                .filter(Objects::nonNull)
                .collect(Collectors.toMap(StorageBlob::getId, item -> item));
        for (ProductionOrderVo record : records) {
            List<StorageAttachment> modelAttachments = attachmentMap.get(record.getProductModelId());
            if (modelAttachments == null || modelAttachments.isEmpty()) {
                continue;
            }
            List<StorageBlobVO> images = modelAttachments.stream()
                    .map(StorageAttachment::getStorageBlobId)
                    .map(blobMap::get)
                    .filter(Objects::nonNull)
                    .map(this::toStorageBlobVO)
                    .collect(Collectors.toList());
            if (!images.isEmpty()) {
                record.setProductImages(images);
            }
        }
    }
    private StorageBlobVO toStorageBlobVO(StorageBlob blob) {
        StorageBlobVO vo = BeanUtil.copyProperties(blob, StorageBlobVO.class);
        vo.setPreviewURL(fileUtil.buildSignedPreviewUrl(vo));
        vo.setDownloadURL(fileUtil.buildSignedDownloadUrl(vo));
        return vo;
    }
}