Commit b0949251 authored by 何金镒's avatar 何金镒

优化 1

parent 01883aa0
...@@ -15,4 +15,6 @@ public class RedisKeys { ...@@ -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_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_STEAM_CHAT_TASK_ID = "konke:dify:last:taskid:";
public static final String KONKE_DIFY_LAST_DIALOGUE = "konke:dify:last:dialogue:";
} }
...@@ -42,7 +42,7 @@ public class CDCController { ...@@ -42,7 +42,7 @@ public class CDCController {
String sn = actions.getStr("sn"); String sn = actions.getStr("sn");
String ccuId = actions.getStr("ccuId"); String ccuId = actions.getStr("ccuId");
String ownerId = actions.getStr("ownerId"); String ownerId = actions.getStr("ownerId");
if(StrUtil.isBlank(sn) || StrUtil.isBlank(ccuId)){ if(StrUtil.isBlank(sn)){
JSONObject result = new JSONObject(); JSONObject result = new JSONObject();
result.set("msg", "参数不能为空"); result.set("msg", "参数不能为空");
result.set("code", 500); result.set("code", 500);
...@@ -50,9 +50,6 @@ public class CDCController { ...@@ -50,9 +50,6 @@ public class CDCController {
} }
log.info("getCDCToken..获取CDCToken..sn:{},ccuId:{},ownerId:{}",sn,ccuId,ownerId); log.info("getCDCToken..获取CDCToken..sn:{},ccuId:{},ownerId:{}",sn,ccuId,ownerId);
// 同步主机设备,预计一天一次?
sycDeviceService.synchronousDevice(ccuId);
QueryWrapper<CDCToken> wrapper = new QueryWrapper<>(); QueryWrapper<CDCToken> wrapper = new QueryWrapper<>();
wrapper.eq("state", 1); wrapper.eq("state", 1);
if(StrUtil.isNotBlank(ownerId)){ if(StrUtil.isNotBlank(ownerId)){
...@@ -60,11 +57,27 @@ public class CDCController { ...@@ -60,11 +57,27 @@ public class CDCController {
}else{ }else{
wrapper.eq("sn", sn); wrapper.eq("sn", sn);
} }
String cdc_token = null; String cdc_token = null;
List<CDCToken> list = tokenService.list(wrapper); 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){ if(list.size() == 1){
CDCToken token = list.get(0);
cdc_token = token.getAccessToken(); cdc_token = token.getAccessToken();
// 判断CDCToken是否过期 // 判断CDCToken是否过期
LocalDateTime localDateTime = token.getCreateTime().plusDays(6); LocalDateTime localDateTime = token.getCreateTime().plusDays(6);
...@@ -97,20 +110,24 @@ public class CDCController { ...@@ -97,20 +110,24 @@ public class CDCController {
token.setCreateTime(LocalDateTime.now()); token.setCreateTime(LocalDateTime.now());
tokenService.updateById(token); tokenService.updateById(token);
} }
// 同步主机设备,预计一天一次?
sycDeviceService.synchronousDevice(ccuId);
}else if(list.size() > 1){ }else if(list.size() > 1){
log.error("获取CDCToken失败,CDCToken数量大于1"); log.error("获取CDCToken失败,CDCToken数量大于1");
return null; return null;
}else{ }else{
//去建发获取CDCToken,有效期7天 //去建发获取CDCToken,有效期7天
cdc_token = cdcHttpUtils.getCDCToken(ccuId, ownerId); cdc_token = cdcHttpUtils.getCDCToken(ccuId, ownerId);
CDCToken token = new CDCToken(); CDCToken cdcToken = new CDCToken();
token.setSn(sn); cdcToken.setSn(sn);
token.setCcuId(ccuId); cdcToken.setCcuId(ccuId);
token.setAccessToken(cdc_token); cdcToken.setAccessToken(cdc_token);
token.setState(CDCToken.STATE_ENABLED); cdcToken.setState(CDCToken.STATE_ENABLED);
token.setCreateTime(LocalDateTime.now()); cdcToken.setCreateTime(LocalDateTime.now());
token.setAiSpeechUserId(sn); cdcToken.setAiSpeechUserId(sn);
tokenService.save(token); tokenService.save(cdcToken);
} }
JSONObject result = new JSONObject(); JSONObject result = new JSONObject();
......
...@@ -80,11 +80,13 @@ public class DeviceController { ...@@ -80,11 +80,13 @@ public class DeviceController {
} }
@PostMapping("/saveTemporaryScene") @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) { @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 "保存成功"; return "保存成功";
}else{ }else{
return "保存失败"; return "保存失败";
......
...@@ -149,12 +149,29 @@ public class DifyControllerV2 { ...@@ -149,12 +149,29 @@ public class DifyControllerV2 {
|| cleanedInput.equalsIgnoreCase("退出") || cleanedInput.equalsIgnoreCase("退出对话") || cleanedInput.equalsIgnoreCase("退出") || cleanedInput.equalsIgnoreCase("退出对话")
|| cleanedInput.equalsIgnoreCase("结束对话") || cleanedInput.equalsIgnoreCase("结束") || cleanedInput.equalsIgnoreCase("结束对话") || cleanedInput.equalsIgnoreCase("结束")
|| cleanedInput.equalsIgnoreCase("闭嘴") || cleanedInput.equalsIgnoreCase("不要说话")){ || cleanedInput.equalsIgnoreCase("闭嘴") || cleanedInput.equalsIgnoreCase("不要说话")){
//结束对话
this.cleanConversation(token);
res = String.format(res, "好的", true); res = String.format(res, "好的", true);
}else{ }else{
if (!webSocketUtil.getWebSocket(token.getSn())) { if (!webSocketUtil.getWebSocket(token.getSn())) {
log.error("未找到sn:{}的WebSocket连接,不处理对话1", token.getSn()); log.error("未找到sn:{}的WebSocket连接,不处理对话1", token.getSn());
res = String.format(res, "网络异常,请检查网络", false); res = String.format(res, "网络异常,请检查网络", false);
}else{ }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)); eventPublisher.publishEvent(new DifyChatSteamEvent(this,token.getSn(), cleanedInput));
res = String.format(res, "正在思考中", false); res = String.format(res, "正在思考中", false);
...@@ -182,6 +199,13 @@ public class DifyControllerV2 { ...@@ -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 { ...@@ -190,6 +214,7 @@ public class DifyControllerV2 {
String redis_task_key = RedisKeys.KONKE_DIFY_LAST_STEAM_CHAT_TASK_ID+ sn; String redis_task_key = RedisKeys.KONKE_DIFY_LAST_STEAM_CHAT_TASK_ID+ sn;
Object redis_task = redisTemplate.opsForValue().get(redis_task_key); Object redis_task = redisTemplate.opsForValue().get(redis_task_key);
if(redis_task != null){ if(redis_task != null){
log.info("【{}】:结束 流式 对话, task_id:{}",sn,redis_task);
String task_id = (String) redis_task; String task_id = (String) redis_task;
String url = "http://172.17.12.12:8088/v1/chat-messages/"+task_id+"/stop"; String url = "http://172.17.12.12:8088/v1/chat-messages/"+task_id+"/stop";
...@@ -211,8 +236,6 @@ public class DifyControllerV2 { ...@@ -211,8 +236,6 @@ public class DifyControllerV2 {
public Flux<String> chatSteamMessages(@RequestParam(name = "query") String query, public Flux<String> chatSteamMessages(@RequestParam(name = "query") String query,
@RequestHeader("sn") String sn) { @RequestHeader("sn") String sn) {
try { try {
log.info("【{}】:开始 流式 对话, query:{}",sn,query);
QueryWrapper<CDCToken> wrapper = new QueryWrapper<>(); QueryWrapper<CDCToken> wrapper = new QueryWrapper<>();
wrapper.eq("sn", sn); wrapper.eq("sn", sn);
List<CDCToken> list = tokenService.list(wrapper); List<CDCToken> list = tokenService.list(wrapper);
...@@ -223,6 +246,7 @@ public class DifyControllerV2 { ...@@ -223,6 +246,7 @@ public class DifyControllerV2 {
if(StrUtil.isBlank(token.getCcuId())){ if(StrUtil.isBlank(token.getCcuId())){
return Flux.just("未绑定主机"); return Flux.just("未绑定主机");
} }
log.info("【{}】:开始 流式 对话, query:{},conversationid:{}",sn,query,token.getConversationId());
if(StrUtil.isBlank(token.getAccessToken())){ if(StrUtil.isBlank(token.getAccessToken())){
// 没有建发的token,有效期7天 // 没有建发的token,有效期7天
String cdc_token = cdcHttpUtils.getCDCToken(token.getCcuId(), token.getCDCOwnerId()); String cdc_token = cdcHttpUtils.getCDCToken(token.getCcuId(), token.getCDCOwnerId());
...@@ -288,6 +312,9 @@ public class DifyControllerV2 { ...@@ -288,6 +312,9 @@ public class DifyControllerV2 {
log.info("dify key:{} ,流式 对话 body:{}",dify_api_key,body); 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() return webClient.post()
.uri(url) .uri(url)
......
...@@ -18,6 +18,8 @@ public class DeviceController2 { ...@@ -18,6 +18,8 @@ public class DeviceController2 {
@Autowired @Autowired
private KonkeIotUtils konkeIotServer; private KonkeIotUtils konkeIotServer;
@Autowired
private SycDeviceService sycDeviceService;
@GetMapping("/triggerScene") @GetMapping("/triggerScene")
public ResultResp triggerScene(@RequestParam(value = "ccuName")String ccuName, public ResultResp triggerScene(@RequestParam(value = "ccuName")String ccuName,
...@@ -27,11 +29,13 @@ public class DeviceController2 { ...@@ -27,11 +29,13 @@ public class DeviceController2 {
} }
@GetMapping("/saveTemporaryScene") @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) { @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("保存成功"); return ResultResp.setDate("保存成功");
}else{ }else{
return ResultResp.setBadDate("保存失败"); return ResultResp.setBadDate("保存失败");
......
package com.ikonke.konkeaialibabamcp.event.listener; package com.ikonke.konkeaialibabamcp.event.listener;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
...@@ -64,6 +65,12 @@ public class DifyChatSteamEventListener { ...@@ -64,6 +65,12 @@ public class DifyChatSteamEventListener {
json.set("type", "other"); json.set("type", "other");
webSocketUtil.sendToSingle(event.getSn(), json.toString()); 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(); // ai_result = ai_result.replaceAll("\n", "##").trim();
// log.info("dify请求返回22--->:{}",ai_result); // log.info("dify请求返回22--->:{}",ai_result);
......
...@@ -18,4 +18,8 @@ public interface CDCTokenMapper extends BaseMapper<CDCToken> { ...@@ -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);") @Update("UPDATE cdc_token SET accessToken = NULL WHERE DATE(createTime) < DATE_SUB(CURDATE(), INTERVAL #{num} DAY);")
int examineCDCToken(@Param("num") int num); int examineCDCToken(@Param("num") int num);
@Update("UPDATE cdc_token SET conversationId = NULL WHERE sn = #{sn};")
int cleanConversation(@Param("sn") String sn);
} }
...@@ -9,4 +9,6 @@ public interface ICDCTokenService extends IService<CDCToken> { ...@@ -9,4 +9,6 @@ public interface ICDCTokenService extends IService<CDCToken> {
CDCToken findBySn(String sn,Integer state); CDCToken findBySn(String sn,Integer state);
int examineCDCToken(int num); int examineCDCToken(int num);
int cleanConversation(String sn);
} }
...@@ -31,4 +31,9 @@ public class ICDCTokenServiceImpl extends ServiceImpl<CDCTokenMapper, CDCToken> ...@@ -31,4 +31,9 @@ public class ICDCTokenServiceImpl extends ServiceImpl<CDCTokenMapper, CDCToken>
return baseMapper.examineCDCToken(num); return baseMapper.examineCDCToken(num);
} }
@Override
public int cleanConversation(String sn){
return baseMapper.cleanConversation(sn);
}
} }
...@@ -18,6 +18,7 @@ import com.ikonke.konkeaialibabamcp.service.SycDeviceService; ...@@ -18,6 +18,7 @@ import com.ikonke.konkeaialibabamcp.service.SycDeviceService;
import com.ikonke.konkeaialibabamcp.service.mysqlservice.ISynDeviceService; import com.ikonke.konkeaialibabamcp.service.mysqlservice.ISynDeviceService;
import com.ikonke.konkeaialibabamcp.service.mysqlservice.ITemporarySceneService; import com.ikonke.konkeaialibabamcp.service.mysqlservice.ITemporarySceneService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Criteria;
...@@ -47,6 +48,9 @@ public class KonkeIotUtils { ...@@ -47,6 +48,9 @@ public class KonkeIotUtils {
@Value("${konke.deviceCloud.appKey}") @Value("${konke.deviceCloud.appKey}")
private String appKey; private String appKey;
@Autowired
private WebSocketUtil webSocketUtil;
private final MongoTemplate mongoTemplate; private final MongoTemplate mongoTemplate;
private final SycDeviceService sycDeviceService; private final SycDeviceService sycDeviceService;
private final ITemporarySceneService temporarySceneService; private final ITemporarySceneService temporarySceneService;
...@@ -976,11 +980,37 @@ public class KonkeIotUtils { ...@@ -976,11 +980,37 @@ public class KonkeIotUtils {
/** /**
* 保存临时场景 * 保存临时场景
*/ */
public Boolean saveTemporaryScene(String ccuName,String temporarySceneId){ public Boolean saveTemporaryScene(String sn,String ccuName,String temporarySceneId){
try { try {
QueryWrapper<TemporaryScene> wrapper = new QueryWrapper<>(); QueryWrapper<TemporaryScene> wrapper = new QueryWrapper<>();
wrapper.eq("ccuId", ccuName); wrapper.eq("ccuId", ccuName);
wrapper.eq("temporarySceneId", temporarySceneId); 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); List<TemporaryScene> list = temporarySceneService.list(wrapper);
if(!list.isEmpty()){ if(!list.isEmpty()){
for(TemporaryScene scene : list){ for(TemporaryScene scene : list){
......
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