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.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>
|
* 广告物料零星结算表 服务实现类
|
* </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;
|
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;
|
}
|
}
|