mitao
2 天以前 e8e30e5474c1fd0c14390710066e40c17155ad37
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetAdMaterialSporadicSettlementServiceImpl.java
@@ -1,10 +1,33 @@
package com.ruoyi.system.service.impl;
import com.ruoyi.system.model.AssetAdMaterialSporadicSettlement;
import com.ruoyi.system.mapper.AssetAdMaterialSporadicSettlementMapper;
import com.ruoyi.system.service.AssetAdMaterialSporadicSettlementService;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.system.dto.asset.AssetAdMaterialSporadicSettlementDTO;
import com.ruoyi.system.export.AssetAdMaterialSporadicSettlementImport;
import com.ruoyi.system.mapper.AssetAdMaterialSporadicSettlementMapper;
import com.ruoyi.system.model.AssetAdMaterialSporadicSettlement;
import com.ruoyi.system.model.AssetAdMaterialSporadicSettlementInfo;
import com.ruoyi.system.service.AssetAdMaterialSporadicSettlementInfoService;
import com.ruoyi.system.service.AssetAdMaterialSporadicSettlementService;
import com.ruoyi.system.service.OssService;
import lombok.Cleanup;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
/**
 * <p>
@@ -15,6 +38,98 @@
 * @since 2025-10-17
 */
@Service
@RequiredArgsConstructor(onConstructor_ = {@Lazy})
public class AssetAdMaterialSporadicSettlementServiceImpl extends ServiceImpl<AssetAdMaterialSporadicSettlementMapper, AssetAdMaterialSporadicSettlement> implements AssetAdMaterialSporadicSettlementService {
    private final OssService ossService;
    private final AssetAdMaterialSporadicSettlementInfoService assetAdMaterialSporadicSettlementInfoService;
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void importData(MultipartFile file, AssetAdMaterialSporadicSettlementDTO dto) {
        try {
            ImportParams importParams = new ImportParams();
            importParams.setTitleRows(0);
            importParams.setHeadRows(1);
            @Cleanup
            InputStream inputStream = file.getInputStream();
            List<AssetAdMaterialSporadicSettlementImport> list = ExcelImportUtil.importExcel(inputStream, AssetAdMaterialSporadicSettlementImport.class, importParams);
            validateFields(list);
            uploadToOss(list);
            //保存
            AssetAdMaterialSporadicSettlement assetAdMaterialSporadicSettlement = BeanUtil.copyProperties(dto, AssetAdMaterialSporadicSettlement.class);
            assetAdMaterialSporadicSettlement.setCreateBy(SecurityUtils.getLoginUser().getUser().getNickName());
            assetAdMaterialSporadicSettlement.setDeptId(Integer.parseInt(SecurityUtils.getLoginUser().getUser().getDeptId()));
            save(assetAdMaterialSporadicSettlement);
            //保存明细
            List<AssetAdMaterialSporadicSettlementInfo> assetAdMaterialSporadicSettlementInfos = BeanUtil.copyToList(list, AssetAdMaterialSporadicSettlementInfo.class);
            assetAdMaterialSporadicSettlementInfos.forEach(item -> item.setAdMaterialSporadicSettlementId(assetAdMaterialSporadicSettlement.getId()));
            assetAdMaterialSporadicSettlementInfoService.saveBatch(assetAdMaterialSporadicSettlementInfos);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    private void validateFields(List<AssetAdMaterialSporadicSettlementImport> list) {
        Optional<AssetAdMaterialSporadicSettlementImport> any = list.stream()
                .filter(item -> StringUtils.isBlank(item.getAdName())).findAny();
        if (any.isPresent()) {
            throw new ServiceException("【名称】不能为空,请检查该列是否填写完整");
        }
        Optional<AssetAdMaterialSporadicSettlementImport> quantityOpt = list.stream()
                .filter(item -> Objects.isNull(item.getQuantity())).findAny();
        if (quantityOpt.isPresent()) {
            throw new ServiceException("【数量】不能为空,请检查该列是否填写完整");
        }
        Optional<AssetAdMaterialSporadicSettlementImport> priceOpt = list.stream()
                .filter(item -> Objects.isNull(item.getUnitPrice())).findAny();
        if (priceOpt.isPresent()) {
            throw new ServiceException("【单价】不能为空,请检查该列是否填写完整");
        }
    }
    /**
     * 文件转存
     * @param list
     */
    private void uploadToOss(List<AssetAdMaterialSporadicSettlementImport> list) {
        //遍历每一条数据
        for (AssetAdMaterialSporadicSettlementImport settlementImport : list) {
            if (StringUtils.isNotEmpty(settlementImport.getDesignLegendTemp())) {
                String ossUrl = getOssUrl(settlementImport.getDesignLegendTemp());
                settlementImport.setDesignLegend(ossUrl);
            }
            if (StringUtils.isNotEmpty(settlementImport.getInstallationLegendTemp())) {
                String ossUrl = getOssUrl(settlementImport.getInstallationLegendTemp());
                settlementImport.setInstallationLegend(ossUrl);
            }
        }
        //删除图片缓存
        for (AssetAdMaterialSporadicSettlementImport settlementImport : list) {
            if (StringUtils.isNotEmpty(settlementImport.getDesignLegendTemp())) {
                deleteImageCache(settlementImport.getDesignLegendTemp());
            }
            if (StringUtils.isNotEmpty(settlementImport.getInstallationLegendTemp())) {
                deleteImageCache(settlementImport.getInstallationLegendTemp());
            }
        }
    }
    private String getOssUrl(String filePath) {
        try {
            //获取到暂存的文件
            File tmpFile = new File(filePath);
            FileInputStream fileInputStream = new FileInputStream(tmpFile);
            //转换为 multipartFile 类
            return ossService.uploadByInputStream(fileInputStream);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    private void deleteImageCache(String filePath) {
        //获取到暂存的文件
        File tmpFile = new File(filePath);
        if (tmpFile.exists() && tmpFile.isFile()) {
            tmpFile.delete();
        }
    }
}