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.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.AssetAdMaterialIntegralSettlementDTO;
|
import com.ruoyi.system.dto.asset.AssetAdMaterialIntegralSettlementImportDTO;
|
import com.ruoyi.system.export.AssetAdMaterialIntegralSettlementInfoImport;
|
import com.ruoyi.system.mapper.AssetAdMaterialIntegralSettlementMapper;
|
import com.ruoyi.system.model.AssetAdMaterialIntegralSettlement;
|
import com.ruoyi.system.model.AssetAdMaterialIntegralSettlementInfo;
|
import com.ruoyi.system.query.AssetAdMaterialIntegralSettlementQuery;
|
import com.ruoyi.system.service.AssetAdMaterialIntegralSettlementInfoService;
|
import com.ruoyi.system.service.AssetAdMaterialIntegralSettlementService;
|
import com.ruoyi.system.service.ISysUserService;
|
import com.ruoyi.system.service.OssService;
|
import com.ruoyi.system.vo.asset.AssetAdMaterialIntegralSettlementDetailVO;
|
import com.ruoyi.system.vo.asset.AssetAdMaterialIntegralSettlementVO;
|
import lombok.Cleanup;
|
import lombok.RequiredArgsConstructor;
|
import lombok.extern.slf4j.Slf4j;
|
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
|
*/
|
@Slf4j
|
@Service
|
@RequiredArgsConstructor(onConstructor_ = {@Lazy})
|
public class AssetAdMaterialIntegralSettlementServiceImpl extends ServiceImpl<AssetAdMaterialIntegralSettlementMapper, AssetAdMaterialIntegralSettlement> implements AssetAdMaterialIntegralSettlementService {
|
|
private final ISysUserService sysUserService;
|
private final OssService ossService;
|
private final AssetAdMaterialIntegralSettlementInfoService assetAdMaterialIntegralSettlementInfoService;
|
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public void importData(MultipartFile file, AssetAdMaterialIntegralSettlementImportDTO dto) {
|
try {
|
ImportParams importParams = new ImportParams();
|
importParams.setTitleRows(0);
|
importParams.setHeadRows(1);
|
@Cleanup
|
InputStream inputStream = file.getInputStream();
|
List<AssetAdMaterialIntegralSettlementInfoImport> list = ExcelImportUtil.importExcel(inputStream, AssetAdMaterialIntegralSettlementInfoImport.class, importParams);
|
validateFields(list);
|
uploadToOss(list);
|
// 保存主表
|
AssetAdMaterialIntegralSettlement assetAdMaterialIntegralSettlement = BeanUtil.copyProperties(dto, AssetAdMaterialIntegralSettlement.class);
|
assetAdMaterialIntegralSettlement.setTotalAmount(calculateTotalAmount(list));
|
assetAdMaterialIntegralSettlement.setCreateBy(SecurityUtils.getLoginUser().getUser().getNickName());
|
assetAdMaterialIntegralSettlement.setDeptId(Integer.parseInt(SecurityUtils.getLoginUser().getUser().getDeptId()));
|
save(assetAdMaterialIntegralSettlement);
|
// 保存明细
|
List<AssetAdMaterialIntegralSettlementInfo> assetAdMaterialIntegralSettlementInfos = BeanUtil.copyToList(list, AssetAdMaterialIntegralSettlementInfo.class);
|
assetAdMaterialIntegralSettlementInfos.forEach(item -> item.setAdMaterialIntegralSettlementId(assetAdMaterialIntegralSettlement.getId()));
|
assetAdMaterialIntegralSettlementInfoService.saveBatch(assetAdMaterialIntegralSettlementInfos);
|
} catch (Exception e) {
|
throw new RuntimeException(e);
|
}
|
}
|
private BigDecimal calculateTotalAmount(List<AssetAdMaterialIntegralSettlementInfoImport> 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<AssetAdMaterialIntegralSettlementInfoImport> list) {
|
Optional<AssetAdMaterialIntegralSettlementInfoImport> any = list.stream()
|
.filter(item -> StringUtils.isBlank(item.getAdName())).findAny();
|
if (any.isPresent()) {
|
throw new ServiceException("【名称】不能为空,请检查该列是否填写完整");
|
}
|
Optional<AssetAdMaterialIntegralSettlementInfoImport> quantityOpt = list.stream()
|
.filter(item -> Objects.isNull(item.getQuantity())).findAny();
|
if (quantityOpt.isPresent()) {
|
throw new ServiceException("【数量】不能为空,请检查该列是否填写完整");
|
}
|
Optional<AssetAdMaterialIntegralSettlementInfoImport> subtotalOpt = list.stream()
|
.filter(item -> Objects.isNull(item.getSubtotal())).findAny();
|
if (subtotalOpt.isPresent()) {
|
throw new ServiceException("【小计】不能为空,请检查该列是否填写完整");
|
}
|
Optional<AssetAdMaterialIntegralSettlementInfoImport> priceOpt = list.stream()
|
.filter(item -> Objects.isNull(item.getUnitPrice())).findAny();
|
if (priceOpt.isPresent()) {
|
throw new ServiceException("【单价】不能为空,请检查该列是否填写完整");
|
}
|
}
|
|
/**
|
* 文件转存
|
* @param list
|
*/
|
private void uploadToOss(List<AssetAdMaterialIntegralSettlementInfoImport> list) {
|
// 遍历每一条数据
|
for (AssetAdMaterialIntegralSettlementInfoImport 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 (AssetAdMaterialIntegralSettlementInfoImport 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);
|
// 上传oss
|
return ossService.uploadByInputStream(fileInputStream);
|
} catch (Exception e) {
|
log.error("广告物料整体项目结算表导入图片上传oss异常", e);
|
}
|
return null;
|
}
|
|
private void deleteImageCache(String filePath) {
|
// 获取到暂存的文件
|
File tmpFile = new File(filePath);
|
if (tmpFile.exists() && tmpFile.isFile()) {
|
tmpFile.delete();
|
}
|
}
|
|
@Override
|
public IPage<AssetAdMaterialIntegralSettlementVO> getPageList(AssetAdMaterialIntegralSettlementQuery 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的分页查询方法
|
return baseMapper.getPageList(query);
|
}
|
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public Boolean add(AssetAdMaterialIntegralSettlementDTO dto) {
|
AssetAdMaterialIntegralSettlement assetAdMaterialIntegralSettlement = BeanUtil.copyProperties(dto, AssetAdMaterialIntegralSettlement.class);
|
assetAdMaterialIntegralSettlement.setCreateBy(SecurityUtils.getLoginUser().getUser().getNickName());
|
assetAdMaterialIntegralSettlement.setDeptId(Integer.parseInt(SecurityUtils.getLoginUser().getUser().getDeptId()));
|
save(assetAdMaterialIntegralSettlement);
|
// 保存明细
|
List<AssetAdMaterialIntegralSettlementInfo> assetAdMaterialIntegralSettlementInfos = BeanUtil.copyToList(dto.getInfos(), AssetAdMaterialIntegralSettlementInfo.class);
|
assetAdMaterialIntegralSettlementInfos.forEach(item -> item.setAdMaterialIntegralSettlementId(assetAdMaterialIntegralSettlement.getId()));
|
return assetAdMaterialIntegralSettlementInfoService.saveBatch(assetAdMaterialIntegralSettlementInfos);
|
}
|
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public Boolean edit(AssetAdMaterialIntegralSettlementDTO dto) {
|
if (Objects.isNull(dto.getId())) {
|
throw new ServiceException("ID不能为空");
|
}
|
AssetAdMaterialIntegralSettlement assetAdMaterialIntegralSettlement = BeanUtil.copyProperties(dto, AssetAdMaterialIntegralSettlement.class);
|
updateById(assetAdMaterialIntegralSettlement);
|
// 删除原有明细
|
assetAdMaterialIntegralSettlementInfoService.lambdaUpdate()
|
.eq(AssetAdMaterialIntegralSettlementInfo::getAdMaterialIntegralSettlementId, dto.getId())
|
.remove();
|
// 保存明细
|
List<AssetAdMaterialIntegralSettlementInfo> assetAdMaterialIntegralSettlementInfos = BeanUtil.copyToList(dto.getInfos(), AssetAdMaterialIntegralSettlementInfo.class);
|
assetAdMaterialIntegralSettlementInfos.forEach(item -> item.setAdMaterialIntegralSettlementId(assetAdMaterialIntegralSettlement.getId()));
|
return assetAdMaterialIntegralSettlementInfoService.saveBatch(assetAdMaterialIntegralSettlementInfos);
|
}
|
|
@Override
|
public Boolean deleteById(Integer id) {
|
// 删除明细
|
assetAdMaterialIntegralSettlementInfoService.lambdaUpdate()
|
.eq(AssetAdMaterialIntegralSettlementInfo::getAdMaterialIntegralSettlementId, id)
|
.remove();
|
return removeById(id);
|
}
|
|
@Override
|
public AssetAdMaterialIntegralSettlementDetailVO getDetail(Integer id) {
|
AssetAdMaterialIntegralSettlement assetAdMaterialIntegralSettlement = getById(id);
|
AssetAdMaterialIntegralSettlementDetailVO vo = BeanUtil.copyProperties(assetAdMaterialIntegralSettlement, AssetAdMaterialIntegralSettlementDetailVO.class);
|
vo.setInfos(assetAdMaterialIntegralSettlementInfoService.lambdaQuery()
|
.eq(AssetAdMaterialIntegralSettlementInfo::getAdMaterialIntegralSettlementId, id)
|
.list());
|
return vo;
|
}
|
}
|