Merge branch 'main' of 192.168.65.198:toolchaintechnologycenter/spdm-backend into dev-glc
This commit is contained in:
@@ -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=approved,1/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";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
|
||||
|
||||
@@ -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 >= #{queryBigFileReq.startTime}-->
|
||||
<!-- </if>-->
|
||||
<!-- <if test="queryBigFileReq.endTime != null">-->
|
||||
<!-- AND file_storage.createTime <= #{queryBigFileReq.endTime}-->
|
||||
<!-- </if>-->
|
||||
<!-- <if test="fileSizeInBytes != null">-->
|
||||
<!-- AND file_storage.fileSize > #{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>
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user