Kaynağa Gözat

修改

1、将conversationInner的功能整合进service。
    2、分离出RegularManager
undefined
10710 1 yıl önce
ebeveyn
işleme
1c292b37de
5 değiştirilmiş dosya ile 292 ekleme ve 3 silme
  1. +12
    -0
      xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/model/DmRegularConverter.java
  2. +11
    -0
      xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/IDmRegularManager.java
  3. +42
    -0
      xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/impl/DmRegularManager.java
  4. +2
    -1
      xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/IDmNltService.java
  5. +225
    -2
      xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/impl/DmNltServiceImpl.java

+ 12
- 0
xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/model/DmRegularConverter.java Dosyayı Görüntüle

@@ -0,0 +1,12 @@
package com.xueyi.nlt.nlt.domain.model;

import com.xueyi.common.core.web.entity.model.BaseConverter;
import com.xueyi.nlt.nlt.domain.dto.DmRegularDto;
import com.xueyi.nlt.nlt.domain.po.DmRegularPo;
import com.xueyi.nlt.nlt.domain.query.DmRegularQuery;
import org.mapstruct.Mapper;
import org.mapstruct.MappingConstants;

@Mapper(componentModel = MappingConstants.ComponentModel.SPRING)
public interface DmRegularConverter extends BaseConverter<DmRegularQuery, DmRegularDto, DmRegularPo> {
}

+ 11
- 0
xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/IDmRegularManager.java Dosyayı Görüntüle

@@ -0,0 +1,11 @@
package com.xueyi.nlt.nlt.manager;

import com.xueyi.common.web.entity.manager.IBaseManager;
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.DmRegularDto;
import com.xueyi.nlt.nlt.domain.query.DmRegularQuery;

public interface IDmRegularManager extends IBaseManager<DmRegularQuery, DmRegularDto> {
public DmIntentResponse doRegularMatch(DmIntentVo intent);
}

+ 42
- 0
xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/impl/DmRegularManager.java Dosyayı Görüntüle

@@ -0,0 +1,42 @@
package com.xueyi.nlt.nlt.manager.impl;


import com.xueyi.common.web.entity.manager.impl.BaseManagerImpl;
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.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<DmRegularQuery, DmRegularDto, DmRegularPo, DmRegularMapper, DmRegularConverter> implements IDmRegularManager {
@Override
public DmIntentResponse doRegularMatch(DmIntentVo intent) {
DmIntentResponse response = new DmIntentResponse();
List<DmRegularPo> regularPos =baseMapper.selectList(null);
for (DmRegularPo regularPo : regularPos) {
if (isMatchRegular(intent.getContent(), 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();
}
}

+ 2
- 1
xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/IDmNltService.java Dosyayı Görüntüle

@@ -1,10 +1,11 @@
package com.xueyi.nlt.nlt.service;

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;

public interface IDmNltService {

DmIntentResponse conversation(DmIntentVo intent);
R<DmIntentResponse> conversation(DmIntentVo intent);

}

+ 225
- 2
xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/impl/DmNltServiceImpl.java Dosyayı Görüntüle

@@ -1,17 +1,240 @@
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.context.SecurityContextHolder;
import com.xueyi.common.core.utils.core.IdUtil;
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.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.vo.MarkRecordVo;
import com.xueyi.nlt.nlt.manager.impl.DmRegularManager;
import com.xueyi.nlt.nlt.service.IDmNltService;
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 DmNltServiceImpl implements IDmNltService {

private static final Logger log = LoggerFactory.getLogger(DmNltServiceImpl.class);

@Autowired
RemoteEnterpriseService remoteEnterpriseService;

@Autowired
private DmRegularManager regularManager;


@Autowired
private RemoteManDeviceService manDeviceService;

@Autowired
private RemoteQAService remoteQAService;

@Autowired
private StringRedisTemplate redisTemplate;

@Autowired
private RedisTemplate<Object,Object> 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) {
return null;
public R<DmIntentResponse> conversation(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<DmManDeviceDto> manDeviceDtoR = manDeviceService.manDeviceInfoInner(intent.getDevId());
String enterpriseId = manDeviceDtoR.getData().getTId().toString();
String enterpriseName = "";
R<SysEnterpriseDto> enterpriseDtoR = remoteEnterpriseService.getInfo(Long.valueOf(enterpriseId));
Source source = SourceUtil.getSourceCache(enterpriseDtoR.getData().getStrategyId());
if (enterpriseDtoR.isOk()) {
enterpriseName = enterpriseDtoR.getData().getName();
}

// 正则技能匹配
DmIntentResponse response = regularManager.doRegularMatch(intent);
if (response != null && StringUtils.isNotEmpty(response.getSkillCode())){
sendToDashboard(intent, enterpriseName);

// 判断是否有权限
R<List<DmSkillDto>> skilllistInner = remoteskillService.skilllistInner(intent.getDevId(),"1",Long.parseLong(enterpriseId), source.getMaster(), SecurityConstants.INNER);
if(skilllistInner.isOk()){
List<DmSkillDto> skilllist=skilllistInner.getData();
for (DmSkillDto dmSkillDto : skilllist) {
if (dmSkillDto.getSkillCode().equals(response.getSkillCode())) {
if(dmSkillDto.getStatus().equals("0")){
response.clear();
response.setMsg("操作无权限");
return R.ok(response);
}
// 为技能设置motion
response.setMotion(dmSkillDto.getMotionName());
}
}
}
switch (response.getSkillCode()) {
case "1":
// 做会议室处理
response.setH5(meetingOrderTemplate.handle(intent.getDevId(), intent.getContent(), Long.valueOf(enterpriseId)));
break;
case "33":
// 做快递预约处理
response.setH5(deliveryOrderTemplate.handle(intent.getDevId(), intent.getContent(), Long.valueOf(enterpriseId)));
break;
case "34":
// 做查询航班信息处理
response.setH5(flightMessageTemplate.handle(intent.getDevId(), intent.getContent(), Long.valueOf(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 R.ok(response);
}
else{
// 调用知识库问答
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<DmKnowledgeResponse> 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 R.ok(response);
}
else {
// 知识库没有答案,返回空
response.clear();
response.setMsg("");
}
}
}

if(StringUtils.isEmpty(response.getSkillCode()) && intent.getMode().equals(MessageConstants.MODE_FREE_CHAT)) {
JSONObject joResult = freeChatTemplate.handle(intent.getDevId(),intent.getContent());
response.setH5(joResult);
}

return R.ok(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");
}
}
}

Yükleniyor…
İptal
Kaydet