|
|
|
@@ -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"); |
|
|
|
} |
|
|
|
} |
|
|
|
} |