fix:优化流程需求同步创建任务

This commit is contained in:
2026-01-31 12:01:14 +08:00
parent 387a2fc210
commit 993731fe3e
7 changed files with 474 additions and 34 deletions

View File

@@ -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);
}
/**
* 获取文件用户的综合访问权限,该权限可以从祖先继承
*

View File

@@ -152,6 +152,15 @@ public interface IDataFileService {
*/
SdmResponse updatePermission(UpdatePermissionReq req);
/**
* 批量更新文件权限(优化版,支持多文件批量操作)
* @param req 批量更新权限请求参数
* @return 更新结果响应
*/
default SdmResponse batchUpdatePermission(BatchUpdatePermissionReq req) {
return SdmResponse.failed("该实现未支持批量更新权限功能");
}
/**
* 初始化系统目录

View File

@@ -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);