Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
P
poc-api
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
poc
poc-api
Commits
2908e0d9
Commit
2908e0d9
authored
Jul 29, 2025
by
R10
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
法律文书ai写作
parent
a3a96294
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
292 additions
and
0 deletions
+292
-0
output.docx
output.docx
+0
-0
AiDialoguesTypeEnum.java
...cn/com/poc/ai_dialogues/constant/AiDialoguesTypeEnum.java
+2
-0
AiLawDialoguesDto.java
src/main/java/cn/com/poc/law/dto/AiLawDialoguesDto.java
+75
-0
LegalRest.java
src/main/java/cn/com/poc/law/rest/LegalRest.java
+6
-0
LegalRestImpl.java
src/main/java/cn/com/poc/law/rest/impl/LegalRestImpl.java
+19
-0
AiLawService.java
src/main/java/cn/com/poc/law/service/AiLawService.java
+23
-0
AiLawServiceImpl.java
...in/java/cn/com/poc/law/service/impl/AiLawServiceImpl.java
+167
-0
No files found.
output.docx
0 → 100644
View file @
2908e0d9
src/main/java/cn/com/poc/ai_dialogues/constant/AiDialoguesTypeEnum.java
View file @
2908e0d9
...
@@ -18,6 +18,8 @@ public enum AiDialoguesTypeEnum {
...
@@ -18,6 +18,8 @@ public enum AiDialoguesTypeEnum {
LEGAL_AFFAIRS
(
"legal_affairs"
,
"法务问答"
),
LEGAL_AFFAIRS
(
"legal_affairs"
,
"法务问答"
),
AI_LEGAL_DOCUMENT_WRITING
(
"ai_legal_document_writing"
,
"法律文书写作"
),
TRAVEL_BUSINESS
(
"travel_business"
,
"旅游业务"
),
TRAVEL_BUSINESS
(
"travel_business"
,
"旅游业务"
),
;
;
...
...
src/main/java/cn/com/poc/law/dto/AiLawDialoguesDto.java
0 → 100644
View file @
2908e0d9
package
cn
.
com
.
poc
.
law
.
dto
;
/**
* @author alex.yao
* @date 2025/6/20
*/
public
class
AiLawDialoguesDto
{
/**
* 对话id
*/
private
String
dialoguesId
;
/**
* 问题
*/
private
String
input
;
/**
* 文件地址
*/
private
String
fileUrl
;
/**
* 知识库ids
*/
private
Integer
[]
knowledgeIds
;
/**
* 数据库ids
*/
private
Integer
[]
databaseIds
;
public
String
getDialoguesId
()
{
return
dialoguesId
;
}
public
void
setDialoguesId
(
String
dialoguesId
)
{
this
.
dialoguesId
=
dialoguesId
;
}
public
String
getInput
()
{
return
input
;
}
public
void
setInput
(
String
input
)
{
this
.
input
=
input
;
}
public
String
getFileUrl
()
{
return
fileUrl
;
}
public
void
setFileUrl
(
String
fileUrl
)
{
this
.
fileUrl
=
fileUrl
;
}
public
Integer
[]
getKnowledgeIds
()
{
return
knowledgeIds
;
}
public
void
setKnowledgeIds
(
Integer
[]
knowledgeIds
)
{
this
.
knowledgeIds
=
knowledgeIds
;
}
public
Integer
[]
getDatabaseIds
()
{
return
databaseIds
;
}
public
void
setDatabaseIds
(
Integer
[]
databaseIds
)
{
this
.
databaseIds
=
databaseIds
;
}
}
src/main/java/cn/com/poc/law/rest/LegalRest.java
View file @
2908e0d9
package
cn
.
com
.
poc
.
law
.
rest
;
package
cn
.
com
.
poc
.
law
.
rest
;
import
cn.com.poc.ai_finance.dto.AiFinanceDialoguesDto
;
import
cn.com.poc.law.dto.LegalFileDto
;
import
cn.com.poc.law.dto.LegalFileDto
;
import
cn.com.yict.framemax.core.rest.BaseRest
;
import
cn.com.yict.framemax.core.rest.BaseRest
;
import
cn.com.yict.framemax.web.permission.Access
;
import
cn.com.yict.framemax.web.permission.Access
;
...
@@ -21,5 +22,10 @@ public interface LegalRest extends BaseRest {
...
@@ -21,5 +22,10 @@ public interface LegalRest extends BaseRest {
*/
*/
String
legalFileQuery
(
@RequestBody
LegalFileDto
legalFileDto
);
String
legalFileQuery
(
@RequestBody
LegalFileDto
legalFileDto
);
/**
* ai对话
*/
void
call
(
@RequestBody
AiFinanceDialoguesDto
dto
)
throws
Exception
;
}
}
src/main/java/cn/com/poc/law/rest/impl/LegalRestImpl.java
View file @
2908e0d9
package
cn
.
com
.
poc
.
law
.
rest
.
impl
;
package
cn
.
com
.
poc
.
law
.
rest
.
impl
;
import
cn.com.poc.ai_finance.aggregate.AiFinanceService
;
import
cn.com.poc.ai_finance.dto.AiFinanceDialoguesDto
;
import
cn.com.poc.common.utils.Assert
;
import
cn.com.poc.common.utils.Assert
;
import
cn.com.poc.common.utils.BlContext
;
import
cn.com.poc.law.dto.LegalFileDto
;
import
cn.com.poc.law.dto.LegalFileDto
;
import
cn.com.poc.law.rest.LegalRest
;
import
cn.com.poc.law.rest.LegalRest
;
import
cn.com.poc.support.security.oauth.entity.UserBaseEntity
;
import
cn.com.poc.thirdparty.resource.demand.ai.aggregate.LegalService
;
import
cn.com.poc.thirdparty.resource.demand.ai.aggregate.LegalService
;
import
cn.com.poc.thirdparty.resource.demand.ai.entity.legal.LegalFileResponse
;
import
cn.com.poc.thirdparty.resource.demand.ai.entity.legal.LegalFileResponse
;
import
cn.com.poc.thirdparty.resource.demand.ai.entity.legal.LegalFileResult
;
import
cn.com.poc.thirdparty.resource.demand.ai.entity.legal.LegalFileResult
;
...
@@ -37,4 +41,19 @@ public class LegalRestImpl implements LegalRest {
...
@@ -37,4 +41,19 @@ public class LegalRestImpl implements LegalRest {
}
}
return
legalFileResult
.
getFilePath
();
return
legalFileResult
.
getFilePath
();
}
}
@Resource
private
AiFinanceService
aiFinanceService
;
@Override
public
void
call
(
AiFinanceDialoguesDto
dto
)
throws
Exception
{
cn
.
hutool
.
core
.
lang
.
Assert
.
notNull
(
dto
.
getDialoguesId
(),
"对话id不能为空"
);
cn
.
hutool
.
core
.
lang
.
Assert
.
notNull
(
dto
.
getInput
(),
"问题不能为空"
);
UserBaseEntity
userBaseEntity
=
BlContext
.
getCurrentUserNotException
();
if
(
userBaseEntity
==
null
)
{
throw
new
BusinessException
(
"用户未登录"
);
}
aiFinanceService
.
call
(
dto
.
getDialoguesId
(),
dto
.
getInput
(),
dto
.
getFileUrl
(),
dto
.
getKnowledgeIds
(),
dto
.
getDatabaseIds
(),
userBaseEntity
.
getUserId
());
}
}
}
src/main/java/cn/com/poc/law/service/AiLawService.java
0 → 100644
View file @
2908e0d9
package
cn
.
com
.
poc
.
law
.
service
;
/**
* AI财务
*
* @author alex.yao
* @date 2025/6/20
*/
public
interface
AiLawService
{
/**
* 调用AI财务服务
*
* @param dialoguesId 对话id
* @param input 问题
* @param fileUrl 文件地址
* @param knowledgeIds 知识库ids
* @param databaseIds 数据库ids
* @param userId 用户id
*/
void
call
(
String
dialoguesId
,
String
input
,
String
fileUrl
,
Integer
[]
knowledgeIds
,
Integer
[]
databaseIds
,
Long
userId
)
throws
Exception
;
}
src/main/java/cn/com/poc/law/service/impl/AiLawServiceImpl.java
0 → 100644
View file @
2908e0d9
package
cn
.
com
.
poc
.
law
.
service
.
impl
;
import
cn.com.poc.agent_application.aggregate.AgentApplicationService
;
import
cn.com.poc.agent_application.constant.AgentApplicationDialoguesRecordConstants
;
import
cn.com.poc.agent_application.entity.*
;
import
cn.com.poc.agent_application.service.BizAgentApplicationDialoguesRecordService
;
import
cn.com.poc.agent_application.service.BizAgentApplicationPublishService
;
import
cn.com.poc.agent_application.utils.AgentApplicationTools
;
import
cn.com.poc.ai_dialogues.entity.BizAiDialoguesEntity
;
import
cn.com.poc.ai_dialogues.service.BizAiDialoguesService
;
import
cn.com.poc.common.constant.CommonConstant
;
import
cn.com.poc.common.utils.JsonUtils
;
import
cn.com.poc.common.utils.StringUtils
;
import
cn.com.poc.knowledge.aggregate.KnowledgeService
;
import
cn.com.poc.law.service.AiLawService
;
import
cn.com.poc.thirdparty.resource.demand.ai.constants.KnowledgeSearchTypeEnum
;
import
cn.com.poc.thirdparty.resource.demand.ai.entity.dialogue.Message
;
import
cn.com.poc.thirdparty.resource.demand.ai.entity.dialogue.Tool
;
import
cn.com.poc.thirdparty.resource.demand.ai.entity.function.FunctionCallResult
;
import
cn.com.yict.framemax.core.exception.BusinessException
;
import
cn.com.yict.framemax.frame.service.FmxParamConfigService
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.stereotype.Service
;
import
org.springframework.web.context.request.RequestContextHolder
;
import
org.springframework.web.context.request.ServletRequestAttributes
;
import
javax.annotation.Resource
;
import
javax.servlet.http.HttpServletResponse
;
import
java.util.ArrayList
;
import
java.util.List
;
/**
* @author alex.yao
* @date 2025/6/20
*/
@Service
public
class
AiLawServiceImpl
implements
AiLawService
{
private
final
Logger
logger
=
LoggerFactory
.
getLogger
(
AiLawServiceImpl
.
class
);
private
final
String
FMX_PARAM_AGENT_ID_CODE
=
"ai_legal_document_writing.agent_id"
;
@Resource
private
FmxParamConfigService
fmxParamConfigService
;
@Resource
private
BizAiDialoguesService
bizAiDialoguesService
;
@Resource
private
AgentApplicationService
agentApplicationService
;
@Resource
private
KnowledgeService
knowledgeService
;
@Resource
private
BizAgentApplicationPublishService
bizAgentApplicationPublishService
;
@Resource
private
BizAgentApplicationDialoguesRecordService
bizAgentApplicationDialoguesRecordService
;
@Override
public
void
call
(
String
dialoguesId
,
String
input
,
String
fileUrl
,
Integer
[]
knowledgeIds
,
Integer
[]
databaseIds
,
Long
userId
)
throws
Exception
{
String
agentId
=
fmxParamConfigService
.
getParam
(
FMX_PARAM_AGENT_ID_CODE
);
if
(
StringUtils
.
isBlank
(
agentId
))
{
logger
.
error
(
"获取AI财务对话agentId失败"
);
throw
new
BusinessException
(
"对话异常"
);
}
// 获取Agent基本信息
BizAgentApplicationPublishEntity
infoEntity
=
bizAgentApplicationPublishService
.
getByAgentId
(
agentId
);
if
(
infoEntity
==
null
)
{
logger
.
error
(
"获取AI财务对话agent信息失败"
);
throw
new
BusinessException
(
"对话异常"
);
}
// 保存对话基础信息
BizAiDialoguesEntity
bizAiDialoguesEntity
=
new
BizAiDialoguesEntity
();
bizAiDialoguesEntity
.
setMemberId
(
userId
);
bizAiDialoguesEntity
.
setDialoguesId
(
dialoguesId
);
bizAiDialoguesEntity
.
setIsDeleted
(
CommonConstant
.
IsDeleted
.
N
);
List
<
BizAiDialoguesEntity
>
bizAiDialoguesEntities
=
bizAiDialoguesService
.
findByExample
(
bizAiDialoguesEntity
,
null
);
if
(
CollectionUtils
.
isEmpty
(
bizAiDialoguesEntities
))
{
logger
.
error
(
"dialogues id 不存在,请重新创建"
);
throw
new
BusinessException
(
"对话异常"
);
}
// 保存标题信息
if
(
StringUtils
.
isBlank
(
bizAiDialoguesEntities
.
get
(
0
).
getTitle
()))
{
BizAiDialoguesEntity
portalDialoguesEntity
=
bizAiDialoguesEntities
.
get
(
0
);
portalDialoguesEntity
.
setTitle
(
input
);
bizAiDialoguesService
.
update
(
portalDialoguesEntity
);
}
// 获取对话配置
String
largeModel
=
infoEntity
.
getLargeModel
();
//获取模型
String
agentSystem
=
infoEntity
.
getAgentSystem
();
//获取Agent角色词
List
<
Integer
>
kdIds
=
knowledgeService
.
getKdIdsByKnowledgeInfoIds
(
knowledgeIds
);
//获取知识库ids
List
<
Message
>
messages
=
AgentApplicationTools
.
buildMessage
(
dialoguesId
,
agentId
,
userId
,
input
);
//构建消息
List
<
Tool
>
tools
=
AgentApplicationTools
.
buildFunctionConfig
(
infoEntity
.
getVariableStructure
(),
infoEntity
.
getIsLongMemory
(),
dialoguesId
,
agentId
,
infoEntity
.
getUnitIds
(),
infoEntity
.
getIsDocumentParsing
());
//构建函数配置
List
<
String
>
fileUrls
=
new
ArrayList
<>();
//构建文件链接
if
(
StringUtils
.
isNotBlank
(
fileUrl
))
{
fileUrls
.
add
(
fileUrl
);
}
CheckPluginUseEntity
checkPluginUseEntity
=
AgentApplicationTools
.
checkPluginUse
(
messages
,
tools
,
fileUrls
);
//检查插件使用
FunctionCallResult
functionCallResult
=
checkPluginUseEntity
.
getFunctionCallResult
();
//函数调用结果
boolean
stream
=
true
;
//是否流式输出
KnowledgeSearchTypeEnum
knowledgeSearchTypeEnum
=
KnowledgeSearchTypeEnum
.
valueOf
(
infoEntity
.
getKnowledgeSearchType
());
//知识库检索方式
KnowledgeSuperclassProblemConfig
knowledgeSuperclassProblemConfig
=
new
KnowledgeSuperclassProblemConfig
();
//知识库超纲配置
knowledgeSuperclassProblemConfig
.
setKnowledgeResponseType
(
infoEntity
.
getKnowledgeResponseType
());
//知识库回复类型
knowledgeSuperclassProblemConfig
.
setKnowledgeCustomResponse
(
infoEntity
.
getKnowledgeCustomResponse
());
//知识库自定义回复
// 记录用户输入时间戳
Long
inputTimestamp
=
System
.
currentTimeMillis
();
// 调用对话Agent
ServletRequestAttributes
servletRequestAttributes
=
(
ServletRequestAttributes
)
RequestContextHolder
.
getRequestAttributes
();
HttpServletResponse
response
=
servletRequestAttributes
.
getResponse
();
AgentResultEntity
agentResultEntity
=
agentApplicationService
.
callAgentApplication
(
agentId
,
dialoguesId
,
largeModel
,
agentSystem
,
kdIds
.
toArray
(
new
Integer
[
0
]),
databaseIds
,
infoEntity
.
getCommunicationTurn
(),
infoEntity
.
getTopP
(),
infoEntity
.
getTemperature
(),
messages
,
tools
,
functionCallResult
,
stream
,
infoEntity
.
getKnowledgeSimilarity
(),
infoEntity
.
getKnowledgeNResult
(),
knowledgeSearchTypeEnum
,
knowledgeSuperclassProblemConfig
,
response
);
//保存对话记录
//用户输入记录
BizAgentApplicationDialoguesRecordEntity
inputRecord
=
new
BizAgentApplicationDialoguesRecordEntity
();
inputRecord
.
setAgentId
(
agentId
);
inputRecord
.
setMemberId
(
userId
);
inputRecord
.
setContent
(
input
);
inputRecord
.
setDialogsId
(
dialoguesId
);
inputRecord
.
setRole
(
AgentApplicationDialoguesRecordConstants
.
ROLE
.
USER
);
inputRecord
.
setTimestamp
(
inputTimestamp
);
bizAgentApplicationDialoguesRecordService
.
save
(
inputRecord
);
//AI输出记录
BizAgentApplicationDialoguesRecordEntity
outputRecord
=
new
BizAgentApplicationDialoguesRecordEntity
();
outputRecord
.
setRole
(
AgentApplicationDialoguesRecordConstants
.
ROLE
.
ASSISTANT
);
outputRecord
.
setAgentId
(
infoEntity
.
getAgentId
());
outputRecord
.
setDialogsId
(
dialoguesId
);
outputRecord
.
setMemberId
(
userId
);
if
(
agentResultEntity
.
getFunction
()
!=
null
)
{
outputRecord
.
setFunction
(
JsonUtils
.
serialize
(
agentResultEntity
.
getFunction
()));
}
outputRecord
.
setTimestamp
(
System
.
currentTimeMillis
());
outputRecord
.
setContent
(
agentResultEntity
.
getMessage
());
outputRecord
.
setReasoningContent
(
agentResultEntity
.
getReasoningContent
());
bizAgentApplicationDialoguesRecordService
.
save
(
outputRecord
);
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment