| | |
| | | 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> |
| | |
| | | * @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; |
| | | } |
| | | } |