Commit 37b2faef authored by huyuchen's avatar huyuchen

huych-电子档案批量导入第四次提交

parent bd54c0d1
......@@ -68,6 +68,12 @@ public class TAttaInfo extends BaseEntity {
@Length(max = 32, message = "实体id和关系类型共同确定附件所属不能超过32个字符")
@Schema(description = "实体id和关系类型共同确定附件所属")
private String domainId;
/**
* 任务ID,用于区分同一个domainId下不同任务的附件
*/
@Length(max = 32, message = "任务ID不能超过32个字符")
@Schema(description = "任务ID,用于区分同一个domainId下不同任务的附件")
private String taskId;
/**
* 状态 0可用 1不可用
*/
......
......@@ -218,6 +218,7 @@ public class FileUploadController {
attaInfo.setRelationType(type);
attaInfo.setDomainId(CommonConstants.ZERO_STRING); // 临时设置为"0",后续更新
attaInfo.setTaskId(CommonConstants.ZERO_STRING);// 临时设置为"0",后续更新
attaInfo.setStatus(CommonConstants.ZERO_STRING); // 0可用
// 保存附件信息到数据库
......
......@@ -20,8 +20,12 @@ public interface FileUploadService {
R<TAttaInfo> uploadFileReturnAtta(MultipartFile file, String filePath, String type, String domainId) throws IOException;
R<TAttaInfo> uploadFileReturnAtta(MultipartFile file, String filePath, String type, String domainId, String taskId) throws IOException;
R<T> uploadAsso(MultipartFile file, String filePath, String type, String domain, String uploadType);
R<T> uploadAsso(MultipartFile file, String filePath, String type, String domain, String uploadType, String taskId);
/**
* 检查文件是否存在
*
......
......@@ -291,6 +291,7 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
attaInfo.setAttaName(fileName);
attaInfo.setRelationType(ArchiveConstants.ATTA_RELATION_TYPE_TASK);
attaInfo.setDomainId(taskId);
attaInfo.setTaskId(taskId);
attaInfo.setAttaSrc(filePath);
attaInfo.setAttaType(fileName.substring(fileName.lastIndexOf('.')));
attaInfo.setStatus(ArchiveConstants.ATTA_STATUS_ENABLED);
......@@ -441,6 +442,7 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
zipAtta.setAttaSize(fileSize);
zipAtta.setRelationType(ArchiveConstants.ATTA_RELATION_TYPE_ZIP);
zipAtta.setDomainId(taskId);
zipAtta.setTaskId(taskId);
zipAtta.setStatus(ArchiveConstants.ATTA_STATUS_DISABLED);
zipAtta.setAttaSrc(tempZipFile.getAbsolutePath()); // 临时存储文件路径
attaInfoService.save(zipAtta);
......@@ -724,10 +726,10 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
continue;
}
// 递归处理资料类型目录下的所有文件(包括子目录)
processDirectoryRecursively(subFile, detail, materialType, feedbackList, materialTypes);
processDirectoryRecursively(subFile, detail, materialType, feedbackList, materialTypes, taskId);
} else {
// 直接是文件,默认为存量类型
processFile(subFile, detail, ArchiveConstants.MATERIAL_TYPE_STOCK, feedbackList, materialTypes);
processFile(subFile, detail, ArchiveConstants.MATERIAL_TYPE_STOCK, feedbackList, materialTypes, taskId);
}
}
......@@ -742,7 +744,7 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
*/
private void processDirectoryRecursively(File directory, TElectronicArchiveDetail detail,
String materialType, List<ArchiveFeedbackVO> feedbackList,
Set<String> materialTypes) {
Set<String> materialTypes, String taskId) {
File[] files = directory.listFiles();
if (files == null || files.length == 0) {
// 文件夹为空
......@@ -756,10 +758,10 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
for (File file : files) {
if (file.isDirectory()) {
// 如果是子目录,递归处理
processDirectoryRecursively(file, detail, materialType, feedbackList, materialTypes);
processDirectoryRecursively(file, detail, materialType, feedbackList, materialTypes, taskId);
} else if (file.isFile()) {
// 如果是文件,上传到阿里云并生成TAttaInfo记录
processFile(file, detail, materialType, feedbackList, materialTypes);
processFile(file, detail, materialType, feedbackList, materialTypes, taskId);
}
}
}
......@@ -768,7 +770,7 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
* 处理单个文件(上传到阿里云OSS,每个文件生成一条TAttaInfo记录)
*/
private void processFile(File file, TElectronicArchiveDetail detail, String materialType,
List<ArchiveFeedbackVO> feedbackList, Set<String> materialTypes) {
List<ArchiveFeedbackVO> feedbackList, Set<String> materialTypes, String taskId) {
String fileName = file.getName();
// 2. 校验文件格式
......@@ -795,11 +797,13 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
// 上传文件,uploadFileReturnAtta会自动生成TAttaInfo记录
// domainId为电子档案详情表的id(detail.getId())
// taskId为任务表的id,用于区分同一个domainId下不同任务的附件
R<TAttaInfo> uploadResult = fileUploadService.uploadFileReturnAtta(
multipartFile,
ossDirectory,
CommonConstants.FOUR_STRING,
detail.getId()
detail.getId(),
taskId
);
if (!R.isSuccess(uploadResult)) {
......@@ -819,7 +823,7 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
feedbackList.add(feedback);
} catch (Exception e) {
log.error("上传文件失败:{},电子档案详情ID:{}", fileName, detail.getId(), e);
log.error("上传文件失败:{},电子档案详情ID:{},任务ID:{}", fileName, detail.getId(), taskId, e);
ArchiveFeedbackVO feedback = createFeedbackVO(detail, materialType,
ArchiveConstants.PROCESS_RESULT_FAILED, "文件上传异常:" + fileName + ",原因:" + e.getMessage());
feedbackList.add(feedback);
......@@ -1227,6 +1231,13 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
.last(CommonConstants.LAST_ONE_SQL);
TElectronicArchiveDetail detail = detailService.getOne(wrapper);
// 创建任务,假删除任务
TElectronicArchiveTask task = new TElectronicArchiveTask();
task.setTaskCode("DZDAPL_SINGLE");
task.setUploadFileName("单个上传");
task.setStatus(ArchiveConstants.TASK_STATUS_GENERATED);
task.setDeleteFlag(CommonConstants.ONE_STRING);
taskService.save(task);
// 4. 如果不存在,创建新的明细
if (detail == null) {
detail = new TElectronicArchiveDetail();
......@@ -1244,14 +1255,6 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
detail.setFileTown(empInfo.getFileTown());
detailService.save(detail);
// 创建任务,假删除任务
TElectronicArchiveTask task = new TElectronicArchiveTask();
task.setTaskCode("DZDAPL_SINGLE");
task.setUploadFileName("单个上传");
task.setStatus(ArchiveConstants.TASK_STATUS_GENERATED);
task.setDeleteFlag(CommonConstants.ONE_STRING);
taskService.save(task);
// 建立任务和档案详情的关联关系
TTaskArchiveRelation relation = new TTaskArchiveRelation();
relation.setTaskId(task.getId());
......@@ -1290,6 +1293,7 @@ public class ElectronicArchiveImportServiceImpl implements ElectronicArchiveImpo
// 更新domainId
attaInfo.setDomainId(detail.getId());
attaInfo.setTaskId(task.getId());
boolean updateSuccess = attaInfoService.updateById(attaInfo);
if (updateSuccess) {
......
......@@ -44,6 +44,11 @@ public class FileUploadServiceImpl implements FileUploadService {
@Override
public R<TAttaInfo> uploadFileReturnAtta(MultipartFile file, String filePath, String type, String domainId) throws IOException {
return uploadFileReturnAtta(file, filePath, type, domainId, null);
}
@Override
public R<TAttaInfo> uploadFileReturnAtta(MultipartFile file, String filePath, String type, String domainId, String taskId) throws IOException {
if (null == file) {
return R.failed("文件删除异常,请重新上传!");
}
......@@ -91,6 +96,7 @@ public class FileUploadServiceImpl implements FileUploadService {
attaInfo.setRelationType(type);
try {
attaInfo.setDomainId(domainId);
attaInfo.setTaskId(taskId);
Set<String> dbAuthsSet = new HashSet<>();
Collection<? extends GrantedAuthority> authorities = AuthorityUtils
......@@ -197,17 +203,26 @@ public class FileUploadServiceImpl implements FileUploadService {
**/
@Override
public R uploadAsso(MultipartFile file, String filePath, String type, String domain, String uploadType){
return getR(file, filePath, type, domain, uploadType);
return uploadAsso(file, filePath, type, domain, uploadType, null);
}
@Override
public R uploadAsso(MultipartFile file, String filePath, String type, String domain, String uploadType, String taskId){
return getR(file, filePath, type, domain, uploadType, taskId);
}
public R getR(MultipartFile file, String filePath, String type, String domain, String uploadType) {
return getR(file, filePath, type, domain, uploadType, null);
}
public R getR(MultipartFile file, String filePath, String type, String domain, String uploadType, String taskId) {
maxLimit = configLimitMapper.getSysConfigLimitByKey("UPLOAD_MAX_LIMIT");
if (atomicInteger.incrementAndGet() <= maxLimit){
try {
if (CommonConstants.ZERO_STRING.equals(uploadType)){
return uploadImg(file, filePath, type, domain);
}else if (CommonConstants.ONE_STRING.equals(uploadType)){
return uploadFileReturnAtta(file, filePath, type, domain);
return uploadFileReturnAtta(file, filePath, type, domain, taskId);
}
}catch (Exception e){
log.error("附件上传异常:",e);
......
......@@ -109,9 +109,10 @@ public class TElectronicArchiveDetailServiceImpl extends ServiceImpl<TElectronic
continue;
}
// 查询该任务上传的附件(domainId为明细ID,附件是在处理ZIP时关联到明细的
// 查询该任务上传的附件(domainId为明细ID,taskId为任务ID,用于区分同一个domainId下不同任务的附件
List<TAttaInfo> taskAttachments = attaInfoService.list(Wrappers.<TAttaInfo>lambdaQuery()
.eq(TAttaInfo::getDomainId, id)
.eq(TAttaInfo::getTaskId, relation.getTaskId())
.eq(TAttaInfo::getRelationType, ArchiveConstants.ATTA_RELATION_TYPE_PER)
.eq(TAttaInfo::getStatus, ArchiveConstants.ATTA_STATUS_ENABLED));
......@@ -364,7 +365,7 @@ public class TElectronicArchiveDetailServiceImpl extends ServiceImpl<TElectronic
// 查询该明细下所有可用附件
List<TAttaInfo> allAttaList = attaInfoService.list(Wrappers.<TAttaInfo>lambdaQuery()
.eq(TAttaInfo::getDomainId, detail.getId())
.eq(TAttaInfo::getRelationType, ArchiveConstants.ATTA_RELATION_TYPE_ZIP)
.eq(TAttaInfo::getRelationType, ArchiveConstants.ATTA_RELATION_TYPE_PER)
.eq(TAttaInfo::getStatus, ArchiveConstants.ATTA_STATUS_ENABLED));
if (CollUtil.isEmpty(allAttaList)) {
......@@ -419,7 +420,7 @@ public class TElectronicArchiveDetailServiceImpl extends ServiceImpl<TElectronic
// 查询该明细下指定资料类型的附件(状态为可用)
List<TAttaInfo> attaList = attaInfoService.list(Wrappers.<TAttaInfo>lambdaQuery()
.eq(TAttaInfo::getDomainId, detail.getId())
.eq(TAttaInfo::getRelationType, ArchiveConstants.ATTA_RELATION_TYPE_ZIP)
.eq(TAttaInfo::getRelationType, ArchiveConstants.ATTA_RELATION_TYPE_PER)
.eq(TAttaInfo::getStatus, ArchiveConstants.ATTA_STATUS_ENABLED)
.like(TAttaInfo::getAttaSrc, request.getMaterialType())); // 附件路径中包含资料类型
......@@ -632,7 +633,7 @@ public class TElectronicArchiveDetailServiceImpl extends ServiceImpl<TElectronic
}
// 校验附件关系类型是否为ZIP附件
if (!ArchiveConstants.ATTA_RELATION_TYPE_ZIP.equals(atta.getRelationType())) {
if (!ArchiveConstants.ATTA_RELATION_TYPE_PER.equals(atta.getRelationType())) {
return R.failed("附件【" + atta.getAttaName() + "】不是电子档案附件");
}
......@@ -676,7 +677,7 @@ public class TElectronicArchiveDetailServiceImpl extends ServiceImpl<TElectronic
// 6. 检查该资料类型下是否还有其他可用附件
LambdaQueryWrapper<TAttaInfo> attaWrapper = Wrappers.<TAttaInfo>lambdaQuery()
.eq(TAttaInfo::getDomainId, request.getDetailId())
.eq(TAttaInfo::getRelationType, ArchiveConstants.ATTA_RELATION_TYPE_ZIP)
.eq(TAttaInfo::getRelationType, ArchiveConstants.ATTA_RELATION_TYPE_PER)
.eq(TAttaInfo::getStatus, ArchiveConstants.ATTA_STATUS_ENABLED)
.like(TAttaInfo::getAttaSrc, "/" + request.getMaterialType() + "/");
long remainingCount = attaInfoService.count(attaWrapper);
......@@ -785,7 +786,6 @@ public class TElectronicArchiveDetailServiceImpl extends ServiceImpl<TElectronic
// 2. 检查是否有可导出的档案
if (downloadMap.isEmpty()) {
log.warn("没有可导出的档案");
response.setContentType("application/json;charset=UTF-8");
response.getWriter().write("{\"code\":1,\"msg\":\"没有可导出的档案\"}");
return;
......@@ -880,7 +880,6 @@ public class TElectronicArchiveDetailServiceImpl extends ServiceImpl<TElectronic
for (String materialType : request.getMaterialTypes()) {
// 校验资料类型是否有效
if (!isValidMaterialType(materialType)) {
log.warn("资料类型无效,跳过:{}", materialType);
continue;
}
......@@ -888,31 +887,18 @@ public class TElectronicArchiveDetailServiceImpl extends ServiceImpl<TElectronic
// 通过附件路径匹配资料类型和任务
List<TAttaInfo> attaList = attaInfoService.list(Wrappers.<TAttaInfo>lambdaQuery()
.eq(TAttaInfo::getDomainId, request.getDetailId())
.eq(TAttaInfo::getRelationType, ArchiveConstants.ATTA_RELATION_TYPE_ZIP)
.eq(TAttaInfo::getTaskId, request.getTaskId())
.eq(TAttaInfo::getRelationType, ArchiveConstants.ATTA_RELATION_TYPE_PER)
.eq(TAttaInfo::getStatus, ArchiveConstants.ATTA_STATUS_ENABLED)
.like(TAttaInfo::getAttaSrc, materialType)); // 附件路径中包含资料类型
// 过滤附件:只保留属于指定任务的附件
// 方法:通过创建时间范围过滤(任务创建时间之后的附件)
List<TAttaInfo> taskAttaList = new ArrayList<>();
for (TAttaInfo atta : attaList) {
// 简单判断:附件创建时间在任务创建时间之后
if (atta.getCreateTime() != null && task.getCreateTime() != null &&
!atta.getCreateTime().isBefore(task.getCreateTime())) {
taskAttaList.add(atta);
}
}
// 如果该资料类型下有附件,添加到Map中
if (CollUtil.isNotEmpty(taskAttaList)) {
materialTypeAttaMap.put(materialType, taskAttaList);
if (CollUtil.isNotEmpty(attaList)) {
materialTypeAttaMap.put(materialType, attaList);
// 添加成功的反馈
feedbackList.add(createSelectedExportSuccessFeedbackVO(detail, task, materialType));
} else {
// 添加失败的反馈
log.warn("该资料类型下没有可用的附件,明细ID:{},任务ID:{},资料类型:{}",
request.getDetailId(), request.getTaskId(), materialType);
feedbackList.add(createSelectedExportFeedbackVOWithDetail(detail, task, materialType,
"该资料类型下没有可用的附件"));
}
......@@ -927,10 +913,24 @@ public class TElectronicArchiveDetailServiceImpl extends ServiceImpl<TElectronic
downloadInfo.setMaterialTypeAttaMap(materialTypeAttaMap);
downloadMap.put(folderName, downloadInfo);
} else {
Map<String, List<TAttaInfo>> targetMap = downloadInfo.getMaterialTypeAttaMap();
// 合并资料类型附件
for (Map.Entry<String, List<TAttaInfo>> entry : materialTypeAttaMap.entrySet()) {
String key = entry.getKey();
List<TAttaInfo> sourceValue = entry.getValue();
if (targetMap.containsKey(key)) {
// 如果key已存在,合并两个List
List<TAttaInfo> targetValue = targetMap.get(key);
targetValue.addAll(sourceValue);
materialTypeAttaMap.put(key, targetValue);
}
downloadInfo.getMaterialTypeAttaMap().putAll(materialTypeAttaMap);
}
}
// 设置资料类型列表
downloadInfo.setMaterialType(String.join(",", materialTypeAttaMap.keySet()));
}
......@@ -1020,7 +1020,8 @@ public class TElectronicArchiveDetailServiceImpl extends ServiceImpl<TElectronic
if (feedback.getEmpName().equals(detail.getEmpName()) &&
feedback.getEmpIdcard().equals(detail.getEmpIdcard()) &&
feedback.getDeptNo().equals(detail.getDeptNo()) &&
materialTypes.contains(feedback.getMaterialType())) {
materialTypes.contains(feedback.getMaterialType()) &&
Common.isEmpty(feedback.getFailReason())) {
feedback.setDownloadStatus(status);
feedback.setFailReason(failReason);
}
......@@ -1162,7 +1163,7 @@ public class TElectronicArchiveDetailServiceImpl extends ServiceImpl<TElectronic
// 1. 查询该明细下所有可用附件
List<TAttaInfo> allAttaList = attaInfoService.list(Wrappers.<TAttaInfo>lambdaQuery()
.eq(TAttaInfo::getDomainId, detail.getId())
.eq(TAttaInfo::getRelationType, ArchiveConstants.ATTA_RELATION_TYPE_ZIP)
.eq(TAttaInfo::getRelationType, ArchiveConstants.ATTA_RELATION_TYPE_PER)
.eq(TAttaInfo::getStatus, ArchiveConstants.ATTA_STATUS_ENABLED));
// 2. 如果没有附件,添加失败反馈
......@@ -1294,7 +1295,7 @@ public class TElectronicArchiveDetailServiceImpl extends ServiceImpl<TElectronic
// 2. 查询该明细下所有的附件(包括可用和不可用的)
List<TAttaInfo> attachments = attaInfoService.list(Wrappers.<TAttaInfo>lambdaQuery()
.eq(TAttaInfo::getDomainId, id)
.eq(TAttaInfo::getRelationType, ArchiveConstants.ATTA_RELATION_TYPE_ZIP));
.eq(TAttaInfo::getRelationType, ArchiveConstants.ATTA_RELATION_TYPE_PER));
// 3. 删除所有附件并删除OSS文件
int attachmentSuccessCount = 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment