mitao
昨天 42131eb034e559dc361fe75d653e4d904aa6a316
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetAdMaterialSporadicSettlementServiceImpl.java
@@ -1,10 +1,43 @@
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.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
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.constants.AssetDeptConstant;
import com.ruoyi.system.dto.asset.AssetAdMaterialSporadicSettlementDTO;
import com.ruoyi.system.dto.asset.AssetAdMaterialSporadicSettlementImportDTO;
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.query.AssetAdMaterialSporadicSettlementQuery;
import com.ruoyi.system.service.AssetAdMaterialSporadicSettlementInfoService;
import com.ruoyi.system.service.AssetAdMaterialSporadicSettlementService;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.system.service.OssService;
import com.ruoyi.system.vo.asset.AssetAdMaterialSporadicSettlementDetailVO;
import com.ruoyi.system.vo.asset.AssetAdMaterialSporadicSettlementVO;
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.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
/**
 * <p>
@@ -15,6 +48,179 @@
 * @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;
    private final ISysUserService sysUserService;
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void importData(MultipartFile file, AssetAdMaterialSporadicSettlementImportDTO 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.setTotalAmount(calculateTotalAmount(list));
            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 BigDecimal calculateTotalAmount(List<AssetAdMaterialSporadicSettlementImport> list) {
        return list.stream().map(item -> BigDecimal.valueOf(item.getQuantity())
                        .multiply(item.getUnitPrice()).setScale(2, RoundingMode.HALF_UP))
                .reduce(BigDecimal.ZERO, BigDecimal::add);
    }
    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();
        }
    }
    @Override
    public IPage<AssetAdMaterialSporadicSettlementVO> getPageList(AssetAdMaterialSporadicSettlementQuery query) {
        // 数据权限:超级管理员/资产管理部查看所有数据,其他部门查看当前及下级部门的数据
        Long userId = SecurityUtils.getUserId();
        boolean isAdmin = SecurityUtils.isAdmin(userId);
        if (!isAdmin) {
            try {
                // 获取当前用户的部门名称
                String deptName = sysUserService.selectUserById(userId).getDeptName();
                // 非超级管理员且非资产管理部,设置部门权限
                if (!AssetDeptConstant.ASSET_INVENTORY_DEPT_NAMES.contains(deptName)) {
                    query.setDeptId(Integer.valueOf(SecurityUtils.getLoginUser().getDeptId()));
                }
            } catch (Exception e) {
                // 如果获取部门信息失败,默认设置部门权限
                try {
                    query.setDeptId(Integer.valueOf(SecurityUtils.getLoginUser().getDeptId()));
                } catch (Exception ex) {
                    // ignore parse, leave null if cannot parse
                }
            }
        }
        // 直接使用Mapper的分页查询方法
        Page<AssetAdMaterialSporadicSettlementVO> page = new Page<>(query.getPageNum(), query.getPageSize());
        return baseMapper.getPageList(query);
    }
    @Transactional(rollbackFor = Exception.class)
    @Override
    public Boolean add(AssetAdMaterialSporadicSettlementDTO dto) {
        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(dto.getInfos(), AssetAdMaterialSporadicSettlementInfo.class);
        assetAdMaterialSporadicSettlementInfos.forEach(item -> item.setAdMaterialSporadicSettlementId(assetAdMaterialSporadicSettlement.getId()));
      return assetAdMaterialSporadicSettlementInfoService.saveBatch(assetAdMaterialSporadicSettlementInfos);
    }
    @Transactional(rollbackFor = Exception.class)
    @Override
    public Boolean edit(AssetAdMaterialSporadicSettlementDTO dto) {
        if (Objects.isNull(dto.getId())) {
            throw new ServiceException("ID不能为空");
        }
        AssetAdMaterialSporadicSettlement assetAdMaterialSporadicSettlement = BeanUtil.copyProperties(dto, AssetAdMaterialSporadicSettlement.class);
        updateById(assetAdMaterialSporadicSettlement);
        //删除原有明细
        assetAdMaterialSporadicSettlementInfoService.removeBySettlementId(dto.getId());
        //保存明细
        List<AssetAdMaterialSporadicSettlementInfo> assetAdMaterialSporadicSettlementInfos = BeanUtil.copyToList(dto.getInfos(), AssetAdMaterialSporadicSettlementInfo.class);
        assetAdMaterialSporadicSettlementInfos.forEach(item -> item.setAdMaterialSporadicSettlementId(assetAdMaterialSporadicSettlement.getId()));
       return assetAdMaterialSporadicSettlementInfoService.saveBatch(assetAdMaterialSporadicSettlementInfos);
    }
    @Override
    public Boolean deleteById(Integer id) {
        //删除明细
        assetAdMaterialSporadicSettlementInfoService.removeBySettlementId(id);
        return removeById(id);
    }
    @Override
    public AssetAdMaterialSporadicSettlementDetailVO getDetail(Integer id) {
        AssetAdMaterialSporadicSettlement assetAdMaterialSporadicSettlement = getById(id);
        AssetAdMaterialSporadicSettlementDetailVO vo = BeanUtil.copyProperties(assetAdMaterialSporadicSettlement, AssetAdMaterialSporadicSettlementDetailVO.class);
        vo.setInfos(assetAdMaterialSporadicSettlementInfoService.getBySettlementId(id));
        return vo;
    }
}