package com.ruoyi.system.service.impl; 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; /** *

* 广告物料零星结算表 服务实现类 *

* * @author mitao * @since 2025-10-17 */ @Service @RequiredArgsConstructor(onConstructor_ = {@Lazy}) public class AssetAdMaterialSporadicSettlementServiceImpl extends ServiceImpl 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 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 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 list) { Optional any = list.stream() .filter(item -> StringUtils.isBlank(item.getAdName())).findAny(); if (any.isPresent()) { throw new ServiceException("【名称】不能为空,请检查该列是否填写完整"); } Optional quantityOpt = list.stream() .filter(item -> Objects.isNull(item.getQuantity())).findAny(); if (quantityOpt.isPresent()) { throw new ServiceException("【数量】不能为空,请检查该列是否填写完整"); } Optional priceOpt = list.stream() .filter(item -> Objects.isNull(item.getUnitPrice())).findAny(); if (priceOpt.isPresent()) { throw new ServiceException("【单价】不能为空,请检查该列是否填写完整"); } } /** * 文件转存 * @param list */ private void uploadToOss(List 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(); } } }