From 42131eb034e559dc361fe75d653e4d904aa6a316 Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期四, 23 十月 2025 17:51:32 +0800
Subject: [PATCH] 保修详情增加资产类型名称字段

---
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetAdMaterialSporadicSettlementServiceImpl.java |  212 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 209 insertions(+), 3 deletions(-)

diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetAdMaterialSporadicSettlementServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetAdMaterialSporadicSettlementServiceImpl.java
index 5936b4a..211858c 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetAdMaterialSporadicSettlementServiceImpl.java
+++ b/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;
+    }
 }

--
Gitblit v1.7.1