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