Commit 02424b79 authored by alex yao's avatar alex yao

feat:Ai软著

parent 93494e03
...@@ -29,17 +29,20 @@ public enum AiDialoguesTypeEnum { ...@@ -29,17 +29,20 @@ public enum AiDialoguesTypeEnum {
TRAVEL_BUSINESS("travel_business", "旅游业务"), TRAVEL_BUSINESS("travel_business", "旅游业务"),
MEETING_ASSISTANT("meeting_assistant","会议助手"), MEETING_ASSISTANT("meeting_assistant", "会议助手"),
LEGISLATIVE_DOCUMENT_WRITING("legislative_document_writing","立案调查"), LEGISLATIVE_DOCUMENT_WRITING("legislative_document_writing", "立案调查"),
CAR_INSURANCE("car_insurance","车辆保险"), CAR_INSURANCE("car_insurance", "车辆保险"),
CAR_RECOMMEND("car_recommend","车辆推荐"), CAR_RECOMMEND("car_recommend", "车辆推荐"),
DATA_AUDIT("data_audit","数据校验"), DATA_AUDIT("data_audit", "数据校验"),
AI_SOFTWARE_COPYRIGHT("ai_software_copyright", "AI软著"),
; ;
......
package cn.com.poc.ai_software_copyright.aggregate;
import java.io.IOException;
import java.util.List;
import java.util.Map;
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;
/**
* AI软著-聚合服务
*
* @author alex.yao
* @date 2025/12/26
*/
public interface SoftwareCopyRightService {
/**
* 软著AI助手
*
* @param type 助手类型
* @param fileUrls 文件地址
* @param question 对话 内容
* @param data 输入参数
*/
void softwareCopyRightAssistant(
AiSoftWareCopyRightEnum.AI_ASSISTANT_TYPE type,
List<String> fileUrls,
String question,
Map<String, Object> data
) throws InterruptedException, DifyApiException, IOException;
/**
* AI-生成技术内容
*
* @param fileUrls
* @param question
* @param baseInfo
* @return
*/
TechnicalContent createTechnicalContent(List<String> fileUrls, BaseInfo baseInfo) throws IOException;
}
package cn.com.poc.ai_software_copyright.aggregate.impl;
import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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.domian.BaseInfo;
import cn.com.poc.ai_software_copyright.domian.TechnicalContent;
import cn.com.poc.common.utils.DocumentLoad;
import cn.com.poc.common.utils.JsonUtils;
import cn.com.poc.common.utils.StringUtils;
import cn.com.yict.framemax.core.exception.BusinessException;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ZipUtil;
import org.apache.commons.collections4.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
/**
* @author alex.yao
* @date 2025/12/26
*/
@Service
public class SoftwareCopyRightServiceImpl implements SoftwareCopyRightService {
private final Logger logger = LoggerFactory.getLogger(SoftwareCopyRightService.class);
@Resource
private SoftwareCopyRightAgent softwareCopyRightAgent;
@Override
public void softwareCopyRightAssistant(
AiSoftWareCopyRightEnum.AI_ASSISTANT_TYPE type,
List<String> fileUrls,
String question,
Map<String, Object> data
) throws InterruptedException, DifyApiException, IOException {
switch (type) {
case MAIN_FUNCTION:
softwareCopyRightAgent.mainFunction(fileUrls, "生成[开发目的]", data);
break;
case TARGET_INDUSTRY:
softwareCopyRightAgent.targetIndustry(fileUrls, "生成[面向行业/领域]", data);
break;
case TECHNICAL_FEATURES:
softwareCopyRightAgent.technicalFeatures(fileUrls, "生成[软件的主要功能]", data);
break;
case DEVELOPMENT_PURPOSE:
softwareCopyRightAgent.developmentPurpose(fileUrls, "生成[技术特点]", data);
break;
default:
throw new BusinessException("不支持的AI助手类型: " + type);
}
}
@Override
public TechnicalContent createTechnicalContent(List<String> fileUrls, BaseInfo baseInfo) throws IOException {
Map<String, Object> data = new HashMap<>();
// 下载文件内容
if (CollectionUtils.isNotEmpty(fileUrls)) {
StringBuilder stringBuilder = new StringBuilder();
StringBuilder codeBuilder = new StringBuilder();
for (String fileUrl : fileUrls) {
File file = DocumentLoad.downloadURLDocument(fileUrl);
// 判断是否为压缩文件并解压
if (isCompressedFile(file)) {
//todo 解压文件,获取解压后的文件列表
List<File> files = unGzip(file);
for (File codeFiles : files) {
// String fileContent = DocumentLoad.documentToText(codeFiles);
// codeBuilder.append("##").append(file.getName()).append(StringUtils.LF);
// codeBuilder.append(fileContent).append(StringUtils.LF);
}
} else {
String fileContent = DocumentLoad.documentToText(file);
stringBuilder.append("##").append(file.getName()).append(StringUtils.LF);
stringBuilder.append(fileContent).append(StringUtils.LF);
}
}
data.put("files", stringBuilder.toString());
data.put("code", codeBuilder.toString());
}
String baseInfoStr = JsonUtils.serialize(baseInfo);
String technicalContent = softwareCopyRightAgent.technicalContent(null, baseInfoStr, data);
logger.info("【技术内容】 baseInfo:{},生成结果: {}", baseInfoStr, technicalContent);
if (StringUtils.isBlank(technicalContent)) {
throw new BusinessException("执行【技术内容】生成异常");
}
return JsonUtils.deSerialize(technicalContent, TechnicalContent.class);
}
/**
* 判断文件是否为压缩文件
*
* @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);
}
}
\ No newline at end of file
...@@ -8,10 +8,45 @@ package cn.com.poc.ai_software_copyright.contant; ...@@ -8,10 +8,45 @@ package cn.com.poc.ai_software_copyright.contant;
*/ */
public class AiSoftWareCopyRightEnum { public class AiSoftWareCopyRightEnum {
//任务状态 Daft - 草稿 Pending - 排队 Running - 执行中 /**
//Complete - 完成 Error - 错误 * 任务状态
* Daft - 草稿
* Pending - 排队
* Running - 执行中
* Complete - 完成
* Error - 错误
*/
public enum GENERATED_STATUS { public enum GENERATED_STATUS {
Daft, Pending, Running, Complete, Error Daft, Pending, Running, Complete, Error
} }
/**
* AI助手对话类型
* 1.开发目的 DEVELOPMENT_PURPOSE
* 2.面向行业/领域 TARGET_INDUSTRY
* 3.软件的主要功能 MAIN_FUNCTION
* 4.该软件的技术特点 TECHNICAL_FEATURES
*/
public enum AI_ASSISTANT_TYPE {
DEVELOPMENT_PURPOSE,
TARGET_INDUSTRY,
MAIN_FUNCTION,
TECHNICAL_FEATURES
}
/**
* 文档生成类型
* 信息采集表-information
* 电脑端使用说明书-pc_operating_manual
* 手机端使用说明书-ph_operating_manual
* 源代码文档-source_code
*/
public enum DOC_TYPE {
information,
pc_operating_manual,
ph_operating_manual,
source_code
}
} }
package cn.com.poc.ai_software_copyright.dto;
import java.util.List;
import java.util.Map;
import cn.com.poc.ai_software_copyright.contant.AiSoftWareCopyRightEnum;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
/**
* @author alex.yao
* @date 2025/12/25
*/
public class SoftwareCopyRightAssistantDto {
private List<String> fileUrls;
private String question;
private AiSoftWareCopyRightEnum.AI_ASSISTANT_TYPE type;
private Map<String, Object> data;
public List<String> getFileUrls() {
return fileUrls;
}
public void setFileUrls(List<String> fileUrls) {
this.fileUrls = fileUrls;
}
public AiSoftWareCopyRightEnum.AI_ASSISTANT_TYPE getType() {
return type;
}
public void setType(AiSoftWareCopyRightEnum.AI_ASSISTANT_TYPE type) {
this.type = type;
}
public String getQuestion() {
return question;
}
public void setQuestion(String question) {
this.question = question;
}
public Map<String, Object> getData() {
return data;
}
public void setData(Map<String, Object> data) {
this.data = data;
}
}
package cn.com.poc.ai_software_copyright.rest; package cn.com.poc.ai_software_copyright.rest;
import java.io.IOException;
import java.util.List;
import cn.com.gsst.dify_client.exception.DifyApiException;
import cn.com.poc.ai_software_copyright.dto.SoftwareCopyRightAssistantDto;
import cn.com.poc.ai_software_copyright.dto.SoftwareCopyRightDto; import cn.com.poc.ai_software_copyright.dto.SoftwareCopyRightDto;
import cn.com.yict.framemax.core.rest.BaseRest; import cn.com.yict.framemax.core.rest.BaseRest;
import cn.com.yict.framemax.data.model.PagingInfo; import cn.com.yict.framemax.data.model.PagingInfo;
import java.util.List;
import cn.com.yict.framemax.web.permission.Access; import cn.com.yict.framemax.web.permission.Access;
import cn.com.yict.framemax.web.permission.Permission; import cn.com.yict.framemax.web.permission.Permission;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
...@@ -22,4 +24,12 @@ public interface BizSoftwareCopyrightRest extends BaseRest { ...@@ -22,4 +24,12 @@ public interface BizSoftwareCopyrightRest extends BaseRest {
List<SoftwareCopyRightDto> querySoftwareCopyRight(@RequestParam(required = false) String query List<SoftwareCopyRightDto> querySoftwareCopyRight(@RequestParam(required = false) String query
, @RequestParam(required = false) String generatedStatus, PagingInfo pagingInfo); , @RequestParam(required = false) String generatedStatus, PagingInfo pagingInfo);
void softwareCopyRightAssistant(@RequestBody SoftwareCopyRightAssistantDto dto)
throws DifyApiException, IOException, InterruptedException;
/**
* AI软著-生成技术内容
*/
SoftwareCopyRightDto createTechnicalContent(@RequestBody SoftwareCopyRightDto dto) throws IOException;
} }
\ No newline at end of file
package cn.com.poc.ai_software_copyright.rest.impl; package cn.com.poc.ai_software_copyright.rest.impl;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.io.IOException;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; 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.contant.AiSoftWareCopyRightEnum;
import cn.com.poc.ai_software_copyright.convert.BizSoftwareCopyrightConvert; import cn.com.poc.ai_software_copyright.convert.BizSoftwareCopyrightConvert;
import cn.com.poc.ai_software_copyright.domian.TechnicalContent;
import cn.com.poc.ai_software_copyright.dto.SoftwareCopyRightAssistantDto;
import cn.com.poc.ai_software_copyright.dto.SoftwareCopyRightDto; import cn.com.poc.ai_software_copyright.dto.SoftwareCopyRightDto;
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.query.SoftwareCopyrightQueryCondition; import cn.com.poc.ai_software_copyright.query.SoftwareCopyrightQueryCondition;
...@@ -20,23 +26,26 @@ import org.springframework.util.Assert; ...@@ -20,23 +26,26 @@ import org.springframework.util.Assert;
public class BizSoftwareCopyrightRestImpl implements BizSoftwareCopyrightRest { public class BizSoftwareCopyrightRestImpl implements BizSoftwareCopyrightRest {
@Resource @Resource
private BizSoftwareCopyrightService service; private SoftwareCopyRightService softwareCopyRightService;
@Resource
private BizSoftwareCopyrightService bizSoftwareCopyrightService;
public SoftwareCopyRightDto getById(java.lang.Long id) throws Exception { public SoftwareCopyRightDto getById(java.lang.Long id) throws Exception {
Assert.notNull(id); Assert.notNull(id);
return BizSoftwareCopyrightConvert.entityToDto(service.get(id)); return BizSoftwareCopyrightConvert.entityToDto(bizSoftwareCopyrightService.get(id));
} }
public SoftwareCopyRightDto save(SoftwareCopyRightDto dto) throws Exception { public SoftwareCopyRightDto save(SoftwareCopyRightDto dto) throws Exception {
Assert.notNull(dto); Assert.notNull(dto);
BizSoftwareCopyrightEntity entity = BizSoftwareCopyrightConvert.dtoToEntity(dto); BizSoftwareCopyrightEntity entity = BizSoftwareCopyrightConvert.dtoToEntity(dto);
entity.setGeneratedStatus(AiSoftWareCopyRightEnum.GENERATED_STATUS.Daft.name()); entity.setGeneratedStatus(AiSoftWareCopyRightEnum.GENERATED_STATUS.Daft.name());
return BizSoftwareCopyrightConvert.entityToDto(service.save(entity)); return BizSoftwareCopyrightConvert.entityToDto(bizSoftwareCopyrightService.save(entity));
} }
public void deletedById(java.lang.Long id) throws Exception { public void deletedById(java.lang.Long id) throws Exception {
Assert.notNull(id); Assert.notNull(id);
service.deletedById(id); bizSoftwareCopyrightService.deletedById(id);
} }
@Override @Override
...@@ -47,9 +56,30 @@ public class BizSoftwareCopyrightRestImpl implements BizSoftwareCopyrightRest { ...@@ -47,9 +56,30 @@ public class BizSoftwareCopyrightRestImpl implements BizSoftwareCopyrightRest {
condition.setGeneratedStatus(generatedStatus); condition.setGeneratedStatus(generatedStatus);
condition.setQuery(query); condition.setQuery(query);
List<SoftwareCopyrightQueryItem> softwareCopyrightQueryItems = List<SoftwareCopyrightQueryItem> softwareCopyrightQueryItems =
service.softwareCopyrightQuery(condition, pagingInfo); bizSoftwareCopyrightService.softwareCopyrightQuery(condition, pagingInfo);
return softwareCopyrightQueryItems.stream().map(BizSoftwareCopyrightConvert::softwareCopyrightQueryItemToDto) return softwareCopyrightQueryItems.stream().map(BizSoftwareCopyrightConvert::softwareCopyrightQueryItemToDto)
.collect( .collect(
Collectors.toList()); Collectors.toList());
} }
@Override
public void softwareCopyRightAssistant(SoftwareCopyRightAssistantDto dto)
throws DifyApiException, IOException, InterruptedException {
softwareCopyRightService.softwareCopyRightAssistant(
dto.getType(),
dto.getFileUrls(),
dto.getQuestion(),
dto.getData()
);
}
@Override
public SoftwareCopyRightDto createTechnicalContent(SoftwareCopyRightDto dto) throws IOException {
Assert.notNull(dto.getBaseInfo());
TechnicalContent technicalContent =
softwareCopyRightService.createTechnicalContent(dto.getReferenceDocumentFileUrl(), dto.getBaseInfo());
SoftwareCopyRightDto result = new SoftwareCopyRightDto();
result.setTechnicalContent(technicalContent);
return result;
}
} }
\ No newline at end of file
package cn.com.poc.ai_software_copyright.scheduler;
import javax.annotation.Resource;
import java.util.List;
import cn.com.poc.ai_software_copyright.contant.AiSoftWareCopyRightEnum;
import cn.com.poc.ai_software_copyright.entity.BizSoftwareCopyrightEntity;
import cn.com.poc.ai_software_copyright.service.BizSoftwareCopyrightService;
import cn.com.poc.common.constant.CommonConstant;
import cn.com.poc.message.entity.SoftwareCopyRightMessage;
import cn.com.poc.message.service.SoftwareCopyRightProduceService;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
* @author alex.yao
* @date 2025/12/26
*/
@Component
public class SoftwareCopyRightScheduler {
@Resource
private SoftwareCopyRightProduceService produceService;
@Resource
private BizSoftwareCopyrightService bizSoftwareCopyrightService;
@Scheduled(cron = "0 0 0/30 * * ?")
public void checkSoftwareCopyRightTask() {
BizSoftwareCopyrightEntity bizSoftwareCopyrightEntity = new BizSoftwareCopyrightEntity();
bizSoftwareCopyrightEntity.setGeneratedStatus(AiSoftWareCopyRightEnum.GENERATED_STATUS.Daft.name());
bizSoftwareCopyrightEntity.setIsDeleted(CommonConstant.IsDeleted.N);
List<BizSoftwareCopyrightEntity> bizSoftwareCopyrightEntities =
bizSoftwareCopyrightService.findByExample(bizSoftwareCopyrightEntity, null);
if (CollectionUtils.isNotEmpty(bizSoftwareCopyrightEntities)) {
for (BizSoftwareCopyrightEntity softwareCopyrightEntity : bizSoftwareCopyrightEntities) {
SoftwareCopyRightMessage message = new SoftwareCopyRightMessage();
message.setId(softwareCopyrightEntity.getId());
message.setStatus(AiSoftWareCopyRightEnum.GENERATED_STATUS.Pending);
message.setBaseInfo(bizSoftwareCopyrightEntity.getBaseInfo());
message.setTechnicalContent(bizSoftwareCopyrightEntity.getTechnicalContent());
message.setReferenceDocumentFileUrl(bizSoftwareCopyrightEntity.getReferenceDocumentFileUrl());
message.setGeneratedDocType(bizSoftwareCopyrightEntity.getGeneratedDocType());
produceService.submitTask(message);
}
}
}
}
package cn.com.poc.ai_software_copyright.service; package cn.com.poc.ai_software_copyright.service;
import java.util.List;
import cn.com.poc.ai_software_copyright.entity.BizSoftwareCopyrightEntity;
import cn.com.poc.ai_software_copyright.query.SoftwareCopyrightQueryCondition; 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.yict.framemax.core.service.BaseService; import cn.com.yict.framemax.core.service.BaseService;
import cn.com.poc.ai_software_copyright.entity.BizSoftwareCopyrightEntity;
import cn.com.yict.framemax.data.model.PagingInfo; import cn.com.yict.framemax.data.model.PagingInfo;
import java.util.Collection;
import java.util.List;
public interface BizSoftwareCopyrightService extends BaseService { public interface BizSoftwareCopyrightService extends BaseService {
BizSoftwareCopyrightEntity get(java.lang.Long id) throws Exception; BizSoftwareCopyrightEntity get(java.lang.Long id);
List<BizSoftwareCopyrightEntity> findByExample(BizSoftwareCopyrightEntity example, PagingInfo pagingInfo) List<BizSoftwareCopyrightEntity> findByExample(BizSoftwareCopyrightEntity example, PagingInfo pagingInfo);
throws Exception;
BizSoftwareCopyrightEntity save(BizSoftwareCopyrightEntity entity) throws Exception; BizSoftwareCopyrightEntity save(BizSoftwareCopyrightEntity entity);
BizSoftwareCopyrightEntity update(BizSoftwareCopyrightEntity entity) throws Exception; BizSoftwareCopyrightEntity update(BizSoftwareCopyrightEntity entity);
void deletedById(java.lang.Long id) throws Exception; void deletedById(java.lang.Long id) throws Exception;
List<SoftwareCopyrightQueryItem> softwareCopyrightQuery(SoftwareCopyrightQueryCondition condition, List<SoftwareCopyrightQueryItem> softwareCopyrightQuery(SoftwareCopyrightQueryCondition condition,
PagingInfo pagingInfo) ; PagingInfo pagingInfo);
} }
\ No newline at end of file
...@@ -25,7 +25,7 @@ public class BizSoftwareCopyrightServiceImpl extends BaseServiceImpl ...@@ -25,7 +25,7 @@ public class BizSoftwareCopyrightServiceImpl extends BaseServiceImpl
@Resource @Resource
private BizSoftwareCopyrightRepository repository; private BizSoftwareCopyrightRepository repository;
public BizSoftwareCopyrightEntity get(java.lang.Long id) throws Exception { public BizSoftwareCopyrightEntity get(java.lang.Long id){
Assert.notNull(id); Assert.notNull(id);
BizSoftwareCopyrightModel model = this.repository.get(id); BizSoftwareCopyrightModel model = this.repository.get(id);
if (model == null) { if (model == null) {
...@@ -38,8 +38,7 @@ public class BizSoftwareCopyrightServiceImpl extends BaseServiceImpl ...@@ -38,8 +38,7 @@ public class BizSoftwareCopyrightServiceImpl extends BaseServiceImpl
} }
public List<BizSoftwareCopyrightEntity> findByExample(BizSoftwareCopyrightEntity example, PagingInfo pagingInfo) public List<BizSoftwareCopyrightEntity> findByExample(BizSoftwareCopyrightEntity example, PagingInfo pagingInfo) {
throws Exception {
List<BizSoftwareCopyrightEntity> result = new ArrayList<BizSoftwareCopyrightEntity>(); List<BizSoftwareCopyrightEntity> result = new ArrayList<BizSoftwareCopyrightEntity>();
BizSoftwareCopyrightModel model = new BizSoftwareCopyrightModel(); BizSoftwareCopyrightModel model = new BizSoftwareCopyrightModel();
if (example != null) { if (example != null) {
...@@ -53,7 +52,7 @@ public class BizSoftwareCopyrightServiceImpl extends BaseServiceImpl ...@@ -53,7 +52,7 @@ public class BizSoftwareCopyrightServiceImpl extends BaseServiceImpl
return result; return result;
} }
public BizSoftwareCopyrightEntity save(BizSoftwareCopyrightEntity entity) throws Exception { public BizSoftwareCopyrightEntity save(BizSoftwareCopyrightEntity entity) {
Assert.notNull(entity); Assert.notNull(entity);
entity.setId(null); entity.setId(null);
entity.setIsDeleted("N"); entity.setIsDeleted("N");
...@@ -62,7 +61,7 @@ public class BizSoftwareCopyrightServiceImpl extends BaseServiceImpl ...@@ -62,7 +61,7 @@ public class BizSoftwareCopyrightServiceImpl extends BaseServiceImpl
return BizSoftwareCopyrightConvert.modelToEntity(saveModel); return BizSoftwareCopyrightConvert.modelToEntity(saveModel);
} }
public BizSoftwareCopyrightEntity update(BizSoftwareCopyrightEntity entity) throws Exception { public BizSoftwareCopyrightEntity update(BizSoftwareCopyrightEntity entity) {
Assert.notNull(entity); Assert.notNull(entity);
Assert.notNull(entity.getId(), "update pk can not be null"); Assert.notNull(entity.getId(), "update pk can not be null");
BizSoftwareCopyrightModel model = this.repository.get(entity.getId()); BizSoftwareCopyrightModel model = this.repository.get(entity.getId());
...@@ -107,7 +106,7 @@ public class BizSoftwareCopyrightServiceImpl extends BaseServiceImpl ...@@ -107,7 +106,7 @@ public class BizSoftwareCopyrightServiceImpl extends BaseServiceImpl
return BizSoftwareCopyrightConvert.modelToEntity(saveModel); return BizSoftwareCopyrightConvert.modelToEntity(saveModel);
} }
public void deletedById(java.lang.Long id) throws Exception { public void deletedById(java.lang.Long id){
Assert.notNull(id); Assert.notNull(id);
BizSoftwareCopyrightModel model = this.repository.get(id); BizSoftwareCopyrightModel model = this.repository.get(id);
if (model != null) { if (model != null) {
......
package cn.com.poc.message.entity;
import cn.com.poc.ai_software_copyright.contant.AiSoftWareCopyRightEnum;
/**
* @author alex.yao
* @date 2025/12/26
*/
public class SoftwareCopyRightMessage {
private Long id;
private AiSoftWareCopyRightEnum.GENERATED_STATUS status;
/**
* base_info
* 基本信息
*/
private java.lang.String baseInfo;
/**
* technical_content
* 技术内容
*/
private java.lang.String technicalContent;
/**
* generated_doc_type
* 生成文档类型
*/
private java.lang.String generatedDocType;
/**
* reference_document_file_url
* 参考文件地址 最大5份
*/
private java.lang.String referenceDocumentFileUrl;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public AiSoftWareCopyRightEnum.GENERATED_STATUS getStatus() {
return status;
}
public void setStatus(AiSoftWareCopyRightEnum.GENERATED_STATUS status) {
this.status = status;
}
public java.lang.String getBaseInfo() {
return this.baseInfo;
}
public void setBaseInfo(java.lang.String baseInfo) {
this.baseInfo = baseInfo;
}
public java.lang.String getTechnicalContent() {
return this.technicalContent;
}
public void setTechnicalContent(java.lang.String technicalContent) {
this.technicalContent = technicalContent;
}
public java.lang.String getReferenceDocumentFileUrl() {
return this.referenceDocumentFileUrl;
}
public void setReferenceDocumentFileUrl(java.lang.String referenceDocumentFileUrl) {
this.referenceDocumentFileUrl = referenceDocumentFileUrl;
}
public java.lang.String getGeneratedDocType() {
return this.generatedDocType;
}
public void setGeneratedDocType(java.lang.String generatedDocType) {
this.generatedDocType = generatedDocType;
}
}
package cn.com.poc.message.service;
import cn.com.poc.message.entity.SoftwareCopyRightMessage;
import cn.com.yict.framemax.core.service.BaseService;
/**
* @author alex.yao
* @date 2025/12/26
*/
public interface SoftwareCopyRightConsumerService extends BaseService {
/**
* 提交生成文档任务
*
* @param message
* @return
*/
void submitTask(SoftwareCopyRightMessage message);
/**
* 更新任务状态
*/
void updateStatus(SoftwareCopyRightMessage message);
}
package cn.com.poc.message.service;
import cn.com.poc.message.entity.SoftwareCopyRightMessage;
import cn.com.yict.framemax.core.service.BaseService;
/**
* @author alex.yao
* @date 2025/12/26
*/
public interface SoftwareCopyRightProduceService extends BaseService {
/**
* 提交生成文档任务
*
* @param message
* @return
*/
SoftwareCopyRightMessage submitTask(SoftwareCopyRightMessage message);
/**
* 更新任务状态
*
* @param message
* @return
*/
SoftwareCopyRightMessage updateStatus(SoftwareCopyRightMessage message);
}
package cn.com.poc.message.service.impl;
import javax.annotation.Resource;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
import cn.com.poc.ai_software_copyright.agent.SoftwareCopyRightAgent;
import cn.com.poc.ai_software_copyright.contant.AiSoftWareCopyRightEnum;
import cn.com.poc.ai_software_copyright.entity.BizSoftwareCopyrightEntity;
import cn.com.poc.ai_software_copyright.service.BizSoftwareCopyrightService;
import cn.com.poc.common.utils.JsonUtils;
import cn.com.poc.message.entity.SoftwareCopyRightMessage;
import cn.com.poc.message.service.SoftwareCopyRightConsumerService;
import cn.com.poc.message.service.SoftwareCopyRightProduceService;
import cn.com.poc.message.topic.SoftwareCopyRightTopic;
import cn.com.yict.framemax.tumbleweed.client.annotation.Consumer;
import com.fasterxml.jackson.core.type.TypeReference;
import org.springframework.stereotype.Service;
/**
* @author alex.yao
* @date 2025/12/26
*/
@Service
public class SoftwareCopyRightConsumerServiceImpl implements SoftwareCopyRightConsumerService {
@Resource
private BizSoftwareCopyrightService bizSoftwareCopyrightService;
@Resource
private SoftwareCopyRightProduceService produceService;
@Resource
private SoftwareCopyRightAgent agent;
/**
* 提交生成文档任务
*
* @param message
* @return
*/
@Override
@Consumer(topic = SoftwareCopyRightTopic.SUBMIT_SOFTWARE_COPYRIGHT_TASK, scale = 2)
public void submitTask(SoftwareCopyRightMessage message) {
message.setStatus(AiSoftWareCopyRightEnum.GENERATED_STATUS.Running);
produceService.updateStatus(message);
//todo 实现提交生成文档任务
String generatedDocType = message.getGeneratedDocType();
List<String> docTypes = JsonUtils.deSerialize(generatedDocType, new TypeReference<List<String>>() {
}.getType());
// 创建一个CompletableFuture数组来存储所有任务
List<CompletableFuture<Object>> futures = docTypes.stream()
.map(docType ->
CompletableFuture.supplyAsync(() ->
agent.generatedDocByType(message, AiSoftWareCopyRightEnum.DOC_TYPE.valueOf(docType)))
)
.collect(Collectors.toList());
// 等待所有任务完成
CompletableFuture<Void> allFutures = CompletableFuture.allOf(
futures.toArray(new CompletableFuture[0])
);
allFutures.thenRun(() -> {
//todo 处理完成逻辑
}).exceptionally(throwable -> {
return null;
});
}
@Override
@Consumer(topic = SoftwareCopyRightTopic.UPDATE_TASK_STATUS, retry = true, scale = 2)
public void updateStatus(SoftwareCopyRightMessage message) {
BizSoftwareCopyrightEntity bizSoftwareCopyrightEntity = bizSoftwareCopyrightService.get(message.getId());
if (bizSoftwareCopyrightEntity != null) {
bizSoftwareCopyrightEntity.setGeneratedStatus(message.getStatus().name());
bizSoftwareCopyrightService.update(bizSoftwareCopyrightEntity);
}
}
}
package cn.com.poc.message.service.impl;
import cn.com.poc.message.entity.SoftwareCopyRightMessage;
import cn.com.poc.message.service.SoftwareCopyRightProduceService;
import cn.com.poc.message.topic.SoftwareCopyRightTopic;
import cn.com.yict.framemax.core.service.BaseService;
import cn.com.yict.framemax.tumbleweed.client.annotation.Producer;
import cn.com.yict.framemax.tumbleweed.constant.PublishPoint;
import org.springframework.stereotype.Service;
/**
* @author alex.yao
* @date 2025/12/26
*/
@Service
public class SoftwareCopyRightProduceServiceImpl implements SoftwareCopyRightProduceService {
/**
* 提交生成文档任务
*
* @param message
* @return
*/
@Producer(topic = SoftwareCopyRightTopic.SUBMIT_SOFTWARE_COPYRIGHT_TASK)
public SoftwareCopyRightMessage submitTask(SoftwareCopyRightMessage message) {
return message;
}
@Override
@Producer(topic = SoftwareCopyRightTopic.UPDATE_TASK_STATUS, publishPoint = PublishPoint.PUBLISH_REAL_TIME)
public SoftwareCopyRightMessage updateStatus(SoftwareCopyRightMessage message) {
return message;
}
}
package cn.com.poc.message.topic;
/**
* @author alex.yao
* @date 2025/12/26
*/
public interface SoftwareCopyRightTopic {
String SUBMIT_SOFTWARE_COPYRIGHT_TASK = "SUBMIT_SOFTWARE_COPYRIGHT_TASK";
String UPDATE_TASK_STATUS = "UPDATE_TASK_STATUS";
}
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