Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
K
konke-ai-alibaba-mcp
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
何金镒
konke-ai-alibaba-mcp
Commits
b0949251
Commit
b0949251
authored
Nov 06, 2025
by
何金镒
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
优化 1
parent
01883aa0
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
123 additions
and
23 deletions
+123
-23
src/main/java/com/ikonke/konkeaialibabamcp/constant/RedisKeys.java
...java/com/ikonke/konkeaialibabamcp/constant/RedisKeys.java
+2
-0
src/main/java/com/ikonke/konkeaialibabamcp/controller/CDCController.java
...om/ikonke/konkeaialibabamcp/controller/CDCController.java
+31
-14
src/main/java/com/ikonke/konkeaialibabamcp/controller/DeviceController.java
...ikonke/konkeaialibabamcp/controller/DeviceController.java
+5
-3
src/main/java/com/ikonke/konkeaialibabamcp/controller/DifyControllerV2.java
...ikonke/konkeaialibabamcp/controller/DifyControllerV2.java
+29
-2
src/main/java/com/ikonke/konkeaialibabamcp/controller/open/DeviceController2.java
.../konkeaialibabamcp/controller/open/DeviceController2.java
+7
-3
src/main/java/com/ikonke/konkeaialibabamcp/event/listener/DifyChatSteamEventListener.java
...alibabamcp/event/listener/DifyChatSteamEventListener.java
+7
-0
src/main/java/com/ikonke/konkeaialibabamcp/mapper/mysql/CDCTokenMapper.java
...ikonke/konkeaialibabamcp/mapper/mysql/CDCTokenMapper.java
+4
-0
src/main/java/com/ikonke/konkeaialibabamcp/service/mysqlservice/ICDCTokenService.java
...keaialibabamcp/service/mysqlservice/ICDCTokenService.java
+2
-0
src/main/java/com/ikonke/konkeaialibabamcp/service/mysqlservice/impl/ICDCTokenServiceImpl.java
...bamcp/service/mysqlservice/impl/ICDCTokenServiceImpl.java
+5
-0
src/main/java/com/ikonke/konkeaialibabamcp/utils/KonkeIotUtils.java
...ava/com/ikonke/konkeaialibabamcp/utils/KonkeIotUtils.java
+31
-1
No files found.
src/main/java/com/ikonke/konkeaialibabamcp/constant/RedisKeys.java
View file @
b0949251
...
...
@@ -15,4 +15,6 @@ public class RedisKeys {
public
static
final
String
KONKE_DIFY_API_KEY
=
"konke:dify:api:key"
;
public
static
final
String
KONKE_DIFY_LAST_STEAM_CHAT_TASK_ID
=
"konke:dify:last:taskid:"
;
public
static
final
String
KONKE_DIFY_LAST_DIALOGUE
=
"konke:dify:last:dialogue:"
;
}
src/main/java/com/ikonke/konkeaialibabamcp/controller/CDCController.java
View file @
b0949251
...
...
@@ -42,7 +42,7 @@ public class CDCController {
String
sn
=
actions
.
getStr
(
"sn"
);
String
ccuId
=
actions
.
getStr
(
"ccuId"
);
String
ownerId
=
actions
.
getStr
(
"ownerId"
);
if
(
StrUtil
.
isBlank
(
sn
)
||
StrUtil
.
isBlank
(
ccuId
)
){
if
(
StrUtil
.
isBlank
(
sn
)){
JSONObject
result
=
new
JSONObject
();
result
.
set
(
"msg"
,
"参数不能为空"
);
result
.
set
(
"code"
,
500
);
...
...
@@ -50,9 +50,6 @@ public class CDCController {
}
log
.
info
(
"getCDCToken..获取CDCToken..sn:{},ccuId:{},ownerId:{}"
,
sn
,
ccuId
,
ownerId
);
// 同步主机设备,预计一天一次?
sycDeviceService
.
synchronousDevice
(
ccuId
);
QueryWrapper
<
CDCToken
>
wrapper
=
new
QueryWrapper
<>();
wrapper
.
eq
(
"state"
,
1
);
if
(
StrUtil
.
isNotBlank
(
ownerId
)){
...
...
@@ -60,11 +57,27 @@ public class CDCController {
}
else
{
wrapper
.
eq
(
"sn"
,
sn
);
}
String
cdc_token
=
null
;
List
<
CDCToken
>
list
=
tokenService
.
list
(
wrapper
);
CDCToken
token
=
null
;
if
(
list
.
size
()
==
1
)
{
token
=
list
.
get
(
0
);
}
if
(
StrUtil
.
isBlank
(
ccuId
)){
if
(
token
!=
null
){
log
.
error
(
"【{}】未传入主机号,删除数据库数据.."
,
sn
);
tokenService
.
removeById
(
token
);
}
//todo 主机号不存在,表明未绑定主机,需要不能使用AI功能
JSONObject
result
=
new
JSONObject
();
result
.
set
(
"msg"
,
"未绑定主机"
);
result
.
set
(
"code"
,
500
);
return
result
;
}
if
(
list
.
size
()
==
1
){
CDCToken
token
=
list
.
get
(
0
);
cdc_token
=
token
.
getAccessToken
();
// 判断CDCToken是否过期
LocalDateTime
localDateTime
=
token
.
getCreateTime
().
plusDays
(
6
);
...
...
@@ -97,20 +110,24 @@ public class CDCController {
token
.
setCreateTime
(
LocalDateTime
.
now
());
tokenService
.
updateById
(
token
);
}
// 同步主机设备,预计一天一次?
sycDeviceService
.
synchronousDevice
(
ccuId
);
}
else
if
(
list
.
size
()
>
1
){
log
.
error
(
"获取CDCToken失败,CDCToken数量大于1"
);
return
null
;
}
else
{
//去建发获取CDCToken,有效期7天
cdc_token
=
cdcHttpUtils
.
getCDCToken
(
ccuId
,
ownerId
);
CDCToken
t
oken
=
new
CDCToken
();
t
oken
.
setSn
(
sn
);
t
oken
.
setCcuId
(
ccuId
);
t
oken
.
setAccessToken
(
cdc_token
);
t
oken
.
setState
(
CDCToken
.
STATE_ENABLED
);
t
oken
.
setCreateTime
(
LocalDateTime
.
now
());
t
oken
.
setAiSpeechUserId
(
sn
);
tokenService
.
save
(
t
oken
);
CDCToken
cdcT
oken
=
new
CDCToken
();
cdcT
oken
.
setSn
(
sn
);
cdcT
oken
.
setCcuId
(
ccuId
);
cdcT
oken
.
setAccessToken
(
cdc_token
);
cdcT
oken
.
setState
(
CDCToken
.
STATE_ENABLED
);
cdcT
oken
.
setCreateTime
(
LocalDateTime
.
now
());
cdcT
oken
.
setAiSpeechUserId
(
sn
);
tokenService
.
save
(
cdcT
oken
);
}
JSONObject
result
=
new
JSONObject
();
...
...
src/main/java/com/ikonke/konkeaialibabamcp/controller/DeviceController.java
View file @
b0949251
...
...
@@ -80,11 +80,13 @@ public class DeviceController {
}
@PostMapping
(
"/saveTemporaryScene"
)
public
String
saveTemporaryScene
(
@RequestParam
(
value
=
"ccuName"
)
String
ccuName
,
public
String
saveTemporaryScene
(
@RequestParam
(
value
=
"sn"
)
String
sn
,
@RequestParam
(
value
=
"ccuName"
)
String
ccuName
,
@RequestParam
(
value
=
"temporarySceneId"
)
String
temporarySceneId
)
{
log
.
info
(
"saveTemporaryScene..临时场景存储..ccuName:{},temporarySceneId:{}
"
,
ccuName
,
temporarySceneId
);
log
.
info
(
"saveTemporaryScene..临时场景存储..ccuName:{},temporarySceneId:{}
,sn:{}"
,
ccuName
,
temporarySceneId
,
sn
);
if
(
konkeIotServer
.
saveTemporaryScene
(
ccuName
,
temporarySceneId
)){
if
(
konkeIotServer
.
saveTemporaryScene
(
sn
,
ccuName
,
temporarySceneId
)){
sycDeviceService
.
synchronousDevice
(
ccuName
);
return
"保存成功"
;
}
else
{
return
"保存失败"
;
...
...
src/main/java/com/ikonke/konkeaialibabamcp/controller/DifyControllerV2.java
View file @
b0949251
...
...
@@ -149,12 +149,29 @@ public class DifyControllerV2 {
||
cleanedInput
.
equalsIgnoreCase
(
"退出"
)
||
cleanedInput
.
equalsIgnoreCase
(
"退出对话"
)
||
cleanedInput
.
equalsIgnoreCase
(
"结束对话"
)
||
cleanedInput
.
equalsIgnoreCase
(
"结束"
)
||
cleanedInput
.
equalsIgnoreCase
(
"闭嘴"
)
||
cleanedInput
.
equalsIgnoreCase
(
"不要说话"
)){
//结束对话
this
.
cleanConversation
(
token
);
res
=
String
.
format
(
res
,
"好的"
,
true
);
}
else
{
if
(!
webSocketUtil
.
getWebSocket
(
token
.
getSn
()))
{
log
.
error
(
"未找到sn:{}的WebSocket连接,不处理对话1"
,
token
.
getSn
());
res
=
String
.
format
(
res
,
"网络异常,请检查网络"
,
false
);
}
else
{
// 判断最后一次对话的时间
String
redis_key
=
RedisKeys
.
KONKE_DIFY_LAST_DIALOGUE
+
token
.
getSn
();
Object
o
=
redisTemplate
.
opsForValue
().
get
(
redis_key
);
if
(
o
!=
null
){
Long
last_dialogue_time
=
(
Long
)
o
;
if
(
System
.
currentTimeMillis
()
-
last_dialogue_time
>
60
*
1000
){
//60秒内没有对话,则清除会话
this
.
cleanConversation
(
token
);
}
}
else
{
this
.
cleanConversation
(
token
);
}
// 异步执行对话
eventPublisher
.
publishEvent
(
new
DifyChatSteamEvent
(
this
,
token
.
getSn
(),
cleanedInput
));
res
=
String
.
format
(
res
,
"正在思考中"
,
false
);
...
...
@@ -182,6 +199,13 @@ public class DifyControllerV2 {
}
}
public
void
cleanConversation
(
CDCToken
token
){
log
.
info
(
"【{}】:清除会话:{}"
,
token
.
getSn
(),
JSONUtil
.
toJsonStr
(
token
));
String
redis_key
=
RedisKeys
.
KONKE_DIFY_CONVERSATION_ID
+
token
.
getSn
();
redisTemplate
.
delete
(
redis_key
);
tokenService
.
cleanConversation
(
token
.
getSn
());
}
/**
* 停止对话
*/
...
...
@@ -190,6 +214,7 @@ public class DifyControllerV2 {
String
redis_task_key
=
RedisKeys
.
KONKE_DIFY_LAST_STEAM_CHAT_TASK_ID
+
sn
;
Object
redis_task
=
redisTemplate
.
opsForValue
().
get
(
redis_task_key
);
if
(
redis_task
!=
null
){
log
.
info
(
"【{}】:结束 流式 对话, task_id:{}"
,
sn
,
redis_task
);
String
task_id
=
(
String
)
redis_task
;
String
url
=
"http://172.17.12.12:8088/v1/chat-messages/"
+
task_id
+
"/stop"
;
...
...
@@ -211,8 +236,6 @@ public class DifyControllerV2 {
public
Flux
<
String
>
chatSteamMessages
(
@RequestParam
(
name
=
"query"
)
String
query
,
@RequestHeader
(
"sn"
)
String
sn
)
{
try
{
log
.
info
(
"【{}】:开始 流式 对话, query:{}"
,
sn
,
query
);
QueryWrapper
<
CDCToken
>
wrapper
=
new
QueryWrapper
<>();
wrapper
.
eq
(
"sn"
,
sn
);
List
<
CDCToken
>
list
=
tokenService
.
list
(
wrapper
);
...
...
@@ -223,6 +246,7 @@ public class DifyControllerV2 {
if
(
StrUtil
.
isBlank
(
token
.
getCcuId
())){
return
Flux
.
just
(
"未绑定主机"
);
}
log
.
info
(
"【{}】:开始 流式 对话, query:{},conversationid:{}"
,
sn
,
query
,
token
.
getConversationId
());
if
(
StrUtil
.
isBlank
(
token
.
getAccessToken
())){
// 没有建发的token,有效期7天
String
cdc_token
=
cdcHttpUtils
.
getCDCToken
(
token
.
getCcuId
(),
token
.
getCDCOwnerId
());
...
...
@@ -288,6 +312,9 @@ public class DifyControllerV2 {
log
.
info
(
"dify key:{} ,流式 对话 body:{}"
,
dify_api_key
,
body
);
//最后一次对话时间
String
last_dialogue_redis_key
=
RedisKeys
.
KONKE_DIFY_LAST_DIALOGUE
+
sn
;
redisTemplate
.
opsForValue
().
set
(
last_dialogue_redis_key
,
System
.
currentTimeMillis
());
return
webClient
.
post
()
.
uri
(
url
)
...
...
src/main/java/com/ikonke/konkeaialibabamcp/controller/open/DeviceController2.java
View file @
b0949251
...
...
@@ -18,6 +18,8 @@ public class DeviceController2 {
@Autowired
private
KonkeIotUtils
konkeIotServer
;
@Autowired
private
SycDeviceService
sycDeviceService
;
@GetMapping
(
"/triggerScene"
)
public
ResultResp
triggerScene
(
@RequestParam
(
value
=
"ccuName"
)
String
ccuName
,
...
...
@@ -27,11 +29,13 @@ public class DeviceController2 {
}
@GetMapping
(
"/saveTemporaryScene"
)
public
ResultResp
saveTemporaryScene
(
@RequestParam
(
value
=
"ccuName"
)
String
ccuName
,
public
ResultResp
saveTemporaryScene
(
@RequestParam
(
value
=
"sn"
)
String
sn
,
@RequestParam
(
value
=
"ccuName"
)
String
ccuName
,
@RequestParam
(
value
=
"sceneId"
)
String
sceneId
)
{
log
.
info
(
"saveTemporaryScene..临时场景存储..ccuName:{},sceneId:{}
"
,
ccuName
,
sceneId
);
log
.
info
(
"saveTemporaryScene..临时场景存储..ccuName:{},sceneId:{}
,sn:{}"
,
ccuName
,
sceneId
,
sn
);
if
(
konkeIotServer
.
saveTemporaryScene
(
ccuName
,
sceneId
)){
if
(
konkeIotServer
.
saveTemporaryScene
(
sn
,
ccuName
,
sceneId
)){
sycDeviceService
.
synchronousDevice
(
ccuName
);
return
ResultResp
.
setDate
(
"保存成功"
);
}
else
{
return
ResultResp
.
setBadDate
(
"保存失败"
);
...
...
src/main/java/com/ikonke/konkeaialibabamcp/event/listener/DifyChatSteamEventListener.java
View file @
b0949251
package
com.ikonke.konkeaialibabamcp.event.listener
;
import
cn.hutool.core.util.StrUtil
;
import
cn.hutool.http.HttpRequest
;
import
cn.hutool.json.JSONObject
;
import
cn.hutool.json.JSONUtil
;
...
...
@@ -64,6 +65,12 @@ public class DifyChatSteamEventListener {
json
.
set
(
"type"
,
"other"
);
webSocketUtil
.
sendToSingle
(
event
.
getSn
(),
json
.
toString
());
}
if
(
StrUtil
.
isBlank
(
ai_result
)){
JSONObject
json
=
new
JSONObject
();
json
.
set
(
"msg"
,
"服务器错误,请稍后重试"
);
json
.
set
(
"type"
,
"error"
);
webSocketUtil
.
sendToSingle
(
event
.
getSn
(),
json
.
toString
());
}
// ai_result = ai_result.replaceAll("\n", "##").trim();
// log.info("dify请求返回22--->:{}",ai_result);
...
...
src/main/java/com/ikonke/konkeaialibabamcp/mapper/mysql/CDCTokenMapper.java
View file @
b0949251
...
...
@@ -18,4 +18,8 @@ public interface CDCTokenMapper extends BaseMapper<CDCToken> {
@Update
(
"UPDATE cdc_token SET accessToken = NULL WHERE DATE(createTime) < DATE_SUB(CURDATE(), INTERVAL #{num} DAY);"
)
int
examineCDCToken
(
@Param
(
"num"
)
int
num
);
@Update
(
"UPDATE cdc_token SET conversationId = NULL WHERE sn = #{sn};"
)
int
cleanConversation
(
@Param
(
"sn"
)
String
sn
);
}
src/main/java/com/ikonke/konkeaialibabamcp/service/mysqlservice/ICDCTokenService.java
View file @
b0949251
...
...
@@ -9,4 +9,6 @@ public interface ICDCTokenService extends IService<CDCToken> {
CDCToken
findBySn
(
String
sn
,
Integer
state
);
int
examineCDCToken
(
int
num
);
int
cleanConversation
(
String
sn
);
}
src/main/java/com/ikonke/konkeaialibabamcp/service/mysqlservice/impl/ICDCTokenServiceImpl.java
View file @
b0949251
...
...
@@ -31,4 +31,9 @@ public class ICDCTokenServiceImpl extends ServiceImpl<CDCTokenMapper, CDCToken>
return
baseMapper
.
examineCDCToken
(
num
);
}
@Override
public
int
cleanConversation
(
String
sn
){
return
baseMapper
.
cleanConversation
(
sn
);
}
}
src/main/java/com/ikonke/konkeaialibabamcp/utils/KonkeIotUtils.java
View file @
b0949251
...
...
@@ -18,6 +18,7 @@ import com.ikonke.konkeaialibabamcp.service.SycDeviceService;
import
com.ikonke.konkeaialibabamcp.service.mysqlservice.ISynDeviceService
;
import
com.ikonke.konkeaialibabamcp.service.mysqlservice.ITemporarySceneService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.data.mongodb.core.MongoTemplate
;
import
org.springframework.data.mongodb.core.query.Criteria
;
...
...
@@ -47,6 +48,9 @@ public class KonkeIotUtils {
@Value
(
"${konke.deviceCloud.appKey}"
)
private
String
appKey
;
@Autowired
private
WebSocketUtil
webSocketUtil
;
private
final
MongoTemplate
mongoTemplate
;
private
final
SycDeviceService
sycDeviceService
;
private
final
ITemporarySceneService
temporarySceneService
;
...
...
@@ -976,11 +980,37 @@ public class KonkeIotUtils {
/**
* 保存临时场景
*/
public
Boolean
saveTemporaryScene
(
String
ccuName
,
String
temporarySceneId
){
public
Boolean
saveTemporaryScene
(
String
sn
,
String
ccuName
,
String
temporarySceneId
){
try
{
QueryWrapper
<
TemporaryScene
>
wrapper
=
new
QueryWrapper
<>();
wrapper
.
eq
(
"ccuId"
,
ccuName
);
wrapper
.
eq
(
"temporarySceneId"
,
temporarySceneId
);
String
url
=
baseUrl
+
"/2.0/ccu/"
+
ccuName
+
"/scene/"
+
temporarySceneId
;
String
body
=
HttpRequest
.
get
(
url
)
.
header
(
"appId"
,
appId
)
.
header
(
"appKey"
,
appKey
)
.
execute
().
body
();
JSONObject
response
=
JSONUtil
.
parseObj
(
body
);
if
(
response
.
getBool
(
"success"
)){
JSONObject
to_websocket
=
new
JSONObject
();
JSONObject
jsonObject1
=
response
.
getJSONObject
(
"data"
);
String
name
=
jsonObject1
.
getStr
(
"name"
);
Integer
roomId
=
jsonObject1
.
getInt
(
"roomId"
);
JSONObject
data
=
new
JSONObject
();
data
.
set
(
"name"
,
name
);
data
.
set
(
"roomId"
,
roomId
);
data
.
set
(
"sceneId"
,
temporarySceneId
);
to_websocket
.
set
(
"data"
,
data
);
to_websocket
.
set
(
"type"
,
"saveScene"
);
to_websocket
.
set
(
"sn"
,
sn
);
to_websocket
.
set
(
"msg"
,
"已保存推荐场景"
);
webSocketUtil
.
sendToSingle
(
sn
,
to_websocket
.
toString
());
}
List
<
TemporaryScene
>
list
=
temporarySceneService
.
list
(
wrapper
);
if
(!
list
.
isEmpty
()){
for
(
TemporaryScene
scene
:
list
){
...
...
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