fix:优化流程需求同步创建任务
This commit is contained in:
@@ -215,6 +215,19 @@ public class DataFileController implements IDataFeignClient {
|
||||
return IDataFileService.updatePermission(req);
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量更新文件权限
|
||||
*
|
||||
* @param req
|
||||
* @return
|
||||
*/
|
||||
@SysLog("批量更新文件权限")
|
||||
@PostMapping("/batchUpdatePermission")
|
||||
@Operation(summary = "批量更新文件权限", description = "批量更新多个文件的用户权限(优化版)")
|
||||
public SdmResponse batchUpdatePermission(@RequestBody @Validated BatchUpdatePermissionReq req) {
|
||||
return IDataFileService.batchUpdatePermission(req);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取文件用户的综合访问权限,该权限可以从祖先继承
|
||||
*
|
||||
|
||||
@@ -152,6 +152,15 @@ public interface IDataFileService {
|
||||
*/
|
||||
SdmResponse updatePermission(UpdatePermissionReq req);
|
||||
|
||||
/**
|
||||
* 批量更新文件权限(优化版,支持多文件批量操作)
|
||||
* @param req 批量更新权限请求参数
|
||||
* @return 更新结果响应
|
||||
*/
|
||||
default SdmResponse batchUpdatePermission(BatchUpdatePermissionReq req) {
|
||||
return SdmResponse.failed("该实现未支持批量更新权限功能");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 初始化系统目录
|
||||
|
||||
@@ -986,50 +986,212 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public SdmResponse updatePermission(UpdatePermissionReq req) {
|
||||
Map<Long, Byte> userPermissions = req.getUserPermissions();
|
||||
if (ObjectUtils.isEmpty(userPermissions)) return SdmResponse.failed("参数错误,缺少userPermissions参数");
|
||||
|
||||
Long fileId = req.getFileId();
|
||||
FileMetadataInfo fileMetadataInfo = null;
|
||||
if(ObjectUtils.isNotEmpty(fileId)){
|
||||
fileMetadataInfo = fileMetadataInfoService.lambdaQuery().eq(FileMetadataInfo::getId, fileId).one();
|
||||
}else if (ObjectUtils.isNotEmpty(req.getUuid())) {
|
||||
fileMetadataInfo = fileMetadataInfoService.lambdaQuery().eq(FileMetadataInfo::getRelatedResourceUuid, req.getUuid()).one();
|
||||
if (fileMetadataInfo == null) {
|
||||
return SdmResponse.failed("根据UUID未找到对应的文件");
|
||||
}
|
||||
fileId = fileMetadataInfo.getId();
|
||||
if (ObjectUtils.isEmpty(userPermissions)) {
|
||||
return SdmResponse.failed("参数错误,缺少userPermissions参数");
|
||||
}
|
||||
|
||||
if (fileMetadataInfo == null) {
|
||||
// 1. 获取文件ID
|
||||
Long fileId = getFileIdFromRequest(req);
|
||||
if (fileId == null) {
|
||||
return SdmResponse.failed("文件不存在");
|
||||
}
|
||||
|
||||
Long finalFileId = fileId;
|
||||
// 2. 批量查询现有权限(一次查询)
|
||||
List<FileUserPermission> existingPermissions = fileUserPermissionService.lambdaQuery()
|
||||
.eq(FileUserPermission::getTFilemetaId, fileId)
|
||||
.in(FileUserPermission::getUserId, userPermissions.keySet())
|
||||
.list();
|
||||
|
||||
// 3. 构建现有用户ID集合
|
||||
Set<Long> existingUserIds = existingPermissions.stream()
|
||||
.map(FileUserPermission::getUserId)
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
// 4. 分离更新和新增
|
||||
List<FileUserPermission> toUpdate = new ArrayList<>();
|
||||
List<FileUserPermission> toInsert = new ArrayList<>();
|
||||
Long tenantId = ThreadLocalContext.getTenantId();
|
||||
|
||||
userPermissions.forEach((userId, permission) -> {
|
||||
FileUserPermission one = fileUserPermissionService.lambdaQuery()
|
||||
.eq(FileUserPermission::getTFilemetaId, finalFileId)
|
||||
.eq(FileUserPermission::getUserId, userId)
|
||||
.one();
|
||||
if (one != null) {
|
||||
//更新权限
|
||||
fileUserPermissionService.lambdaUpdate()
|
||||
.set(FileUserPermission::getPermission, permission)
|
||||
.eq(FileUserPermission::getUserId, userId)
|
||||
.eq(FileUserPermission::getTFilemetaId, finalFileId)
|
||||
.update();
|
||||
if (existingUserIds.contains(userId)) {
|
||||
// 需要更新
|
||||
FileUserPermission update = existingPermissions.stream()
|
||||
.filter(p -> p.getUserId().equals(userId))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
if (update != null) {
|
||||
update.setPermission(permission);
|
||||
toUpdate.add(update);
|
||||
}
|
||||
} else {
|
||||
// 新增权限
|
||||
FileUserPermission fileUserPermission = new FileUserPermission();
|
||||
fileUserPermission.setTFilemetaId(finalFileId);
|
||||
fileUserPermission.setUserId(userId);
|
||||
fileUserPermission.setTenantId(ThreadLocalContext.getTenantId());
|
||||
fileUserPermission.setPermission(permission);
|
||||
fileUserPermissionService.save(fileUserPermission);
|
||||
// 需要新增
|
||||
FileUserPermission insert = new FileUserPermission();
|
||||
insert.setTFilemetaId(fileId);
|
||||
insert.setUserId(userId);
|
||||
insert.setTenantId(tenantId);
|
||||
insert.setPermission(permission);
|
||||
toInsert.add(insert);
|
||||
}
|
||||
});
|
||||
|
||||
// 5. 批量更新和插入
|
||||
if (CollectionUtils.isNotEmpty(toUpdate)) {
|
||||
fileUserPermissionService.updateBatchById(toUpdate);
|
||||
}
|
||||
if (CollectionUtils.isNotEmpty(toInsert)) {
|
||||
fileUserPermissionService.saveBatch(toInsert);
|
||||
}
|
||||
|
||||
return SdmResponse.success("更新权限成功");
|
||||
}
|
||||
|
||||
/**
|
||||
* 从请求中获取文件ID
|
||||
*/
|
||||
private Long getFileIdFromRequest(UpdatePermissionReq req) {
|
||||
Long fileId = req.getFileId();
|
||||
if (ObjectUtils.isNotEmpty(fileId)) {
|
||||
FileMetadataInfo fileMetadataInfo = fileMetadataInfoService.lambdaQuery()
|
||||
.eq(FileMetadataInfo::getId, fileId)
|
||||
.one();
|
||||
return fileMetadataInfo != null ? fileMetadataInfo.getId() : null;
|
||||
}
|
||||
|
||||
if (ObjectUtils.isNotEmpty(req.getUuid())) {
|
||||
FileMetadataInfo fileMetadataInfo = fileMetadataInfoService.lambdaQuery()
|
||||
.eq(FileMetadataInfo::getRelatedResourceUuid, req.getUuid())
|
||||
.one();
|
||||
return fileMetadataInfo != null ? fileMetadataInfo.getId() : null;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public SdmResponse batchUpdatePermission(BatchUpdatePermissionReq req) {
|
||||
if (req == null || CollectionUtils.isEmpty(req.getFilePermissions())) {
|
||||
return SdmResponse.failed("文件权限列表不能为空");
|
||||
}
|
||||
|
||||
try {
|
||||
// 1. 构建文件权限映射 Map<fileId, Map<userId, permission>>
|
||||
Map<Long, Map<Long, Byte>> filePermissionMap = buildFilePermissionMap(req);
|
||||
if (filePermissionMap.isEmpty()) {
|
||||
return SdmResponse.failed("未找到有效的文件");
|
||||
}
|
||||
|
||||
// 2. 批量查询现有权限(一次查询所有文件的所有用户权限)
|
||||
Set<Long> allFileIds = filePermissionMap.keySet();
|
||||
Set<Long> allUserIds = filePermissionMap.values().stream()
|
||||
.flatMap(map -> map.keySet().stream())
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
List<FileUserPermission> existingPermissions = fileUserPermissionService.lambdaQuery()
|
||||
.in(FileUserPermission::getTFilemetaId, allFileIds)
|
||||
.in(FileUserPermission::getUserId, allUserIds)
|
||||
.list();
|
||||
|
||||
// 3. 构建现有权限的索引 Map<fileId_userId, FileUserPermission>
|
||||
Map<String, FileUserPermission> existingPermissionIndex = existingPermissions.stream()
|
||||
.collect(Collectors.toMap(
|
||||
p -> p.getTFilemetaId() + "_" + p.getUserId(),
|
||||
p -> p
|
||||
));
|
||||
|
||||
// 4. 分离更新和新增列表
|
||||
List<FileUserPermission> toUpdate = new ArrayList<>();
|
||||
List<FileUserPermission> toInsert = new ArrayList<>();
|
||||
Long tenantId = ThreadLocalContext.getTenantId();
|
||||
|
||||
filePermissionMap.forEach((fileId, userPerms) -> {
|
||||
userPerms.forEach((userId, permission) -> {
|
||||
String key = fileId + "_" + userId;
|
||||
FileUserPermission existing = existingPermissionIndex.get(key);
|
||||
|
||||
if (existing != null) {
|
||||
// 需要更新
|
||||
existing.setPermission(permission);
|
||||
toUpdate.add(existing);
|
||||
} else {
|
||||
// 需要新增
|
||||
FileUserPermission insert = new FileUserPermission();
|
||||
insert.setTFilemetaId(fileId);
|
||||
insert.setUserId(userId);
|
||||
insert.setTenantId(tenantId);
|
||||
insert.setPermission(permission);
|
||||
toInsert.add(insert);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 5. 批量执行更新和插入(两次数据库操作)
|
||||
int updateCount = 0, insertCount = 0;
|
||||
if (CollectionUtils.isNotEmpty(toUpdate)) {
|
||||
fileUserPermissionService.updateBatchById(toUpdate);
|
||||
updateCount = toUpdate.size();
|
||||
}
|
||||
if (CollectionUtils.isNotEmpty(toInsert)) {
|
||||
fileUserPermissionService.saveBatch(toInsert);
|
||||
insertCount = toInsert.size();
|
||||
}
|
||||
|
||||
log.info("批量更新权限成功,更新{}\u6761,新增{}\u6761", updateCount, insertCount);
|
||||
return SdmResponse.success("批量更新权限成功");
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("批量更新权限失败", e);
|
||||
throw new RuntimeException("批量更新权限失败", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建文件权限映射 Map<fileId, Map<userId, permission>>
|
||||
*/
|
||||
private Map<Long, Map<Long, Byte>> buildFilePermissionMap(BatchUpdatePermissionReq req) {
|
||||
Map<Long, Map<Long, Byte>> filePermissionMap = new HashMap<>();
|
||||
|
||||
// 收集所有uuid用于批量查询
|
||||
List<String> uuids = req.getFilePermissions().stream()
|
||||
.filter(item -> ObjectUtils.isEmpty(item.getFileId()) && StringUtils.hasText(item.getUuid()))
|
||||
.map(BatchUpdatePermissionReq.FilePermissionItem::getUuid)
|
||||
.distinct()
|
||||
.toList();
|
||||
|
||||
// 批量查询uuid对应的fileId
|
||||
Map<String, Long> uuidToFileIdMap = new HashMap<>();
|
||||
if (CollectionUtils.isNotEmpty(uuids)) {
|
||||
List<FileMetadataInfo> fileMetadataInfos = fileMetadataInfoService.lambdaQuery()
|
||||
.in(FileMetadataInfo::getRelatedResourceUuid, uuids)
|
||||
.list();
|
||||
uuidToFileIdMap = fileMetadataInfos.stream()
|
||||
.collect(Collectors.toMap(
|
||||
FileMetadataInfo::getRelatedResourceUuid,
|
||||
FileMetadataInfo::getId
|
||||
));
|
||||
}
|
||||
|
||||
// 构建最终的映射关系
|
||||
for (BatchUpdatePermissionReq.FilePermissionItem item : req.getFilePermissions()) {
|
||||
if (MapUtils.isEmpty(item.getUserPermissions())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Long fileId = item.getFileId();
|
||||
if (fileId == null && StringUtils.hasText(item.getUuid())) {
|
||||
fileId = uuidToFileIdMap.get(item.getUuid());
|
||||
}
|
||||
|
||||
if (fileId != null) {
|
||||
filePermissionMap.put(fileId, item.getUserPermissions());
|
||||
} else {
|
||||
log.warn("未找到文件:fileId={}, uuid={}", item.getFileId(), item.getUuid());
|
||||
}
|
||||
}
|
||||
|
||||
return filePermissionMap;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SdmResponse fileExists(String path) {
|
||||
String filePath = getDirMinioObjectKey(path);
|
||||
|
||||
Reference in New Issue
Block a user