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

优化 1

parent 01883aa0
......@@ -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:";
}
......@@ -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 token = new CDCToken();
token.setSn(sn);
token.setCcuId(ccuId);
token.setAccessToken(cdc_token);
token.setState(CDCToken.STATE_ENABLED);
token.setCreateTime(LocalDateTime.now());
token.setAiSpeechUserId(sn);
tokenService.save(token);
CDCToken cdcToken = new CDCToken();
cdcToken.setSn(sn);
cdcToken.setCcuId(ccuId);
cdcToken.setAccessToken(cdc_token);
cdcToken.setState(CDCToken.STATE_ENABLED);
cdcToken.setCreateTime(LocalDateTime.now());
cdcToken.setAiSpeechUserId(sn);
tokenService.save(cdcToken);
}
JSONObject result = new JSONObject();
......
......@@ -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 "保存失败";
......
......@@ -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)
......
......@@ -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("保存失败");
......
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);
......
......@@ -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);
}
......@@ -9,4 +9,6 @@ public interface ICDCTokenService extends IService<CDCToken> {
CDCToken findBySn(String sn,Integer state);
int examineCDCToken(int num);
int cleanConversation(String sn);
}
......@@ -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);
}
}
......@@ -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){
......
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