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