From 9f3a45da6d1dc9c71187f15131665eb9806f5588 Mon Sep 17 00:00:00 2001
From: maven <2163098428@qq.com>
Date: 星期二, 28 十月 2025 15:58:03 +0800
Subject: [PATCH] yys 1.修改配置文件 2.增加模板

---
 src/main/java/com/ruoyi/inspectiontask/service/impl/QrCodeScanRecordServiceImpl.java |  194 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 194 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/ruoyi/inspectiontask/service/impl/QrCodeScanRecordServiceImpl.java b/src/main/java/com/ruoyi/inspectiontask/service/impl/QrCodeScanRecordServiceImpl.java
new file mode 100644
index 0000000..5ac3038
--- /dev/null
+++ b/src/main/java/com/ruoyi/inspectiontask/service/impl/QrCodeScanRecordServiceImpl.java
@@ -0,0 +1,194 @@
+package com.ruoyi.inspectiontask.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.basic.dto.StorageBlobDTO;
+import com.ruoyi.basic.mapper.StorageAttachmentMapper;
+import com.ruoyi.basic.mapper.StorageBlobMapper;
+import com.ruoyi.basic.pojo.StorageAttachment;
+import com.ruoyi.basic.pojo.StorageBlob;
+import com.ruoyi.basic.service.StorageAttachmentService;
+import com.ruoyi.common.constant.StorageAttachmentConstants;
+import com.ruoyi.common.utils.MinioUtils;
+import com.ruoyi.common.utils.bean.BeanUtils;
+import com.ruoyi.inspectiontask.dto.QrCodeScanRecordDto;
+import com.ruoyi.inspectiontask.mapper.QrCodeMapper;
+import com.ruoyi.inspectiontask.mapper.QrCodeScanRecordMapper;
+import com.ruoyi.inspectiontask.pojo.QrCode;
+import com.ruoyi.inspectiontask.pojo.QrCodeScanRecord;
+import com.ruoyi.inspectiontask.service.QrCodeScanRecordService;
+import com.ruoyi.project.system.domain.SysUser;
+import com.ruoyi.project.system.mapper.SysUserMapper;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import static com.ruoyi.common.constant.StorageAttachmentConstants.StorageAttachmentFile;
+import static com.ruoyi.common.enums.StorageAttachmentRecordType.QrCodeScanRecords;
+
+/**
+ * @author :yys
+ * @date : 2025/9/19 10:54
+ */
+@Service
+@Slf4j
+public class QrCodeScanRecordServiceImpl extends ServiceImpl<QrCodeScanRecordMapper, QrCodeScanRecord> implements QrCodeScanRecordService {
+
+    @Autowired
+    private QrCodeScanRecordMapper qrCodeScanRecordMapper;
+
+    @Autowired
+    private QrCodeMapper qrCodeMapper;
+
+    @Autowired
+    private StorageAttachmentService storageAttachmentService;
+
+    @Autowired
+    private StorageBlobMapper storageBlobMapper;
+
+    @Autowired
+    private StorageAttachmentMapper storageAttachmentMapper;
+
+    @Autowired
+    private MinioUtils minioUtils;
+
+    @Autowired
+    private SysUserMapper sysUserMapper;
+
+    @Override
+    public IPage<QrCodeScanRecordDto> selectQrCodeScanRecordList(Page<QrCodeScanRecord> page, QrCodeScanRecordDto qrCodeScanRecordDto) {
+        // 1. 鏋勫缓鍩虹鏌ヨ鏉′欢
+        LambdaQueryWrapper<QrCodeScanRecord> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.orderByDesc(QrCodeScanRecord::getCreateTime);
+
+        // 2. 鎵ц鍒嗛〉鏌ヨ
+        IPage<QrCodeScanRecord> scanRecordIPage = qrCodeScanRecordMapper.selectPage(page, queryWrapper);
+
+        // 3. 鏃犳暟鎹彁鍓嶈繑鍥�
+        if (CollectionUtils.isEmpty(scanRecordIPage.getRecords())) {
+            return new Page<>(scanRecordIPage.getCurrent(), scanRecordIPage.getSize(), scanRecordIPage.getTotal());
+        }
+
+        // 4. 鎵归噺鑾峰彇鎵�鏈夎褰旾D鍜屼簩缁寸爜ID
+        List<Long> recordIds = scanRecordIPage.getRecords().stream()
+                .map(QrCodeScanRecord::getId)
+                .collect(Collectors.toList());
+
+        Set<Long> qrCodeIds = scanRecordIPage.getRecords().stream()
+                .map(QrCodeScanRecord::getQrCodeId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+
+        // 5. 鎵归噺鏌ヨ鍏宠仈鏁版嵁锛堜娇鐢ㄦ渶鏂癆PI锛�
+        // 5.1 鏌ヨ浜岀淮鐮佷俊鎭紙鏇挎崲selectBatchIds涓簊electByIds锛�
+        Map<Long, QrCode> qrCodeMap = qrCodeIds.isEmpty()
+                ? Collections.emptyMap()
+                : qrCodeMapper.selectBatchIds(qrCodeIds).stream()
+                .collect(Collectors.toMap(QrCode::getId, Function.identity()));
+
+        // 5.2 鏌ヨ闄勪欢鍏宠仈鍏崇郴
+        Map<Long, List<StorageAttachment>> attachmentsMap = storageAttachmentMapper
+                .selectList(new LambdaQueryWrapper<StorageAttachment>()
+                        .in(StorageAttachment::getRecordId, recordIds)
+                        .eq(StorageAttachment::getRecordType, QrCodeScanRecords.ordinal()))
+                .stream()
+                .collect(Collectors.groupingBy(StorageAttachment::getRecordId));
+
+        // 5.3 鏌ヨ鏂囦欢鏁版嵁锛堜娇鐢╯electByIds锛�
+        Set<Long> blobIds = attachmentsMap.values().stream()
+                .flatMap(List::stream)
+                .map(StorageAttachment::getStorageBlobId)
+                .collect(Collectors.toSet());
+
+        Map<Long, StorageBlob> blobMap = blobIds.isEmpty()
+                ? Collections.emptyMap()
+                : storageBlobMapper.selectBatchIds(blobIds).stream()
+                .collect(Collectors.toMap(StorageBlob::getId, Function.identity()));
+
+        // 6. 缁勮DTO鏁版嵁
+        List<QrCodeScanRecordDto> dtoList = scanRecordIPage.getRecords().stream().map(record -> {
+            QrCodeScanRecordDto dto = new QrCodeScanRecordDto();
+            BeanUtils.copyProperties(record, dto);
+
+            SysUser sysUser = sysUserMapper.selectUserById(record.getScannerId());
+            dto.setScanner(sysUser.getNickName());
+
+            // 6.1 璁剧疆浜岀淮鐮佷俊鎭�
+            Optional.ofNullable(qrCodeMap.get(record.getQrCodeId()))
+                    .ifPresent(qrCode -> {
+                        BeanUtils.copyProperties(qrCode, dto); // 澶嶅埗鍒扮埗绫�
+                        dto.setQrCode(qrCode); // 璁剧疆瀹屾暣瀵硅薄
+                    });
+
+            // 6.2 璁剧疆闄勪欢淇℃伅
+            dto.setStorageBlobDTO(
+                    Optional.ofNullable(attachmentsMap.get(record.getId()))
+                            .orElse(Collections.emptyList())
+                            .stream()
+                            .map(att -> {
+                                StorageBlobDTO blobDTO = new StorageBlobDTO();
+                                Optional.ofNullable(blobMap.get(att.getStorageBlobId()))
+                                        .ifPresent(blob -> {
+                                            BeanUtils.copyProperties(blob, blobDTO);
+                                            blobDTO.setUrl(minioUtils.getPreviewUrls(blob.getBucketFilename(), blob.getBucketName(), true));
+                                            blobDTO.setDownloadUrl(minioUtils.getDownloadUrls(blob.getBucketFilename(),blob.getBucketName(),blob.getOriginalFilename(),true));
+                                        });
+                                return blobDTO;
+                            })
+                            .filter(blobDTO -> blobDTO.getId() != null) // 杩囨护鏃犳晥闄勪欢
+                            .collect(Collectors.toList())
+            );
+            return dto;
+        }).collect(Collectors.toList());
+
+        // 7. 鏋勫缓杩斿洖鍒嗛〉瀵硅薄
+        IPage<QrCodeScanRecordDto> resultPage = new Page<>();
+        BeanUtils.copyProperties(scanRecordIPage, resultPage);
+        resultPage.setRecords(dtoList);
+
+        return resultPage;
+    }
+
+    @Override
+    public int addOrEditQrCodeRecord(QrCodeScanRecordDto qrCodeScanRecordDto) {
+        QrCodeScanRecord qrCodeScanRecord = new QrCodeScanRecord();
+        BeanUtils.copyProperties(qrCodeScanRecordDto, qrCodeScanRecord);
+        int i;
+        if (Objects.isNull(qrCodeScanRecordDto.getId())) {
+            i = qrCodeScanRecordMapper.insert(qrCodeScanRecord);
+        } else {
+            i = qrCodeScanRecordMapper.updateById(qrCodeScanRecord);
+        }
+
+        if (qrCodeScanRecordDto.getStorageBlobDTO() != null && !qrCodeScanRecordDto.getStorageBlobDTO().isEmpty()) {
+            List<StorageAttachment> attachments = new ArrayList<>();
+
+            for (StorageBlobDTO storageBlobDTO : qrCodeScanRecordDto.getStorageBlobDTO()) {
+                StorageAttachment storageAttachment = new StorageAttachment(
+                        StorageAttachmentFile,
+                        (long) QrCodeScanRecords.ordinal(),
+                        qrCodeScanRecord.getId()
+                );
+                storageAttachment.setStorageBlobDTO(storageBlobDTO);
+                attachments.add(storageAttachment);
+            }
+            storageAttachmentService.saveStorageAttachment(attachments, qrCodeScanRecord.getId(), QrCodeScanRecords, StorageAttachmentFile);
+        }
+        return i;
+    }
+
+    @Override
+    public int delByIds(Long[] ids) {
+        return qrCodeScanRecordMapper.deleteBatchIds(Arrays.asList(ids));
+    }
+
+}
\ No newline at end of file

--
Gitblit v1.9.3