mitao
2 天以前 e8e30e5474c1fd0c14390710066e40c17155ad37
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
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;
 
/**
 * <p>
 * 广告物料零星结算表 服务实现类
 * </p>
 *
 * @author mitao
 * @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();
        }
    }
}