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();
}
}
}