From 9cd4074a456fd5c422506279191b6015836347e5 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期五, 30 十月 2026 10:08:35 +0800
Subject: [PATCH] feat: 设备台账启用状态、审批签核展示与导入健壮性

---
 src/main/java/com/ruoyi/device/service/impl/DeviceLedgerServiceImpl.java |  122 +++++++++++++++++++++++++++++++++-------
 1 files changed, 100 insertions(+), 22 deletions(-)

diff --git a/src/main/java/com/ruoyi/device/service/impl/DeviceLedgerServiceImpl.java b/src/main/java/com/ruoyi/device/service/impl/DeviceLedgerServiceImpl.java
index b4c5d65..bce327f 100644
--- a/src/main/java/com/ruoyi/device/service/impl/DeviceLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/device/service/impl/DeviceLedgerServiceImpl.java
@@ -4,6 +4,7 @@
 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.exception.ServiceException;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.bean.BeanUtils;
@@ -12,6 +13,9 @@
 import com.ruoyi.device.execl.DeviceLedgerExeclDto;
 import com.ruoyi.device.mapper.DeviceLedgerMapper;
 import com.ruoyi.device.pojo.DeviceLedger;
+import com.ruoyi.basic.dto.StorageAttachmentDTO;
+import com.ruoyi.basic.enums.RecordTypeEnum;
+import com.ruoyi.basic.service.StorageAttachmentService;
 import com.ruoyi.device.service.IDeviceLedgerService;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.project.system.domain.SysUser;
@@ -20,6 +24,7 @@
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
@@ -36,6 +41,7 @@
 
     private final DeviceLedgerMapper deviceLedgerMapper;
     private final SysUserMapper sysUserMapper;
+    private final StorageAttachmentService storageAttachmentService;
 
     @Override
     public IPage<DeviceLedgerDto> queryPage(Page page, DeviceLedgerDto deviceLedger) {
@@ -44,25 +50,66 @@
     }
 
     @Override
-    public AjaxResult saveDeviceLedger(DeviceLedger deviceLedger) {
+    public List<DeviceLedgerDto> selectDeviceOptions(Long areaId) {
+        return deviceLedgerMapper.selectDeviceOptions(areaId);
+    }
+
+    @Override
+    public AjaxResult saveDeviceLedger(DeviceLedgerDto deviceLedgerDto) {
         LambdaQueryWrapper<DeviceLedger> deviceLedgerLambdaQueryWrapper = new LambdaQueryWrapper<>();
-        deviceLedgerLambdaQueryWrapper.eq(DeviceLedger::getDeviceName,deviceLedger.getDeviceName());
+        deviceLedgerLambdaQueryWrapper.eq(DeviceLedger::getDeviceName,deviceLedgerDto.getDeviceName());
         if (this.count(deviceLedgerLambdaQueryWrapper) > 0) {
             return AjaxResult.error("璁惧鍚嶇О宸插瓨鍦�");
         }
+        DeviceLedger deviceLedger = new DeviceLedger();
+        BeanUtils.copyProperties(deviceLedgerDto, deviceLedger);
         boolean save = this.save(deviceLedger);
         if (save){
+            if (deviceLedgerDto.getStorageBlobDTOs() != null) {
+                StorageAttachmentDTO attachmentDTO = new StorageAttachmentDTO();
+                attachmentDTO.setApplication("image");
+                attachmentDTO.setRecordType(RecordTypeEnum.DEVICE_LEDGER.getType());
+                attachmentDTO.setRecordId(deviceLedger.getId());
+                attachmentDTO.setStorageBlobDTOs(deviceLedgerDto.getStorageBlobDTOs());
+                storageAttachmentService.saveStorageAttachment(attachmentDTO);
+            }
             return AjaxResult.success();
         }
         return AjaxResult.error();
     }
 
     @Override
-    public AjaxResult updateDeviceLedger(DeviceLedger deviceLedger) {
+    public AjaxResult updateDeviceLedger(DeviceLedgerDto deviceLedgerDto) {
+        DeviceLedger deviceLedger = new DeviceLedger();
+        BeanUtils.copyProperties(deviceLedgerDto, deviceLedger);
         if (this.updateById(deviceLedger)) {
+            if (deviceLedgerDto.getStorageBlobDTOs() != null) {
+                StorageAttachmentDTO attachmentDTO = new StorageAttachmentDTO();
+                attachmentDTO.setApplication("image");
+                attachmentDTO.setRecordType(RecordTypeEnum.DEVICE_LEDGER.getType());
+                attachmentDTO.setRecordId(deviceLedger.getId());
+                attachmentDTO.setStorageBlobDTOs(deviceLedgerDto.getStorageBlobDTOs());
+                storageAttachmentService.saveStorageAttachment(attachmentDTO);
+            }
             return AjaxResult.success();
         }
         return AjaxResult.error();
+    }
+
+    @Override
+    public DeviceLedgerDto getDeviceLedgerDetail(Long id) {
+        DeviceLedger deviceLedger = this.getById(id);
+        if (deviceLedger != null) {
+            DeviceLedgerDto deviceLedgerDto = new DeviceLedgerDto();
+            BeanUtils.copyProperties(deviceLedger, deviceLedgerDto);
+            StorageAttachmentDTO dto = new StorageAttachmentDTO();
+            dto.setRecordType(RecordTypeEnum.DEVICE_LEDGER.getType());
+            dto.setRecordId(id);
+            dto.setApplication("image");
+            deviceLedgerDto.setStorageBlobVOs(storageAttachmentService.list(dto));
+            return deviceLedgerDto;
+        }
+        return null;
     }
 
     @Override
@@ -82,9 +129,7 @@
             util.exportExcel(response, deviceLedgerExeclDtos, "璁惧鍙拌处瀵煎嚭");
         }else  {
             ArrayList<Long> arrayList = new ArrayList<>();
-            Arrays.stream(ids).map(id -> {
-                return arrayList.add( id);
-            });
+            Arrays.stream(ids).map(arrayList::add);
             List<DeviceLedger> supplierManageList = deviceLedgerMapper.selectBatchIds(arrayList);
             ArrayList<DeviceLedgerExeclDto> deviceLedgerExeclDtos = new ArrayList<>();
             supplierManageList.stream().forEach(deviceLedger -> {
@@ -100,26 +145,59 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Boolean importData(MultipartFile file) throws IOException {
         ExcelUtil<DeviceLedgerExeclDto> util = new ExcelUtil<DeviceLedgerExeclDto>(DeviceLedgerExeclDto.class);
         List<DeviceLedgerExeclDto> userList = util.importExcel(file.getInputStream());
-        userList.forEach(c -> {
-            DeviceLedger deviceLedger = new DeviceLedger();
-            SysUser sysUser = sysUserMapper.selectUserByUserName(c.getCreateUser());
-            if (sysUser!=null) {
-                deviceLedger.setCreateUser(sysUser.getUserId().intValue());
-            }else {
-                deviceLedger.setCreateUser(SecurityUtils.getUserId().intValue());
+        if (userList == null || userList.isEmpty()) {
+            // 琛ㄥご涓庢ā鏉夸笉涓�鑷存椂瑙f瀽涓嶅埌浠讳綍鏁版嵁锛屾槑纭彁绀猴紝閬垮厤鍓嶇鍙湅鍒扳�滃鍏ユ垚鍔熲�濆嵈娌℃湁浠讳綍鏁版嵁
+            throw new ServiceException("鏈鍙栧埌鍙鍏ョ殑鏁版嵁锛岃纭鏂囦欢琛ㄥご涓庡鍏ユā鏉夸竴鑷村悗閲嶈瘯");
+        }
+        int importCount = 0;
+        for (int i = 0; i < userList.size(); i++) {
+            DeviceLedgerExeclDto c = userList.get(i);
+            if (c == null) {
+                continue;
             }
-            BeanUtils.copyProperties(c,deviceLedger);
-            // 閫氳繃鍚◣鍗曚环銆佹暟閲忋�佺◣鐜囪绠楀惈绋庢�讳环锛屼笉鍚◣鎬讳环
-            deviceLedger.setTaxIncludingPriceTotal(c.getTaxIncludingPriceUnit());
-            deviceLedger.setNumber(BigDecimal.ONE);
-            deviceLedger.setPlanRuntimeTime(DateUtils.toLocalDate(c.getPlanRuntimeTime()));
-            deviceLedger.setUnTaxIncludingPriceTotal(deviceLedger.getTaxIncludingPriceTotal().divide(BigDecimal.ONE.add(c.getTaxRate()),2, RoundingMode.HALF_UP));
-            deviceLedgerMapper.insert(deviceLedger);
-        });
-
+            DeviceLedger deviceLedger;
+            try {
+                deviceLedger = buildDeviceLedger(c);
+            } catch (Exception e) {
+                throw new ServiceException("绗�" + (i + 2) + "琛屾暟鎹湁璇細" + e.getMessage());
+            }
+            try {
+                deviceLedgerMapper.insert(deviceLedger);
+            } catch (Exception e) {
+                throw new ServiceException("绗�" + (i + 2) + "琛屼繚瀛樺け璐ワ細" + e.getMessage());
+            }
+            importCount++;
+        }
+        if (importCount == 0) {
+            throw new ServiceException("鏈鍙栧埌鍙鍏ョ殑鏁版嵁锛岃纭鏂囦欢琛ㄥご涓庡鍏ユā鏉夸竴鑷村悗閲嶈瘯");
+        }
         return true;
     }
+
+    /**
+     * 灏嗗鍏ヨ杞崲涓鸿澶囧彴璐﹀疄浣�
+     */
+    private DeviceLedger buildDeviceLedger(DeviceLedgerExeclDto c) {
+        DeviceLedger deviceLedger = new DeviceLedger();
+        SysUser sysUser = sysUserMapper.selectUserByUserName(c.getCreateUser());
+        if (sysUser != null) {
+            deviceLedger.setCreateUser(sysUser.getUserId().intValue());
+        } else {
+            deviceLedger.setCreateUser(SecurityUtils.getUserId().intValue());
+        }
+        BeanUtils.copyProperties(c, deviceLedger);
+        // 閫氳繃鍚◣鍗曚环銆佹暟閲忋�佺◣鐜囪绠楀惈绋庢�讳环锛屼笉鍚◣鎬讳环
+        deviceLedger.setTaxIncludingPriceTotal(c.getTaxIncludingPriceUnit());
+        deviceLedger.setNumber(BigDecimal.ONE);
+        deviceLedger.setPlanRuntimeTime(DateUtils.toLocalDate(c.getPlanRuntimeTime()));
+        // 璁$畻涓嶅惈绋庢�讳环锛屽鐞嗙┖鍊兼儏鍐�
+        if (deviceLedger.getTaxIncludingPriceTotal() != null && c.getTaxRate() != null) {
+            deviceLedger.setUnTaxIncludingPriceTotal(deviceLedger.getTaxIncludingPriceTotal().divide(BigDecimal.ONE.add(c.getTaxRate()), 2, RoundingMode.HALF_UP));
+        }
+        return deviceLedger;
+    }
 }

--
Gitblit v1.9.3