Merge branch 'main' of 192.168.65.198:toolchaintechnologycenter/spdm-backend into dev-glc

This commit is contained in:
2026-03-11 09:25:45 +08:00
5 changed files with 259 additions and 18 deletions

View File

@@ -35,6 +35,7 @@ public enum ApproveFileDataTypeEnum {
// 知识库文件列表可见的类型
private static final List<Integer> VISABLE_FILE_LIST;
private static final List<Integer> ALL_VISABLE_FILE_LIST;
static {
@@ -45,6 +46,15 @@ public enum ApproveFileDataTypeEnum {
MODIFY_METADATA_REVIEWING.getCode()
));
}
static {
ALL_VISABLE_FILE_LIST = Collections.unmodifiableList(Arrays.asList(
COMPLETED.getCode(),
UPLOAD_REVIEWING.getCode(),
MODIFY_REVIEWING.getCode(),
DELETE_REVIEWING.getCode(),
MODIFY_METADATA_REVIEWING.getCode()
));
}
ApproveFileDataTypeEnum(int code, String description) {
@@ -100,10 +110,30 @@ public enum ApproveFileDataTypeEnum {
return VISABLE_FILE_LIST;
}
/**
* 获取知识库文件列表所有的类型编码列表
*/
public static List<Integer> getAllVisibleInFileList() {
return ALL_VISABLE_FILE_LIST;
}
/**
* 检查指定code是否在知识库文件列表可见范围内
*/
public static boolean isVisibleInFileList(int code) {
return VISABLE_FILE_LIST.contains(code);
}
/**
* 根据审核状态 code 返回英文状态0=approved1/2/3/4=pending
* @param code 审核状态码
* @return approved / pending
*/
public static String getStatusStr(Integer code) {
if (code == null) {
return "pending"; // 空值默认返回 pending可按你需求改
}
return code == COMPLETED.getCode() ? "approved" : "pending";
}
}

View File

@@ -115,4 +115,12 @@ public class QueryBigFileReq extends BaseReq {
@JSONField(serialize = false)
private List<Long> fileIds;
@Schema(description = "当前查询用户的id")
private Long currentReqUserId;
@Schema(description = "审批全类型")
private List<Integer> approveAllTypeList;
}

View File

@@ -8,7 +8,6 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.github.pagehelper.util.StringUtil;
import com.google.common.collect.Sets;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.common.ThreadLocalContext;
@@ -27,7 +26,6 @@ import com.sdm.common.entity.resp.data.*;
import com.sdm.common.entity.resp.project.SimulationNodeResp;
import com.sdm.common.entity.resp.system.CIDUserResp;
import com.sdm.common.feign.impl.project.SimulationNodeFeignClientImpl;
import com.sdm.common.feign.impl.system.SysLogFeignClientImpl;
import com.sdm.common.feign.impl.system.SysUserFeignClientImpl;
import com.sdm.common.feign.inter.project.ISimulationNodeFeignClient;
import com.sdm.common.feign.inter.system.IApproveFeignClient;
@@ -45,7 +43,6 @@ import com.sdm.data.bo.ExportOperate;
import com.sdm.data.model.bo.ApprovalFileDataContentsModel;
import com.sdm.data.model.bo.ApprovalParamContentsModel;
import com.sdm.data.model.dto.ExportKnowledgeDto;
import com.sdm.data.model.dto.FileDictTagsAggDTO;
import com.sdm.data.model.entity.*;
import com.sdm.data.model.enums.ApproveFileActionENUM;
import com.sdm.data.model.req.*;
@@ -931,9 +928,15 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
.filter(org.apache.commons.lang3.StringUtils::isNotBlank)
.map(Long::valueOf)
.collect(Collectors.toList());
Long userId =ThreadLocalContext.getUserId();
if(CollectionUtils.isNotEmpty(creatorIds)&&!Objects.isNull(userId)){
creatorIds.add(userId);
}
if(!Objects.isNull(userId)){
queryBigFileReq.setCurrentReqUserId(userId);
queryBigFileReq.setApproveAllTypeList(ApproveFileDataTypeEnum.getAllVisibleInFileList());
}
queryBigFileReq.setUploadUserId(creatorIds);
SdmResponse<PageDataResp<List<FileStorage>>> searchResult = dataStorageAnalysis.listBigFile(queryBigFileReq);
List<Long> fileIdList = searchResult.getData().getData().stream().map(FileStorage::getFileId).collect(Collectors.toList());
@@ -945,7 +948,12 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
FileMetadataHierarchyHelper.FileHierarchyResult hierarchyResult = hierarchyHelper.getFilesWithParentCache(fileIdList);
List<FileMetadataInfo> files = hierarchyResult.getFiles();
Map<Long, FileMetadataInfo> parentCacheMap = hierarchyResult.getParentCacheMap();
// 设置审批状态
if(CollectionUtils.isNotEmpty(files)){
files.stream().forEach(x -> {
x.setApprovalStatus(ApproveFileDataTypeEnum.getStatusStr(x.getApproveType()));
});
}
setCreatorNames(files);
setCidInfos(files);
setProjectName(files);
@@ -1054,20 +1062,63 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
.filter(org.apache.commons.lang3.StringUtils::isNotBlank)
.map(Long::valueOf)
.collect(Collectors.toList());
// 自己的id
// Long userId = ThreadLocalContext.getUserId();
// if(CollectionUtils.isNotEmpty(creatorIds)){
// creatorIds.add(userId);
// }
// PageHelper.startPage(req.getCurrent(), req.getSize());
// List<FileMetadataInfo> list = fileMetadataInfoService.lambdaQuery().eq(FileMetadataInfo::getParentId, parentId)
// .in(CollectionUtils.isNotEmpty(creatorIds), FileMetadataInfo::getCreatorId, creatorIds)
// .eq(ObjectUtils.isNotEmpty(req.getQueryTarget()), FileMetadataInfo::getDataType, req.getQueryTarget())
// .like(ObjectUtils.isNotEmpty(req.getFileName()), FileMetadataInfo::getOriginalName, req.getFileName())
// .eq(FileMetadataInfo::getIsLatest, FileIsLastEnum.YES.getValue())
// // 排除已删除(回收站中的文件)
// .isNull(FileMetadataInfo::getDeletedAt)
// // 审核完成 ,元数据修改审核中,文件修改审核中,删除文件审核中
// .in(FileMetadataInfo::getApproveType,fileDatdList)
// // 文件夹在前(dataType=1),文件在后(dataType=2),同类型内按名称升序
// .orderByAsc(FileMetadataInfo::getDataType)
// .orderByDesc(FileMetadataInfo::getCreateTime)
// .list();
Long userId = ThreadLocalContext.getUserId();
if (CollectionUtils.isNotEmpty(creatorIds) && !Objects.isNull(userId)) {
creatorIds.add(userId);
}
PageHelper.startPage(req.getCurrent(), req.getSize());
List<FileMetadataInfo> list = fileMetadataInfoService.lambdaQuery().eq(FileMetadataInfo::getParentId, parentId)
// 当前查询人的数据,所有的状态都可见
List<Integer> allVisibleInFileList = ApproveFileDataTypeEnum.getAllVisibleInFileList();
// 其他人,审批后可见状态
List<Integer> fileDatdList = ApproveFileDataTypeEnum.getVisibleInFileList();
List<FileMetadataInfo> list = fileMetadataInfoService.lambdaQuery()
.eq(FileMetadataInfo::getParentId, parentId)
.in(CollectionUtils.isNotEmpty(creatorIds), FileMetadataInfo::getCreatorId, creatorIds)
.eq(ObjectUtils.isNotEmpty(req.getQueryTarget()), FileMetadataInfo::getDataType, req.getQueryTarget())
.like(ObjectUtils.isNotEmpty(req.getFileName()), FileMetadataInfo::getOriginalName, req.getFileName())
.eq(FileMetadataInfo::getIsLatest, FileIsLastEnum.YES.getValue())
// 排除已删除(回收站中的文件)
.isNull(FileMetadataInfo::getDeletedAt)
// 审核完成 ,元数据修改审核中,文件修改审核中,删除文件审核中
.in(FileMetadataInfo::getApproveType,fileDatdList)
// 文件夹在前(dataType=1),文件在后(dataType=2),同类型内按名称升序
// ===================== 兼容 userId 为空 =====================
// 如果 userId 不为空:区分自己/别人
.nested(!Objects.isNull(userId), wrapper -> wrapper
.eq(FileMetadataInfo::getCreatorId, userId)
.in(FileMetadataInfo::getApproveType, allVisibleInFileList)
.or()
.ne(FileMetadataInfo::getCreatorId, userId)
.in(FileMetadataInfo::getApproveType, fileDatdList)
)
// 如果 userId 为空:统一走普通可见状态
.in(Objects.isNull(userId), FileMetadataInfo::getApproveType, fileDatdList)
// =================================================================
.orderByAsc(FileMetadataInfo::getDataType)
.orderByDesc(FileMetadataInfo::getCreateTime)
.list();
// 创建人赋值
setCreatorNames(list);
setCidInfos(list);
@@ -1081,11 +1132,12 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
List<FileMetadataInfoResp> dtoList = list.stream().map(entity -> {
FileMetadataInfoResp dto = new FileMetadataInfoResp();
BeanUtils.copyProperties(entity, dto);
//计算当前用户对该文件的综合权限位
// 对于列表查询,如果层级很深,频繁递归会有性能问题。
dto.setPermissionValue(fileUserPermissionService.getMergedPermission(entity.getId(), ThreadLocalContext.getUserId()));
dto.setKnowledgeBaseName(knowledgeBaseName);
// 设置审批状态
dto.setApprovalStatus(ApproveFileDataTypeEnum.getStatusStr(entity.getApproveType()));
return dto;
}).collect(Collectors.toList());

View File

@@ -155,6 +155,66 @@
) s ON t.userId = s.userId
</select>
<!-- <select id="selectBigFiles" resultType="com.sdm.data.model.entity.FileStorage">-->
<!-- SELECT-->
<!-- file_storage.fileName,file_storage.fileId,file_storage.userGroupId,file_storage.userId,file_storage.fileSuffix-->
<!-- FROM file_metadata_info-->
<!-- inner join file_storage on file_storage.fileId = file_metadata_info.id-->
<!-- <where>-->
<!-- file_metadata_info.id is not null-->
<!-- and file_metadata_info.isLatest = #{queryBigFileReq.isLatest}-->
<!-- and file_metadata_info.tenantId = #{tenantId}-->
<!-- and file_storage.tenantId = #{tenantId}-->
<!-- and file_metadata_info.deletedAt IS NULL-->
<!-- <if test="queryBigFileReq.approveTypeList != null and queryBigFileReq.approveTypeList.size()>0">-->
<!-- AND file_metadata_info.approveType IN-->
<!-- <foreach collection="queryBigFileReq.approveTypeList" item="approveType" open="(" separator="," close=")">-->
<!-- #{approveType}-->
<!-- </foreach>-->
<!-- </if>-->
<!-- <if test="queryBigFileReq.dirIds != null and queryBigFileReq.dirIds.size()>0">-->
<!-- AND file_storage.dirId IN-->
<!-- <foreach collection="queryBigFileReq.dirIds" item="dirId" open="(" separator="," close=")">-->
<!-- #{dirId}-->
<!-- </foreach>-->
<!-- </if>-->
<!-- <if test="queryBigFileReq.fileSuffix != null and queryBigFileReq.fileSuffix != ''">-->
<!-- AND file_storage.fileSuffix = #{queryBigFileReq.fileSuffix}-->
<!-- </if>-->
<!-- <if test="queryBigFileReq.fileIds != null and queryBigFileReq.fileIds.size()>0">-->
<!-- AND file_storage.fileId IN-->
<!-- <foreach collection="queryBigFileReq.fileIds" item="fileId" open="(" separator="," close=")">-->
<!-- #{fileId}-->
<!-- </foreach>-->
<!-- </if>-->
<!-- <if test="queryBigFileReq.fileName != null and queryBigFileReq.fileName != ''">-->
<!-- AND file_storage.fileName LIKE CONCAT('%', #{queryBigFileReq.fileName}, '%')-->
<!-- </if>-->
<!-- <if test="queryBigFileReq.startTime != null">-->
<!-- AND file_storage.createTime &gt;= #{queryBigFileReq.startTime}-->
<!-- </if>-->
<!-- <if test="queryBigFileReq.endTime != null">-->
<!-- AND file_storage.createTime &lt;= #{queryBigFileReq.endTime}-->
<!-- </if>-->
<!-- <if test="fileSizeInBytes != null">-->
<!-- AND file_storage.fileSize &gt; #{fileSizeInBytes}-->
<!-- </if>-->
<!-- <if test="queryBigFileReq.uploadUserId != null and queryBigFileReq.uploadUserId.size()>0">-->
<!-- AND file_storage.userId IN-->
<!-- <foreach collection="queryBigFileReq.uploadUserId" item="userId" open="(" separator="," close=")">-->
<!-- #{userId}-->
<!-- </foreach>-->
<!-- </if>-->
<!-- </where>-->
<!-- GROUP BY file_storage.fileName, file_storage.fileId, file_storage.userGroupId, file_storage.userId, file_storage.fileSuffix-->
<!-- <if test="queryBigFileReq.dirIds != null and queryBigFileReq.dirIds.size() > 0">-->
<!-- HAVING COUNT(DISTINCT file_storage.dirId) = #{queryBigFileReq.dirIdsCount}-->
<!-- </if>-->
<!-- order by MAX(file_storage.updateTime) desc-->
<!-- </select>-->
<select id="selectBigFiles" resultType="com.sdm.data.model.entity.FileStorage">
SELECT
file_storage.fileName,file_storage.fileId,file_storage.userGroupId,file_storage.userId,file_storage.fileSuffix
@@ -166,12 +226,49 @@
and file_metadata_info.tenantId = #{tenantId}
and file_storage.tenantId = #{tenantId}
and file_metadata_info.deletedAt IS NULL
<if test="queryBigFileReq.approveTypeList != null and queryBigFileReq.approveTypeList.size()>0">
AND file_metadata_info.approveType IN
<foreach collection="queryBigFileReq.approveTypeList" item="approveType" open="(" separator="," close=")">
#{approveType}
</foreach>
</if>
<!-- ===================== 修复后:兼容 currentReqUserId = null 的情况 ===================== -->
<choose>
<!-- 情况1当前用户ID 不为空 → 自己看全部状态,别人看指定状态 -->
<when test="queryBigFileReq.currentReqUserId != null">
AND (
<!-- 自己创建的:使用 approveAllTypeList -->
<if test="queryBigFileReq.approveAllTypeList != null and queryBigFileReq.approveAllTypeList.size()>0">
(file_metadata_info.creatorId = #{queryBigFileReq.currentReqUserId}
AND file_metadata_info.approveType IN
<foreach collection="queryBigFileReq.approveAllTypeList" item="approveType" open="(" separator="," close=")">
#{approveType}
</foreach>)
</if>
<!-- 连接 OR -->
<if test="(queryBigFileReq.approveAllTypeList != null and !queryBigFileReq.approveAllTypeList.isEmpty())
and (queryBigFileReq.approveTypeList != null and !queryBigFileReq.approveTypeList.isEmpty())">
OR
</if>
<!-- 别人创建的:使用 approveTypeList -->
<if test="queryBigFileReq.approveTypeList != null and queryBigFileReq.approveTypeList.size()>0">
(file_metadata_info.creatorId != #{queryBigFileReq.currentReqUserId}
AND file_metadata_info.approveType IN
<foreach collection="queryBigFileReq.approveTypeList" item="approveType" open="(" separator="," close=")">
#{approveType}
</foreach>)
</if>
)
</when>
<!-- 情况2当前用户ID 为空 → 统一使用 approveTypeList原来的逻辑 -->
<otherwise>
<if test="queryBigFileReq.approveTypeList != null and queryBigFileReq.approveTypeList.size()>0">
AND file_metadata_info.approveType IN
<foreach collection="queryBigFileReq.approveTypeList" item="approveType" open="(" separator="," close=")">
#{approveType}
</foreach>
</if>
</otherwise>
</choose>
<!-- ===================================================================================== -->
<if test="queryBigFileReq.dirIds != null and queryBigFileReq.dirIds.size()>0">
AND file_storage.dirId IN
@@ -214,4 +311,6 @@
</if>
order by MAX(file_storage.updateTime) desc
</select>
</mapper>

View File

@@ -13,6 +13,9 @@ import com.sdm.common.entity.resp.system.CIDUserResp;
import com.sdm.common.feign.impl.system.SysUserFeignClientImpl;
import com.sdm.common.utils.PageUtils;
import com.sdm.common.utils.TimeCalculator;
import com.sdm.outbridge.entity.LyricVProjectBatchToDM;
import com.sdm.outbridge.service.lyric.LyricVProjectBatchToDmService;
import com.sdm.outbridge.service.lyric.LyricVProjectToDmService;
import com.sdm.project.common.MemberTypeEnum;
import com.sdm.project.dao.SimulationTaskMapper;
import com.sdm.project.dao.SimulationWorkMapper;
@@ -56,6 +59,9 @@ public class SimulationWorkServiceImpl extends ServiceImpl<SimulationWorkMapper,
@Autowired
private SimulationTaskExtraServiceImpl taskExtraService;
@Autowired
private LyricVProjectBatchToDmService lyricVProjectBatchToDmService;
// 报工类型常量
public static final int WORK_TYPE_START = 0; // 开始报工
public static final int WORK_TYPE_FINISH = 1; // 完成报工
@@ -67,6 +73,12 @@ public class SimulationWorkServiceImpl extends ServiceImpl<SimulationWorkMapper,
SimulationTaskExtra.PROPERTY_NAME_SHOULD_PROGRESS
);
// 特殊批次名称
public static final String SPECIAL_BATCH_NAME = "C01";
// 普通批次名称
public static final String GENERAL_BATCH_NAME = "P00";
/**
* 更新任务应达成进度(删除旧值+保存新值)
*/
@@ -362,4 +374,44 @@ public class SimulationWorkServiceImpl extends ServiceImpl<SimulationWorkMapper,
return SdmResponse.success();
}
/**
* 根据项目ID获取对应的批次号
* 规则优先返回C01批次无则返回固定值P00
*
* @param projectId 项目ID非空
* @return 批次号C01/P00
*/
public String getBatchByProjectId(String projectId) {
// 1. 参数校验
if (StringUtils.isBlank(projectId)) {
String errorMsg = String.format("获取批次号失败projectId不能为空入参为[%s]", projectId);
log.error(errorMsg);
throw new IllegalArgumentException(errorMsg);
}
// 2. 直接查询是否存在C01批次
boolean existsSpecialBatch = lyricVProjectBatchToDmService.lambdaQuery()
.eq(LyricVProjectBatchToDM::getProjectId, projectId)
.eq(LyricVProjectBatchToDM::getBatch, SPECIAL_BATCH_NAME)
.exists();
// 3. 存在C01批次则返回否则检查是否有其他批次
if (existsSpecialBatch) {
return SPECIAL_BATCH_NAME;
}
// 4. 检查是否有其他批次数据原逻辑无数据返回空串有数据返回P00
boolean existsAnyBatch = lyricVProjectBatchToDmService.lambdaQuery()
.eq(LyricVProjectBatchToDM::getProjectId, projectId)
.exists();
if (!existsAnyBatch) {
log.error("根据projectId{}未查询到任何批次信息,返回空串", projectId);
return "";
}
// 5. 有批次但无C01返回通用批次
return GENERAL_BATCH_NAME;
}
}