diff --git a/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/RemoteBaiduNLPService.java b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/RemoteBaiduNLPService.java new file mode 100644 index 00000000..71937949 --- /dev/null +++ b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/RemoteBaiduNLPService.java @@ -0,0 +1,21 @@ +package com.xueyi.nlt.api.nlt.feign; + +import com.alibaba.fastjson2.JSONObject; +import com.xueyi.nlt.api.nlt.feign.factory.RemoteBaiduNLPFallbackFactory; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestParam; + +@FeignClient(url = "${notification.baidunlp.url}",name = "baidu-nlp", fallbackFactory = RemoteBaiduNLPFallbackFactory.class) +public interface RemoteBaiduNLPService { + + @PostMapping(path = "/oauth/2.0/token", consumes = "application/x-www-form-urlencoded") + JSONObject getAccessToken(@RequestBody String body); + + @PostMapping(path = "/rpc/2.0/nlp/v2/dnnlm_cn", consumes = "application/json") + JSONObject detected(@RequestParam(value = "charset", defaultValue = "UTF-8") String charset, + @RequestParam("access_token") String accessToken, + @RequestBody String body); +} diff --git a/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/factory/RemoteBaiduNLPFallbackFactory.java b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/factory/RemoteBaiduNLPFallbackFactory.java new file mode 100644 index 00000000..af6e3589 --- /dev/null +++ b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/factory/RemoteBaiduNLPFallbackFactory.java @@ -0,0 +1,15 @@ +package com.xueyi.nlt.api.nlt.feign.factory; + +import com.xueyi.nlt.api.nlt.feign.RemoteBaiduNLPService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cloud.openfeign.FallbackFactory; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +public class RemoteBaiduNLPFallbackFactory implements FallbackFactory { + @Override + public RemoteBaiduNLPService create(Throwable cause) { + return null; + } +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/server/handler/ChatServerHandler.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/server/handler/ChatServerHandler.java index 943c01de..d6bff226 100644 --- a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/server/handler/ChatServerHandler.java +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/server/handler/ChatServerHandler.java @@ -2,9 +2,23 @@ package com.xueyi.nlt.netty.server.handler; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.xueyi.common.core.utils.core.ObjectUtil; +import com.xueyi.common.core.utils.core.SpringUtils; +import com.xueyi.common.core.web.result.AjaxResult; +import com.xueyi.common.core.web.result.R; +import com.xueyi.nlt.api.nlt.domain.vo.DmIntentVo; +import com.xueyi.nlt.api.nlt.domain.vo.response.DmIntentResponse; import com.xueyi.nlt.netty.server.config.ServerConfig; +import com.xueyi.nlt.nlt.service.IDmIntentService; +import com.xueyi.nlt.nlt.service.IDmRegularService; +import com.xueyi.nlt.nlt.service.impl.LogServiceImpl; import com.xueyi.nlt.nlt.template.FreeChatTemplate; import com.xueyi.nlt.nlt.template.MovieChatTemplate; +import com.xueyi.system.api.digitalmans.domain.dto.DmManDeviceDto; +import com.xueyi.system.api.digitalmans.feign.RemoteManDeviceService; +import com.xueyi.system.api.organize.domain.dto.SysEnterpriseDto; +import com.xueyi.system.api.organize.feign.RemoteEnterpriseService; +import com.yomahub.tlog.context.TLogContext; import com.yomahub.tlog.core.annotation.TLogAspect; import com.yomahub.tlog.core.rpc.TLogLabelBean; import com.yomahub.tlog.core.rpc.TLogRPCHandler; @@ -20,21 +34,35 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; +import javax.annotation.Resource; import java.net.InetSocketAddress; @Component public class ChatServerHandler extends SimpleChannelInboundHandler { // 添加log private static final Logger log = LoggerFactory.getLogger(ChatServerHandler.class); + private static final Logger intentLog = LoggerFactory.getLogger("intentLog"); public static ChatServerHandler INSTANCE; + @Autowired + private RemoteManDeviceService manDeviceService; @Autowired private FreeChatTemplate freeChatTemplate; + @Autowired + private RemoteEnterpriseService remoteEnterpriseService; + + @Autowired + private IDmIntentService intentService; + + @Autowired private MovieChatTemplate movieChatTemplate; + @Autowired + private LogServiceImpl logService; + private final TLogRPCHandler tLogRPCHandler = new TLogRPCHandler(); @PostConstruct @@ -42,6 +70,10 @@ public class ChatServerHandler extends SimpleChannelInboundHandler manDeviceDtoR = INSTANCE.manDeviceService.manDeviceInfoInner(devId); + if (!manDeviceDtoR.isOk() || manDeviceDtoR.getData() == null) { + JSONObject jo = new JSONObject(); + jo.put("action",""); + jo.put("motion","idle"); + jo.put("traceId",""); + jo.put("status",2); + jo.put("code",1); + jo.put("tts","设备号未激活或已过期。"); + channel.writeAndFlush(new TextWebSocketFrame(jo.toJSONString())); + } + String enterpriseName = ""; + // 获取当前数字人租户信息 + R enterpriseDtoR = INSTANCE.remoteEnterpriseService.getInfo(manDeviceDtoR.getData().getTId()); + if (enterpriseDtoR.isOk()) { + enterpriseName = enterpriseDtoR.getData().getName(); + } synchronized (ServerConfig.class) { @@ -78,7 +129,36 @@ public class ChatServerHandler extends SimpleChannelInboundHandler { +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/vo/WordProcessVo.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/vo/WordProcessVo.java new file mode 100644 index 00000000..4ac69899 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/vo/WordProcessVo.java @@ -0,0 +1,9 @@ +package com.xueyi.nlt.nlt.domain.vo; + +import lombok.Data; + +@Data +public class WordProcessVo{ + private String metadata; + private String processedResult; +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/IDmRegularManager.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/IDmRegularManager.java new file mode 100644 index 00000000..fb54f8a8 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/IDmRegularManager.java @@ -0,0 +1,10 @@ +package com.xueyi.nlt.nlt.manager; + +import com.xueyi.common.web.entity.manager.IBaseManager; +import com.xueyi.nlt.api.nlt.domain.vo.response.DmIntentResponse; +import com.xueyi.nlt.nlt.domain.dto.DmRegularDto; +import com.xueyi.nlt.nlt.domain.query.DmRegularQuery; + +public interface IDmRegularManager extends IBaseManager { + public DmIntentResponse doRegularMatch(String content); +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/impl/DmRegularManager.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/impl/DmRegularManager.java new file mode 100644 index 00000000..74c88f00 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/impl/DmRegularManager.java @@ -0,0 +1,41 @@ +package com.xueyi.nlt.nlt.manager.impl; + + +import com.xueyi.common.web.entity.manager.impl.BaseManagerImpl; +import com.xueyi.nlt.api.nlt.domain.vo.response.DmIntentResponse; +import com.xueyi.nlt.nlt.domain.model.DmRegularConverter; +import com.xueyi.nlt.nlt.domain.po.DmRegularPo; +import com.xueyi.nlt.nlt.domain.dto.DmRegularDto; +import com.xueyi.nlt.nlt.domain.query.DmRegularQuery; +import com.xueyi.nlt.nlt.manager.IDmRegularManager; +import com.xueyi.nlt.nlt.mapper.DmRegularMapper; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@Component +public class DmRegularManager extends BaseManagerImpl implements IDmRegularManager { + @Override + public DmIntentResponse doRegularMatch(String content) { + DmIntentResponse response = new DmIntentResponse(); + List regularPos =baseMapper.selectList(null); + for (DmRegularPo regularPo : regularPos) { + if (isMatchRegular(content, regularPo.getExpression())) { + response.setMsg(regularPo.getText()); + response.setSkillCode(regularPo.getSkillCode()); + response.setAction(regularPo.getAction()); + response.setH5(regularPo.getJson()); + break; + } + } + return response; + } + + private boolean isMatchRegular(String str,String regular) { + Pattern pattern = Pattern.compile(regular); + Matcher matcher = pattern.matcher(str); + return matcher.find(); + } +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/IDmIntentService.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/IDmIntentService.java index 79981a70..d4a34a4f 100644 --- a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/IDmIntentService.java +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/IDmIntentService.java @@ -1,8 +1,15 @@ package com.xueyi.nlt.nlt.service; import com.xueyi.common.web.entity.service.IBaseService; +import com.xueyi.nlt.api.nlt.domain.vo.DmIntentVo; +import com.xueyi.nlt.api.nlt.domain.vo.response.DmIntentResponse; import com.xueyi.nlt.nlt.domain.dto.DmIntentDto; import com.xueyi.nlt.nlt.domain.query.DmIntentQuery; public interface IDmIntentService extends IBaseService { + DmIntentResponse regularAnswer(DmIntentVo intent); + + DmIntentResponse knowledgeAnswer(DmIntentVo intent); + + DmIntentResponse conversation(DmIntentVo intent); } diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/IDmRegularService.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/IDmRegularService.java new file mode 100644 index 00000000..1615ead6 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/IDmRegularService.java @@ -0,0 +1,10 @@ +package com.xueyi.nlt.nlt.service; + +import com.xueyi.common.web.entity.service.IBaseService; +import com.xueyi.nlt.api.nlt.domain.vo.response.DmIntentResponse; +import com.xueyi.nlt.nlt.domain.dto.DmRegularDto; +import com.xueyi.nlt.nlt.domain.query.DmRegularQuery; + +public interface IDmRegularService extends IBaseService { + DmIntentResponse doRegularMatch(String content); +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/IDmWordProcessService.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/IDmWordProcessService.java new file mode 100644 index 00000000..003af48f --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/IDmWordProcessService.java @@ -0,0 +1,7 @@ +package com.xueyi.nlt.nlt.service; + +import com.xueyi.nlt.nlt.domain.vo.WordProcessVo; + +public interface IDmWordProcessService { + public WordProcessVo semanticIntegrityDetection (WordProcessVo dmWordProcessVo); +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/impl/DmIntentServiceImpl.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/impl/DmIntentServiceImpl.java index 38c7ba34..bd352cb3 100644 --- a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/impl/DmIntentServiceImpl.java +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/impl/DmIntentServiceImpl.java @@ -1,12 +1,312 @@ package com.xueyi.nlt.nlt.service.impl; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.xueyi.common.cache.utils.SourceUtil; +import com.xueyi.common.core.constant.basic.SecurityConstants; +import com.xueyi.common.core.constant.digitalman.MessageConstants; +import com.xueyi.common.core.constant.digitalman.SkillConstants; +import com.xueyi.common.core.utils.core.IdUtil; +import com.xueyi.common.core.web.result.AjaxResult; +import com.xueyi.common.core.web.result.R; import com.xueyi.common.web.entity.service.impl.BaseServiceImpl; +import com.xueyi.nlt.api.nlt.domain.vo.CoversationSessionVo; +import com.xueyi.nlt.api.nlt.domain.vo.DmIntentVo; +import com.xueyi.nlt.api.nlt.domain.vo.KnowledgeVo; +import com.xueyi.nlt.api.nlt.domain.vo.response.DmIntentResponse; +import com.xueyi.nlt.api.nlt.domain.vo.response.DmKnowledgeResponse; +import com.xueyi.nlt.api.nlt.feign.RemoteQAService; import com.xueyi.nlt.nlt.domain.dto.DmIntentDto; import com.xueyi.nlt.nlt.domain.query.DmIntentQuery; +import com.xueyi.nlt.nlt.domain.vo.MarkRecordVo; import com.xueyi.nlt.nlt.manager.IDmIntentManager; +import com.xueyi.nlt.nlt.manager.impl.DmRegularManager; import com.xueyi.nlt.nlt.service.IDmIntentService; +import com.xueyi.nlt.nlt.template.DeliveryOrderTemplate; +import com.xueyi.nlt.nlt.template.FlightMessageTemplate; +import com.xueyi.nlt.nlt.template.FreeChatTemplate; +import com.xueyi.nlt.nlt.template.MeetingOrderTemplate; +import com.xueyi.system.api.digitalmans.domain.dto.DmManDeviceDto; +import com.xueyi.system.api.digitalmans.domain.dto.DmSkillDto; +import com.xueyi.system.api.digitalmans.feign.RemoteManDeviceService; +import com.xueyi.system.api.digitalmans.feign.RemoteSkillService; +import com.xueyi.system.api.model.Source; +import com.xueyi.system.api.organize.domain.dto.SysEnterpriseDto; +import com.xueyi.system.api.organize.feign.RemoteEnterpriseService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + @Service public class DmIntentServiceImpl extends BaseServiceImpl implements IDmIntentService { + private static final Logger log = LoggerFactory.getLogger(DmIntentServiceImpl.class); + + @Autowired + RemoteEnterpriseService remoteEnterpriseService; + + @Autowired + private DmRegularManager regularManager; + + + @Autowired + private RemoteManDeviceService manDeviceService; + + @Autowired + private RemoteQAService remoteQAService; + + @Autowired + private StringRedisTemplate redisTemplate; + + @Autowired + private RedisTemplate redisTemplate2; + + @Autowired + private MeetingOrderTemplate meetingOrderTemplate; + + @Autowired + private DeliveryOrderTemplate deliveryOrderTemplate; + + @Autowired + private FreeChatTemplate freeChatTemplate; + + @Autowired + private RemoteSkillService remoteskillService; + + @Autowired + private FlightMessageTemplate flightMessageTemplate; + + @Override + public DmIntentResponse conversation(DmIntentVo intent) { + DmIntentResponse response = regularAnswer(intent); + if (response != null && (StringUtils.isNotEmpty(response.getSkillCode()) || StringUtils.isNotEmpty(response.getMsg()))) { + return response; + } + else{ + response = knowledgeAnswer(intent); + } + + if(StringUtils.isEmpty(response.getSkillCode()) && intent.getMode().equals(MessageConstants.MODE_FREE_CHAT)) { + JSONObject joResult = freeChatTemplate.handle(intent.getDevId(),intent.getContent()); + response.setH5(joResult); + } + + return response; + } + + @Override + public DmIntentResponse regularAnswer(DmIntentVo intent) { + MarkRecordVo recordVo = new MarkRecordVo(); + recordVo.setDevId(intent.getDevId()); + recordVo.setId(IdUtil.getSnowflakeNextId()); + recordVo.setCreateTime(LocalDateTime.now()); + recordVo.setQuestion(intent.getContent()); + recordVo.setHit(1); + + R manDeviceDtoR = manDeviceService.manDeviceInfoInner(intent.getDevId()); + Long enterpriseId = manDeviceDtoR.getData().getTId(); + String enterpriseName = ""; + R enterpriseDtoR = remoteEnterpriseService.getInfo(enterpriseId); + Source source = SourceUtil.getSourceCache(enterpriseDtoR.getData().getStrategyId()); + if (enterpriseDtoR.isOk()) { + enterpriseName = enterpriseDtoR.getData().getName(); + } + + DmIntentResponse response = sessionHandle(intent); + //已有session的处理 + if(response != null && StringUtils.isNotEmpty(response.getSkillCode())){ + return response; + } + + // 正则技能匹配 + response = regularManager.doRegularMatch(intent.getContent()); + if (response != null && StringUtils.isNotEmpty(response.getSkillCode())){ + sendToDashboard(intent, enterpriseName); + + // 判断是否有权限 + R> skilllistInner = remoteskillService.skilllistInner(intent.getDevId(),"1",enterpriseId, source.getMaster(), SecurityConstants.INNER); + if(skilllistInner.isOk()){ + List skilllist=skilllistInner.getData(); + for (DmSkillDto dmSkillDto : skilllist) { + if (dmSkillDto.getSkillCode().equals(response.getSkillCode())) { + if(dmSkillDto.getStatus().equals("0")){ + response.clear(); + response.setMsg("操作无权限"); + return response; + } + // 为技能设置motion + response.setMotion(dmSkillDto.getMotionName()); + } + } + } + switch (response.getSkillCode()) { + case "1": + // 做会议室处理 + response.setH5(meetingOrderTemplate.handle(intent.getDevId(), intent.getContent(), enterpriseId)); + break; + case "33": + // 做快递预约处理 + response.setH5(deliveryOrderTemplate.handle(intent.getDevId(), intent.getContent(), enterpriseId)); + break; + case "34": + // 做查询航班信息处理 + response.setH5(flightMessageTemplate.handle(intent.getDevId(), intent.getContent(), enterpriseId)); + break; + default: + break; + } + }else if(response != null && StringUtils.isNotEmpty(response.getMsg())){ + // 记录log + recordVo.setType(2); + List answers = new ArrayList(); + answers.add(response.getMsg()); + recordVo.setAnswers(answers); + return response; + } + return response; + } + @Override + public DmIntentResponse knowledgeAnswer(DmIntentVo intent){ + MarkRecordVo recordVo = new MarkRecordVo(); + recordVo.setDevId(intent.getDevId()); + recordVo.setId(IdUtil.getSnowflakeNextId()); + recordVo.setCreateTime(LocalDateTime.now()); + recordVo.setQuestion(intent.getContent()); + recordVo.setHit(1); + + R manDeviceDtoR = manDeviceService.manDeviceInfoInner(intent.getDevId()); + Long enterpriseId = manDeviceDtoR.getData().getTId(); + String enterpriseName = ""; + R enterpriseDtoR = remoteEnterpriseService.getInfo(Long.valueOf(enterpriseId)); + if (enterpriseDtoR.isOk()) { + enterpriseName = enterpriseDtoR.getData().getName(); + } + + // 调用知识库问答 + DmIntentResponse response = new DmIntentResponse(); + response.setSkillCode("30"); + DmKnowledgeResponse qaAjax = null; + KnowledgeVo knowledgeVo = new KnowledgeVo(); + knowledgeVo.setManCode(manDeviceDtoR.getData().getManCode()); + knowledgeVo.setTenantId(manDeviceDtoR.getData().getTId()); + knowledgeVo.setQuestion(intent.getContent()); + R dmKnowledgeResponseR = remoteQAService.query(knowledgeVo); + if (dmKnowledgeResponseR!= null && dmKnowledgeResponseR.getData() != null) { + qaAjax = dmKnowledgeResponseR.getData(); + } + + String content = ""; + if (qaAjax != null) { + log.info("知识库问答返回结果:{}",qaAjax.toString()); + if (qaAjax.getTarget() == 1) { + content = qaAjax.getResult().get(0).getKnowledgeLib(); + pushIntoDashboardRedis(enterpriseName,content,"knowledge"); + response.setH5(JSONObject.from(qaAjax)); + // 记录log + recordVo.setType(2); + List answers = new ArrayList(); + answers.add(response.getMsg()); + recordVo.setAnswers(answers); // 航班查询 + return response; + } + else { + // 知识库没有答案,返回空 + response.clear(); + response.setMsg(""); + } + } + return response; + } + + private DmIntentResponse sessionHandle(DmIntentVo intent) { + R manDeviceDtoR = manDeviceService.manDeviceInfoInner(intent.getDevId()); + Long enterpriseId = manDeviceDtoR.getData().getTId(); + + DmIntentResponse response = new DmIntentResponse(); + // 判断会议室缓存 + // 获取设备号对应缓存 + //之前已有session信息 + CoversationSessionVo sessionObject = (CoversationSessionVo) redisTemplate2.opsForValue().get("group:device" + ":" + intent.getDevId() + ":" +"session"); //category + if (sessionObject != null) { + switch (sessionObject.getCategory()) { + case "meeting": + response.setMsg(""); + response.setSkillCode("1"); + response.setH5(meetingOrderTemplate.handle(intent.getDevId(),intent.getContent(), enterpriseId)); + response.setAction("Meeting"); + break; + case "delivery": + response.setMsg(""); + response.setSkillCode("33"); + response.setH5(deliveryOrderTemplate.handle(intent.getDevId(),intent.getContent(), enterpriseId)); + break; + case "flight": + response.setMsg(""); + response.setSkillCode("34"); + response.setH5(flightMessageTemplate.handle(intent.getDevId(),intent.getContent(), enterpriseId)); + break; + + } + } + return response; + } + + + private int pushIntoDashboardRedis(String name,String content,String type) { + try { + JSONObject object = new JSONObject(); + object.put("tenantName", name); + object.put("content", content); + if (type.equals("skill")) { + redisTemplate2.opsForList().leftPush("dashboard:skill-consume", object.toJSONString()); + } else if (type.equals("knowledge")) { + redisTemplate2.opsForList().leftPush("dashboard:knowledge-consume", object.toJSONString()); + } + return 1; + } catch (Exception e) { + log.error("推送到仪表盘失败:{}",e.getMessage()); + return 0; + } + } + + private void sendToDashboard(DmIntentVo intent, String enterpriseName) { + if (SkillConstants.SkillType.BOOK_MEETING_ROOM.getCode().equals(intent.getSkillCode()) ) { + if (!redisTemplate2.hasKey("group:device" + ":" + intent.getDevId() + ":" +"session")) { + // 获取名称为"meeting-order"的BaseTemplate的实例 + redisTemplate.opsForValue().increment("dashboard:meeting", 1); + pushIntoDashboardRedis(enterpriseName, "会议室预定", "skill"); + } + } else if (SkillConstants.SkillType.CREATE_VISITOR_INFO.getCode().equals(intent.getSkillCode())) { + // 访客预定 + redisTemplate.opsForValue().increment("dashboard:create_visitor_info", 1); + pushIntoDashboardRedis(enterpriseName,"访客邀约","skill"); + } else if (SkillConstants.SkillType.REGISTER_VISITOR.getCode().equals(intent.getSkillCode())) { + // 访客登记 + redisTemplate.opsForValue().increment("dashboard:register_visitor", 1); + pushIntoDashboardRedis(enterpriseName,"陌生人登记","skill"); + } else if (SkillConstants.SkillType.BROADCAST_DISPLAY.getCode().equals(intent.getSkillCode())) { + // 播报展示 + redisTemplate.opsForValue().increment("dashboard:broadcast_display", 1); + pushIntoDashboardRedis(enterpriseName,"播报展示","skill"); + } else if (SkillConstants.SkillType.OPEN_DOOR.getCode().equals(intent.getSkillCode())) { + // 开门记录 + redisTemplate.opsForValue().increment("dashboard:open_door", 1); + pushIntoDashboardRedis(enterpriseName,"开门","skill"); + }else if (SkillConstants.SkillType.DELIVERY.getCode().equals(intent.getSkillCode()) ) { + if (!redisTemplate2.hasKey("group:device" + ":" + intent.getDevId() + ":" + "session")) { + // 获取名称为"meeting-order"的BaseTemplate的实例 + redisTemplate.opsForValue().increment("dashboard:delivery", 1); + pushIntoDashboardRedis(enterpriseName, "寄快递", "skill"); + } + }else if (SkillConstants.SkillType.FLIGHT.getCode().equals(intent.getSkillCode()) ) { + redisTemplate.opsForValue().increment("dashboard:flight", 1); + pushIntoDashboardRedis(enterpriseName, "查询航班信息", "skill"); + } + } } diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/impl/DmRegularServiceImpl.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/impl/DmRegularServiceImpl.java new file mode 100644 index 00000000..0a611634 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/impl/DmRegularServiceImpl.java @@ -0,0 +1,17 @@ +package com.xueyi.nlt.nlt.service.impl; + +import com.xueyi.common.web.entity.service.impl.BaseServiceImpl; +import com.xueyi.nlt.api.nlt.domain.vo.DmIntentVo; +import com.xueyi.nlt.api.nlt.domain.vo.response.DmIntentResponse; +import com.xueyi.nlt.nlt.domain.query.DmRegularQuery; +import com.xueyi.nlt.nlt.domain.dto.DmRegularDto; +import com.xueyi.nlt.nlt.manager.IDmRegularManager; +import com.xueyi.nlt.nlt.service.IDmRegularService; + +public class DmRegularServiceImpl extends BaseServiceImpl implements IDmRegularService { + + @Override + public DmIntentResponse doRegularMatch(String content) { + return baseManager.doRegularMatch(content); + } +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/impl/DmWordProcessServiceImpl.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/impl/DmWordProcessServiceImpl.java new file mode 100644 index 00000000..701192f3 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/impl/DmWordProcessServiceImpl.java @@ -0,0 +1,51 @@ +package com.xueyi.nlt.nlt.service.impl; + +import com.alibaba.fastjson2.JSONObject; +import com.xueyi.nlt.api.nlt.feign.RemoteBaiduNLPService; +import com.xueyi.nlt.nlt.config.BaiduConfig; +import com.xueyi.nlt.nlt.domain.vo.WordProcessVo; +import com.xueyi.nlt.nlt.service.IDmWordProcessService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class DmWordProcessServiceImpl implements IDmWordProcessService { + + @Autowired + RemoteBaiduNLPService remoteBaiduNLPService; + + @Autowired + private BaiduConfig baiduConfig; + + private static final Logger log = LoggerFactory.getLogger(DmWordProcessServiceImpl.class); + + public WordProcessVo semanticIntegrityDetection (WordProcessVo wordProcessVo){ + log.info("元数据:" + wordProcessVo.getMetadata()); + String body = "grant_type=client_credentials&client_id=" + baiduConfig.getApiKey() + "&client_secret=" + baiduConfig.getSecretKey(); + JSONObject accessJson = remoteBaiduNLPService.getAccessToken(body); + JSONObject result = remoteBaiduNLPService.detected("UTF-8", accessJson.getString("access_token"), "{\"text\":\"" + wordProcessVo.getMetadata() + "\"}"); + if(result.containsKey("ppl")){ + if(result != null){ + if(result.containsKey("error_code")){ + String errorMsg = String.format("语义完整性检测失败,错误码:%d,错误信息:%s", result.getInteger("error_code"),result.getString("error_msg")); + log.error(errorMsg); + }else{ + Double ppl = result.getDouble("ppl"); + if(ppl < 300) { + wordProcessVo.setProcessedResult("2"); + }else if(ppl > 1000){ + wordProcessVo.setProcessedResult("0"); + }else{ + wordProcessVo.setProcessedResult("1"); + } + log.info("语义完整性检测结果:" + wordProcessVo.getProcessedResult()); + } + }else{ + log.error("语义完整性检测失败,未获取到返回结果"); + } + } + return wordProcessVo; + } +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/impl/LogServiceImpl.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/impl/LogServiceImpl.java new file mode 100644 index 00000000..6f3c82cb --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/impl/LogServiceImpl.java @@ -0,0 +1,19 @@ +package com.xueyi.nlt.nlt.service.impl; + +import com.alibaba.fastjson2.JSONObject; +import com.yomahub.tlog.core.annotation.TLogAspect; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +@Component +public class LogServiceImpl { + + private static final Logger intentLog = LoggerFactory.getLogger("intentLog"); + + @TLogAspect({"enterpriseName","type"}) + public void record(JSONObject jo,String text,String enterpriseName, String type) { + jo.put("text",text); + intentLog.info("{}", jo.toJSONString()); + } +} diff --git a/xueyi-modules/xueyi-nlt/src/main/resources/logback.xml b/xueyi-modules/xueyi-nlt/src/main/resources/logback.xml index 68e840f2..1d7add53 100644 --- a/xueyi-modules/xueyi-nlt/src/main/resources/logback.xml +++ b/xueyi-modules/xueyi-nlt/src/main/resources/logback.xml @@ -57,11 +57,38 @@ + + + ${log.path}/intent/intentInfo.log + + + + ${log.path}/intent/intentInfo.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + + + @@ -70,5 +97,6 @@ + \ No newline at end of file