Commit 4d5c2967 authored by alex yao's avatar alex yao

style[software_copyright]: 优化代码结构

parent 3b672403
......@@ -8,8 +8,11 @@ import cn.com.gsst.dify_client.exception.DifyApiException;
import cn.com.poc.ai_software_copyright.contant.AiSoftWareCopyRightEnum;
import cn.com.poc.ai_software_copyright.domian.BaseInfo;
import cn.com.poc.ai_software_copyright.domian.TechnicalContent;
import cn.com.poc.ai_software_copyright.dto.SoftwareCopyRightDto;
import cn.com.poc.ai_software_copyright.entity.BizSoftwareCopyrightDocRecordEntity;
import cn.com.poc.ai_software_copyright.entity.BizSoftwareCopyrightEntity;
import cn.com.poc.ai_software_copyright.entity.CallbackEntity;
import cn.com.yict.framemax.data.model.PagingInfo;
import org.springframework.web.multipart.MultipartFile;
/**
......@@ -51,7 +54,7 @@ public interface SoftwareCopyRightService {
*
* @param id biz_software_copyright 主键id
*/
BizSoftwareCopyrightDocRecordEntity listFile(Long id) ;
BizSoftwareCopyrightDocRecordEntity listFile(Long id);
/**
* 获取下载地址
......@@ -71,19 +74,21 @@ public interface SoftwareCopyRightService {
String upload(MultipartFile file) throws IOException;
/**
* 压缩文件并更新记录
* 软著查询
*
* @param recordEntity
* @return 压缩文件地址
* @param query 查询条件
* @param generatedStatus 生成状态
* @param pagingInfo 分页信息
* @return 软著列表
*/
String zipFilesAndUpdateRecord(BizSoftwareCopyrightDocRecordEntity recordEntity);
List<BizSoftwareCopyrightEntity> querySoftwareCopyRight(String query, String generatedStatus, PagingInfo pagingInfo);
/**
* 回调-生成基础文档
*
* @param taskId 回调任务ID
* @param type 回调类型
* @param taskId 回调任务ID
* @param type 回调类型
* @param callbackEntity 回调结果
*/
void callbackGeneratedBaseDoc(String taskId, String type, CallbackEntity callbackEntity);
......
......@@ -7,22 +7,27 @@ import java.io.InputStream;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionException;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
import cn.com.gsst.dify_client.exception.DifyApiException;
import cn.com.poc.ai_software_copyright.agent.SoftwareCopyRightAgent;
import cn.com.poc.ai_software_copyright.aggregate.SoftwareCopyRightService;
import cn.com.poc.ai_software_copyright.contant.AiSoftWareCopyRightEnum;
import cn.com.poc.ai_software_copyright.convert.BizSoftwareCopyrightConvert;
import cn.com.poc.ai_software_copyright.domian.BaseInfo;
import cn.com.poc.ai_software_copyright.domian.TechnicalContent;
import cn.com.poc.ai_software_copyright.entity.BizSoftwareCopyrightDocRecordEntity;
import cn.com.poc.ai_software_copyright.entity.BizSoftwareCopyrightEntity;
import cn.com.poc.ai_software_copyright.entity.CallbackEntity;
import cn.com.poc.ai_software_copyright.query.SoftwareCopyrightQueryCondition;
import cn.com.poc.ai_software_copyright.query.SoftwareCopyrightQueryItem;
import cn.com.poc.ai_software_copyright.service.BizSoftwareCopyrightDocRecordService;
import cn.com.poc.ai_software_copyright.service.BizSoftwareCopyrightService;
import cn.com.poc.common.constant.CommonConstant;
......@@ -31,11 +36,13 @@ import cn.com.poc.common.service.BizFileUploadRecordService;
import cn.com.poc.common.service.BosConfigService;
import cn.com.poc.common.service.RedisService;
import cn.com.poc.common.utils.DocumentLoad;
import cn.com.poc.common.utils.FileUtils;
import cn.com.poc.common.utils.JsonUtils;
import cn.com.poc.common.utils.MD5Util;
import cn.com.poc.common.utils.MD5Utils;
import cn.com.poc.common.utils.StringUtils;
import cn.com.yict.framemax.core.exception.BusinessException;
import cn.com.yict.framemax.data.model.PagingInfo;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ZipUtil;
......@@ -47,6 +54,8 @@ import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
/**
* 软著-聚合服务
*
* @author alex.yao
* @date 2025/12/26
*/
......@@ -55,6 +64,12 @@ public class SoftwareCopyRightServiceImpl implements SoftwareCopyRightService {
private final Logger logger = LoggerFactory.getLogger(SoftwareCopyRightService.class);
private final List<String> DRAFT_PENDING_RUNNING_STATUS = Arrays.asList(
AiSoftWareCopyRightEnum.GENERATED_STATUS.Daft.name(),
AiSoftWareCopyRightEnum.GENERATED_STATUS.Pending.name(),
AiSoftWareCopyRightEnum.GENERATED_STATUS.Running.name()
);
@Resource
private BosConfigService bosConfigService;
......@@ -116,14 +131,14 @@ public class SoftwareCopyRightServiceImpl implements SoftwareCopyRightService {
tempFiles.add(file); // 添加到临时文件列表
// 判断是否为压缩文件并解压
if (isCompressedFile(file)) {
if (FileUtils.isCompressedFile(file)) {
try {
//解压文件,获取解压后的文件列表
List<File> files = unGzip(file);
List<File> files = FileUtils.unGzip(file);
if (files != null) { // 添加空值检查
for (File codeFiles : files) {
// 验证文件名安全性
String fileName = sanitizeFileName(codeFiles.getName());
String fileName = FileUtils.sanitizeFileName(codeFiles.getName());
String fileContent = DocumentLoad.documentToText(codeFiles);
codeBuilder.append("##").append(fileName).append(StringUtils.LF);
codeBuilder.append(fileContent).append(StringUtils.LF);
......@@ -139,7 +154,7 @@ public class SoftwareCopyRightServiceImpl implements SoftwareCopyRightService {
} else {
try {
// 验证文件名安全性
String fileName = sanitizeFileName(file.getName());
String fileName = FileUtils.sanitizeFileName(file.getName());
String fileContent = DocumentLoad.documentToText(file);
stringBuilder.append("##").append(fileName).append(StringUtils.LF);
stringBuilder.append(fileContent).append(StringUtils.LF);
......@@ -190,23 +205,16 @@ public class SoftwareCopyRightServiceImpl implements SoftwareCopyRightService {
@Override
public String getDownloadUrl(Long id) {
checkTaskIsComplete(id);
BizSoftwareCopyrightDocRecordEntity bizSoftwareCopyrightDocRecordEntity =
new BizSoftwareCopyrightDocRecordEntity();
bizSoftwareCopyrightDocRecordEntity.setRelationId(id);
bizSoftwareCopyrightDocRecordEntity.setIsDeleted(CommonConstant.IsDeleted.N);
List<BizSoftwareCopyrightDocRecordEntity> recordEntities =
bizSoftwareCopyrightDocRecordService.findByExample(bizSoftwareCopyrightDocRecordEntity, null);
if (CollectionUtils.isEmpty(recordEntities)) {
BizSoftwareCopyrightDocRecordEntity recordEntity = bizSoftwareCopyrightDocRecordService.getByRelationId(id);
if (recordEntity == null) {
throw new BusinessException("查询无记录");
}
BizSoftwareCopyrightDocRecordEntity recordEntity = recordEntities.get(0);
if (StringUtils.isBlank(recordEntity.getAggregationUrl())) {
zipFilesAndUpdateRecord(recordEntity);
}
return recordEntity.getAggregationUrl();
}
@Override
public String upload(MultipartFile file) throws IOException {
String md5 = MD5Util.fileToMD5(file.getInputStream());
......@@ -217,6 +225,7 @@ public class SoftwareCopyRightServiceImpl implements SoftwareCopyRightService {
String contentType = file.getContentType();
String originalFilename = file.getOriginalFilename();
assert originalFilename != null;
String prefix = originalFilename.substring(originalFilename.lastIndexOf(".")).replaceAll("\\.", "");
String upload = bosConfigService.upload(file.getInputStream(), prefix, contentType);
......@@ -246,7 +255,31 @@ public class SoftwareCopyRightServiceImpl implements SoftwareCopyRightService {
}
@Override
public String zipFilesAndUpdateRecord(BizSoftwareCopyrightDocRecordEntity recordEntity) {
public List<BizSoftwareCopyrightEntity> querySoftwareCopyRight(String query, String generatedStatus,
PagingInfo pagingInfo) {
SoftwareCopyrightQueryCondition condition = new SoftwareCopyrightQueryCondition();
if (StringUtils.isNotBlank(generatedStatus)) {
if (DRAFT_PENDING_RUNNING_STATUS.contains(generatedStatus)) {
condition.setGeneratedStatusList(DRAFT_PENDING_RUNNING_STATUS);
} else {
condition.setGeneratedStatus(generatedStatus);
}
}
condition.setQuery(query);
List<SoftwareCopyrightQueryItem> softwareCopyrightQueryItems =
bizSoftwareCopyrightService.softwareCopyrightQuery(condition, pagingInfo);
return softwareCopyrightQueryItems.stream()
.map(BizSoftwareCopyrightConvert::softwareCopyrightQueryItemToEntity)
.collect(Collectors.toList());
}
/**
* 压缩文件并更新记录
*
* @param recordEntity
* @return
*/
private String zipFilesAndUpdateRecord(BizSoftwareCopyrightDocRecordEntity recordEntity) {
String pcOperatingManualUrl = recordEntity.getPcOperatingManual();
String informationUrl = recordEntity.getInformation();
String phOperatingManualUrl = recordEntity.getPhOperatingManual();
......@@ -258,28 +291,28 @@ public class SoftwareCopyRightServiceImpl implements SoftwareCopyRightService {
addFileIfNotBlank(pcOperatingManualUrl, files);
}).exceptionally(throwable -> {
logger.error("下载PC操作手册失败: {}", pcOperatingManualUrl, throwable);
return null;
throw new BusinessException("下载PC操作手册失败");
});
CompletableFuture<Void> informationUrlFuture = CompletableFuture.runAsync(() -> {
addFileIfNotBlank(informationUrl, files);
}).exceptionally(throwable -> {
logger.error("下载信息文件失败: {}", informationUrl, throwable);
return null;
throw new BusinessException("下载信息文件失败");
});
CompletableFuture<Void> phOperatingManualUrlFuture = CompletableFuture.runAsync(() -> {
addFileIfNotBlank(phOperatingManualUrl, files);
}).exceptionally(throwable -> {
logger.error("下载手机操作手册失败: {}", phOperatingManualUrl, throwable);
return null;
throw new BusinessException("下载手机操作手册失败");
});
CompletableFuture<Void> sourceCodeUrlFuture = CompletableFuture.runAsync(() -> {
addFileIfNotBlank(sourceCodeUrl, files);
}).exceptionally(throwable -> {
logger.error("下载源码失败: {}", sourceCodeUrl, throwable);
return null;
throw new BusinessException("下载源码失败");
});
// 等待所有文件下载完成后再执行压缩和上传
......@@ -287,7 +320,8 @@ public class SoftwareCopyRightServiceImpl implements SoftwareCopyRightService {
CompletableFuture.allOf(pcOperatingManualUrlFuture, informationUrlFuture,
phOperatingManualUrlFuture, sourceCodeUrlFuture).join();
} catch (CompletionException e) {
throw new BusinessException("文件下载过程中发生错误", e.getCause());
logger.error("文件下载过程中发生错误:{}", e.getMessage());
throw new BusinessException("文件下载过程中发生错误");
}
if (CollectionUtils.isEmpty(files)) {
......@@ -297,7 +331,7 @@ public class SoftwareCopyRightServiceImpl implements SoftwareCopyRightService {
File zipFile = null;
try {
// 创建临时文件用于存放压缩包,对文件名进行安全处理
String safeFileName = sanitizeFileName(String.valueOf(recordEntity.getId()));
String safeFileName = FileUtils.sanitizeFileName(String.valueOf(recordEntity.getId()));
zipFile = File.createTempFile("aggregation_" + safeFileName, ".zip");
// 将所有文件打包成zip
ZipUtil.zip(zipFile, Charset.defaultCharset(), false, files.toArray(new File[0]));
......@@ -350,36 +384,6 @@ public class SoftwareCopyRightServiceImpl implements SoftwareCopyRightService {
}
}
/**
* 判断文件是否为压缩文件
*
* @param file 文件
* @return 是否为压缩文件
*/
private boolean isCompressedFile(File file) {
String fileName = file.getName().toLowerCase();
return fileName.endsWith(".zip") || fileName.endsWith(".tar") ||
fileName.endsWith(".tar.gz") || fileName.endsWith(".tgz") ||
fileName.endsWith(".rar") || fileName.endsWith(".7z");
}
/**
* 解压文件
*
* @param gzipFile
* @return
* @throws IOException
*/
private List<File> unGzip(File gzipFile) throws IOException {
// 目标解压目录
String destDir = Files.createTempDirectory("gzip/temp/").toString();
// 确保目标目录存在
FileUtil.mkdir(destDir);
File[] extractedFiles = ZipUtil.unzip(gzipFile, new File(destDir)).listFiles();
return ListUtil.toList(extractedFiles);
}
private void checkTaskIsComplete(Long id) {
BizSoftwareCopyrightEntity bizSoftwareCopyrightEntity = bizSoftwareCopyrightService.get(id);
if (bizSoftwareCopyrightEntity == null) {
......@@ -390,22 +394,4 @@ public class SoftwareCopyRightServiceImpl implements SoftwareCopyRightService {
throw new BusinessException("任务未完成");
}
}
/**
* 验证并清理文件名,防止路径遍历攻击
*/
private String sanitizeFileName(String fileName) {
if (fileName == null) {
return "unknown";
}
// 移除路径分隔符,防止路径遍历
fileName = fileName.replace("../", "").replace("..\\", "").replace("..", "");
// 只保留文件名部分
int lastSeparatorIndex = Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\'));
if (lastSeparatorIndex >= 0) {
fileName = fileName.substring(lastSeparatorIndex + 1);
}
return fileName.isEmpty() ? "unknown" : fileName;
}
}
\ No newline at end of file
......@@ -87,10 +87,10 @@ public class BizSoftwareCopyrightConvert {
);
softwareCopyRightDto.setReferenceDocumentFileUrl(
StringUtils.isNotBlank(entity.getReferenceDocumentFileUrl())
? JsonUtils.deSerialize(entity.getReferenceDocumentFileUrl(), new TypeReference<List<String>>() {
}.getType())
: Collections.emptyList()
StringUtils.isNotBlank(entity.getReferenceDocumentFileUrl()) ?
JsonUtils.deSerialize(entity.getReferenceDocumentFileUrl(), new TypeReference<List<String>>() {
}.getType()) :
Collections.emptyList()
);
softwareCopyRightDto.setGeneratedDocType(
......@@ -138,4 +138,18 @@ public class BizSoftwareCopyrightConvert {
softwareCopyRightDto.setCreatedTime(item.getCreatedTime());
return softwareCopyRightDto;
}
public static BizSoftwareCopyrightEntity softwareCopyrightQueryItemToEntity(SoftwareCopyrightQueryItem item) {
BizSoftwareCopyrightEntity bizSoftwareCopyrightEntity = new BizSoftwareCopyrightEntity();
bizSoftwareCopyrightEntity.setId(item.getId());
bizSoftwareCopyrightEntity.setBaseInfo(item.getBaseInfo());
bizSoftwareCopyrightEntity.setTechnicalContent(item.getTechnicalContent());
bizSoftwareCopyrightEntity.setReferenceDocumentFileUrl(item.getReferenceDocumentFileUrl());
bizSoftwareCopyrightEntity.setGeneratedDocType(item.getGeneratedDocType());
bizSoftwareCopyrightEntity.setGeneratedStatus(item.getGeneratedStatus());
bizSoftwareCopyrightEntity.setErrorMess(item.getErrorMess());
bizSoftwareCopyrightEntity.setCreatedTime(item.getCreatedTime());
return bizSoftwareCopyrightEntity;
}
}
\ No newline at end of file
......@@ -22,8 +22,6 @@ import cn.com.poc.ai_software_copyright.query.SoftwareCopyrightQueryCondition;
import cn.com.poc.ai_software_copyright.query.SoftwareCopyrightQueryItem;
import cn.com.poc.ai_software_copyright.rest.BizSoftwareCopyrightRest;
import cn.com.poc.ai_software_copyright.service.BizSoftwareCopyrightService;
import cn.com.poc.common.service.RedisService;
import cn.com.poc.common.utils.JsonUtils;
import cn.com.poc.common.utils.StringUtils;
import cn.com.yict.framemax.data.model.PagingInfo;
import org.springframework.stereotype.Component;
......@@ -33,14 +31,9 @@ import org.springframework.web.multipart.MultipartFile;
@Component
public class BizSoftwareCopyrightRestImpl implements BizSoftwareCopyrightRest {
@Resource
private RedisService redisService;
@Resource
private SoftwareCopyRightService softwareCopyRightService;
@Resource
private BizSoftwareCopyrightService bizSoftwareCopyrightService;
......@@ -64,30 +57,11 @@ public class BizSoftwareCopyrightRestImpl implements BizSoftwareCopyrightRest {
@Override
public List<SoftwareCopyRightDto> querySoftwareCopyRight(String query, String generatedStatus,
PagingInfo pagingInfo) {
SoftwareCopyrightQueryCondition condition = new SoftwareCopyrightQueryCondition();
List<String> generatedStatusList = null;
if (StringUtils.isNotBlank(generatedStatus)) {
if (generatedStatus.equals(AiSoftWareCopyRightEnum.GENERATED_STATUS.Daft.name())
|| generatedStatus.equals(AiSoftWareCopyRightEnum.GENERATED_STATUS.Pending.name())
|| generatedStatus.equals(AiSoftWareCopyRightEnum.GENERATED_STATUS.Running.name())
) {
generatedStatusList = new ArrayList<>();
generatedStatusList.add(AiSoftWareCopyRightEnum.GENERATED_STATUS.Daft.name());
generatedStatusList.add(AiSoftWareCopyRightEnum.GENERATED_STATUS.Pending.name());
generatedStatusList.add(AiSoftWareCopyRightEnum.GENERATED_STATUS.Running.name());
condition.setGeneratedStatusList(generatedStatusList);
} else {
condition.setGeneratedStatus(generatedStatus);
}
}
condition.setQuery(query);
List<SoftwareCopyrightQueryItem> softwareCopyrightQueryItems =
bizSoftwareCopyrightService.softwareCopyrightQuery(condition, pagingInfo);
return softwareCopyrightQueryItems.stream().map(BizSoftwareCopyrightConvert::softwareCopyrightQueryItemToDto)
.collect(
Collectors.toList());
List<BizSoftwareCopyrightEntity> bizSoftwareCopyrightEntities =
softwareCopyRightService.querySoftwareCopyRight(query, generatedStatus, pagingInfo);
return bizSoftwareCopyrightEntities.stream().map(BizSoftwareCopyrightConvert::entityToDto)
.collect(Collectors.toList());
}
@Override
......
......@@ -55,25 +55,26 @@ public class SoftwareCopyRightScheduler {
"https://gsst-poe-sit.gz.bcebos.com/v1/software-copyright/%E6%A8%A1%E6%9D%BF.docx";
@Resource
private SoftwareCopyRightProduceService produceService;
private RedisService redisService;
@Resource
private RedisService redisService;
private BosConfigService bosConfigService;
@Resource
private BizSoftwareCopyrightService bizSoftwareCopyrightService;
private LegalService legalService;
@Resource
private SoftwareCopyRightAgent softwareCopyRightAgent;
@Resource
private BizSoftwareCopyrightDocRecordService bizSoftwareCopyrightDocRecordService;
private SoftwareCopyRightProduceService produceService;
@Resource
private BosConfigService bosConfigService;
private BizSoftwareCopyrightService bizSoftwareCopyrightService;
@Resource
private LegalService legalService;
private BizSoftwareCopyrightDocRecordService bizSoftwareCopyrightDocRecordService;
@Scheduled(fixedDelay = 1000 * 30)
public void checkDeftSoftwareCopyRightTask() {
......@@ -122,7 +123,7 @@ public class SoftwareCopyRightScheduler {
}
@Scheduled(fixedDelay = 1000 * 30)
@Scheduled(fixedDelay = 1000 * 15)
public void checkRunningSoftwareCopyRightTask() {
BizSoftwareCopyrightEntity bizSoftwareCopyrightEntity = new BizSoftwareCopyrightEntity();
bizSoftwareCopyrightEntity.setGeneratedStatus(AiSoftWareCopyRightEnum.GENERATED_STATUS.Running.name());
......@@ -132,41 +133,37 @@ public class SoftwareCopyRightScheduler {
if (CollectionUtils.isNotEmpty(bizSoftwareCopyrightEntities)) {
bizSoftwareCopyrightEntities.parallelStream().forEach(softwareCopyrightEntity -> {
after(softwareCopyrightEntity);
});
}
}
private void after(BizSoftwareCopyrightEntity softwareCopyrightEntity) {
BizSoftwareCopyrightDocRecordEntity recordEntity =
bizSoftwareCopyrightDocRecordService.getByRelationId(softwareCopyrightEntity.getId());
if (recordEntity == null) {
recordEntity = new BizSoftwareCopyrightDocRecordEntity();
recordEntity.setRelationId(softwareCopyrightEntity.getId());
}
String generatedDocType = softwareCopyrightEntity.getGeneratedDocType();
if (StringUtils.isBlank(generatedDocType)) {
return;
}
List<String> docTypes;
try {
docTypes = JsonUtils.deSerialize(generatedDocType, new TypeReference<List<String>>() {
if (StringUtils.isBlank(softwareCopyrightEntity.getGeneratedDocType())) {
return;
}
docTypes = JsonUtils.deSerialize(softwareCopyrightEntity.getGeneratedDocType(), new TypeReference<List<String>>() {
}.getType());
if (CollectionUtils.isEmpty(docTypes)) {
return;
}
} catch (Exception e) {
throw new IllegalArgumentException("Invalid generatedDocType format", e);
}
if (docTypes == null || docTypes.isEmpty()) {
return;
}
String redisKey = CALL_BACK + softwareCopyrightEntity.getId();
boolean allDone = true;
boolean isChange = false;
BizSoftwareCopyrightDocRecordEntity recordEntity =
bizSoftwareCopyrightDocRecordService.getByRelationId(softwareCopyrightEntity.getId());
if (recordEntity == null) {
recordEntity = new BizSoftwareCopyrightDocRecordEntity();
recordEntity.setRelationId(softwareCopyrightEntity.getId());
}
for (String docType : docTypes) {
AiSoftWareCopyRightEnum.DOC_TYPE type;
......@@ -185,11 +182,9 @@ public class SoftwareCopyRightScheduler {
allDone = false;
continue;
}
try {
JSONObject jsonObject = JSONObject.parseObject(obj.toString());
JSONArray jsonArray = jsonObject.getJSONArray("result");
if (jsonArray != null) {
byte[] documentBytes = createSourceCodeDocument(jsonArray);
String url =
......@@ -202,7 +197,6 @@ public class SoftwareCopyRightScheduler {
continue;
}
}
} else if (type.equals(AiSoftWareCopyRightEnum.DOC_TYPE.pc_operating_manual)) {
String pcOperatingManual = recordEntity.getPcOperatingManual();
if (StringUtils.isBlank(pcOperatingManual)) {
......@@ -211,11 +205,9 @@ public class SoftwareCopyRightScheduler {
allDone = false;
continue;
}
try {
JSONObject jsonObject = JSONObject.parseObject(obj.toString());
String result = jsonObject.getString("result");
if (result != null) {
byte[] documentBytes = createSimpleDocument(result);
String url = uploadDocument(documentBytes,
......@@ -229,7 +221,6 @@ public class SoftwareCopyRightScheduler {
continue;
}
}
} else if (type.equals(AiSoftWareCopyRightEnum.DOC_TYPE.ph_operating_manual)) {
String phOperatingManual = recordEntity.getPhOperatingManual();
if (StringUtils.isBlank(phOperatingManual)) { // 修复:使用正确的变量名
......@@ -261,7 +252,6 @@ public class SoftwareCopyRightScheduler {
BizSoftwareCopyrightConvert.entityToDto(softwareCopyrightEntity);
BaseInfo baseInfo = softwareCopyRightDto.getBaseInfo();
TechnicalContent technicalContent = softwareCopyRightDto.getTechnicalContent();
List<Item> items = new ArrayList<>();
buildItem(baseInfo, items, technicalContent);
LegalFileResponse legalFileResponse = new LegalFileResponse();
......@@ -286,39 +276,22 @@ public class SoftwareCopyRightScheduler {
}
private void buildItem(BaseInfo baseInfo, List<Item> items, TechnicalContent technicalContent) {
// 处理baseInfo的所有字段
// 处理baseInfo,technicalContent的所有字段
java.lang.reflect.Field[] baseInfoFields = baseInfo.getClass().getDeclaredFields();
for (java.lang.reflect.Field field : baseInfoFields) {
field.setAccessible(true);
try {
Object value = field.get(baseInfo);
List<String> values = new ArrayList<>();
if (value == null) {
values.add(" ");
}
if (value != null) {
values.add(value.toString());
}
Item item = new Item();
item.setKey(field.getName());
item.setValue(values);
item.setType("text");
items.add(item);
} catch (IllegalAccessException e) {
// 记录错误但继续处理其他字段
continue;
}
}
// 处理technicalContent的所有字段
java.lang.reflect.Field[] technicalContentFields = technicalContent.getClass().getDeclaredFields();
for (java.lang.reflect.Field field : technicalContentFields) {
java.lang.reflect.Field[] fileds =
new java.lang.reflect.Field[baseInfoFields.length + technicalContentFields.length];
System.arraycopy(baseInfoFields, 0, fileds, 0, baseInfoFields.length);
System.arraycopy(technicalContentFields, 0, fileds, baseInfoFields.length, technicalContentFields.length);
for (java.lang.reflect.Field field : fileds) {
field.setAccessible(true);
try {
Object value = field.get(technicalContent);
Object value = field.get(baseInfo);
List<String> values = new ArrayList<>();
if (value == null) {
values.add(" ");
values.add(StringUtils.SPACE);
}
if (value != null) {
values.add(value.toString());
......@@ -329,7 +302,7 @@ public class SoftwareCopyRightScheduler {
item.setType("text");
items.add(item);
} catch (IllegalAccessException e) {
// 记录错误但继续处理其他字段
//todo 记录错误但继续处理其他字段
continue;
}
}
......
package cn.com.poc.common.utils;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ZipUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;
......@@ -7,7 +10,9 @@ import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Date;
import java.util.List;
import java.util.UUID;
/**
......@@ -70,4 +75,50 @@ public class FileUtils {
return null;
}
/**
* 判断文件是否为压缩文件
*
* @param file 文件
* @return 是否为压缩文件
*/
public static boolean isCompressedFile(File file) {
String fileName = file.getName().toLowerCase();
return fileName.endsWith(".zip") || fileName.endsWith(".tar") ||
fileName.endsWith(".tar.gz") || fileName.endsWith(".tgz") ||
fileName.endsWith(".rar") || fileName.endsWith(".7z");
}
/**
* 解压文件
*
* @param gzipFile
* @return
* @throws IOException
*/
public static List<File> unGzip(File gzipFile) throws IOException {
// 目标解压目录
String destDir = Files.createTempDirectory("gzip/temp/").toString();
// 确保目标目录存在
FileUtil.mkdir(destDir);
File[] extractedFiles = ZipUtil.unzip(gzipFile, new File(destDir)).listFiles();
return ListUtil.toList(extractedFiles);
}
/**
* 验证并清理文件名,防止路径遍历攻击
*/
public static String sanitizeFileName(String fileName) {
if (fileName == null) {
return "unknown";
}
// 移除路径分隔符,防止路径遍历
fileName = fileName.replace("../", "").replace("..\\", "").replace("..", "");
// 只保留文件名部分
int lastSeparatorIndex = Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\'));
if (lastSeparatorIndex >= 0) {
fileName = fileName.substring(lastSeparatorIndex + 1);
}
return fileName.isEmpty() ? "unknown" : fileName;
}
}
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