Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
C
cmeeting
概览
概览
详情
活动
周期分析
版本库
存储库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
Issue Boards
Open sidebar
翟斌
cmeeting
Commits
2875a1b7
提交
2875a1b7
authored
11月 27, 2025
作者:
洪东保
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
生成纪要代码改动
debug
父级
8990bc7c
隐藏空白字符变更
内嵌
并排
正在显示
5 个修改的文件
包含
34 行增加
和
18 行删除
+34
-18
src/main/java/com/cmeeting/job/CmeetingJob.java
+2
-0
src/main/java/com/cmeeting/job/FileProcessTask.java
+28
-15
src/main/java/com/cmeeting/service/impl/TencentMeetingServiceImpl.java
+2
-1
src/main/resources/application.yml
+1
-1
src/main/resources/mapper/primary/MeetingInfoMapper.xml
+1
-1
没有找到文件。
src/main/java/com/cmeeting/job/CmeetingJob.java
浏览文件 @
2875a1b7
...
...
@@ -197,6 +197,7 @@ public class CmeetingJob {
// 不能用status筛选,因为可能线程执行一般服务终止,status状态没变
List
<
MeetingInfo
>
meetingInfoList
=
meetingInfoService
.
list
(
new
LambdaQueryWrapper
<
MeetingInfo
>()
.
isNotNull
(
MeetingInfo:
:
getMeetingRecordId
)
.
eq
(
MeetingInfo:
:
getEmailPushAccess
,
Boolean
.
TRUE
)
.
eq
(
MeetingInfo:
:
getEmailGenerateAccess
,
Boolean
.
TRUE
)
.
eq
(
MeetingInfo:
:
getIsGenerated
,
Boolean
.
FALSE
)
...
...
@@ -252,6 +253,7 @@ public class CmeetingJob {
//查出所有早于一小时前的,邮件推送失败且未重试过的会议
List
<
MeetingInfo
>
meetingInfoList
=
meetingInfoService
.
list
(
new
LambdaQueryWrapper
<
MeetingInfo
>()
.
isNotNull
(
MeetingInfo:
:
getMeetingRecordId
)
.
eq
(
MeetingInfo:
:
getEmailPushAccess
,
Boolean
.
TRUE
)
.
eq
(
MeetingInfo:
:
getIsGenerated
,
Boolean
.
TRUE
)
.
eq
(
MeetingInfo:
:
getIsPushed
,
Boolean
.
FALSE
)
...
...
src/main/java/com/cmeeting/job/FileProcessTask.java
浏览文件 @
2875a1b7
...
...
@@ -124,7 +124,7 @@ public class FileProcessTask {
MeetingInfo
meetingInfo
=
meetingInfoMapper
.
selectOne
(
new
LambdaQueryWrapper
<
MeetingInfo
>()
.
eq
(
MeetingInfo:
:
getMeetingRecordId
,
meetingRecordId
));
if
(
meetingInfo
.
getIsGenerated
())
{
log
.
warn
(
"Generating is down, meeting
Id: {}, subMeetingId: {}"
,
meetingInfo
.
getMeetingId
(),
meetingInfo
.
getSubMeetingId
()
);
log
.
warn
(
"Generating is down, meeting
RecordId: {}"
,
meetingRecordId
);
return
;
}
if
(!
meetingInfo
.
getEmailPushAccess
())
{
...
...
@@ -147,9 +147,10 @@ public class FileProcessTask {
for
(
String
recordFileId
:
recordFileIdList
)
{
recordTextBuffer
.
append
(
TencentMeetingApiUtil
.
ApiV1AddressesRecordFileIdGetRequest
(
recordFileId
));
}
if
(
StringUtils
.
isEmpty
(
recordTextBuffer
.
toString
().
replaceAll
(
"\\n"
,
""
).
trim
()))
{
log
.
info
(
"获取的转录文本为空,跳过纪要生成,meetingId:{},fileRecordId:{}"
,
meetingId
,
recordFileIdList
.
toString
());
processLogService
.
log
(
meetingId
,
subMeetingId
,
"获取的转录文本为空,跳过纪要生成"
);
if
(
StringUtils
.
isEmpty
(
recordTextBuffer
.
toString
().
replaceAll
(
"\\n"
,
""
).
trim
())){
log
.
info
(
"获取的转录文本为空,跳过纪要生成,meetingRecordId:{}"
,
meetingRecordId
);
processLogService
.
log
(
meetingId
,
subMeetingId
,
meetingRecordId
+
"获取的转录文本为空,跳过纪要生成"
);
status
=
MeetingState
.
EMPTY
.
getCode
();
throw
new
RuntimeException
(
"获取的转录文本为空,跳过纪要生成"
);
}
// 1. 根据转录文件内容recordTextBuffer判断使用模板类型
...
...
@@ -172,8 +173,16 @@ public class FileProcessTask {
processLogService
.
log
(
meetingId
,
subMeetingId
,
"用户"
+
hostUid
+
"暂未关联企微信息,无法生成纪要文件"
);
continue
;
}
String
processedResult
=
processWithClaude
(
recordTextBuffer
.
toString
(),
meetingDate
,
participantNames
,
template
.
getPrompt
());
String
processedResult
=
null
;
//暂时让所有模板共用一个提示词,两个模板输出同样的结果
LLMResult
llmResult
=
processWithClaude
(
recordTextBuffer
.
toString
(),
meetingDate
,
participantNames
,
template
.
getPrompt
());
if
(
llmResult
.
success
)
{
processedResult
=
llmResult
.
respond
;
}
else
if
(
llmResult
.
reason
.
equals
(
"会议记录 过短,退出"
))
{
status
=
MeetingState
.
EMPTY
.
getCode
();
throw
new
RuntimeException
(
"会议记录 过短,退出"
);
}
log
.
info
(
"meetingRecordId: {},结果长度:{}"
,
meetingRecordId
,
processedResult
.
length
());
String
minutesPath
=
saveResult
(
processedResult
,
recordTextBuffer
.
toString
(),
meetingInfo
,
toUserCode
,
template
);
DateTimeFormatter
fmt
=
DateTimeFormatter
.
ofPattern
(
"yyyyMMdd"
);
...
...
@@ -187,12 +196,13 @@ public class FileProcessTask {
FileUtil
.
del
(
minutesPath
);
}
if
(
CollectionUtils
.
isEmpty
(
attachments
))
{
log
.
info
(
"用户{}暂无任何模板权限,纪要生成失败"
,
hostUid
);
log
.
info
(
"meetingRecordId:{}用户{}暂无任何模板权限,纪要生成失败"
,
meetingRecordId
,
hostUid
);
isSuccess
=
false
;
continue
;
}
if
(!
tidWidRelations
.
containsKey
(
meetingInfo
.
getHostUid
()))
{
log
.
error
(
"邮件推送重试失败: 主持人对应关系未配置。meeting
Id {}"
,
meeting
Id
);
processLogService
.
log
(
meetingId
,
subMeetingId
,
"邮件推送重试失败: 主持人对应关系未配置。meeting
Id "
+
meeting
Id
);
log
.
error
(
"邮件推送重试失败: 主持人对应关系未配置。meeting
RecordId {}"
,
meetingRecord
Id
);
processLogService
.
log
(
meetingId
,
subMeetingId
,
"邮件推送重试失败: 主持人对应关系未配置。meeting
RecordId:"
+
meetingRecord
Id
);
continue
;
}
...
...
@@ -215,7 +225,7 @@ public class FileProcessTask {
StringWriter
sw
=
new
StringWriter
();
PrintWriter
pw
=
new
PrintWriter
(
sw
);
e
.
printStackTrace
(
pw
);
processLogService
.
log
(
meetingId
,
subMeetingId
,
sw
.
toString
());
processLogService
.
log
(
meetingId
,
subMeetingId
,
meetingRecordId
+
sw
.
toString
());
// 异常处理
retryCount
++;
if
(
retryCount
>
MAX_RETRY
)
{
...
...
@@ -225,6 +235,7 @@ public class FileProcessTask {
meetingInfoMapper
.
update
(
null
,
new
LambdaUpdateWrapper
<
MeetingInfo
>()
.
eq
(
MeetingInfo:
:
getMeetingRecordId
,
meetingRecordId
)
.
set
(
MeetingInfo:
:
getStatus
,
MeetingState
.
GENERATE_ERROR
.
getCode
())
.
set
(
MeetingInfo:
:
getGenerateRetry
,
Boolean
.
TRUE
));
}
else
{
meetingInfoMapper
.
update
(
null
,
...
...
@@ -285,16 +296,18 @@ public class FileProcessTask {
* @param prompt 提示词
* @return
*/
private
String
processWithClaude
(
String
textContent
,
String
meetingDate
,
String
participantNames
,
String
prompt
)
{
private
LLMResult
processWithClaude
(
String
textContent
,
String
meetingDate
,
String
participantNames
,
String
prompt
)
{
// //将文件传送给大模型处理
LLMConfig
baseLLM
=
new
LLMConfig
(
llmModel
,
llmApiAddr
,
"Bearer "
+
llmToken
,
llmMaxTokens
);
LLMResult
llmResult
=
MeetingProcess
.
processMeeting
(
prompt
,
textContent
,
meetingDate
,
participantNames
,
baseLLM
,
new
ArrayList
<>());
if
(
llmResult
.
success
)
{
return
llmResult
.
respond
;
}
throw
new
RuntimeException
(
llmResult
.
reason
);
return
llmResult
;
// if (llmResult.success) {
// return llmResult.respond;
// }
// throw new RuntimeException(llmResult.reason);
// DebugOutputTool.println(llmResult.respond);
}
...
...
src/main/java/com/cmeeting/service/impl/TencentMeetingServiceImpl.java
浏览文件 @
2875a1b7
...
...
@@ -207,7 +207,8 @@ public class TencentMeetingServiceImpl extends ServiceImpl<TecentMeetingMapper,
boolean
flag
=
true
;
if
(
CollUtil
.
isNotEmpty
(
meetingIds
))
{
for
(
TencentMeetingVO
.
SimpleMeetingInfo
meetingInfo
:
meetingIds
)
{
if
(
meetingInfo
.
getMeetingRecordId
().
equals
(
meetingRecordId
))
{
String
meetingRecordIdTemp
=
meetingInfo
.
getMeetingRecordId
();
if
(
meetingRecordIdTemp
!=
null
&&
meetingRecordIdTemp
.
equals
(
meetingRecordId
))
{
flag
=
false
;
break
;
}
...
...
src/main/resources/application.yml
浏览文件 @
2875a1b7
...
...
@@ -100,7 +100,7 @@ tencent:
aesKey
:
agy6ALUePp34lljWz1uIQWa7yQq3dgxxQNmfaN9GROm
base-save-path
:
E:/save/
#会议纪要临时文件存储路径
search-scope
:
2
#腾会转录文件拉取时间范围,查询过去n天的记录
search-end-time
:
'
2025-
07-30
23
:59:59'
#此时间之前的数据不拉取
search-end-time
:
'
2025-
11-26
22
:59:59'
#此时间之前的数据不拉取
email
:
sender
:
${EMAIL_SENDER}
...
...
src/main/resources/mapper/primary/MeetingInfoMapper.xml
浏览文件 @
2875a1b7
...
...
@@ -34,7 +34,7 @@
</foreach>
</insert>
<select
id=
"getAllMeetingIds"
resultType=
"com.cmeeting.vo.TencentMeetingVO$SimpleMeetingInfo"
>
select meeting_id,meeting_record_id,sub_meeting_id,record_file_id from cmt_meeting_info order by sync_time
limit 1
0000;
select meeting_id,meeting_record_id,sub_meeting_id,record_file_id from cmt_meeting_info order by sync_time
desc limit 2
0000;
</select>
<select
id=
"statistics"
resultType=
"java.util.LinkedHashMap"
>
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论