Commit 0f2a319d by pengshun

feat: 支持doc转docx

parent 60dd1279
No preview for this file type
No preview for this file type
...@@ -37,23 +37,8 @@ ...@@ -37,23 +37,8 @@
<module name="yudao-spring-boot-starter-biz-ip" /> <module name="yudao-spring-boot-starter-biz-ip" />
<module name="yudao-module-infra-api" /> <module name="yudao-module-infra-api" />
<module name="yudao-spring-boot-starter-monitor" /> <module name="yudao-spring-boot-starter-monitor" />
<module name="yudao-module-system-api" />
</profile>
<profile name="Annotation profile for yudao-module-infra-biz" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<processorPath useClasspath="false">
<entry name="$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-configuration-processor/3.3.4/spring-boot-configuration-processor-3.3.4.jar" />
<entry name="$MAVEN_REPOSITORY$/org/projectlombok/lombok/1.18.34/lombok-1.18.34.jar" />
<entry name="$MAVEN_REPOSITORY$/org/mapstruct/mapstruct-processor/1.6.2/mapstruct-processor-1.6.2.jar" />
<entry name="$MAVEN_REPOSITORY$/org/mapstruct/mapstruct/1.6.2/mapstruct-1.6.2.jar" />
<entry name="$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-configuration-processor/3.3.4/spring-boot-configuration-processor-3.3.4.jar" />
<entry name="$MAVEN_REPOSITORY$/org/projectlombok/lombok/1.18.34/lombok-1.18.34.jar" />
<entry name="$MAVEN_REPOSITORY$/org/mapstruct/mapstruct-processor/1.6.2/mapstruct-processor-1.6.2.jar" />
<entry name="$MAVEN_REPOSITORY$/org/mapstruct/mapstruct/1.6.2/mapstruct-1.6.2.jar" />
</processorPath>
<module name="yudao-module-infra-biz" /> <module name="yudao-module-infra-biz" />
<module name="yudao-module-system-api" />
</profile> </profile>
<profile name="Annotation profile for yudao-server" enabled="true"> <profile name="Annotation profile for yudao-server" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" /> <sourceOutputDir name="target/generated-sources/annotations" />
......
...@@ -27,6 +27,11 @@ ...@@ -27,6 +27,11 @@
<option name="url" value="https://repo.spring.io/snapshot" /> <option name="url" value="https://repo.spring.io/snapshot" />
</remote-repository> </remote-repository>
<remote-repository> <remote-repository>
<option name="id" value="com.e-iceblue" />
<option name="name" value="com.e-iceblue" />
<option name="url" value="https://repo.e-iceblue.cn/repository/maven-public/" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" /> <option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" /> <option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" /> <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
......
...@@ -87,4 +87,6 @@ public interface ErrorCodeConstants { ...@@ -87,4 +87,6 @@ public interface ErrorCodeConstants {
ErrorCode FASTGPT_REF_ERROR = new ErrorCode(1_022_009_005, "未找到知识库引用"); ErrorCode FASTGPT_REF_ERROR = new ErrorCode(1_022_009_005, "未找到知识库引用");
ErrorCode FASTGPT_DETAIL_ERROR = new ErrorCode(1_022_009_005, "未找到知识库详情"); ErrorCode FASTGPT_DETAIL_ERROR = new ErrorCode(1_022_009_005, "未找到知识库详情");
ErrorCode AGENT_POLICY_NOTIFY_NOT_EXISTS = new ErrorCode(1_043_001_001, "操作失败,找不到该记录");
} }
package cn.iocoder.yudao.module.ai.controller.admin.agent; package cn.iocoder.yudao.module.ai.controller.admin.agent;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.ai.controller.admin.agent.vo.*; import cn.iocoder.yudao.module.ai.controller.admin.agent.vo.*;
import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.analysis.AiChatAnalysisPageReqVO;
import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.analysis.AiChatAnalysisRespVO;
import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationCreateMyReqVO;
import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatAnalysisDO;
import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatConversationDO; import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatConversationDO;
import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiAgentPolicyNotifyDO;
import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiApiKeyDO; import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiApiKeyDO;
import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModelDO; import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModelDO;
import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO; import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO;
import cn.iocoder.yudao.module.ai.service.agent.AgentPolicyNotifyService;
import cn.iocoder.yudao.module.ai.service.agent.OrderInfoRequestService; import cn.iocoder.yudao.module.ai.service.agent.OrderInfoRequestService;
import cn.iocoder.yudao.module.ai.service.chat.AiChatConversationService; import cn.iocoder.yudao.module.ai.service.chat.AiChatConversationService;
import cn.iocoder.yudao.module.ai.service.chat.AiChatMessageService; import cn.iocoder.yudao.module.ai.service.chat.AiChatMessageService;
...@@ -72,6 +81,9 @@ public class AgentChatController { ...@@ -72,6 +81,9 @@ public class AgentChatController {
@Resource @Resource
private AiChatMessageService chatMessageService; private AiChatMessageService chatMessageService;
@Resource
private AgentPolicyNotifyService agentPolicyNotifyService;
@PostMapping("/create-agent-records") @PostMapping("/create-agent-records")
@Operation(summary = "创建对话过的智能体记录") @Operation(summary = "创建对话过的智能体记录")
@PermitAll @PermitAll
...@@ -559,4 +571,41 @@ public class AgentChatController { ...@@ -559,4 +571,41 @@ public class AgentChatController {
} }
} }
@GetMapping("/page-policy")
@Operation(summary = "获得政策通知-分页")
@PermitAll
public CommonResult<PageResult<AiAgentPolicyNotifyRespVO>> getPolicyPage(AiAgentPolicyNotifyPageReqVO pageReqVO) {
PageResult<AiAgentPolicyNotifyDO> pageResult = agentPolicyNotifyService.getPolicyPage(pageReqVO);
if (CollUtil.isEmpty(pageResult.getList())) {
return success(PageResult.empty());
}
Long userId = getLoginUserId();
// return success(BeanUtils.toBean(pageResult, AiAgentPolicyNotifyRespVO.class));
List<AiAgentPolicyNotifyRespVO> voList = pageResult.getList().stream()
.map(doObj -> {
AiAgentPolicyNotifyRespVO vo = BeanUtils.toBean(doObj, AiAgentPolicyNotifyRespVO.class);
// 判断是否已读:userId 不为 null 且 readList 包含 userId
boolean read = userId != null
&& doObj.getReadList() != null
&& doObj.getReadList().contains(userId);
vo.setRead(read);
return vo;
})
.collect(Collectors.toList());
return success(new PageResult<>(voList, pageResult.getTotal()));
}
@PostMapping("/create-policy")
@Operation(summary = "创建政策通知信息")
public CommonResult<Long> createPolicy(@RequestBody @Valid AiAgentPolicyNotifyCreateReqVO createReqVO) {
return success(agentPolicyNotifyService.createPolicyNotify(createReqVO));
}
@PutMapping("/update-read")
@Operation(summary = "更新已读状态")
public CommonResult<Boolean> updatePolicyRead(@RequestBody @Valid AiAgentPolicyNotifyUpdateReqVO updateReqVO) {
agentPolicyNotifyService.updatePolicyRead(updateReqVO, getLoginUserId());
return success(true);
}
} }
package cn.iocoder.yudao.module.ai.controller.admin.agent.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - AI智能体策略通知创建 Request VO")
@Data
public class AiAgentPolicyNotifyCreateReqVO {
@Schema(description = "政策名", requiredMode = Schema.RequiredMode.REQUIRED, example = "关于进一步规范公租房管理的通知")
private String policyName;
@Schema(description = "制度名(匹配的规则名称)", requiredMode = Schema.RequiredMode.REQUIRED, example = "公租房资格审核规则")
private String matchedRuleName;
@Schema(description = "政策发布日期", requiredMode = Schema.RequiredMode.REQUIRED, example = "1757376000000")
private LocalDateTime policyPublishDate;
@Schema(description = "政策原文链接", example = "https://example.com/policy/123")
private String policySourceUrl;
@Schema(description = "校验时间", example = "1757376000000")
private LocalDateTime checkTime;
@Schema(description = "结果(摘要结果)", requiredMode = Schema.RequiredMode.REQUIRED, example = "该政策涉及收入门槛调整")
private String summaryResult;
@Schema(description = "详情", requiredMode = Schema.RequiredMode.REQUIRED, example = "详细内容...")
private String details;
}
package cn.iocoder.yudao.module.ai.controller.admin.agent.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "管理后台 - AI智能体策略通知 Request VO")
@Data
public class AiAgentPolicyNotifyPageReqVO extends PageParam {
}
package cn.iocoder.yudao.module.ai.controller.admin.agent.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - AI智能体策略通知 Response VO")
@Data
public class AiAgentPolicyNotifyRespVO {
@Schema(description = "记录编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long id;
@Schema(description = "政策名", example = "关于进一步规范公租房管理的通知")
private String policyName;
@Schema(description = "制度名(匹配的规则名称)", example = "公租房资格审核规则")
private String matchedRuleName;
@Schema(description = "政策发布日期", example = "2025-03-01 10:00:00")
private LocalDateTime policyPublishDate;
@Schema(description = "校验时间", example = "2025-03-15 14:30:00")
private LocalDateTime checkTime;
@Schema(description = "结果(摘要结果)", example = "该政策涉及收入门槛调整")
private String summaryResult;
@Schema(description = "政策原文链接", example = "https://example.com/policy/123")
private String policySourceUrl;
@Schema(description = "详情", example = "详细内容...")
private String details;
@Schema(description = "当前用户是否已读", example = "true")
private Boolean read;
}
package cn.iocoder.yudao.module.ai.controller.admin.agent.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - AI智能体策略通知已读状态更新 Request VO")
@Data
public class AiAgentPolicyNotifyUpdateReqVO {
@Schema(description = "数据ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long id;
@Schema(description = "是否已读", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
private Boolean read;
}
...@@ -71,6 +71,15 @@ public class AiKnowledgeDocumentController { ...@@ -71,6 +71,15 @@ public class AiKnowledgeDocumentController {
return success(BeanUtils.toBean(pageResult, AiKnowledgeDocumentRespVO.class)); return success(BeanUtils.toBean(pageResult, AiKnowledgeDocumentRespVO.class));
} }
@GetMapping("/page-kl-by-id")
@Operation(summary = "通过用户ID获取知识库文档分页")
public CommonResult<PageResult<AiKnowledgeDocumentRespVO>> getKnowledgeDocumentPageByUserId(
@Valid AiKnowledgeDocumentPageReqVO pageReqVO) {
Long userId = pageReqVO.getUserId();
PageResult<AiKnowledgeDocumentDO> pageResult = documentService.getKnowledgeDocumentPageByUserId(pageReqVO, userId);
return success(BeanUtils.toBean(pageResult, AiKnowledgeDocumentRespVO.class));
}
@GetMapping("/get") @GetMapping("/get")
@Operation(summary = "获取文档详情") @Operation(summary = "获取文档详情")
@PreAuthorize("@ss.hasPermission('ai:knowledge:query')") @PreAuthorize("@ss.hasPermission('ai:knowledge:query')")
......
...@@ -17,4 +17,7 @@ public class AiKnowledgeDocumentPageReqVO extends PageParam { ...@@ -17,4 +17,7 @@ public class AiKnowledgeDocumentPageReqVO extends PageParam {
@Schema(description = "上级目录名称", example = "1") @Schema(description = "上级目录名称", example = "1")
private Long parentId; private Long parentId;
@Schema(description = "用户ID", example = "1")
private Long userId;
} }
...@@ -53,4 +53,7 @@ public class AiKnowledgeDocumentRespVO { ...@@ -53,4 +53,7 @@ public class AiKnowledgeDocumentRespVO {
@Schema(description = "是否可删除", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "是否可删除", requiredMode = Schema.RequiredMode.REQUIRED)
private Boolean deletable; private Boolean deletable;
@Schema(description = "创建人", requiredMode = Schema.RequiredMode.REQUIRED, example = "24790")
private String creator;
} }
package cn.iocoder.yudao.module.ai.dal.dataobject.model;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.*;
import java.time.LocalDateTime;
import java.util.List;
/**
* AI 智能体策略通知 DO
*
* 记录策略匹配结果、政策信息等
*
* @author yourname
* @since 2026-04-07
*/
@TableName(value = "ai_agent_policy_notify", autoResultMap = true)
@KeySequence("ai_agent_policy_notify_seq") // 用于 Oracle、PostgreSQL 等数据库主键自增,MySQL 可省略
@Data
@EqualsAndHashCode(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AiAgentPolicyNotifyDO extends BaseDO {
/**
* 记录编号,自增
*/
@TableId
private Long id;
/**
* 政策名
*/
private String policyName;
/**
* 制度名(匹配的规则名称)
*/
private String matchedRuleName;
/**
* 政策发布日期
*/
private LocalDateTime policyPublishDate;
/**
* 校验时间
*/
private LocalDateTime checkTime;
/**
* 结果(摘要结果)
*/
private String summaryResult;
/**
* 政策原文链接
*/
private String policySourceUrl;
/**
* 详情
*/
private String details;
/**
*
* 已读人员名单
*/
@TableField(typeHandler = JacksonTypeHandler.class)
private List<Long> readList;
}
package cn.iocoder.yudao.module.ai.dal.mysql.model;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.ai.controller.admin.agent.vo.AiAgentPolicyNotifyPageReqVO;
import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDocumentDO;
import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiAgentPolicyNotifyDO;
import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* AI 聊天角色 Mapper
*
* @author fansili
*/
@Mapper
public interface AiAgentPolicyNotifyMapper extends BaseMapperX<AiAgentPolicyNotifyDO> {
default PageResult<AiAgentPolicyNotifyDO> selectPage(AiAgentPolicyNotifyPageReqVO pageReqVO) {
return selectPage(pageReqVO, new LambdaQueryWrapperX<AiAgentPolicyNotifyDO>()
.eq(AiAgentPolicyNotifyDO::getDeleted, 0)
.orderByDesc(AiAgentPolicyNotifyDO::getCheckTime));
}
}
package cn.iocoder.yudao.module.ai.service.agent;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.ai.controller.admin.agent.vo.AiAgentPolicyNotifyCreateReqVO;
import cn.iocoder.yudao.module.ai.controller.admin.agent.vo.AiAgentPolicyNotifyPageReqVO;
import cn.iocoder.yudao.module.ai.controller.admin.agent.vo.AiAgentPolicyNotifyUpdateReqVO;
import cn.iocoder.yudao.module.ai.controller.admin.agent.vo.OrderInfoVO;
import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiAgentPolicyNotifyDO;
import org.xml.sax.SAXException;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.util.List;
public interface AgentPolicyNotifyService {
PageResult<AiAgentPolicyNotifyDO> getPolicyPage(AiAgentPolicyNotifyPageReqVO pageReqVO);
Long createPolicyNotify(AiAgentPolicyNotifyCreateReqVO createReqVO);
void updatePolicyRead(AiAgentPolicyNotifyUpdateReqVO updateReqVO, Long loginUserId);
}
package cn.iocoder.yudao.module.ai.service.agent;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.ai.controller.admin.agent.vo.AiAgentPolicyNotifyCreateReqVO;
import cn.iocoder.yudao.module.ai.controller.admin.agent.vo.AiAgentPolicyNotifyPageReqVO;
import cn.iocoder.yudao.module.ai.controller.admin.agent.vo.AiAgentPolicyNotifyUpdateReqVO;
import cn.iocoder.yudao.module.ai.controller.admin.agent.vo.OrderInfoVO;
import cn.iocoder.yudao.module.ai.dal.dataobject.aiappapikey.AiAppApiKeyDO;
import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatConversationDO;
import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiAgentPolicyNotifyDO;
import cn.iocoder.yudao.module.ai.dal.mysql.model.AiAgentPolicyNotifyMapper;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.client.RestTemplate;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.io.StringReader;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.ai.enums.ErrorCodeConstants.*;
@Service
@Validated
@Slf4j
public class AgentPolicyNotifyServiceImpl implements AgentPolicyNotifyService {
private final AiAgentPolicyNotifyMapper aiAgentPolicyNotifyMapper;
public AgentPolicyNotifyServiceImpl(AiAgentPolicyNotifyMapper aiAgentPolicyNotifyMapper) {
this.aiAgentPolicyNotifyMapper = aiAgentPolicyNotifyMapper;
}
@Override
public PageResult<AiAgentPolicyNotifyDO> getPolicyPage(AiAgentPolicyNotifyPageReqVO pageReqVO) {
return aiAgentPolicyNotifyMapper.selectPage(pageReqVO);
}
@Override
public Long createPolicyNotify(AiAgentPolicyNotifyCreateReqVO createReqVO) {
// 插入
AiAgentPolicyNotifyDO aiAgentPolicyNotifyDO = BeanUtils.toBean(createReqVO, AiAgentPolicyNotifyDO.class);
aiAgentPolicyNotifyMapper.insert(aiAgentPolicyNotifyDO);
// 返回
return aiAgentPolicyNotifyDO.getId();
}
@Override
public void updatePolicyRead(AiAgentPolicyNotifyUpdateReqVO updateReqVO, Long loginUserId) {
// 校验存在
AiAgentPolicyNotifyDO updateObj = aiAgentPolicyNotifyMapper.selectById(updateReqVO.getId());
if (updateObj == null) {
throw exception(AGENT_POLICY_NOTIFY_NOT_EXISTS);
}
// 更新
// 获取或初始化 readList
List<Long> readList = updateObj.getReadList();
if (readList == null) {
readList = new ArrayList<>();
updateObj.setReadList(readList);
}
Boolean read = updateReqVO.getRead();
if(read){
// 避免重复添加
if (!readList.contains(loginUserId)) {
readList.add(loginUserId);
aiAgentPolicyNotifyMapper.updateById(updateObj);
}
}else{
if (readList.contains(loginUserId)) {
readList.remove(loginUserId);
aiAgentPolicyNotifyMapper.updateById(updateObj);
}
}
}
}
...@@ -131,4 +131,6 @@ public interface AiKnowledgeDocumentService { ...@@ -131,4 +131,6 @@ public interface AiKnowledgeDocumentService {
Long getKnowledgeSize(Long userId); Long getKnowledgeSize(Long userId);
void updateKnowledgeDocumentDeletable(AiKnowledgeDocumentUpdateDeletableReqVO reqVO); void updateKnowledgeDocumentDeletable(AiKnowledgeDocumentUpdateDeletableReqVO reqVO);
PageResult<AiKnowledgeDocumentDO> getKnowledgeDocumentPageByUserId(AiKnowledgeDocumentPageReqVO pageReqVO, Long userId);
} }
...@@ -30,6 +30,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU ...@@ -30,6 +30,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
import static cn.iocoder.yudao.module.ai.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.module.ai.enums.ErrorCodeConstants.*;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_NOT_EXISTS;
/** /**
* AI 知识库文档 Service 实现类 * AI 知识库文档 Service 实现类
...@@ -453,8 +454,11 @@ public class AiKnowledgeDocumentServiceImpl implements AiKnowledgeDocumentServic ...@@ -453,8 +454,11 @@ public class AiKnowledgeDocumentServiceImpl implements AiKnowledgeDocumentServic
@Override @Override
public PageResult<AiKnowledgeDocumentDO> getKnowledgeDocumentPage4User(AiKnowledgeDocumentPageReqVO pageReqVO, Long userId) { public PageResult<AiKnowledgeDocumentDO> getKnowledgeDocumentPage4User(AiKnowledgeDocumentPageReqVO pageReqVO, Long userId) {
if(userId == null){
throw exception(USER_NOT_EXISTS);
}
AiKnowledgeDO aiKnowledgeDO = knowledgeService.getKnowledge(pageReqVO.getKnowledgeId()); AiKnowledgeDO aiKnowledgeDO = knowledgeService.getKnowledge(pageReqVO.getKnowledgeId());
String permission = KnowledgePermissionUtils.checkSeeKBPermission(aiKnowledgeDO.getEmbeddingModel()); String permission = KnowledgePermissionUtils.checkSeeKBPermission(aiKnowledgeDO.getEmbeddingModel(), userId);
PageResult<AiKnowledgeDocumentDO> pageResult; PageResult<AiKnowledgeDocumentDO> pageResult;
...@@ -514,6 +518,31 @@ public class AiKnowledgeDocumentServiceImpl implements AiKnowledgeDocumentServic ...@@ -514,6 +518,31 @@ public class AiKnowledgeDocumentServiceImpl implements AiKnowledgeDocumentServic
} }
@Override @Override
public PageResult<AiKnowledgeDocumentDO> getKnowledgeDocumentPageByUserId(AiKnowledgeDocumentPageReqVO pageReqVO, Long userId) {
if(userId == null){
throw exception(USER_NOT_EXISTS);
}
AiKnowledgeDO aiKnowledgeDO = knowledgeService.getKnowledge(pageReqVO.getKnowledgeId());
PageResult<AiKnowledgeDocumentDO> pageResult;
pageResult = knowledgeDocumentMapper.selectPageOwner(pageReqVO, userId);
boolean editKBPermission = KnowledgePermissionUtils.checkEditKBPermission(aiKnowledgeDO.getEmbeddingModel());
pageResult.getList().forEach(doc -> {
if(doc.getStatus() == 0){
doc.setHasPermi(editKBPermission);
}else {
boolean isSuperAdmin = KnowledgePermissionUtils.isSuperAdmin();
boolean isKbAdmin = KnowledgePermissionUtils.isKnowledgeAdmin();
doc.setHasPermi(isSuperAdmin || isKbAdmin);
}
});
return pageResult;
}
@Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void deleteKnowledgeDocumentByKnowledgeId(Long knowledgeId) { public void deleteKnowledgeDocumentByKnowledgeId(Long knowledgeId) {
// // 1. 获取该知识库下的所有文档 // // 1. 获取该知识库下的所有文档
......
...@@ -114,9 +114,9 @@ public class KnowledgePermissionUtils { ...@@ -114,9 +114,9 @@ public class KnowledgePermissionUtils {
// } // }
// return "owner_kb"; // return "owner_kb";
// } // }
public static String checkSeeKBPermission(String kbType) { public static String checkSeeKBPermission(String kbType, Long userId) {
PermissionApi permissionApi = SpringUtil.getBean(PermissionApi.class); PermissionApi permissionApi = SpringUtil.getBean(PermissionApi.class);
Long userId = getLoginUserId(); // Long userId = getLoginUserId();
if(Objects.equals(kbType, "out_kb")){ if(Objects.equals(kbType, "out_kb")){
return "all"; return "all";
} else if (Objects.equals(kbType, "owner_kb")) { } else if (Objects.equals(kbType, "owner_kb")) {
......
...@@ -131,6 +131,20 @@ ...@@ -131,6 +131,20 @@
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<!-- doc转docx -->
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.doc.free</artifactId>
<version>5.2.0</version>
</dependency>
</dependencies> </dependencies>
<repositories>
<repository>
<id>com.e-iceblue</id>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
</project> </project>
...@@ -11,6 +11,8 @@ import cn.iocoder.yudao.module.ai.service.knowledge.AiKnowledgeDocumentService; ...@@ -11,6 +11,8 @@ import cn.iocoder.yudao.module.ai.service.knowledge.AiKnowledgeDocumentService;
import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.*; import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.*;
import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileDO; import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileDO;
import cn.iocoder.yudao.module.infra.service.file.FileService; import cn.iocoder.yudao.module.infra.service.file.FileService;
import com.spire.doc.Document;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
...@@ -27,6 +29,8 @@ import org.springframework.web.bind.annotation.*; ...@@ -27,6 +29,8 @@ import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.HashMap; import java.util.HashMap;
...@@ -138,6 +142,33 @@ public class FileController { ...@@ -138,6 +142,33 @@ public class FileController {
throw exception(FILE_KB_ID_EMPTY); throw exception(FILE_KB_ID_EMPTY);
} }
} }
// 处理doc的文件上传
String originalFilename = file.getOriginalFilename();
if (originalFilename != null && originalFilename.toLowerCase().endsWith(".doc")) {
try (InputStream is = file.getInputStream();
ByteArrayOutputStream os = new ByteArrayOutputStream()) {
// 1. 使用第三方库读取 .doc 数据流 (此处以 Spire.Doc 为例)
// com.spire.doc.Document document = new com.spire.doc.Document();
Document document = new Document();
document.loadFromStream(is, com.spire.doc.FileFormat.Doc);
// 2. 将数据流保存为 .docx 格式到内存输出流
// FileFormat.Docx_2013 是较稳定的兼容格式
document.saveToStream(os, com.spire.doc.FileFormat.Docx_2013);
// 1. 确保文件名干净,去掉可能存在的路径符号
String newFilename = FileUtil.mainName(originalFilename) + ".docx";
// 4. 上传转换后的字节流并提前返回
return success(fileService.createFile(newFilename, uploadReqVO.getPath(), os.toByteArray()));
} catch (Exception e) {
log.error("[uploadFile][doc转docx失败] 文件名: {}", originalFilename, e);
// 此处抛出你自定义的异常,比如:throw exception(DOC_TO_DOCX_ERROR);
throw new RuntimeException("doc文件转换docx失败", e);
}
}
return success(fileService.createFile(file.getOriginalFilename(), path, IoUtil.readBytes(file.getInputStream()))); return success(fileService.createFile(file.getOriginalFilename(), path, IoUtil.readBytes(file.getInputStream())));
} }
......
...@@ -20,6 +20,13 @@ ...@@ -20,6 +20,13 @@
</description> </description>
<url>https://github.com/YunaiV/ruoyi-vue-pro</url> <url>https://github.com/YunaiV/ruoyi-vue-pro</url>
<repositories>
<repository>
<id>com.e-iceblue</id>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>cn.iocoder.boot</groupId> <groupId>cn.iocoder.boot</groupId>
...@@ -128,6 +135,13 @@ ...@@ -128,6 +135,13 @@
<artifactId>yudao-spring-boot-starter-protection</artifactId> <artifactId>yudao-spring-boot-starter-protection</artifactId>
</dependency> </dependency>
<!-- doc转docx -->
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.doc.free</artifactId>
<version>5.2.0</version>
</dependency>
</dependencies> </dependencies>
<build> <build>
......
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 sign in to comment