From 71fba5328a35b449b11088e540932787220f91d8 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期三, 18 六月 2025 17:28:50 +0800
Subject: [PATCH] 1.生产加工变更库存回滚 2.巡检,档案上传完善

---
 ruoyi-common/src/main/java/com/ruoyi/basic/service/StorageBlobService.java                   |    2 
 main-business/src/main/java/com/ruoyi/business/entity/InspectionTask.java                    |   94 +-
 ruoyi-common/src/main/java/com/ruoyi/basic/service/impl/StorageBlobServiceImpl.java          |   47 +
 main-business/src/main/java/com/ruoyi/business/service/impl/ArchiveServiceImpl.java          |  126 ++++
 ruoyi-common/src/main/java/com/ruoyi/basic/entity/dto/StorageBlobDTO.java                    |    2 
 ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml                              |    5 
 main-business/src/main/java/com/ruoyi/business/service/InspectionTaskService.java            |    8 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java              |   24 
 main-business/src/main/java/com/ruoyi/business/service/impl/InspectionTaskServiceImpl.java   |  170 +++++++
 main-business/src/main/java/com/ruoyi/business/dto/ArchiveDto.java                           |    7 
 main-business/src/main/resources/mapper/OfficialInventoryMapper.xml                          |    4 
 ruoyi-common/src/main/java/com/ruoyi/common/handler/LocalDateTimeTypeHandler.java            |   67 ++
 ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java              |   33 +
 main-business/src/main/java/com/ruoyi/business/vo/ArchiveVo.java                             |    8 
 ruoyi-common/src/main/java/com/ruoyi/common/enums/StorageAttachmentRecordType.java           |    3 
 ruoyi-common/src/main/java/com/ruoyi/basic/entity/StorageBlob.java                           |   12 
 main-business/src/main/java/com/ruoyi/business/controller/ProductionMasterController.java    |   14 
 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java                     |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java                        |   13 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java             |  111 +--
 main-business/src/main/java/com/ruoyi/business/entity/ProductionMaster.java                  |    2 
 main-business/src/main/java/com/ruoyi/business/controller/InspectionTaskController.java      |   50 +
 main-business/src/main/java/com/ruoyi/business/dto/InspectionTaskDto.java                    |   12 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/SysUserVo.java                                |   12 
 main-business/src/main/java/com/ruoyi/business/service/impl/ProductionMasterServiceImpl.java |  112 ++++
 ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MinioUtils.java                       |  146 +++++
 main-business/src/main/java/com/ruoyi/business/service/ArchiveService.java                   |    2 
 main-business/src/main/java/com/ruoyi/business/controller/ArchiveController.java             |    5 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java             |  270 ++++------
 main-business/src/main/java/com/ruoyi/business/service/ProductionMasterService.java          |    2 
 main-business/src/main/java/com/ruoyi/business/mapper/OfficialInventoryMapper.java           |    5 
 ruoyi-common/src/main/java/com/ruoyi/basic/entity/StorageAttachment.java                     |   35 
 32 files changed, 1,035 insertions(+), 374 deletions(-)

diff --git a/main-business/src/main/java/com/ruoyi/business/controller/ArchiveController.java b/main-business/src/main/java/com/ruoyi/business/controller/ArchiveController.java
index 1e7cefe..4e4ca1a 100644
--- a/main-business/src/main/java/com/ruoyi/business/controller/ArchiveController.java
+++ b/main-business/src/main/java/com/ruoyi/business/controller/ArchiveController.java
@@ -3,7 +3,6 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.business.dto.ArchiveDto;
-import com.ruoyi.business.entity.Archive;
 import com.ruoyi.business.service.ArchiveService;
 import com.ruoyi.common.core.domain.R;
 import lombok.AllArgsConstructor;
@@ -29,8 +28,8 @@
      * 鏌ヨ妗f淇℃伅琛�
      */
     @GetMapping("/list")
-    public R<IPage<Archive>> treeList(Page page, ArchiveDto archiveDto) {
-        IPage<Archive> list = archiveService.selectArchiveList(page, archiveDto);
+    public R<IPage<ArchiveDto>> treeList(Page page, ArchiveDto archiveDto) {
+        IPage<ArchiveDto> list = archiveService.selectArchiveList(page, archiveDto);
         return R.ok(list);
     }
 
diff --git a/main-business/src/main/java/com/ruoyi/business/controller/InspectionTaskController.java b/main-business/src/main/java/com/ruoyi/business/controller/InspectionTaskController.java
index 60d0985..d085f74 100644
--- a/main-business/src/main/java/com/ruoyi/business/controller/InspectionTaskController.java
+++ b/main-business/src/main/java/com/ruoyi/business/controller/InspectionTaskController.java
@@ -1,21 +1,51 @@
 package com.ruoyi.business.controller;
 
-import org.springframework.web.bind.annotation.RequestMapping;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.business.dto.InspectionTaskDto;
+import com.ruoyi.business.service.InspectionTaskService;
+import com.ruoyi.common.core.domain.R;
 import lombok.AllArgsConstructor;
-    import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 /**
-* <p>
-    * 宸℃浠诲姟琛� 鍓嶇鎺у埗鍣�
-    * </p>
-*
-* @author ld
-* @since 2025-06-14
-*/
+ * <p>
+ * 宸℃浠诲姟琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author ld
+ * @since 2025-06-14
+ */
 
 @RestController
 @AllArgsConstructor
 @RequestMapping("/inspectionTask")
-        public class InspectionTaskController {
+public class InspectionTaskController {
+    private InspectionTaskService inspectionTaskService;
 
+    /**
+     * 宸℃浠诲姟琛ㄨ〃鏌ヨ
+     */
+    @GetMapping("/list")
+    public R<IPage<InspectionTaskDto>> list(Page page, InspectionTaskDto inspectionTaskDto) {
+        IPage<InspectionTaskDto> list = inspectionTaskService.selectInspectionTaskList(page,inspectionTaskDto);
+        return R.ok(list);
     }
+
+    /**
+     * 宸℃浠诲姟琛ㄦ柊澧炰慨鏀�
+     */
+    @PostMapping("/addOrEditInspectionTask")
+    public R addOrEditInspectionTask(@RequestBody InspectionTaskDto inspectionTaskDto) {
+        return R.ok(inspectionTaskService.addOrEditInspectionTask(inspectionTaskDto));
+    }
+
+    /**
+     * 宸℃浠诲姟琛ㄥ垹闄�
+     */
+    @DeleteMapping("/delInspectionTask")
+    public R remove(@RequestBody Long[] ids) {
+        return R.ok(inspectionTaskService.delByIds(ids));
+    }
+
+}
diff --git a/main-business/src/main/java/com/ruoyi/business/controller/ProductionMasterController.java b/main-business/src/main/java/com/ruoyi/business/controller/ProductionMasterController.java
index db20a13..7573b84 100644
--- a/main-business/src/main/java/com/ruoyi/business/controller/ProductionMasterController.java
+++ b/main-business/src/main/java/com/ruoyi/business/controller/ProductionMasterController.java
@@ -42,13 +42,21 @@
     }
 
     /**
-     * 鍒犻櫎
+     * 娓呯┖鐢熶骇鏄庣粏搴撳瓨閫夋嫨list
+     */
+    @DeleteMapping("/deleteProductionInventory")
+    public R delOI(@RequestBody ProductionMasterDto productionMasterDto) {
+        return R.ok(productionMasterService.deleteProductionInventory(productionMasterDto));
+    }
+
+
+
+    /**
+     * 鍒犻櫎鐢熶骇涓昏〃(搴撳瓨鍥炴粴锛屾槑缁嗗垹闄�)
      */
     @DeleteMapping("/delPM")
     public R remove(@RequestBody Long[] ids) {
         return R.ok(productionMasterService.delByIds(ids));
     }
-
-
 
 }
diff --git a/main-business/src/main/java/com/ruoyi/business/dto/ArchiveDto.java b/main-business/src/main/java/com/ruoyi/business/dto/ArchiveDto.java
index 0587fc1..dc92a44 100644
--- a/main-business/src/main/java/com/ruoyi/business/dto/ArchiveDto.java
+++ b/main-business/src/main/java/com/ruoyi/business/dto/ArchiveDto.java
@@ -1,6 +1,7 @@
 package com.ruoyi.business.dto;
 
-import com.ruoyi.basic.entity.StorageAttachment;
+import com.ruoyi.basic.entity.StorageBlob;
+import com.ruoyi.basic.entity.dto.StorageBlobDTO;
 import com.ruoyi.business.entity.Archive;
 import lombok.Data;
 
@@ -11,5 +12,7 @@
 
     private Long treeId;
 
-    private List<StorageAttachment> attachments;
+    private List<StorageBlobDTO> storageBlobDTO;
+
+    private List<StorageBlob> attachments;
 }
diff --git a/main-business/src/main/java/com/ruoyi/business/dto/InspectionTaskDto.java b/main-business/src/main/java/com/ruoyi/business/dto/InspectionTaskDto.java
index 38520cb..a5991ef 100644
--- a/main-business/src/main/java/com/ruoyi/business/dto/InspectionTaskDto.java
+++ b/main-business/src/main/java/com/ruoyi/business/dto/InspectionTaskDto.java
@@ -1,8 +1,20 @@
 package com.ruoyi.business.dto;
 
+import com.ruoyi.basic.entity.StorageAttachment;
+import com.ruoyi.basic.entity.dto.StorageBlobDTO;
 import com.ruoyi.business.entity.InspectionTask;
 import lombok.Data;
 
+import java.util.List;
+
 @Data
 public class InspectionTaskDto extends InspectionTask {
+
+    private List<StorageBlobDTO> storageBlobDTO;
+    private List<StorageBlobDTO> beforeProduction;
+    private List<StorageBlobDTO> afterProduction;
+    private List<StorageBlobDTO> productionIssues;
+
+    private List<StorageAttachment> attachments;
+
 }
diff --git a/main-business/src/main/java/com/ruoyi/business/entity/InspectionTask.java b/main-business/src/main/java/com/ruoyi/business/entity/InspectionTask.java
index 866a1c4..8c96c92 100644
--- a/main-business/src/main/java/com/ruoyi/business/entity/InspectionTask.java
+++ b/main-business/src/main/java/com/ruoyi/business/entity/InspectionTask.java
@@ -2,58 +2,58 @@
 
 import com.baomidou.mybatisplus.annotation.*;
 import lombok.Data;
-    import com.ruoyi.common.core.domain.MyBaseEntity;
+import com.ruoyi.common.core.domain.MyBaseEntity;
 
 /**
-* 宸℃浠诲姟琛� 瀹炰綋绫�
-*
-* @author ld
-* @date 2025-06-14
-*/
+ * 宸℃浠诲姟琛� 瀹炰綋绫�
+ *
+ * @author ld
+ * @date 2025-06-14
+ */
 @Data
 @TableName("inspection_task")
 public class InspectionTask extends MyBaseEntity {
 
-private static final long serialVersionUID = 1L;
+    private static final long serialVersionUID = 1L;
 
-        /**
-        * 宸℃浠诲姟鍞竴鏍囪瘑
-        */
-            @TableId(value = "id", type = IdType.AUTO)
-        private Long id;
-        /**
-        * 宸℃浠诲姟鍚嶇О
-        */
-            @TableField(value = "task_name")
-        private String taskName;
-        /**
-        * 
-        */
-            @TableField(value = "inspector_id")
-        private Long inspectorId;
-        /**
-        * 鎵ц宸℃鐨勪汉鍛樺鍚�
-        */
-            @TableField(value = "inspector")
-        private String inspector;
-        /**
-        * 宸℃鍦扮偣璇︾粏鎻忚堪
-        */
-            @TableField(value = "port")
-        private String port;
-        /**
-        * 浠诲姟闄勫姞璇存槑鎴栫壒娈婃儏鍐佃褰�
-        */
-            @TableField(value = "remarks")
-        private String remarks;
-        /**
-        * 
-        */
-            @TableField(value = "registrant_id")
-        private Long registrantId;
-        /**
-        * 浠诲姟鐧昏浜哄鍚�
-        */
-            @TableField(value = "registrant")
-        private String registrant;
+    /**
+     * 宸℃浠诲姟鍞竴鏍囪瘑
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+    /**
+     * 宸℃浠诲姟鍚嶇О
+     */
+    @TableField(value = "task_name")
+    private String taskName;
+    /**
+     *
+     */
+    @TableField(value = "inspector_id")
+    private Long inspectorId;
+    /**
+     * 鎵ц宸℃鐨勪汉鍛樺鍚�
+     */
+    @TableField(value = "inspector")
+    private String inspector;
+    /**
+     * 宸℃鍦扮偣璇︾粏鎻忚堪
+     */
+    @TableField(value = "port")
+    private String port;
+    /**
+     * 浠诲姟闄勫姞璇存槑鎴栫壒娈婃儏鍐佃褰�
+     */
+    @TableField(value = "remarks")
+    private String remarks;
+    /**
+     *
+     */
+    @TableField(value = "registrant_id")
+    private Long registrantId;
+    /**
+     * 浠诲姟鐧昏浜哄鍚�
+     */
+    @TableField(value = "registrant")
+    private String registrant;
 }
\ No newline at end of file
diff --git a/main-business/src/main/java/com/ruoyi/business/entity/ProductionMaster.java b/main-business/src/main/java/com/ruoyi/business/entity/ProductionMaster.java
index caf15b3..aadb2ed 100644
--- a/main-business/src/main/java/com/ruoyi/business/entity/ProductionMaster.java
+++ b/main-business/src/main/java/com/ruoyi/business/entity/ProductionMaster.java
@@ -61,7 +61,7 @@
      *
      */
     @TableField(value = "producer_id")
-    private String producerId;
+    private Long producerId;
     /**
      * 鐢熶骇浜�
      */
diff --git a/main-business/src/main/java/com/ruoyi/business/mapper/OfficialInventoryMapper.java b/main-business/src/main/java/com/ruoyi/business/mapper/OfficialInventoryMapper.java
index fe7895d..17256d2 100644
--- a/main-business/src/main/java/com/ruoyi/business/mapper/OfficialInventoryMapper.java
+++ b/main-business/src/main/java/com/ruoyi/business/mapper/OfficialInventoryMapper.java
@@ -5,6 +5,8 @@
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.math.BigDecimal;
+
 /**
  * <p>
  * 姝e紡搴撳瓨琛� Mapper 鎺ュ彛
@@ -17,4 +19,7 @@
 public interface OfficialInventoryMapper extends BaseMapper<OfficialInventory> {
     // 鑾峰彇姝e紡搴撹褰�
     OfficialInventory getOfficialInventoryForUpdateById(@Param("id") Long id);
+
+    int addInventoryQuantity(@Param("id") Long officialId,
+                             @Param("quantity") BigDecimal adjustAmount);
 }
diff --git a/main-business/src/main/java/com/ruoyi/business/service/ArchiveService.java b/main-business/src/main/java/com/ruoyi/business/service/ArchiveService.java
index 2be2e11..8eb6b86 100644
--- a/main-business/src/main/java/com/ruoyi/business/service/ArchiveService.java
+++ b/main-business/src/main/java/com/ruoyi/business/service/ArchiveService.java
@@ -19,7 +19,7 @@
  */
 public interface ArchiveService extends IService<Archive> {
 
-    IPage<Archive> selectArchiveList(Page page, ArchiveDto archiveDto);
+    IPage<ArchiveDto> selectArchiveList(Page page, ArchiveDto archiveDto);
 
     int addOrEditArchive(ArchiveDto archiveDto);
 
diff --git a/main-business/src/main/java/com/ruoyi/business/service/InspectionTaskService.java b/main-business/src/main/java/com/ruoyi/business/service/InspectionTaskService.java
index 803eaab..f28573b 100644
--- a/main-business/src/main/java/com/ruoyi/business/service/InspectionTaskService.java
+++ b/main-business/src/main/java/com/ruoyi/business/service/InspectionTaskService.java
@@ -1,5 +1,8 @@
 package com.ruoyi.business.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.business.dto.InspectionTaskDto;
 import com.ruoyi.business.entity.InspectionTask;
 import com.baomidou.mybatisplus.extension.service.IService;
 
@@ -13,4 +16,9 @@
  */
 public interface InspectionTaskService extends IService<InspectionTask> {
 
+    IPage<InspectionTaskDto> selectInspectionTaskList(Page page, InspectionTaskDto inspectionTaskDto);
+
+    int addOrEditInspectionTask(InspectionTaskDto inspectionTaskDto);
+
+    int delByIds(Long[] ids);
 }
diff --git a/main-business/src/main/java/com/ruoyi/business/service/ProductionMasterService.java b/main-business/src/main/java/com/ruoyi/business/service/ProductionMasterService.java
index 7577b79..162b1d5 100644
--- a/main-business/src/main/java/com/ruoyi/business/service/ProductionMasterService.java
+++ b/main-business/src/main/java/com/ruoyi/business/service/ProductionMasterService.java
@@ -21,4 +21,6 @@
     int addOrEditPM(ProductionMasterDto productionMasterDto);
 
     int delByIds(Long[] ids);
+
+    int deleteProductionInventory(ProductionMasterDto productionMasterDto);
 }
diff --git a/main-business/src/main/java/com/ruoyi/business/service/impl/ArchiveServiceImpl.java b/main-business/src/main/java/com/ruoyi/business/service/impl/ArchiveServiceImpl.java
index b5553a5..7443026 100644
--- a/main-business/src/main/java/com/ruoyi/business/service/impl/ArchiveServiceImpl.java
+++ b/main-business/src/main/java/com/ruoyi/business/service/impl/ArchiveServiceImpl.java
@@ -3,20 +3,27 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 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.entity.StorageAttachment;
+import com.ruoyi.basic.entity.StorageBlob;
+import com.ruoyi.basic.entity.dto.StorageBlobDTO;
+import com.ruoyi.basic.mapper.StorageAttachmentMapper;
+import com.ruoyi.basic.mapper.StorageBlobMapper;
 import com.ruoyi.basic.service.StorageAttachmentService;
 import com.ruoyi.business.dto.ArchiveDto;
 import com.ruoyi.business.entity.Archive;
 import com.ruoyi.business.mapper.ArchiveMapper;
 import com.ruoyi.business.service.ArchiveService;
 import com.ruoyi.common.utils.bean.BeanUtils;
+import com.ruoyi.common.utils.file.MinioUtils;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
-import java.util.List;
-import java.util.Objects;
+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.Archives;
@@ -38,26 +45,125 @@
 
     private final StorageAttachmentService storageAttachmentService;
 
+    private final StorageBlobMapper storageBlobMapper;
+
+    private final StorageAttachmentMapper storageAttachmentMapper;
+    private final MinioUtils minioUtils;
 
 
     @Override
-    public IPage<Archive> selectArchiveList(Page page, ArchiveDto archiveDto) {
+    public IPage<ArchiveDto> selectArchiveList(Page page, ArchiveDto archiveDto) {
+        // 1. 鍒嗛〉鏌ヨ涓绘暟鎹�
         LambdaQueryWrapper<Archive> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.orderByDesc(Archive::getCreateTime);
-        return archiveMapper.selectPage(page, queryWrapper);
+        IPage<Archive> archivePage = archiveMapper.selectPage(page, queryWrapper);
+
+        // 2. 鏃犳暟鎹彁鍓嶈繑鍥�
+        if (CollectionUtils.isEmpty(archivePage.getRecords())) {
+            return new Page<>(archivePage.getCurrent(), archivePage.getSize(), archivePage.getTotal());
+        }
+
+        // 3. 鎵归噺鑾峰彇鎵�鏈夋。妗圛D
+        List<Long> archiveIds = archivePage.getRecords()
+                .stream()
+                .map(Archive::getId)
+                .collect(Collectors.toList());
+
+        // 4. 鎵归噺鏌ヨ闄勪欢鏄犲皠鍏崇郴锛堥伩鍏峃+1锛�
+
+        List<StorageAttachment> storageAttachments = storageAttachmentMapper
+                .selectList(new LambdaQueryWrapper<StorageAttachment>()
+                        .in(StorageAttachment::getRecordId, archiveIds)
+                        .eq(StorageAttachment::getRecordType, Archives.ordinal())
+                );
+
+        Map<Long, List<StorageAttachment>> attachmentsMap = storageAttachmentMapper
+                .selectList(new LambdaQueryWrapper<StorageAttachment>()
+                        .in(StorageAttachment::getRecordId, archiveIds)
+                        .eq(StorageAttachment::getRecordType, Archives.ordinal())
+                ).stream()
+                .collect(Collectors.groupingBy(StorageAttachment::getRecordId));
+
+        // 5. 鎵归噺鏌ヨ鎵�鏈夐渶瑕佺殑鏂囦欢鏁版嵁
+        Set<Long> blobIds = attachmentsMap.values()
+                .stream()
+                .flatMap(List::stream)
+                .map(StorageAttachment::getStorageBlobId)
+                .collect(Collectors.toSet());
+        Map<Long, StorageBlob> blobMap = blobIds.isEmpty()
+                ? Collections.emptyMap()
+                : storageBlobMapper.selectList(new LambdaQueryWrapper<StorageBlob>().in(StorageBlob::getId, blobIds))
+                .stream()
+                .collect(Collectors.toMap(StorageBlob::getId, Function.identity()));
+
+        // 6. 缁勮DTO锛堝崟娆″惊鐜畬鎴愭暟鎹閰嶏級
+        List<ArchiveDto> dtoList = archivePage.getRecords().stream().map(archive -> {
+            ArchiveDto dto = new ArchiveDto();
+            BeanUtils.copyProperties(archive, dto);  // 澶嶅埗涓诲璞″睘鎬�
+
+            // 鎸夐渶娣诲姞闄勪欢淇℃伅
+            List<StorageBlobDTO> blobDTOs = Optional.ofNullable(attachmentsMap.get(archive.getId()))
+                    .orElse(Collections.emptyList())
+                    .stream()
+                    .map(att -> blobMap.get(att.getStorageBlobId()))
+                    .filter(Objects::nonNull)
+                    .map(blob -> {
+                        StorageBlobDTO blobDTO = new StorageBlobDTO();
+                        BeanUtils.copyProperties(blob, blobDTO);
+                   
+                        // 鍔ㄦ�佺敓鎴愰瑙堝湴鍧�鍜屼笅杞藉湴鍧�
+                        // 璁剧疆棰勮URL
+                        blobDTO.setUrl(minioUtils.getPreviewUrls(
+                                blob.getBucketFilename(),
+                                blob.getBucketName(),
+                                true
+                        ));
+
+                        // 璁剧疆涓嬭浇URL
+                        blobDTO.setDownloadUrl(minioUtils.getDownloadUrls(
+                                blob.getBucketFilename(),
+                                blob.getBucketName(),
+                                blob.getOriginalFilename(),  // 鍘熷鏂囦欢鍚�
+                                true
+                        ));
+                        return blobDTO;
+                    })
+                    .collect(Collectors.toList());
+
+            dto.setStorageBlobDTO(blobDTOs);
+            return dto;
+        }).collect(Collectors.toList());
+
+        // 7. 鏋勫缓杩斿洖鍒嗛〉瀵硅薄
+        IPage<ArchiveDto> resultPage = new Page<>();
+        resultPage.setRecords(dtoList);
+        return resultPage;
     }
 
     @Override
     public int addOrEditArchive(ArchiveDto archiveDto) {
         Archive archive = new Archive();
         BeanUtils.copyProperties(archiveDto, archive);
-        int i ;
+        int i;
         if (Objects.isNull(archiveDto.getId())) {
-            i= archiveMapper.insert(archive);
+            i = archiveMapper.insert(archive);
         } else {
-            i= archiveMapper.updateById(archive);
+            i = archiveMapper.updateById(archive);
         }
-        storageAttachmentService.saveStorageAttachment(archiveDto.getAttachments(), archive.getId(),Archives,StorageAttachmentFile);
+        if (archiveDto.getStorageBlobDTO() != null && !archiveDto.getStorageBlobDTO().isEmpty()) {
+            List<StorageAttachment> attachments = new ArrayList<>();
+
+            for (StorageBlobDTO storageBlobDTO : archiveDto.getStorageBlobDTO()) {
+                StorageAttachment storageAttachment = new StorageAttachment(
+                        StorageAttachmentFile,
+                        (long) Archives.ordinal(),
+                        archive.getId()
+                );
+                storageAttachment.setStorageBlobDTO(storageBlobDTO);
+                attachments.add(storageAttachment);
+            }
+            storageAttachmentService.saveStorageAttachment(attachments, archive.getId(), Archives, StorageAttachmentFile);
+        }
         return i;
     }
 
@@ -77,7 +183,7 @@
 
     @Override
     public List<StorageAttachment> fileList(ArchiveDto archiveDto) {
-        storageAttachmentService.selectStorageAttachments(archiveDto.getId(), Archives, StorageAttachmentFile);
-        return null;
+        List<StorageAttachment> storageAttachments = storageAttachmentService.selectStorageAttachments(archiveDto.getId(), Archives, StorageAttachmentFile);
+        return storageAttachments;
     }
 }
diff --git a/main-business/src/main/java/com/ruoyi/business/service/impl/InspectionTaskServiceImpl.java b/main-business/src/main/java/com/ruoyi/business/service/impl/InspectionTaskServiceImpl.java
index e8d378d..72f00bf 100644
--- a/main-business/src/main/java/com/ruoyi/business/service/impl/InspectionTaskServiceImpl.java
+++ b/main-business/src/main/java/com/ruoyi/business/service/impl/InspectionTaskServiceImpl.java
@@ -1,11 +1,32 @@
 package com.ruoyi.business.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.entity.StorageAttachment;
+import com.ruoyi.basic.entity.StorageBlob;
+import com.ruoyi.basic.entity.dto.StorageBlobDTO;
+import com.ruoyi.basic.mapper.StorageAttachmentMapper;
+import com.ruoyi.basic.mapper.StorageBlobMapper;
+import com.ruoyi.basic.service.StorageAttachmentService;
+import com.ruoyi.business.dto.InspectionTaskDto;
 import com.ruoyi.business.entity.InspectionTask;
 import com.ruoyi.business.mapper.InspectionTaskMapper;
 import com.ruoyi.business.service.InspectionTaskService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springframework.stereotype.Service;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.bean.BeanUtils;
+import com.ruoyi.common.utils.file.MinioUtils;
 import lombok.RequiredArgsConstructor;
+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.InspectionTasks;
 
 /**
  * <p>
@@ -19,4 +40,149 @@
 @RequiredArgsConstructor
 public class InspectionTaskServiceImpl extends ServiceImpl<InspectionTaskMapper, InspectionTask> implements InspectionTaskService {
 
+    private final InspectionTaskMapper inspectionTaskMapper;
+
+    private final StorageAttachmentService storageAttachmentService;
+
+    private final StorageBlobMapper storageBlobMapper;
+
+    private final StorageAttachmentMapper storageAttachmentMapper;
+
+    private final MinioUtils minioUtils;
+
+    @Override
+    public IPage<InspectionTaskDto> selectInspectionTaskList(Page page, InspectionTaskDto inspectionTaskDto) {
+        LambdaQueryWrapper<InspectionTask> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.orderByDesc(InspectionTask::getCreateTime);
+        IPage<InspectionTask> entityPage = inspectionTaskMapper.selectPage(page, queryWrapper);
+
+        //  鏃犳暟鎹彁鍓嶈繑鍥�
+        if (CollectionUtils.isEmpty(entityPage.getRecords())) {
+            return new Page<>(entityPage.getCurrent(), entityPage.getSize(), entityPage.getTotal());
+        }
+        // 鑾峰彇id闆嗗悎
+        List<Long> ids = entityPage.getRecords().stream().map(InspectionTask::getId).collect(Collectors.toList());
+
+        Map<Long, List<StorageAttachment>> attachmentsMap = storageAttachmentMapper.selectList(new LambdaQueryWrapper<StorageAttachment>().in(StorageAttachment::getRecordId, ids)
+                        .eq(StorageAttachment::getRecordType, InspectionTasks.ordinal()))
+                .stream()
+                .collect(Collectors.groupingBy(StorageAttachment::getRecordId));
+        //  鎵归噺鏌ヨ鎵�鏈夐渶瑕佺殑鏂囦欢鏁版嵁
+        Set<Long> blobIds = attachmentsMap.values()
+                .stream()
+                .flatMap(List::stream)
+                .map(StorageAttachment::getStorageBlobId)
+                .collect(Collectors.toSet());
+        Map<Long, StorageBlob> blobMap = blobIds.isEmpty()
+                ? Collections.emptyMap()
+                : storageBlobMapper.selectList(new LambdaQueryWrapper<StorageBlob>().in(StorageBlob::getId, blobIds))
+                .stream()
+                .collect(Collectors.toMap(StorageBlob::getId, Function.identity()));
+
+        List<InspectionTaskDto> dtoList = entityPage.getRecords().stream().map(inspectionTask -> {
+            InspectionTaskDto dto = new InspectionTaskDto();
+            BeanUtils.copyProperties(inspectionTask, dto);  // 澶嶅埗涓诲璞″睘鎬�
+
+            // 鍒濆鍖栦笁涓檮浠跺垪琛�
+            dto.setBeforeProduction(new ArrayList<>());
+            dto.setAfterProduction(new ArrayList<>());
+            dto.setProductionIssues(new ArrayList<>());
+
+            // 澶勭悊闄勪欢鍒嗙被
+            Optional.ofNullable(attachmentsMap.get(inspectionTask.getId()))
+                    .orElse(Collections.emptyList())
+                    .forEach(attachment -> {
+                        StorageBlob blob = blobMap.get(attachment.getStorageBlobId());
+                        if (blob != null) {
+                            // 鍒涘缓闄勪欢DTO
+                            StorageBlobDTO blobDto = createBlobDto(blob);
+
+                            // 鏍规嵁type鍒嗙被
+                            switch ((int) blob.getType().longValue()) {
+                                case 0:
+                                    dto.getBeforeProduction().add(blobDto);
+                                    break;
+                                case 1:
+                                    dto.getAfterProduction().add(blobDto);
+                                    break;
+                                case 2:
+                                    dto.getProductionIssues().add(blobDto);
+                                    break;
+                                default:
+                                    // 鍙�夛細璁板綍鏈垎绫荤被鍨�
+                                    break;
+                            }
+                        }
+                    });
+
+            return dto;
+        }).collect(Collectors.toList());
+
+        // 7. 鏋勫缓杩斿洖鍒嗛〉瀵硅薄
+        IPage<InspectionTaskDto> resultPage = new Page<>();
+        resultPage.setRecords(dtoList);
+        return resultPage;
+    }
+
+    // 鎻愬彇鍒涘缓BlobDTO鐨勫叕鍏辨柟娉�
+    private StorageBlobDTO createBlobDto(StorageBlob blob) {
+        StorageBlobDTO dto = new StorageBlobDTO();
+        BeanUtils.copyProperties(blob, dto);
+
+        // 璁剧疆URL
+        dto.setUrl(minioUtils.getPreviewUrls(
+                blob.getBucketFilename(),
+                blob.getBucketName(),
+                true
+        ));
+
+        // 璁剧疆涓嬭浇URL
+        dto.setDownloadUrl(minioUtils.getDownloadUrls(
+                blob.getBucketFilename(),
+                blob.getBucketName(),
+                blob.getOriginalFilename(),
+                true
+        ));
+        return dto;
+    }
+
+    @Override
+    public int addOrEditInspectionTask(InspectionTaskDto inspectionTaskDto) {
+        SecurityUtils.getLoginUser().getUserId();
+        InspectionTask inspectionTask = new InspectionTask();
+        BeanUtils.copyProperties(inspectionTaskDto, inspectionTask);
+        inspectionTask.setRegistrantId(SecurityUtils.getLoginUser().getUserId());
+        inspectionTask.setRegistrant(SecurityUtils.getLoginUser().getUsername());
+        int i;
+        if (Objects.isNull(inspectionTaskDto.getId())) {
+            i = inspectionTaskMapper.insert(inspectionTask);
+        } else {
+            i = inspectionTaskMapper.updateById(inspectionTask);
+        }
+
+        if (inspectionTaskDto.getStorageBlobDTO() != null && !inspectionTaskDto.getStorageBlobDTO().isEmpty()) {
+            List<StorageAttachment> attachments = new ArrayList<>();
+
+            for (StorageBlobDTO storageBlobDTO : inspectionTaskDto.getStorageBlobDTO()) {
+                StorageAttachment storageAttachment = new StorageAttachment(
+                        StorageAttachmentFile,
+                        (long) InspectionTasks.ordinal(),
+                        inspectionTask.getId()
+                );
+                storageAttachment.setStorageBlobDTO(storageBlobDTO);
+                attachments.add(storageAttachment);
+            }
+            storageAttachmentService.saveStorageAttachment(attachments, inspectionTask.getId(), InspectionTasks, StorageAttachmentFile);
+        }
+        return i;
+    }
+
+    @Override
+    public int delByIds(Long[] ids) {
+        // 妫�鏌ュ弬鏁�
+        if (ids == null || ids.length == 0) {
+            return 0;
+        }
+      return inspectionTaskMapper.deleteByIds(Arrays.asList(ids));
+    }
 }
diff --git a/main-business/src/main/java/com/ruoyi/business/service/impl/ProductionMasterServiceImpl.java b/main-business/src/main/java/com/ruoyi/business/service/impl/ProductionMasterServiceImpl.java
index 84bed74..0a9dcc1 100644
--- a/main-business/src/main/java/com/ruoyi/business/service/impl/ProductionMasterServiceImpl.java
+++ b/main-business/src/main/java/com/ruoyi/business/service/impl/ProductionMasterServiceImpl.java
@@ -2,6 +2,7 @@
 
 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.business.dto.ProductionMasterDto;
@@ -14,16 +15,16 @@
 import com.ruoyi.business.mapper.ProductionMapper;
 import com.ruoyi.business.mapper.ProductionMasterMapper;
 import com.ruoyi.business.service.ProductionMasterService;
+import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.bean.BeanUtils;
+import com.ruoyi.system.mapper.SysUserMapper;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -45,6 +46,8 @@
     private final ProductionMapper productionMapper;
 
     private final OfficialInventoryMapper officialInventoryMapper;
+
+    private final SysUserMapper sysUserMapper;
 
     @Override
     public IPage<ProductionMasterDto> selectPMList(Page page, ProductionMasterDto productionMasterDto) {
@@ -153,6 +156,12 @@
         productionMaster.setId(masterId);
 
         // 3. 缁熶竴瀛愯〃澶勭悊閫昏緫
+        Long producerId = productionMasterDto.getProducerId();
+        if (producerId == null) {
+            throw new BaseException("璇烽�夋嫨鐢熶骇鑰�");
+        }
+        SysUser sysUser = sysUserMapper.selectUserById(producerId);
+        productionMaster.setProducer(sysUser.getUserName());
         if (masterId == null) {
             productionMasterMapper.insert(productionMaster);
             masterId = productionMaster.getId(); // 鑾峰彇鏂扮敓鎴愮殑ID
@@ -221,7 +230,102 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public int delByIds(Long[] ids) {
-        return 0;
+        if (ids == null || ids.length == 0) {
+            return 0;
+        }
+
+        List<Long> idList = Arrays.asList(ids);
+
+        // 1. 棰勫姞杞芥墍鏈夊叧鑱旀暟鎹�
+        List<ProductionInventory> allInventoryList = productionInventoryMapper.selectList(
+                new LambdaQueryWrapper<ProductionInventory>()
+                        .in(ProductionInventory::getProductionMasterId, idList)
+        );
+
+        // 2. 鎸夊畼鏂瑰簱瀛業D鍒嗙粍骞惰绠楀簱瀛樿皟鏁撮噺
+        Map<Long, BigDecimal> inventoryAdjustMap = allInventoryList.stream()
+                .collect(Collectors.groupingBy(
+                        ProductionInventory::getOfficialId,
+                        Collectors.reducing(
+                                BigDecimal.ZERO,
+                                inv -> new BigDecimal(inv.getUsedQuantity()),
+                                BigDecimal::add
+                        )
+                ));
+
+        // 3. 鎵归噺鏇存柊瀹樻柟搴撳瓨 (浣跨敤SQL鐩存帴鏇存柊)
+        if (!inventoryAdjustMap.isEmpty()) {
+            inventoryAdjustMap.forEach((officialId, adjustAmount) ->
+                    officialInventoryMapper.addInventoryQuantity(officialId, adjustAmount)
+            );
+        }
+
+        // 4. 鎵归噺鍒犻櫎鍏宠仈鏁版嵁
+        if (!allInventoryList.isEmpty()) {
+            List<Long> inventoryIds = allInventoryList.stream()
+                    .map(ProductionInventory::getId)
+                    .collect(Collectors.toList());
+            productionInventoryMapper.deleteBatchIds(inventoryIds);
+        }
+
+        // 鍒犻櫎鐢熶骇鏄庣粏
+        productionMapper.delete(
+                new LambdaQueryWrapper<Production>()
+                        .in(Production::getProductionMasterId, idList)
+        );
+
+        // 5. 鍒犻櫎涓昏褰�
+        return productionMasterMapper.deleteBatchIds(idList);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int deleteProductionInventory(ProductionMasterDto productionMasterDto) {
+        List<ProductionInventory> inventories = productionMasterDto.getProductionInventoryList();
+        if (CollectionUtils.isEmpty(inventories)) {
+            return 0;
+        }
+
+        // 棰勬敹闆嗘暟鎹敤浜庢壒閲忔搷浣�
+        Map<Long, BigDecimal> inventoryAdjustMap = new HashMap<>();
+        List<Long> productionIdsToDelete = new ArrayList<>(inventories.size());
+
+        for (ProductionInventory inventory : inventories) {
+            // 鏀堕泦闇�瑕佸垹闄ょ殑鐢熶骇搴撳瓨ID
+            productionIdsToDelete.add(inventory.getId());
+
+            // 绱搴撳瓨璋冩暣閲忥紙鐩稿悓officialId鐨勭敤閲忕疮鍔狅級
+            BigDecimal adjustment = new BigDecimal(inventory.getUsedQuantity());
+            inventoryAdjustMap.merge(
+                    inventory.getOfficialId(),
+                    adjustment,
+                    BigDecimal::add
+            );
+        }
+
+        // 鎵归噺鏇存柊瀹樻柟搴撳瓨
+        for (Map.Entry<Long, BigDecimal> entry : inventoryAdjustMap.entrySet()) {
+            OfficialInventory official = officialInventoryMapper.selectById(entry.getKey());
+            if (official == null) {
+                throw new BaseException("瀹樻柟搴撳瓨涓嶅瓨鍦紝ID: " + entry.getKey());
+            }
+
+            // 浣跨敤绾跨▼瀹夊叏鐨凚igDecimal鎿嶄綔
+            official.setInventoryQuantity(
+                    Optional.ofNullable(official.getInventoryQuantity())
+                            .orElse(BigDecimal.ZERO)
+                            .add(entry.getValue())
+            );
+            officialInventoryMapper.updateById(official);
+        }
+
+        // 鎵归噺鍒犻櫎鐢熶骇搴撳瓨
+        if (!productionIdsToDelete.isEmpty()) {
+            productionInventoryMapper.deleteBatchIds(productionIdsToDelete);
+        }
+
+        return productionIdsToDelete.size();
     }
 }
diff --git a/main-business/src/main/java/com/ruoyi/business/vo/ArchiveVo.java b/main-business/src/main/java/com/ruoyi/business/vo/ArchiveVo.java
new file mode 100644
index 0000000..3ce7871
--- /dev/null
+++ b/main-business/src/main/java/com/ruoyi/business/vo/ArchiveVo.java
@@ -0,0 +1,8 @@
+package com.ruoyi.business.vo;
+
+import com.ruoyi.business.entity.Archive;
+import lombok.Data;
+
+@Data
+public class ArchiveVo extends Archive {
+}
diff --git a/main-business/src/main/resources/mapper/OfficialInventoryMapper.xml b/main-business/src/main/resources/mapper/OfficialInventoryMapper.xml
index 7474896..55dfbd7 100644
--- a/main-business/src/main/resources/mapper/OfficialInventoryMapper.xml
+++ b/main-business/src/main/resources/mapper/OfficialInventoryMapper.xml
@@ -30,6 +30,10 @@
                 update_time,
             id, supplier_name, coal, unit, inventory_quantity, price_including_tax, total_price_including_tax, pending_replenishment, registrant_id, registration_date
     </sql>
+    <insert id="addInventoryQuantity">
+        update official_inventory set inventory_quantity = inventory_quantity + #{quantity} where id = #{id}
+    </insert>
+
 
     <select id="getOfficialInventoryForUpdateById" resultType="com.ruoyi.business.entity.OfficialInventory">
         select *
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java
index 31fc707..bf81449 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java
@@ -1,10 +1,14 @@
 package com.ruoyi.web.controller.common;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import com.ruoyi.basic.service.StorageBlobService;
+import com.ruoyi.common.config.RuoYiConfig;
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.file.FileUploadUtils;
+import com.ruoyi.common.utils.file.FileUtils;
+import com.ruoyi.framework.config.ServerConfig;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 import org.slf4j.Logger;
@@ -16,13 +20,9 @@
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
-import com.ruoyi.common.config.RuoYiConfig;
-import com.ruoyi.common.constant.Constants;
-import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.common.utils.file.FileUploadUtils;
-import com.ruoyi.common.utils.file.FileUtils;
-import com.ruoyi.framework.config.ServerConfig;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * 閫氱敤璇锋眰澶勭悊
@@ -142,9 +142,9 @@
      * minio閫氱敤涓婁紶璇锋眰锛堝涓級
      */
     @PostMapping("/minioUploads")
-    public R minioUploadFiles(List<MultipartFile> files, String bucketName) throws Exception
+    public R minioUploadFiles(List<MultipartFile> files, String bucketName,Long type) throws Exception
     {
-        return R.ok(storageBlobService.updateStorageBlobs(files, bucketName));
+        return R.ok(storageBlobService.updateStorageBlobs(files, bucketName,type));
     }
 
     /**
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
index 7c2c6af..aeacec0 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
@@ -1,24 +1,9 @@
 package com.ruoyi.web.controller.system;
 
-import java.util.List;
-import java.util.stream.Collectors;
-import jakarta.servlet.http.HttpServletResponse;
-import org.apache.commons.lang3.ArrayUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import org.springframework.web.multipart.MultipartFile;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.domain.entity.SysDept;
 import com.ruoyi.common.core.domain.entity.SysRole;
 import com.ruoyi.common.core.domain.entity.SysUser;
@@ -31,16 +16,26 @@
 import com.ruoyi.system.service.ISysPostService;
 import com.ruoyi.system.service.ISysRoleService;
 import com.ruoyi.system.service.ISysUserService;
+import com.ruoyi.system.vo.SysUserVo;
+import jakarta.servlet.http.HttpServletResponse;
+import org.apache.commons.lang3.ArrayUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 鐢ㄦ埛淇℃伅
- * 
+ *
  * @author ruoyi
  */
 @RestController
 @RequestMapping("/system/user")
-public class SysUserController extends BaseController
-{
+public class SysUserController extends BaseController {
     @Autowired
     private ISysUserService userService;
 
@@ -58,8 +53,7 @@
      */
     @PreAuthorize("@ss.hasPermi('system:user:list')")
     @GetMapping("/list")
-    public TableDataInfo list(SysUser user)
-    {
+    public TableDataInfo list(SysUser user) {
         startPage();
         List<SysUser> list = userService.selectUserList(user);
         return getDataTable(list);
@@ -68,8 +62,7 @@
     @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.EXPORT)
     @PreAuthorize("@ss.hasPermi('system:user:export')")
     @PostMapping("/export")
-    public void export(HttpServletResponse response, SysUser user)
-    {
+    public void export(HttpServletResponse response, SysUser user) {
         List<SysUser> list = userService.selectUserList(user);
         ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
         util.exportExcel(response, list, "鐢ㄦ埛鏁版嵁");
@@ -78,8 +71,7 @@
     @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.IMPORT)
     @PreAuthorize("@ss.hasPermi('system:user:import')")
     @PostMapping("/importData")
-    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
-    {
+    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception {
         ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
         List<SysUser> userList = util.importExcel(file.getInputStream());
         String operName = getUsername();
@@ -88,8 +80,7 @@
     }
 
     @PostMapping("/importTemplate")
-    public void importTemplate(HttpServletResponse response)
-    {
+    public void importTemplate(HttpServletResponse response) {
         ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
         util.importTemplateExcel(response, "鐢ㄦ埛鏁版嵁");
     }
@@ -98,12 +89,10 @@
      * 鏍规嵁鐢ㄦ埛缂栧彿鑾峰彇璇︾粏淇℃伅
      */
     @PreAuthorize("@ss.hasPermi('system:user:query')")
-    @GetMapping(value = { "/", "/{userId}" })
-    public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId)
-    {
+    @GetMapping(value = {"/", "/{userId}"})
+    public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId) {
         AjaxResult ajax = AjaxResult.success();
-        if (StringUtils.isNotNull(userId))
-        {
+        if (StringUtils.isNotNull(userId)) {
             userService.checkUserDataScope(userId);
             SysUser sysUser = userService.selectUserById(userId);
             ajax.put(AjaxResult.DATA_TAG, sysUser);
@@ -122,20 +111,14 @@
     @PreAuthorize("@ss.hasPermi('system:user:add')")
     @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.INSERT)
     @PostMapping
-    public AjaxResult add(@Validated @RequestBody SysUser user)
-    {
+    public AjaxResult add(@Validated @RequestBody SysUser user) {
         deptService.checkDeptDataScope(user.getDeptId());
         roleService.checkRoleDataScope(user.getRoleIds());
-        if (!userService.checkUserNameUnique(user))
-        {
+        if (!userService.checkUserNameUnique(user)) {
             return error("鏂板鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛岀櫥褰曡处鍙峰凡瀛樺湪");
-        }
-        else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
-        {
+        } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {
             return error("鏂板鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛屾墜鏈哄彿鐮佸凡瀛樺湪");
-        }
-        else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
-        {
+        } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) {
             return error("鏂板鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛岄偖绠辫处鍙峰凡瀛樺湪");
         }
         user.setCreateBy(getUsername());
@@ -149,22 +132,16 @@
     @PreAuthorize("@ss.hasPermi('system:user:edit')")
     @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.UPDATE)
     @PutMapping
-    public AjaxResult edit(@Validated @RequestBody SysUser user)
-    {
+    public AjaxResult edit(@Validated @RequestBody SysUser user) {
         userService.checkUserAllowed(user);
         userService.checkUserDataScope(user.getUserId());
         deptService.checkDeptDataScope(user.getDeptId());
         roleService.checkRoleDataScope(user.getRoleIds());
-        if (!userService.checkUserNameUnique(user))
-        {
+        if (!userService.checkUserNameUnique(user)) {
             return error("淇敼鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛岀櫥褰曡处鍙峰凡瀛樺湪");
-        }
-        else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
-        {
+        } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {
             return error("淇敼鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛屾墜鏈哄彿鐮佸凡瀛樺湪");
-        }
-        else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
-        {
+        } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) {
             return error("淇敼鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛岄偖绠辫处鍙峰凡瀛樺湪");
         }
         user.setUpdateBy(getUsername());
@@ -177,10 +154,8 @@
     @PreAuthorize("@ss.hasPermi('system:user:remove')")
     @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.DELETE)
     @DeleteMapping("/{userIds}")
-    public AjaxResult remove(@PathVariable Long[] userIds)
-    {
-        if (ArrayUtils.contains(userIds, getUserId()))
-        {
+    public AjaxResult remove(@PathVariable Long[] userIds) {
+        if (ArrayUtils.contains(userIds, getUserId())) {
             return error("褰撳墠鐢ㄦ埛涓嶈兘鍒犻櫎");
         }
         return toAjax(userService.deleteUserByIds(userIds));
@@ -192,8 +167,7 @@
     @PreAuthorize("@ss.hasPermi('system:user:resetPwd')")
     @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.UPDATE)
     @PutMapping("/resetPwd")
-    public AjaxResult resetPwd(@RequestBody SysUser user)
-    {
+    public AjaxResult resetPwd(@RequestBody SysUser user) {
         userService.checkUserAllowed(user);
         userService.checkUserDataScope(user.getUserId());
         user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
@@ -207,8 +181,7 @@
     @PreAuthorize("@ss.hasPermi('system:user:edit')")
     @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.UPDATE)
     @PutMapping("/changeStatus")
-    public AjaxResult changeStatus(@RequestBody SysUser user)
-    {
+    public AjaxResult changeStatus(@RequestBody SysUser user) {
         userService.checkUserAllowed(user);
         userService.checkUserDataScope(user.getUserId());
         user.setUpdateBy(getUsername());
@@ -220,8 +193,7 @@
      */
     @PreAuthorize("@ss.hasPermi('system:user:query')")
     @GetMapping("/authRole/{userId}")
-    public AjaxResult authRole(@PathVariable("userId") Long userId)
-    {
+    public AjaxResult authRole(@PathVariable("userId") Long userId) {
         AjaxResult ajax = AjaxResult.success();
         SysUser user = userService.selectUserById(userId);
         List<SysRole> roles = roleService.selectRolesByUserId(userId);
@@ -236,8 +208,7 @@
     @PreAuthorize("@ss.hasPermi('system:user:edit')")
     @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.GRANT)
     @PutMapping("/authRole")
-    public AjaxResult insertAuthRole(Long userId, Long[] roleIds)
-    {
+    public AjaxResult insertAuthRole(Long userId, Long[] roleIds) {
         userService.checkUserDataScope(userId);
         roleService.checkRoleDataScope(roleIds);
         userService.insertUserAuth(userId, roleIds);
@@ -249,8 +220,16 @@
      */
     @PreAuthorize("@ss.hasPermi('system:user:list')")
     @GetMapping("/deptTree")
-    public AjaxResult deptTree(SysDept dept)
-    {
+    public AjaxResult deptTree(SysDept dept) {
         return success(deptService.selectDeptTreeList(dept));
     }
+
+
+    /**
+     * 鎵�鏈夌敤鎴穕ist
+     */
+    @GetMapping("/listAll")
+    public R<List<SysUserVo>> listAll() {
+        return R.ok(userService.selectUserListAll());
+    }
 }
diff --git a/ruoyi-common/src/main/java/com/ruoyi/basic/entity/StorageAttachment.java b/ruoyi-common/src/main/java/com/ruoyi/basic/entity/StorageAttachment.java
index dddde62..44b750d 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/basic/entity/StorageAttachment.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/basic/entity/StorageAttachment.java
@@ -1,13 +1,13 @@
 package com.ruoyi.basic.entity;
 
-import com.baomidou.mybatisplus.annotation.*;
-import com.fasterxml.jackson.annotation.JsonFormat;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
 import com.ruoyi.basic.entity.dto.StorageBlobDTO;
 import lombok.Data;
-import com.ruoyi.common.core.domain.BaseEntity;
 
 import java.io.Serializable;
-import java.util.Date;
 
 /**
  * 閫氱敤鏂囦欢涓婁紶鐨勯檮浠朵俊鎭� 瀹炰綋绫�
@@ -26,16 +26,24 @@
      */
     @TableId(value = "id", type = IdType.AUTO)
     private Long id;
+//
+//    /**
+//     * 鍒涘缓鏃堕棿
+//     */
+//    @TableField(value = "create_time",
+//            fill = FieldFill.INSERT,
+//            typeHandler = LocalDateTimeTypeHandler.class)
+//    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+//    private LocalDateTime createTime;
 
-    /** 鍒涘缓鏃堕棿 */
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @TableField(fill = FieldFill.INSERT)
-    private Date createTime;
-
-    /** 鏇存柊鏃堕棿 */
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @TableField(fill = FieldFill.INSERT_UPDATE)
-    private Date updateTime;
+//    /**
+//     * 鏇存柊鏃堕棿
+//     */
+//    @TableField(value = "update_time",
+//            fill = FieldFill.INSERT_UPDATE,
+//            typeHandler = LocalDateTimeTypeHandler.class)
+//    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+//    private LocalDateTime updateTime;
 
     /**
      * 閫昏緫鍒犻櫎
@@ -63,6 +71,7 @@
     @TableField(value = "storage_blob_id")
     private Long storageBlobId;
 
+    @TableField(exist = false)
     private StorageBlobDTO storageBlobDTO;
 
     public StorageAttachment(String fileType, Long recordType, Long recordId) {
diff --git a/ruoyi-common/src/main/java/com/ruoyi/basic/entity/StorageBlob.java b/ruoyi-common/src/main/java/com/ruoyi/basic/entity/StorageBlob.java
index e793031..a9d1b21 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/basic/entity/StorageBlob.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/basic/entity/StorageBlob.java
@@ -1,9 +1,11 @@
 package com.ruoyi.basic.entity;
 
-import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
-import com.ruoyi.common.core.domain.BaseEntity;
 
 import java.io.Serializable;
 import java.util.Date;
@@ -62,4 +64,10 @@
      */
     @TableField(value = "byte_size")
     private Long byteSize;
+
+    /**
+     * 0鐢熶骇鍓� 1鐢熶骇鍚� 2鐢熶骇闂
+     */
+    @TableField(value = "type")
+    private Long type;
 }
\ No newline at end of file
diff --git a/ruoyi-common/src/main/java/com/ruoyi/basic/entity/dto/StorageBlobDTO.java b/ruoyi-common/src/main/java/com/ruoyi/basic/entity/dto/StorageBlobDTO.java
index 2ab3d2c..7100ef1 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/basic/entity/dto/StorageBlobDTO.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/basic/entity/dto/StorageBlobDTO.java
@@ -6,4 +6,6 @@
 @Data
 public class StorageBlobDTO extends StorageBlob {
     private String url;
+
+    private String downloadUrl;
 }
diff --git a/ruoyi-common/src/main/java/com/ruoyi/basic/service/StorageBlobService.java b/ruoyi-common/src/main/java/com/ruoyi/basic/service/StorageBlobService.java
index b242c26..64f737d 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/basic/service/StorageBlobService.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/basic/service/StorageBlobService.java
@@ -24,7 +24,7 @@
      * @param bucketName 瀛樺偍妗跺悕绉�
      * @return 涓婁紶缁撴灉
      */
-    List<StorageBlobDTO> updateStorageBlobs(List<MultipartFile> files, String bucketName);
+    List<StorageBlobDTO> updateStorageBlobs(List<MultipartFile> files, String bucketName,Long type);
 
     /**
      * 鎵归噺鍒犻櫎鏂囦欢
diff --git a/ruoyi-common/src/main/java/com/ruoyi/basic/service/impl/StorageBlobServiceImpl.java b/ruoyi-common/src/main/java/com/ruoyi/basic/service/impl/StorageBlobServiceImpl.java
index 72c2dd7..1c51d86 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/basic/service/impl/StorageBlobServiceImpl.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/basic/service/impl/StorageBlobServiceImpl.java
@@ -2,29 +2,26 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.basic.entity.StorageAttachment;
 import com.ruoyi.basic.entity.StorageBlob;
 import com.ruoyi.basic.entity.dto.StorageBlobDTO;
 import com.ruoyi.basic.mapper.StorageAttachmentMapper;
 import com.ruoyi.basic.mapper.StorageBlobMapper;
 import com.ruoyi.basic.service.StorageBlobService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.common.config.MinioConfig;
-import com.ruoyi.common.constant.Constants;
 import com.ruoyi.common.core.domain.MinioResult;
 import com.ruoyi.common.exception.file.InvalidExtensionException;
-import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.file.MinioUtils;
 import com.ruoyi.common.utils.uuid.IdUtils;
+import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import lombok.RequiredArgsConstructor;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -47,13 +44,12 @@
     private MinioUtils minioUtils;
 
     @Override
-    public List<StorageBlobDTO> updateStorageBlobs(List<MultipartFile> files, String bucketName) {
+    public List<StorageBlobDTO> updateStorageBlobs(List<MultipartFile> files, String bucketName,Long type) {
 
         // 鑻ユ病浼犲叆bucketName锛屽垯浣跨敤榛樿bucketName
         if (StringUtils.isEmpty(bucketName)) {
-            bucketName  = minioUtils.getDefaultBucket();
+            bucketName = minioUtils.getDefaultBucket();
         }
-
         List<StorageBlobDTO> storageBlobDTOs = new ArrayList<>();
         for (MultipartFile file : files) {
             try {
@@ -66,16 +62,17 @@
                 dto.setKey(IdUtils.simpleUUID());
                 dto.setBucketName(bucketName);
                 dto.setUrl(minioUtils.getPreviewUrl(res.getBucketFileName(), bucketName, false));
+                dto.setDownloadUrl(minioUtils.getDownloadUrl(res.getBucketFileName(), bucketName));
+                if (type != null){
+                    dto.setType(type);
+                }
                 // 鎻掑叆鏁版嵁搴�
                 storageBlobMapper.insert(dto);
-
                 storageBlobDTOs.add(dto);
             } catch (InvalidExtensionException e) {
-                throw new RuntimeException("minio鏂囦欢涓婁紶寮傚父锛�" +  e);
+                throw new RuntimeException("minio鏂囦欢涓婁紶寮傚父锛�" + e);
             }
         }
-
-
         return storageBlobDTOs;
     }
 
@@ -85,20 +82,30 @@
                 .eq(StorageAttachment::getRecordId, attachment.getRecordId())
                 .eq(StorageAttachment::getRecordType, attachment.getRecordType())
                 .eq(StorageAttachment::getName, attachment.getName()));
-        List<Long> ids = attachments.stream().map(StorageAttachment::getStorageBlobId).toList();
-        List<StorageBlob> storageBlobs = storageBlobMapper.selectList(new LambdaQueryWrapper<StorageBlob>()
-                .in(StorageBlob::getId, ids));
+        List<Long> ids = attachments.stream()
+                .map(StorageAttachment::getStorageBlobId)
+                .collect(Collectors.toList());
+        List<StorageBlob> storageBlobs = new ArrayList<>();
+        if (!ids.isEmpty()) {
+            // 鍙湪ID鍒楄〃闈炵┖鏃舵墽琛屾煡璇�
+            storageBlobs = storageBlobMapper.selectList(
+                    new LambdaQueryWrapper<StorageBlob>().in(StorageBlob::getId, ids)
+            );
+        }
+        
+        // 绉婚櫎MinIO涓殑鏂囦欢
         if (!storageBlobs.isEmpty()) {
             for (StorageBlob storageBlob : storageBlobs) {
-                // 绉婚櫎妗跺唴鏂囦欢
-                minioUtils.removeObjectsResult(storageBlob.getBucketName(), storageBlob.getBucketName());
+                minioUtils.removeObjectsResult(storageBlob.getBucketName(), storageBlob.getBucketFilename());
             }
         }
 
+        // 鍒犻櫎鏁版嵁搴撹褰�
         if (!ids.isEmpty()) {
-            return storageBlobMapper.delete(new QueryWrapper<StorageBlob>().lambda().in(StorageBlob::getId, ids));
+            return storageBlobMapper.delete(
+                    new QueryWrapper<StorageBlob>().lambda().in(StorageBlob::getId, ids)
+            );
         }
-
         return 0;
     }
 }
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/StorageAttachmentRecordType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/StorageAttachmentRecordType.java
index 50b65ad..74233aa 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/StorageAttachmentRecordType.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/StorageAttachmentRecordType.java
@@ -10,7 +10,8 @@
 public enum StorageAttachmentRecordType {
     // 渚嬪瓙 瀹為檯寮�鍙戣鍒犻櫎
     Template("Template","鑼冧緥"),
-    Archives("Archives","鏂囨。绠$悊");
+    Archives("Archives","鏂囨。绠$悊"),
+    InspectionTasks("InspectionTasks","鐢熶骇宸℃");
 
 
     private final String code;
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/handler/LocalDateTimeTypeHandler.java b/ruoyi-common/src/main/java/com/ruoyi/common/handler/LocalDateTimeTypeHandler.java
new file mode 100644
index 0000000..522bb5e
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/handler/LocalDateTimeTypeHandler.java
@@ -0,0 +1,67 @@
+package com.ruoyi.common.handler;
+
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+import org.apache.ibatis.type.MappedTypes;
+
+import java.sql.*;
+import java.time.LocalDateTime;
+
+@MappedTypes(LocalDateTime.class)
+public class LocalDateTimeTypeHandler extends BaseTypeHandler<LocalDateTime> {
+
+    @Override
+    public void setNonNullParameter(PreparedStatement ps, int i,
+                                    LocalDateTime parameter, JdbcType jdbcType) throws SQLException {
+        ps.setObject(i, parameter);
+    }
+
+    @Override
+    public LocalDateTime getNullableResult(ResultSet rs, String columnName) throws SQLException {
+        Object value = rs.getObject(columnName);
+        if (value == null) {
+            return null;
+        }
+
+        if (value instanceof Timestamp) {
+            return ((Timestamp) value).toLocalDateTime();
+        } else if (value instanceof LocalDateTime) {
+            return (LocalDateTime) value;
+        }
+
+        // 鐗规畩澶勭悊锛氬鏋滄暟鎹簱杩斿洖鐨勬槸瀛楃涓�
+        return LocalDateTime.parse(value.toString());
+    }
+
+    @Override
+    public LocalDateTime getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+        Object value = rs.getObject(columnIndex);
+        if (value == null) {
+            return null;
+        }
+
+        if (value instanceof Timestamp) {
+            return ((Timestamp) value).toLocalDateTime();
+        } else if (value instanceof LocalDateTime) {
+            return (LocalDateTime) value;
+        }
+
+        return LocalDateTime.parse(value.toString());
+    }
+
+    @Override
+    public LocalDateTime getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+        Object value = cs.getObject(columnIndex);
+        if (value == null) {
+            return null;
+        }
+
+        if (value instanceof Timestamp) {
+            return ((Timestamp) value).toLocalDateTime();
+        } else if (value instanceof LocalDateTime) {
+            return (LocalDateTime) value;
+        }
+
+        return LocalDateTime.parse(value.toString());
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MinioUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MinioUtils.java
index 4b87a2e..ff2dab3 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MinioUtils.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MinioUtils.java
@@ -9,6 +9,8 @@
 import io.minio.http.Method;
 import io.minio.messages.DeleteError;
 import io.minio.messages.DeleteObject;
+import jakarta.servlet.ServletOutputStream;
+import jakarta.servlet.http.HttpServletResponse;
 import lombok.Getter;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -16,15 +18,11 @@
 import org.springframework.util.FastByteArrayOutputStream;
 import org.springframework.web.multipart.MultipartFile;
 
-import jakarta.servlet.ServletOutputStream;
-import jakarta.servlet.http.HttpServletResponse;
 import java.io.InputStream;
+import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
@@ -303,4 +301,140 @@
         return null;
     }
 
+    /**
+     * 涓嬭浇url锛堝己鍒舵祻瑙堝櫒涓嬭浇鏂囦欢锛�
+     * @param bucketFileName minio鏂囦欢鍚嶇О
+     * @param bucketName 瀛樺偍妗跺悕绉�
+     * @param  锛堝皬鏃讹級锛岄粯璁�24灏忔椂
+     * @return 鏂囦欢涓嬭浇URL
+     */
+    public String getDownloadUrl(String bucketFileName, String bucketName) {
+        if (StringUtils.isNotBlank(bucketFileName)) {
+            try {
+                // 妫�鏌ユ枃浠舵槸鍚﹀瓨鍦�
+                minioClient.statObject(StatObjectArgs.builder()
+                        .bucket(bucketName)
+                        .object(bucketFileName)
+                        .build());
+
+                // 璁剧疆鍝嶅簲澶�
+                Map<String, String> reqParams = new HashMap<>();
+                // 鎻愬彇鍘熷鏂囦欢鍚嶏紙濡傛灉瀛樺偍鏃朵繚鐣欎簡鍘熷鍚嶇О锛�
+                String originalFileName = extractOriginalFileName(bucketFileName);
+                reqParams.put("response-content-disposition",
+                        "attachment; filename=\"" + URLEncoder.encode(originalFileName, StandardCharsets.UTF_8) + "\"");
+
+                // 鏋勫缓棰勭鍚峌RL鍙傛暟
+                GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder()
+                        .method(Method.GET)
+                        .bucket(bucketName)
+                        .object(bucketFileName)
+                        .expiry(previewExpiry, TimeUnit.HOURS)
+                        .extraQueryParams(reqParams)
+                        .build();
+
+                return minioClient.getPresignedObjectUrl(args);
+            } catch (Exception e) {
+                throw new UtilException("MinioUtils锛氱敓鎴愪笅杞介摼鎺ュ紓甯�", e);
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 浠巄ucketFileName涓彁鍙栧師濮嬫枃浠跺悕
+     * 闇�鏍规嵁瀹為檯瀛樺偍瑙勫垯璋冩暣锛堜緥濡傦紝濡傛灉瀛樺偍鏃舵坊鍔犱簡鏃堕棿鎴虫垨UUID鍚庣紑锛�
+     */
+    private String extractOriginalFileName(String bucketFileName) {
+        // 绀轰緥锛氬鏋滃瓨鍌ㄦ牸寮忎负 "鍘熷鏂囦欢鍚峗UUID"
+        int underscoreIndex = bucketFileName.lastIndexOf("_");
+        if (underscoreIndex > 0) {
+            return bucketFileName.substring(0, underscoreIndex);
+        }
+        // 濡傛灉娌℃湁鐗规畩鏍煎紡锛岀洿鎺ヨ繑鍥炲畬鏁存枃浠跺悕
+        return bucketFileName;
+    }
+
+
+    /**
+     * 鐢熸垚棰勮URL
+     * @param bucketFilename 鏂囦欢鍦∕inIO涓殑鍞竴鏍囪瘑
+     * @param bucketName 瀛樺偍妗跺悕绉�
+     * @param useDefaultExpiry 鏄惁浣跨敤榛樿杩囨湡鏃堕棿锛坱rue=浣跨敤榛樿杩囨湡鏃堕棿锛宖alse=姘镐箙鏈夋晥锛�
+     * @return 棰勮URL
+     */
+    public String getPreviewUrls(String bucketFilename, String bucketName, boolean useDefaultExpiry) {
+        if (StringUtils.isBlank(bucketFilename)) {
+            return null;
+        }
+
+        try {
+            // 楠岃瘉鏂囦欢瀛樺湪鎬�
+            minioClient.statObject(StatObjectArgs.builder()
+                    .bucket(bucketName)
+                    .object(bucketFilename)
+                    .build());
+
+            GetPresignedObjectUrlArgs.Builder builder = GetPresignedObjectUrlArgs.builder()
+                    .method(Method.GET)
+                    .bucket(bucketName)
+                    .object(bucketFilename);
+
+            // 璁剧疆杩囨湡鏃堕棿锛歶seDefaultExpiry=true 浣跨敤閰嶇疆鐨勮繃鏈熸椂闂�
+            if (useDefaultExpiry) {
+                builder.expiry(previewExpiry, TimeUnit.HOURS);
+            }
+
+            return minioClient.getPresignedObjectUrl(builder.build());
+        } catch (Exception e) {
+            throw new UtilException("鐢熸垚棰勮URL澶辫触: " + e.getMessage(), e);
+        }
+    }
+
+    /**
+     * 鐢熸垚涓嬭浇URL锛堝己鍒舵祻瑙堝櫒涓嬭浇锛�
+     * @param bucketFilename 鏂囦欢鍦∕inIO涓殑鍞竴鏍囪瘑
+     * @param bucketName 瀛樺偍妗跺悕绉�
+     * @param originalFileName 鍘熷鏂囦欢鍚嶏紙鐢ㄤ簬涓嬭浇鏃舵樉绀猴級
+     * @param useDefaultExpiry 鏄惁浣跨敤榛樿杩囨湡鏃堕棿锛坱rue=浣跨敤榛樿锛宖alse=鏃犺繃鏈熸椂闂达級
+     * @return 涓嬭浇URL
+     */
+    public String getDownloadUrls(String bucketFilename, String bucketName, String originalFileName, boolean useDefaultExpiry) {
+        if (StringUtils.isBlank(bucketFilename)) {
+            return null;
+        }
+
+        try {
+            // 楠岃瘉鏂囦欢瀛樺湪鎬�
+            minioClient.statObject(StatObjectArgs.builder()
+                    .bucket(bucketName)
+                    .object(bucketFilename)
+                    .build());
+
+            // 姝g‘缂栫爜鏂囦欢鍚嶏細鏇挎崲 + 涓� %20
+            String encodedFileName = URLEncoder.encode(originalFileName, StandardCharsets.UTF_8)
+                    .replace("+", "%20");
+
+            Map<String, String> reqParams = new HashMap<>();
+            reqParams.put("response-content-disposition",
+                    "attachment; filename=\"" + encodedFileName + "\"");
+
+            GetPresignedObjectUrlArgs.Builder builder = GetPresignedObjectUrlArgs.builder()
+                    .method(Method.GET)
+                    .bucket(bucketName)
+                    .object(bucketFilename)
+                    .extraQueryParams(reqParams);
+
+            // 鏍规嵁鍙傛暟鍐冲畾鏄惁璁剧疆杩囨湡鏃堕棿
+            if (useDefaultExpiry) {
+                // 浣跨敤榛樿杩囨湡鏃堕棿锛堜粠閰嶇疆璇诲彇锛�
+                builder.expiry(previewExpiry, TimeUnit.HOURS);
+            } else {
+                // 涓嶈缃繃鏈熸椂闂达紙MinIO 榛樿7澶╋級
+            }
+            return minioClient.getPresignedObjectUrl(builder.build());
+        } catch (Exception e) {
+            throw new UtilException("鐢熸垚涓嬭浇URL澶辫触: " + e.getMessage(), e);
+        }
+    }
 }
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java
index 4de14eb..84e8879 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java
@@ -1,10 +1,13 @@
 package com.ruoyi.framework.config;
 
 import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
 import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import com.ruoyi.common.handler.LocalDateTimeTypeHandler;
+import org.apache.ibatis.type.JdbcType;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
@@ -12,15 +15,35 @@
 public class MybatisPlusConfig {
 
     @Bean
-    public MybatisPlusInterceptor mybatisPlusInterceptor(){
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
         MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
-        // 鍒嗛〉
-        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.POSTGRE_SQL));
-        // 涔愯閿�
+        // 1. 鍒嗛〉鎻掍欢 - 鎸囧畾 PostgreSQL 鏁版嵁搴撶被鍨�
+        PaginationInnerInterceptor pagination = new PaginationInnerInterceptor(DbType.POSTGRE_SQL);
+        pagination.setOptimizeJoin(true); // 浼樺寲 JOIN 鏌ヨ
+        pagination.setMaxLimit(500L); // 璁剧疆鏈�澶у崟椤甸檺鍒�
+        interceptor.addInnerInterceptor(pagination);
+
+        // 2. 涔愯閿佹彃浠�
         interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
-        // 闃叉鍏ㄥ眬鍒犻櫎鎴栨洿鏂�
+
+        // 3. 闃叉鍏ㄨ〃鏇存柊/鍒犻櫎鎻掍欢
         interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
+
         return interceptor;
     }
 
+    // 4. 娣诲姞鍏ㄥ眬绫诲瀷澶勭悊鍣ㄩ厤缃�
+    @Bean
+    public ConfigurationCustomizer configurationCustomizer() {
+        return configuration -> {
+            // 娉ㄥ唽 LocalDateTime 绫诲瀷澶勭悊鍣�
+            configuration.getTypeHandlerRegistry().register(new LocalDateTimeTypeHandler());
+
+            // 璁剧疆绌哄�煎鐞嗙瓥鐣�
+            configuration.setJdbcTypeForNull(JdbcType.NULL);
+
+            // 鍚敤鑷姩椹煎嘲鍛藉悕瑙勫垯鏄犲皠
+            configuration.setMapUnderscoreToCamelCase(true);
+        };
+    }
 }
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
index 76e1c79..5ec84d4 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
@@ -1,8 +1,10 @@
 package com.ruoyi.system.mapper;
 
-import java.util.List;
-import org.apache.ibatis.annotations.Param;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ruoyi.common.core.domain.entity.SysUser;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * 鐢ㄦ埛琛� 鏁版嵁灞�
@@ -10,7 +12,7 @@
  * @author ruoyi
  */
 public interface SysUserMapper
-{
+extends BaseMapper<SysUser> {
     /**
      * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ鐢ㄦ埛鍒楄〃
      * 
@@ -124,4 +126,9 @@
      * @return 缁撴灉
      */
     public SysUser checkEmailUnique(String email);
+
+    /**
+     * 鏌ヨ鎵�鏈夌敤鎴�
+     */
+    List<SysUser> selectUserListAll();
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
index 10bc2ab..25ab22a 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
@@ -1,7 +1,9 @@
 package com.ruoyi.system.service;
 
-import java.util.List;
 import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.system.vo.SysUserVo;
+
+import java.util.List;
 
 /**
  * 鐢ㄦ埛 涓氬姟灞�
@@ -203,4 +205,6 @@
      * @return 缁撴灉
      */
     public String importUser(List<SysUser> userList, Boolean isUpdateSupport, String operName);
+
+    List<SysUserVo> selectUserListAll();
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
index 82c303a..73d946c 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -1,15 +1,5 @@
 package com.ruoyi.system.service.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.Collectors;
-import jakarta.validation.Validator;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
 import com.ruoyi.common.annotation.DataScope;
 import com.ruoyi.common.constant.UserConstants;
 import com.ruoyi.common.core.domain.entity.SysRole;
@@ -22,124 +12,116 @@
 import com.ruoyi.system.domain.SysPost;
 import com.ruoyi.system.domain.SysUserPost;
 import com.ruoyi.system.domain.SysUserRole;
-import com.ruoyi.system.mapper.SysPostMapper;
-import com.ruoyi.system.mapper.SysRoleMapper;
-import com.ruoyi.system.mapper.SysUserMapper;
-import com.ruoyi.system.mapper.SysUserPostMapper;
-import com.ruoyi.system.mapper.SysUserRoleMapper;
+import com.ruoyi.system.mapper.*;
 import com.ruoyi.system.service.ISysConfigService;
 import com.ruoyi.system.service.ISysDeptService;
 import com.ruoyi.system.service.ISysUserService;
+import com.ruoyi.system.vo.SysUserVo;
+import jakarta.validation.Validator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 鐢ㄦ埛 涓氬姟灞傚鐞�
- * 
+ *
  * @author ruoyi
  */
 @Service
-public class SysUserServiceImpl implements ISysUserService
-{
+public class SysUserServiceImpl implements ISysUserService {
     private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class);
-
+    @Autowired
+    protected Validator validator;
     @Autowired
     private SysUserMapper userMapper;
-
     @Autowired
     private SysRoleMapper roleMapper;
-
     @Autowired
     private SysPostMapper postMapper;
-
     @Autowired
     private SysUserRoleMapper userRoleMapper;
-
     @Autowired
     private SysUserPostMapper userPostMapper;
-
     @Autowired
     private ISysConfigService configService;
-
     @Autowired
     private ISysDeptService deptService;
 
-    @Autowired
-    protected Validator validator;
-
     /**
      * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ鐢ㄦ埛鍒楄〃
-     * 
+     *
      * @param user 鐢ㄦ埛淇℃伅
      * @return 鐢ㄦ埛淇℃伅闆嗗悎淇℃伅
      */
     @Override
     @DataScope(deptAlias = "d", userAlias = "u")
-    public List<SysUser> selectUserList(SysUser user)
-    {
+    public List<SysUser> selectUserList(SysUser user) {
         return userMapper.selectUserList(user);
     }
 
     /**
      * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ宸插垎閰嶇敤鎴疯鑹插垪琛�
-     * 
+     *
      * @param user 鐢ㄦ埛淇℃伅
      * @return 鐢ㄦ埛淇℃伅闆嗗悎淇℃伅
      */
     @Override
     @DataScope(deptAlias = "d", userAlias = "u")
-    public List<SysUser> selectAllocatedList(SysUser user)
-    {
+    public List<SysUser> selectAllocatedList(SysUser user) {
         return userMapper.selectAllocatedList(user);
     }
 
     /**
      * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ鏈垎閰嶇敤鎴疯鑹插垪琛�
-     * 
+     *
      * @param user 鐢ㄦ埛淇℃伅
      * @return 鐢ㄦ埛淇℃伅闆嗗悎淇℃伅
      */
     @Override
     @DataScope(deptAlias = "d", userAlias = "u")
-    public List<SysUser> selectUnallocatedList(SysUser user)
-    {
+    public List<SysUser> selectUnallocatedList(SysUser user) {
         return userMapper.selectUnallocatedList(user);
     }
 
     /**
      * 閫氳繃鐢ㄦ埛鍚嶆煡璇㈢敤鎴�
-     * 
+     *
      * @param userName 鐢ㄦ埛鍚�
      * @return 鐢ㄦ埛瀵硅薄淇℃伅
      */
     @Override
-    public SysUser selectUserByUserName(String userName)
-    {
+    public SysUser selectUserByUserName(String userName) {
         return userMapper.selectUserByUserName(userName);
     }
 
     /**
      * 閫氳繃鐢ㄦ埛ID鏌ヨ鐢ㄦ埛
-     * 
+     *
      * @param userId 鐢ㄦ埛ID
      * @return 鐢ㄦ埛瀵硅薄淇℃伅
      */
     @Override
-    public SysUser selectUserById(Long userId)
-    {
+    public SysUser selectUserById(Long userId) {
         return userMapper.selectUserById(userId);
     }
 
     /**
      * 鏌ヨ鐢ㄦ埛鎵�灞炶鑹茬粍
-     * 
+     *
      * @param userName 鐢ㄦ埛鍚�
      * @return 缁撴灉
      */
     @Override
-    public String selectUserRoleGroup(String userName)
-    {
+    public String selectUserRoleGroup(String userName) {
         List<SysRole> list = roleMapper.selectRolesByUserName(userName);
-        if (CollectionUtils.isEmpty(list))
-        {
+        if (CollectionUtils.isEmpty(list)) {
             return StringUtils.EMPTY;
         }
         return list.stream().map(SysRole::getRoleName).collect(Collectors.joining(","));
@@ -147,16 +129,14 @@
 
     /**
      * 鏌ヨ鐢ㄦ埛鎵�灞炲矖浣嶇粍
-     * 
+     *
      * @param userName 鐢ㄦ埛鍚�
      * @return 缁撴灉
      */
     @Override
-    public String selectUserPostGroup(String userName)
-    {
+    public String selectUserPostGroup(String userName) {
         List<SysPost> list = postMapper.selectPostsByUserName(userName);
-        if (CollectionUtils.isEmpty(list))
-        {
+        if (CollectionUtils.isEmpty(list)) {
             return StringUtils.EMPTY;
         }
         return list.stream().map(SysPost::getPostName).collect(Collectors.joining(","));
@@ -164,17 +144,15 @@
 
     /**
      * 鏍¢獙鐢ㄦ埛鍚嶇О鏄惁鍞竴
-     * 
+     *
      * @param user 鐢ㄦ埛淇℃伅
      * @return 缁撴灉
      */
     @Override
-    public boolean checkUserNameUnique(SysUser user)
-    {
+    public boolean checkUserNameUnique(SysUser user) {
         Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId();
         SysUser info = userMapper.checkUserNameUnique(user.getUserName());
-        if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue())
-        {
+        if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) {
             return UserConstants.NOT_UNIQUE;
         }
         return UserConstants.UNIQUE;
@@ -187,12 +165,10 @@
      * @return
      */
     @Override
-    public boolean checkPhoneUnique(SysUser user)
-    {
+    public boolean checkPhoneUnique(SysUser user) {
         Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId();
         SysUser info = userMapper.checkPhoneUnique(user.getPhonenumber());
-        if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue())
-        {
+        if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) {
             return UserConstants.NOT_UNIQUE;
         }
         return UserConstants.UNIQUE;
@@ -205,12 +181,10 @@
      * @return
      */
     @Override
-    public boolean checkEmailUnique(SysUser user)
-    {
+    public boolean checkEmailUnique(SysUser user) {
         Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId();
         SysUser info = userMapper.checkEmailUnique(user.getEmail());
-        if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue())
-        {
+        if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) {
             return UserConstants.NOT_UNIQUE;
         }
         return UserConstants.UNIQUE;
@@ -218,33 +192,28 @@
 
     /**
      * 鏍¢獙鐢ㄦ埛鏄惁鍏佽鎿嶄綔
-     * 
+     *
      * @param user 鐢ㄦ埛淇℃伅
      */
     @Override
-    public void checkUserAllowed(SysUser user)
-    {
-        if (StringUtils.isNotNull(user.getUserId()) && user.isAdmin())
-        {
+    public void checkUserAllowed(SysUser user) {
+        if (StringUtils.isNotNull(user.getUserId()) && user.isAdmin()) {
             throw new ServiceException("涓嶅厑璁告搷浣滆秴绾х鐞嗗憳鐢ㄦ埛");
         }
     }
 
     /**
      * 鏍¢獙鐢ㄦ埛鏄惁鏈夋暟鎹潈闄�
-     * 
+     *
      * @param userId 鐢ㄦ埛id
      */
     @Override
-    public void checkUserDataScope(Long userId)
-    {
-        if (!SysUser.isAdmin(SecurityUtils.getUserId()))
-        {
+    public void checkUserDataScope(Long userId) {
+        if (!SysUser.isAdmin(SecurityUtils.getUserId())) {
             SysUser user = new SysUser();
             user.setUserId(userId);
             List<SysUser> users = SpringUtils.getAopProxy(this).selectUserList(user);
-            if (StringUtils.isEmpty(users))
-            {
+            if (StringUtils.isEmpty(users)) {
                 throw new ServiceException("娌℃湁鏉冮檺璁块棶鐢ㄦ埛鏁版嵁锛�");
             }
         }
@@ -252,14 +221,13 @@
 
     /**
      * 鏂板淇濆瓨鐢ㄦ埛淇℃伅
-     * 
+     *
      * @param user 鐢ㄦ埛淇℃伅
      * @return 缁撴灉
      */
     @Override
     @Transactional
-    public int insertUser(SysUser user)
-    {
+    public int insertUser(SysUser user) {
         // 鏂板鐢ㄦ埛淇℃伅
         int rows = userMapper.insertUser(user);
         // 鏂板鐢ㄦ埛宀椾綅鍏宠仈
@@ -271,26 +239,24 @@
 
     /**
      * 娉ㄥ唽鐢ㄦ埛淇℃伅
-     * 
+     *
      * @param user 鐢ㄦ埛淇℃伅
      * @return 缁撴灉
      */
     @Override
-    public boolean registerUser(SysUser user)
-    {
+    public boolean registerUser(SysUser user) {
         return userMapper.insertUser(user) > 0;
     }
 
     /**
      * 淇敼淇濆瓨鐢ㄦ埛淇℃伅
-     * 
+     *
      * @param user 鐢ㄦ埛淇℃伅
      * @return 缁撴灉
      */
     @Override
     @Transactional
-    public int updateUser(SysUser user)
-    {
+    public int updateUser(SysUser user) {
         Long userId = user.getUserId();
         // 鍒犻櫎鐢ㄦ埛涓庤鑹插叧鑱�
         userRoleMapper.deleteUserRoleByUserId(userId);
@@ -305,104 +271,94 @@
 
     /**
      * 鐢ㄦ埛鎺堟潈瑙掕壊
-     * 
-     * @param userId 鐢ㄦ埛ID
+     *
+     * @param userId  鐢ㄦ埛ID
      * @param roleIds 瑙掕壊缁�
      */
     @Override
     @Transactional
-    public void insertUserAuth(Long userId, Long[] roleIds)
-    {
+    public void insertUserAuth(Long userId, Long[] roleIds) {
         userRoleMapper.deleteUserRoleByUserId(userId);
         insertUserRole(userId, roleIds);
     }
 
     /**
      * 淇敼鐢ㄦ埛鐘舵��
-     * 
+     *
      * @param user 鐢ㄦ埛淇℃伅
      * @return 缁撴灉
      */
     @Override
-    public int updateUserStatus(SysUser user)
-    {
+    public int updateUserStatus(SysUser user) {
         return userMapper.updateUser(user);
     }
 
     /**
      * 淇敼鐢ㄦ埛鍩烘湰淇℃伅
-     * 
+     *
      * @param user 鐢ㄦ埛淇℃伅
      * @return 缁撴灉
      */
     @Override
-    public int updateUserProfile(SysUser user)
-    {
+    public int updateUserProfile(SysUser user) {
         return userMapper.updateUser(user);
     }
 
     /**
      * 淇敼鐢ㄦ埛澶村儚
-     * 
+     *
      * @param userName 鐢ㄦ埛鍚�
-     * @param avatar 澶村儚鍦板潃
+     * @param avatar   澶村儚鍦板潃
      * @return 缁撴灉
      */
     @Override
-    public boolean updateUserAvatar(String userName, String avatar)
-    {
+    public boolean updateUserAvatar(String userName, String avatar) {
         return userMapper.updateUserAvatar(userName, avatar) > 0;
     }
 
     /**
      * 閲嶇疆鐢ㄦ埛瀵嗙爜
-     * 
+     *
      * @param user 鐢ㄦ埛淇℃伅
      * @return 缁撴灉
      */
     @Override
-    public int resetPwd(SysUser user)
-    {
+    public int resetPwd(SysUser user) {
         return userMapper.updateUser(user);
     }
 
     /**
      * 閲嶇疆鐢ㄦ埛瀵嗙爜
-     * 
+     *
      * @param userName 鐢ㄦ埛鍚�
      * @param password 瀵嗙爜
      * @return 缁撴灉
      */
     @Override
-    public int resetUserPwd(String userName, String password)
-    {
+    public int resetUserPwd(String userName, String password) {
         return userMapper.resetUserPwd(userName, password);
     }
 
     /**
      * 鏂板鐢ㄦ埛瑙掕壊淇℃伅
-     * 
+     *
      * @param user 鐢ㄦ埛瀵硅薄
      */
-    public void insertUserRole(SysUser user)
-    {
+    public void insertUserRole(SysUser user) {
         this.insertUserRole(user.getUserId(), user.getRoleIds());
     }
 
     /**
      * 鏂板鐢ㄦ埛宀椾綅淇℃伅
-     * 
+     *
      * @param user 鐢ㄦ埛瀵硅薄
      */
-    public void insertUserPost(SysUser user)
-    {
+    public void insertUserPost(SysUser user) {
         Long[] posts = user.getPostIds();
-        if (StringUtils.isNotEmpty(posts))
-        {
+        if (StringUtils.isNotEmpty(posts)) {
             // 鏂板鐢ㄦ埛涓庡矖浣嶇鐞�
             List<SysUserPost> list = new ArrayList<SysUserPost>(posts.length);
-            for (Long postId : posts)
-            {
+            for (Long postId : posts) {
                 SysUserPost up = new SysUserPost();
                 up.setUserId(user.getUserId());
                 up.setPostId(postId);
@@ -414,18 +370,15 @@
 
     /**
      * 鏂板鐢ㄦ埛瑙掕壊淇℃伅
-     * 
-     * @param userId 鐢ㄦ埛ID
+     *
+     * @param userId  鐢ㄦ埛ID
      * @param roleIds 瑙掕壊缁�
      */
-    public void insertUserRole(Long userId, Long[] roleIds)
-    {
-        if (StringUtils.isNotEmpty(roleIds))
-        {
+    public void insertUserRole(Long userId, Long[] roleIds) {
+        if (StringUtils.isNotEmpty(roleIds)) {
             // 鏂板鐢ㄦ埛涓庤鑹茬鐞�
             List<SysUserRole> list = new ArrayList<SysUserRole>(roleIds.length);
-            for (Long roleId : roleIds)
-            {
+            for (Long roleId : roleIds) {
                 SysUserRole ur = new SysUserRole();
                 ur.setUserId(userId);
                 ur.setRoleId(roleId);
@@ -437,14 +390,13 @@
 
     /**
      * 閫氳繃鐢ㄦ埛ID鍒犻櫎鐢ㄦ埛
-     * 
+     *
      * @param userId 鐢ㄦ埛ID
      * @return 缁撴灉
      */
     @Override
     @Transactional
-    public int deleteUserById(Long userId)
-    {
+    public int deleteUserById(Long userId) {
         // 鍒犻櫎鐢ㄦ埛涓庤鑹插叧鑱�
         userRoleMapper.deleteUserRoleByUserId(userId);
         // 鍒犻櫎鐢ㄦ埛涓庡矖浣嶈〃
@@ -454,16 +406,14 @@
 
     /**
      * 鎵归噺鍒犻櫎鐢ㄦ埛淇℃伅
-     * 
+     *
      * @param userIds 闇�瑕佸垹闄ょ殑鐢ㄦ埛ID
      * @return 缁撴灉
      */
     @Override
     @Transactional
-    public int deleteUserByIds(Long[] userIds)
-    {
-        for (Long userId : userIds)
-        {
+    public int deleteUserByIds(Long[] userIds) {
+        for (Long userId : userIds) {
             checkUserAllowed(new SysUser(userId));
             checkUserDataScope(userId);
         }
@@ -474,33 +424,42 @@
         return userMapper.deleteUserByIds(userIds);
     }
 
+    @Override
+    public List<SysUserVo> selectUserListAll() {
+        List<SysUser> allUsers = userMapper.selectUserListAll();
+        // 鍒涘缓鏂扮殑鍒楄〃锛屽彧淇濈暀 userId 鍜� userName
+        List<SysUserVo> result = new ArrayList<>();
+        for (SysUser user : allUsers) {
+            SysUserVo simpleUser = new SysUserVo();
+            simpleUser.setUserId(user.getUserId());
+            simpleUser.setNickName(user.getNickName());
+            result.add(simpleUser);
+        }
+        return result;
+    }
+
     /**
      * 瀵煎叆鐢ㄦ埛鏁版嵁
-     * 
-     * @param userList 鐢ㄦ埛鏁版嵁鍒楄〃
+     *
+     * @param userList        鐢ㄦ埛鏁版嵁鍒楄〃
      * @param isUpdateSupport 鏄惁鏇存柊鏀寔锛屽鏋滃凡瀛樺湪锛屽垯杩涜鏇存柊鏁版嵁
-     * @param operName 鎿嶄綔鐢ㄦ埛
+     * @param operName        鎿嶄綔鐢ㄦ埛
      * @return 缁撴灉
      */
     @Override
-    public String importUser(List<SysUser> userList, Boolean isUpdateSupport, String operName)
-    {
-        if (StringUtils.isNull(userList) || userList.size() == 0)
-        {
+    public String importUser(List<SysUser> userList, Boolean isUpdateSupport, String operName) {
+        if (StringUtils.isNull(userList) || userList.size() == 0) {
             throw new ServiceException("瀵煎叆鐢ㄦ埛鏁版嵁涓嶈兘涓虹┖锛�");
         }
         int successNum = 0;
         int failureNum = 0;
         StringBuilder successMsg = new StringBuilder();
         StringBuilder failureMsg = new StringBuilder();
-        for (SysUser user : userList)
-        {
-            try
-            {
+        for (SysUser user : userList) {
+            try {
                 // 楠岃瘉鏄惁瀛樺湪杩欎釜鐢ㄦ埛
                 SysUser u = userMapper.selectUserByUserName(user.getUserName());
-                if (StringUtils.isNull(u))
-                {
+                if (StringUtils.isNull(u)) {
                     BeanValidators.validateWithException(validator, user);
                     deptService.checkDeptDataScope(user.getDeptId());
                     String password = configService.selectConfigByKey("sys.user.initPassword");
@@ -509,9 +468,7 @@
                     userMapper.insertUser(user);
                     successNum++;
                     successMsg.append("<br/>" + successNum + "銆佽处鍙� " + user.getUserName() + " 瀵煎叆鎴愬姛");
-                }
-                else if (isUpdateSupport)
-                {
+                } else if (isUpdateSupport) {
                     BeanValidators.validateWithException(validator, user);
                     checkUserAllowed(u);
                     checkUserDataScope(u.getUserId());
@@ -521,28 +478,21 @@
                     userMapper.updateUser(user);
                     successNum++;
                     successMsg.append("<br/>" + successNum + "銆佽处鍙� " + user.getUserName() + " 鏇存柊鎴愬姛");
-                }
-                else
-                {
+                } else {
                     failureNum++;
                     failureMsg.append("<br/>" + failureNum + "銆佽处鍙� " + user.getUserName() + " 宸插瓨鍦�");
                 }
-            }
-            catch (Exception e)
-            {
+            } catch (Exception e) {
                 failureNum++;
                 String msg = "<br/>" + failureNum + "銆佽处鍙� " + user.getUserName() + " 瀵煎叆澶辫触锛�";
                 failureMsg.append(msg + e.getMessage());
                 log.error(msg, e);
             }
         }
-        if (failureNum > 0)
-        {
+        if (failureNum > 0) {
             failureMsg.insert(0, "寰堟姳姝夛紝瀵煎叆澶辫触锛佸叡 " + failureNum + " 鏉℃暟鎹牸寮忎笉姝g‘锛岄敊璇涓嬶細");
             throw new ServiceException(failureMsg.toString());
-        }
-        else
-        {
+        } else {
             successMsg.insert(0, "鎭枩鎮紝鏁版嵁宸插叏閮ㄥ鍏ユ垚鍔燂紒鍏� " + successNum + " 鏉★紝鏁版嵁濡備笅锛�");
         }
         return successMsg.toString();
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/SysUserVo.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/SysUserVo.java
new file mode 100644
index 0000000..2d5ef64
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/SysUserVo.java
@@ -0,0 +1,12 @@
+package com.ruoyi.system.vo;
+
+import lombok.Data;
+
+@Data
+public class SysUserVo {
+
+    private Long userId;
+
+    private String nickName;
+
+}
diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
index d44c977..a41723f 100644
--- a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -141,7 +141,10 @@
 	<select id="checkEmailUnique" parameterType="String" resultMap="SysUserResult">
 		select user_id, email from sys_user where email = #{email} and del_flag = '0' limit 1
 	</select>
-	
+	<select id="selectUserListAll" resultType="com.ruoyi.common.core.domain.entity.SysUser">
+		select user_id, nick_name from sys_user where del_flag = '0'
+	</select>
+
 	<insert id="insertUser" parameterType="SysUser" useGeneratedKeys="true" keyProperty="userId">
  		insert into sys_user(
  			<if test="userId != null and userId != 0">user_id,</if>

--
Gitblit v1.9.3