备份NLP代码

This commit is contained in:
wulin 2023-10-08 21:05:09 +08:00
parent 175b5490ac
commit 7bf3121c3b
20 changed files with 31044 additions and 28860 deletions

View File

@ -1,100 +0,0 @@
package com.qiuguo.iot.base.enums;
/*
* 词性表
* 作者吴林
* */
// 中文词性表
public enum ChinesePartSpeechEnum {
v(0, "动词"),
vd(0, "副动词"),
vn(0, "名动词"),
ng(1, "名语素"),
nr(2, "人名"),//LAC PER
PER(2, "人名"),
ns(3, "地名"),
nt(4, "机构团体"),
ORG(4, "机构团体"),
LOC(4, "机构团体"),
nz(5, "其他专名"),
n(6, "名词"),
q(7, "量词"),
b(8, "区别词"),
c(9, "连接词"),
dg(10, "副语素"),
d(10, "副词"),
e(11, "叹词"),
f(12, "方位词"),
g(13, "语素"),
h(14, "前街成分"),//LAC t
i(15, "成语"),//LAC vn
j(16, "简称略语"),
k(17, "后接成分"),
l(18, "习惯用语"),
m(19, "数词"),
o(20, "拟声词"),
p(21, "介词"),
r(22, "代词"),
s(23, "触动词"),
tg(24, "时语素"),
t(25, "时间词"),//LAC TIME
TIME(25, "时间词"),//LAC TIME
u(26, "助词"),
vg(27, "动语素"),
a(28, "形容词:包含 ad ag an"),
ag(28, "形玉素"),
ad(28, "副形词"),
an(28, "名形词"),
w(29, "标点符号"),
x(30, "非语素词"),
y(31, "语气词"),//LAC xc
xc(31, "语气词"),//LAC xc
z(32, "状态词"),
un(33, "未知词"),
zd(99, "自定义"),
qg(100, "在查找字符串时用来临时替换用户命名的设备目前最多同时支持20个见LAC字典"),
;
ChinesePartSpeechEnum(Integer c, String n){
code = c;
name = n;
}
private Integer code;
private String name;
public Integer getCode() {
return code;
}
public String getName() {
return name;
}
public static ChinesePartSpeechEnum getEnumWithCode(Integer c){
for (ChinesePartSpeechEnum e:values()
) {
if(e.getCode().compareTo(c) == 0){
return e;
}
}
return null;
}
public static ChinesePartSpeechEnum getEnumWithName(String name){
for (ChinesePartSpeechEnum e:values()
) {
if(e.getName().equals(name)){
return e;
}
}
return null;
}
}

View File

@ -76,6 +76,9 @@ public class DeviceInfoEntity extends GenericEntity<Long> {
@Comment("最后一次上线时间")
@Column(name = "last_on_line_time")
private Date lastOnLineTime;
@Comment("最后一次上线时间")
@Column(name = "last_off_line_time")
private Date lastOffLineTime;
@Comment("通讯协议类型0WebSocket 1MQTT 2TCP 3UDP 4HTTP")
@Column(name = "protocol_type", nullable = false)

View File

@ -68,6 +68,21 @@ public class DeviceInfoRequest implements java.io.Serializable {
//最后一次上线时间搜索结束
private Date lastOnLineTimeEnd;
/**
* 最后一次上线时间
*/
private Date lastOffLineTime;
/**
* 最后一次上线时间
*/
private Date lastOffLineTimeStart;
/**
* 最后一次上线时间
*/
private Date lastOffLineTimeEnd;
//通讯协议类型0WebSocket 1MQTT 2TCP 3UDP 4HTTP
private Integer protocolType;
//运行模式id

View File

@ -1,5 +1,8 @@
package com.qiuguo.iot.data.resp.device;
import lombok.Data;
import org.hswebframework.ezorm.rdb.mapping.annotation.Comment;
import javax.persistence.Column;
import java.util.Date;
/**
* <p>
@ -35,6 +38,10 @@ public class DeviceInfoResp {
private Integer onLine;
//最后一次上线时间
private Date lastOnLineTime;
/**
* 最后一次上线时间
*/
private Date lastOffLineTime;
//通讯协议类型0WebSocket 1MQTT 2TCP 3UDP 4HTTP
private Integer protocolType;
//运行模式id

View File

@ -69,4 +69,12 @@ public class DeviceUserBindResp {
* 是否在线0 b不在线 1在线
*/
private Integer Online;
/**
* 最后上线时间
*/
private Date lastOnLineTime;
/**
* 最后离线时间
*/
private Date lastOffLineTime;
}

View File

@ -2,6 +2,7 @@ package com.qiuguo.iot.data.service.device;
import com.qiuguo.iot.base.enums.YesNo;
import com.qiuguo.iot.base.utils.StringUtils;
import com.qiuguo.iot.data.entity.device.DeviceInfoEntity;
import com.qiuguo.iot.data.request.device.DeviceInfoRequest;
@ -81,6 +82,9 @@ public class DeviceInfoService extends GenericReactiveCrudService<DeviceInfoEnti
if(request.getLastOnLineTime() != null){
reactiveQuery = reactiveQuery.and(DeviceInfoRequest::getLastOnLineTime, request.getLastOnLineTime());
}
if(request.getLastOffLineTime() != null){
reactiveQuery = reactiveQuery.and(DeviceInfoRequest::getLastOffLineTime, request.getLastOffLineTime());
}
if(request.getProtocolType() != null){
reactiveQuery = reactiveQuery.and(DeviceInfoRequest::getProtocolType, request.getProtocolType());
}
@ -172,6 +176,12 @@ public class DeviceInfoService extends GenericReactiveCrudService<DeviceInfoEnti
if(request.getLastOnLineTimeEnd() != null){
reactiveQuery = reactiveQuery.lte(DeviceInfoRequest::getLastOnLineTime, request.getLastOnLineTimeEnd());
}
if(request.getLastOffLineTimeStart() != null){
reactiveQuery = reactiveQuery.gte(DeviceInfoRequest::getLastOffLineTime, request.getLastOffLineTimeStart());
}
if(request.getLastOffLineTimeEnd() != null){
reactiveQuery = reactiveQuery.lte(DeviceInfoRequest::getLastOffLineTime, request.getLastOffLineTimeEnd());
}
if(request.getProtocolType() != null){
reactiveQuery = reactiveQuery.and(DeviceInfoRequest::getProtocolType, request.getProtocolType());
}
@ -348,18 +358,33 @@ public class DeviceInfoService extends GenericReactiveCrudService<DeviceInfoEnti
public Mono<Integer> setOnLineStatus(Long id, Integer code) {
return createUpdate()
.set("on_line", code)
.set("modify_time", new Date())
.where("id", id)
ReactiveUpdate<DeviceInfoEntity> update = createUpdate();
update.set("on_line", code)
.set("modify_time", new Date());
if(code.equals(YesNo.YES.getCode())){
//设置上线时间
update.set("last_on_line_time", new Date());
}else{
update.set("last_off_line_time", new Date());
}
return update.where("id", id)
.execute();
}
public Mono<Integer> setOnLineStatus(String sn, Integer code) {
return createUpdate()
.set("on_line", code)
.set("modify_time", new Date())
.where("sn", sn)
.execute();
ReactiveUpdate<DeviceInfoEntity> update = createUpdate();
update.set("on_line", code)
.set("modify_time", new Date());
if(code.equals(YesNo.YES.getCode())){
//设置上线时间
update.set("last_on_line_time", new Date());
}else{
update.set("last_off_line_time", new Date());
}
return update
.where("sn", sn)
.execute();
}
}

View File

@ -21,6 +21,7 @@ import org.hswebframework.ezorm.rdb.operator.DatabaseOperator;
import org.hswebframework.ezorm.rdb.operator.DefaultDatabaseOperator;
import org.hswebframework.ezorm.rdb.operator.dml.QueryOperator;
import org.hswebframework.ezorm.rdb.operator.dml.delete.DeleteOperator;
import org.hswebframework.ezorm.rdb.operator.dml.query.SelectColumn;
import org.hswebframework.ezorm.rdb.operator.dml.query.SortOrder;
import org.hswebframework.ezorm.rdb.supports.mysql.MysqlDialect;
import org.hswebframework.ezorm.rdb.supports.mysql.MysqlSchemaMetadata;
@ -346,37 +347,54 @@ public class DeviceUserBindService extends GenericReactiveCrudService<DeviceUser
}
public Mono<PagerResult<DeviceUserBindResp>> selectDeviceUserBindsContainOnLineByRequest(DeviceUserBindRequest request) {
//ResultWrapper<String, DeviceUserBindResp> wrapper = new ListResultWrapper<String, DeviceUserBindResp>();
//List<String> names = new ArrayList<>();
//names.add("device_info.on_line as onLine");
//FunctionalInterface ll = DeviceUserBindResp::getDeviceId;
QueryOperator queryOperator = databaseOperator.dml().query("device_user_bind")
//.select("count(1) as 'total'")
QueryOperator queryOperator = databaseOperator.dml().query("device_user_bind").setParam(getSelectParamter(request))
.select(SelectColumn.of("device_user_bind.*"))
//本表的只能这样下面的错误
/*.select(SelectColumn.of("device_user_bind.is_main", "isMain"))
.select(SelectColumn.of("device_user_bind.other_device_id", "otherDeviceId"))
.select(SelectColumn.of("device_user_bind.bind_name", "bindName"))
.select(SelectColumn.of("device_user_bind.city", "city"))
.select(SelectColumn.of("device_user_bind.device_type", "deviceType"))
.select(SelectColumn.of("device_user_bind.category_code", "categoryCode"))
.select(SelectColumn.of("device_user_bind.province", "province"))
.select(SelectColumn.of("device_user_bind.address", "address"))
.select(SelectColumn.of("device_user_bind.county", "county"))
.select(SelectColumn.of("device_user_bind.modify_time", "modifyTime"))
.select(SelectColumn.of("device_user_bind.id", "id"))
.select(SelectColumn.of("device_user_bind.village", "village"))
.select(SelectColumn.of("device_user_bind.space_id", "spaceId"))
.select(SelectColumn.of("device_user_bind.device_id", "deviceId"))
.select(SelectColumn.of("device_user_bind.country", "country"))
.select(SelectColumn.of("device_user_bind.is_delete", "isDelete"))*/
.select(SelectColumn.of("device_info.last_on_line_time", "lastOnLineTime"))
.select(SelectColumn.of("device_info.last_off_line_time", "lastOffLineTime"))
.select(SelectColumn.of("device_info.on_line", "onLine"))
//.select(SelectColumn.of("count(1)", "total"))
.leftJoin("device_info", joinOperator -> {
joinOperator.on("device_user_bind.device_id = device_info.id");
}).setParam(getSelectParamter(request));
});
Term term = new Term();
term.and("device_info.is_delete", 0);
if(request.getOnLine() != null){
Term term = new Term();
term.and("device_info.on_line", request.getOnLine());
queryOperator.where(term);
}
queryOperator.where(term);
//String sql = queryOperator.getSql().getSql();
//20231008日记暂未实现查询总量功能后期补上
String sql = queryOperator.select("count(1) as 'total'").getSql().getSql();
List<Map<String, Object>> dataList = queryOperator.fetch(ResultWrappers.mapList()).sync();
List<DeviceUserBindResp> deviceUserBindRespList = new ArrayList<>(dataList.size());
for (Map<String, Object> o:dataList
) {
JSONObject jsonObject = new JSONObject(o);
return queryOperator.fetch(ResultWrappers.mapList()).reactive().map(map ->{
JSONObject jsonObject = new JSONObject(map);
DeviceUserBindResp deviceUserBindResp = JSONObject.toJavaObject(jsonObject, DeviceUserBindResp.class);
deviceUserBindRespList.add(deviceUserBindResp);
log.info("信息{}", deviceUserBindResp);
}
PagerResult<DeviceUserBindResp> pagerResult = new PagerResult<>();
pagerResult.setData(deviceUserBindRespList);
pagerResult.setPageIndex(request.getCurrPage());
pagerResult.setPageSize(request.getPageSize());
pagerResult.setTotal(10);
return Mono.just(pagerResult);
return deviceUserBindResp;
}).collectList().map(list ->{
PagerResult<DeviceUserBindResp> pagerResult = new PagerResult<>();
pagerResult.setPageIndex(request.getCurrPage());
pagerResult.setPageSize(request.getPageSize());
pagerResult.setTotal(10);
pagerResult.setData(list);
return pagerResult;
});
}

View File

@ -291,6 +291,9 @@ public class SystemTalkAnswerConfigService extends GenericReactiveCrudService<Sy
return group.get(key);
}
return null;
}
public ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> getSystemTalkWithKeyGroup() {
return group;
}
}

View File

@ -0,0 +1,575 @@
package com.qiuguo.iot.third.enums;
import com.qiuguo.iot.base.utils.StringUtils;
import com.qiuguo.iot.data.entity.system.SystemTalkAnswerConfigEntity;
import com.qiuguo.iot.third.nlp.action.Action;
import com.qiuguo.iot.third.nlp.action.Actions;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
/*
* 词性表
* 作者吴林
* */
// 中文词性表
public enum ChinesePartSpeechEnum implements IChinesePartSpeech{
v(0, "动词"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
vd(0, "副动词"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
vn(0, "名动词"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
ng(1, "名语素"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
nr(2, "人名"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},//LAC PER
PER(2, "人名"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
ns(3, "地名"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
nt(4, "机构团体"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
ORG(4, "机构团体"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
LOC(4, "机构团体"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
nz(5, "其他专名"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
n(6, "名词"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
//匹配到关键词就不能作为名词加入未匹配到的分割前的都加入名词
SystemTalkAnswerConfigEntity entity = getSystemTalkWithKey(key, keyGroup);
if(entity != null){
systemTalkAnswerConfigEntities.add(entity);
actions.setA(1);//a = 1;
if(StringUtils.isNotEmpty(actions.getName())){//已记录的加进去
//
entity = getSystemTalkWithKey(actions.getName(), keyGroup);
if(entity != null){
systemTalkAnswerConfigEntities.add(entity);
actions.setA(1);//a = 1;
}else{
//这里会走到a+b=2
action.setName(actions.getName());//.add(name);//加入分割前的名词
actions.setB(1);//b = 1;
actions.setName("");//name = "";
}
}
}else{
if(actions.getB() == 1 && actions.getA() == 0){
//本名称没有找到对应的动作
action.setSystemTalkAnswerConfigEntity(actions.getLastSystemTalkAnswerConfigEntity());
action.setAction(action.getSystemTalkAnswerConfigEntity().getAskKey());
action.setDeviceUserBindEntity(actions.getLastDeviceUserBindEntity());
actions.getActions().add(action);
actions.setLastName(action.getName());//lastName = action.getName();
actions.setLastDeviceUserBindEntity(action.getDeviceUserBindEntity());
action = new Action();
actions.setName("");//name = "";
action.setLbs(new ArrayList<>());
action.setAsk(actions.getRecordText());
}
actions.setName(actions.getName() + key);//name += key.getKey();
}
return action;
}
},
q(7, "量词"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
b(8, "区别词"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
c(9, "连接词"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
dg(10, "副语素"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
d(10, "副词"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
e(11, "叹词"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
f(12, "方位词"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
g(13, "语素"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
h(14, "前街成分"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},//LAC t
i(15, "成语"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},//LAC vn
j(16, "简称略语"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
k(17, "后接成分"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
l(18, "习惯用语"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
m(19, "数词"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
o(20, "拟声词"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
p(21, "介词"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
r(22, "代词"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
s(23, "触动词"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
tg(24, "时语素"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
t(25, "时间词"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},//LAC TIME
TIME(25, "时间词"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},//LAC TIME
u(26, "助词"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
vg(27, "动语素"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
a(28, "形容词:包含 ad ag an"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
ag(28, "形玉素"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
ad(28, "副形词"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
an(28, "名形词"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
w(29, "标点符号"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
x(30, "非语素词"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
y(31, "语气词"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},//LAC xc
xc(31, "语气词"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},//LAC xc
z(32, "状态词"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
un(33, "未知词"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
zd(99, "自定义"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
qg(100, "在查找字符串时用来临时替换用户命名的设备目前最多同时支持20个见LAC字典"){
@Override
public Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities){
return action;
}
},
;
ChinesePartSpeechEnum(Integer c, String n){
code = c;
name = n;
}
private Integer code;
private String name;
public Integer getCode() {
return code;
}
public String getName() {
return name;
}
public static ChinesePartSpeechEnum getEnumWithCode(Integer c){
for (ChinesePartSpeechEnum e:values()
) {
if(e.getCode().compareTo(c) == 0){
return e;
}
}
return null;
}
public static ChinesePartSpeechEnum getEnumWithName(String name){
for (ChinesePartSpeechEnum e:values()
) {
if(e.getName().equals(name)){
return e;
}
}
return null;
}
private static SystemTalkAnswerConfigEntity getSystemTalkWithKey(String key, ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup){
if(keyGroup.contains(key)){
return keyGroup.get(key);
}
return null;
}
}

View File

@ -0,0 +1,16 @@
package com.qiuguo.iot.third.enums;
import com.qiuguo.iot.data.entity.system.SystemTalkAnswerConfigEntity;
import com.qiuguo.iot.third.nlp.action.Action;
import com.qiuguo.iot.third.nlp.action.Actions;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
public interface IChinesePartSpeech {
Action getAction(ConcurrentHashMap<String, SystemTalkAnswerConfigEntity> keyGroup,
String key,
Actions actions,
Action action,
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities);
}

View File

@ -1,10 +1,9 @@
package com.qiuguo.iot.third.nlp;
import com.qiuguo.iot.base.enums.ChinesePartSpeechEnum;
import com.qiuguo.iot.third.enums.ChinesePartSpeechEnum;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
public class NlpKey {

View File

@ -1,5 +1,6 @@
package com.qiuguo.iot.third.nlp.action;
import com.qiuguo.iot.data.entity.device.DeviceUserBindEntity;
import com.qiuguo.iot.data.entity.system.SystemTalkAnswerConfigEntity;
import lombok.Data;
import lombok.NoArgsConstructor;
@ -13,7 +14,10 @@ public class Action {
//匹配系统的动作
private SystemTalkAnswerConfigEntity systemTalkAnswerConfigEntity;
private String action;//动作(动词)
private List<String> name;//动作对象(名词)可能存在多个如果有关系词连接
/**
* 动作对象(名词)可能存在多个如果有关系词连接
*/
private String name;
private String status;//动作程度结果名词量词
private ActionTime time;//具体时间
@ -26,5 +30,9 @@ public class Action {
/**
* 原始记录话语
*/
private String ask;//原话
private String ask;
/**
* 对应绑定的设备信息
*/
private DeviceUserBindEntity deviceUserBindEntity;
}

View File

@ -1,19 +1,47 @@
package com.qiuguo.iot.third.nlp.action;
import com.qiuguo.iot.base.enums.ChinesePartSpeechEnum;
import com.qiuguo.iot.base.utils.StringUtils;
import com.qiuguo.iot.data.entity.device.DeviceUserBindEntity;
import com.qiuguo.iot.data.entity.system.SystemTalkAnswerConfigEntity;
import com.qiuguo.iot.third.nlp.Nlp;
import com.qiuguo.iot.third.nlp.NlpKey;
import lombok.Data;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
@Data
public class Actions {
private List<Action> actions;//动作解析
/**
* 下面a,b解析时使用动作名词计数
*/
int a = 0;
int b = 0;
/**
* 当前组合的名词
*/
String name;
/**
* 记录最后一个匹配的名词
*/
String lastName;
/**
* 记录匹配到的最后一个系统配置指令
*/
SystemTalkAnswerConfigEntity lastSystemTalkAnswerConfigEntity;
/**
* 最后一个匹配的绑定设备和lastName同时出现
*/
DeviceUserBindEntity lastDeviceUserBindEntity;
/**
* 原始问话
*/
String recordText;
/**
* 解析后的动作记录
*/
private List<Action> actions;
public Actions() {}

View File

@ -1,6 +1,6 @@
package com.qiuguo.iot.third.service;
import com.qiuguo.iot.base.enums.ChinesePartSpeechEnum;
import com.qiuguo.iot.third.enums.ChinesePartSpeechEnum;
import com.qiuguo.iot.base.enums.DeviceTypeEnum;
import com.qiuguo.iot.base.utils.StringUtils;
import com.qiuguo.iot.data.entity.device.DeviceUserBindEntity;
@ -8,7 +8,6 @@ import com.qiuguo.iot.data.entity.system.SystemTalkAnswerConfigEntity;
import com.qiuguo.iot.data.request.device.DeviceUserBindRequest;
import com.qiuguo.iot.data.service.device.DeviceUserBindService;
import com.qiuguo.iot.data.service.system.SystemTalkAnswerConfigService;
import com.qiuguo.iot.third.nlp.INlp;
import com.qiuguo.iot.third.nlp.NlpKey;
import com.qiuguo.iot.third.nlp.action.Action;
import com.qiuguo.iot.third.nlp.action.ActionTime;
@ -38,7 +37,7 @@ public class NlpService {
private static Integer MAX_COUT = 2000;
public Mono<Actions> getActionWithLacSingle(Long userId, String text){
/*if(userId != null){
if(userId != null){
DeviceUserBindRequest request = new DeviceUserBindRequest();
request.setUserId(userId);
//涂鸦设备
@ -59,192 +58,67 @@ public class NlpService {
//找到对应的名称
pText = pText.replace(entity.getBindName(), ">" + (i++) + "<");
includs.add(entity);
}
}
if(includs.size() > 0){
//String ppText = pText;
return liguoNlpService.geSingletNlp(pText).map(nlp -> {
Actions actions = new Actions();
actions.setActions(new ArrayList<>());
//nlp.getKeys().sort(Comparator.comparing(NlpKey::getType)); //解析,按照type从小到大排序
Action action = new Action();
String name = "";
action.setName(new ArrayList<>());
action.setLbs(new ArrayList<>());
action.setAsk(text);
int a = 0, b = 0;
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities = new ArrayList<>();
SystemTalkAnswerConfigEntity lastSystemTalkAnswerConfigEntity = null;
String lastName = null;
for (NlpKey key : nlp.getKeys()
) {
if(a + b == 2){
a = 0;
b = 0;
if(systemTalkAnswerConfigEntities.size() > 0){//指令按照优先级排序
systemTalkAnswerConfigEntities.sort(Comparator.comparing(SystemTalkAnswerConfigEntity::getKeyOrder));
lastSystemTalkAnswerConfigEntity = systemTalkAnswerConfigEntities.get(0);
action.setSystemTalkAnswerConfigEntity(lastSystemTalkAnswerConfigEntity);
action.setAction(action.getSystemTalkAnswerConfigEntity().getAskKey());
systemTalkAnswerConfigEntities.clear();
}else if(lastSystemTalkAnswerConfigEntity != null){
action.setSystemTalkAnswerConfigEntity(lastSystemTalkAnswerConfigEntity);
action.setAction(action.getSystemTalkAnswerConfigEntity().getAskKey());
}
if(StringUtils.isNotEmpty(name)){
action.getName().add(name);
lastName = name;
}else if(action != null && StringUtils.isNotEmpty(lastName)){
action.getName().add(lastName);
}
actions.getActions().add(action);
action = new Action();
name = "";
action.setName(new ArrayList<>());
action.setLbs(new ArrayList<>());
action.setAsk(text);
}
if(key.getType().equals(ChinesePartSpeechEnum.v.getCode())){
action.setAction(key.getKey());
SystemTalkAnswerConfigEntity entity = systemTalkAnswerConfigService.getSystemTalkWithKey(action.getAction());
if(entity != null){
systemTalkAnswerConfigEntities.add(entity);
}
a = 1;
}else if(key.getType().equals(ChinesePartSpeechEnum.n.getCode())){
//匹配到关键词就不能作为名词加入未匹配到的分割前的都加入名词
SystemTalkAnswerConfigEntity entity = systemTalkAnswerConfigService.getSystemTalkWithKey(key.getKey());
if(entity != null){
systemTalkAnswerConfigEntities.add(entity);
if(StringUtils.isNotEmpty(name)){//已记录的加进去
//
entity = systemTalkAnswerConfigService.getSystemTalkWithKey(name);
if(entity != null){
systemTalkAnswerConfigEntities.add(entity);
}else{
action.getName().add(name);//加入分割前的名词
name = "";
}
}
}else{
name += key.getKey();
}
b = 1;
}else if(key.getType().equals(ChinesePartSpeechEnum.m.getCode())){
action.setStatus(key.getKey());
}else if(key.getType().equals(ChinesePartSpeechEnum.c.getCode())){
if(StringUtils.isNotEmpty(name)){
action.getName().add(name);
}
name = "";
}else if(key.getType().equals(ChinesePartSpeechEnum.nt.getCode())){
action.getLbs().add(key.getKey());
}else if(key.getType().equals(ChinesePartSpeechEnum.t.getCode())){
//解析时间关键字
action.setTime(new ActionTime());
action.getTime().setTime(key.getKey());
}else if(key.getType().equals(ChinesePartSpeechEnum.qg.getCode())){
//替换成对应的设备
}
}
if(StringUtils.isNotEmpty(name)){
SystemTalkAnswerConfigEntity entity = systemTalkAnswerConfigService.getSystemTalkWithKey(name);
if(entity != null){
systemTalkAnswerConfigEntities.add(entity);
}else{
action.getName().add(name);
}
}else{
if(StringUtils.isNotEmpty(lastName)){
action.getName().add(lastName);
}
}
if(systemTalkAnswerConfigEntities.size() > 0){//指令按照优先级排序
systemTalkAnswerConfigEntities.sort(Comparator.comparing(SystemTalkAnswerConfigEntity::getKeyOrder));
action.setSystemTalkAnswerConfigEntity(systemTalkAnswerConfigEntities.get(0));
action.setAction(action.getSystemTalkAnswerConfigEntity().getAskKey());
//actions.getActions().add(action);
}else if(lastSystemTalkAnswerConfigEntity != null){
action.setSystemTalkAnswerConfigEntity(lastSystemTalkAnswerConfigEntity);
action.setAction(action.getSystemTalkAnswerConfigEntity().getAskKey());
//actions.getActions().add(action);
}
if(a + b > 0){
actions.getActions().add(action);
}
return actions;
});
if(includs.size() > 0) {
return getActions(pText, text, includs);
}
}
//Actions actions = null;
return getActions(text);
return getActions(text, text, null);
});
}*/
}
//20230928日记后期改成先匹配用户的设备名称再找动词
return getActions(text);
return getActions(text, text, null);
}
public Mono<Actions> getActions(String text) {
public Mono<Actions> getActions(String text, String recordText, List<DeviceUserBindEntity> includs) {
return liguoNlpService.geSingletNlp(text).map(nlp -> {
Actions actions = new Actions();
actions.setActions(new ArrayList<>());
//nlp.getKeys().sort(Comparator.comparing(NlpKey::getType)); //解析,按照type从小到大排序
Action action = new Action();
String name = "";
//String name = "";
action.setName(new ArrayList<>());
actions.setRecordText(recordText);
action.setLbs(new ArrayList<>());
action.setAsk(text);
int a = 0, b = 0;
action.setAsk(actions.getRecordText());
List<SystemTalkAnswerConfigEntity> systemTalkAnswerConfigEntities = new ArrayList<>();
SystemTalkAnswerConfigEntity lastSystemTalkAnswerConfigEntity = null;
String lastName = null;
for (NlpKey key : nlp.getKeys()
) {
if(a + b == 2){
a = 0;
b = 0;
if(actions.getA() + actions.getB() == 2){
actions.setA(0);// = 0;
actions.setB(0);//b = 0;
if(systemTalkAnswerConfigEntities.size() > 0){//指令按照优先级排序
systemTalkAnswerConfigEntities.sort(Comparator.comparing(SystemTalkAnswerConfigEntity::getKeyOrder));
lastSystemTalkAnswerConfigEntity = systemTalkAnswerConfigEntities.get(0);
action.setSystemTalkAnswerConfigEntity(lastSystemTalkAnswerConfigEntity);
action.setSystemTalkAnswerConfigEntity(systemTalkAnswerConfigEntities.get(0));
actions.setLastSystemTalkAnswerConfigEntity(action.getSystemTalkAnswerConfigEntity());
actions.setLastDeviceUserBindEntity(action.getDeviceUserBindEntity());
action.setAction(action.getSystemTalkAnswerConfigEntity().getAskKey());
systemTalkAnswerConfigEntities.clear();
}else if(lastSystemTalkAnswerConfigEntity != null){
action.setSystemTalkAnswerConfigEntity(lastSystemTalkAnswerConfigEntity);
}else if(actions.getLastSystemTalkAnswerConfigEntity() != null){
action.setSystemTalkAnswerConfigEntity(actions.getLastSystemTalkAnswerConfigEntity());
action.setAction(action.getSystemTalkAnswerConfigEntity().getAskKey());
action.setDeviceUserBindEntity(actions.getLastDeviceUserBindEntity());
}
if(StringUtils.isNotEmpty(name)){
action.getName().add(name);
lastName = name;
}else if(action != null && StringUtils.isNotEmpty(lastName)){
action.getName().add(lastName);
if(StringUtils.isNotEmpty(actions.getName())){
action.setName(actions.getName());//.add(name);
}else if(StringUtils.isNotEmpty(actions.getLastName())){
action.setName(actions.getLastName());//.add(lastName);
}
actions.getActions().add(action);
actions.setLastName(action.getName());//lastName = actions.getName();
actions.setLastDeviceUserBindEntity(action.getDeviceUserBindEntity());
action = new Action();
name = "";
action.setName(new ArrayList<>());
actions.setName("");//name = "";
//action.setName(new ArrayList<>());
action.setLbs(new ArrayList<>());
action.setAsk(text);
action.setAsk(actions.getRecordText());
}
@ -254,72 +128,139 @@ public class NlpService {
if(entity != null){
systemTalkAnswerConfigEntities.add(entity);
}
a = 1;
actions.setA(1);//a = 1;
}else if(key.getType().equals(ChinesePartSpeechEnum.n.getCode())){
//匹配到关键词就不能作为名词加入未匹配到的分割前的都加入名词
SystemTalkAnswerConfigEntity entity = systemTalkAnswerConfigService.getSystemTalkWithKey(key.getKey());
if(entity != null){
systemTalkAnswerConfigEntities.add(entity);
if(StringUtils.isNotEmpty(name)){//已记录的加进去
actions.setA(1);//a = 1;
if(StringUtils.isNotEmpty(actions.getName())){//已记录的加进去
//
entity = systemTalkAnswerConfigService.getSystemTalkWithKey(name);
entity = systemTalkAnswerConfigService.getSystemTalkWithKey(actions.getName());
if(entity != null){
systemTalkAnswerConfigEntities.add(entity);
actions.setA(1);//a = 1;
}else{
action.getName().add(name);//加入分割前的名词
name = "";
//这里会走到a+b=2
action.setName(actions.getName());//.add(name);//加入分割前的名词
actions.setB(1);//b = 1;
actions.setName("");//name = "";
}
}
}else{
name += key.getKey();
if(actions.getB() == 1 && actions.getA() == 0){
//本名称没有找到对应的动作
action.setSystemTalkAnswerConfigEntity(actions.getLastSystemTalkAnswerConfigEntity());
action.setAction(action.getSystemTalkAnswerConfigEntity().getAskKey());
action.setDeviceUserBindEntity(actions.getLastDeviceUserBindEntity());
actions.getActions().add(action);
actions.setLastName(action.getName());//lastName = action.getName();
actions.setLastDeviceUserBindEntity(action.getDeviceUserBindEntity());
action = new Action();
actions.setName("");//name = "";
//action.setName(new ArrayList<>());
action.setLbs(new ArrayList<>());
action.setAsk(actions.getRecordText());
}
actions.setName(actions.getName() + key.getKey());//name += key.getKey();
//b = 1;
}
b = 1;
}else if(key.getType().equals(ChinesePartSpeechEnum.m.getCode())){
action.setStatus(key.getKey());
}else if(key.getType().equals(ChinesePartSpeechEnum.c.getCode())){
if(StringUtils.isNotEmpty(name)){
action.getName().add(name);
}else if(key.getType().equals(ChinesePartSpeechEnum.c.getCode()) ||
key.getType().equals(ChinesePartSpeechEnum.w.getCode())){//标点符号连接词
if(StringUtils.isNotEmpty(actions.getName())){
//action.setName(name);//.add(name);
SystemTalkAnswerConfigEntity entity = systemTalkAnswerConfigService.getSystemTalkWithKey(actions.getName());
if(entity != null){
systemTalkAnswerConfigEntities.add(entity);
actions.setA(1);//a = 1;
}else{
if(actions.getB() == 1 && actions.getA() == 0){
//本名称没有找到对应的动作
action.setSystemTalkAnswerConfigEntity(actions.getLastSystemTalkAnswerConfigEntity());
action.setAction(action.getSystemTalkAnswerConfigEntity().getAskKey());
action.setDeviceUserBindEntity(actions.getLastDeviceUserBindEntity());
actions.getActions().add(action);
actions.setLastName(action.getName());//lastName = action.getName();
actions.setLastDeviceUserBindEntity(action.getDeviceUserBindEntity());
action = new Action();
actions.setName("");//name = "";
//action.setName(new ArrayList<>());
action.setLbs(new ArrayList<>());
action.setAsk(actions.getRecordText());
}
action.setName(actions.getName());//.add(name);//加入分割前的名词
//name = "";
actions.setB(1);//b = 1;
}
}
name = "";
actions.setName("");//name = "";
}else if(key.getType().equals(ChinesePartSpeechEnum.nt.getCode())){
action.getLbs().add(key.getKey());
}else if(key.getType().equals(ChinesePartSpeechEnum.t.getCode())){
//解析时间关键字
action.setTime(new ActionTime());
action.getTime().setTime(key.getKey());
}else if(key.getType().equals(ChinesePartSpeechEnum.qg.getCode())){
//替换成对应的设备
if(actions.getB() == 1 && actions.getA() == 0){
//本名称没有找到对应的动作
action.setSystemTalkAnswerConfigEntity(actions.getLastSystemTalkAnswerConfigEntity());
action.setAction(action.getSystemTalkAnswerConfigEntity().getAskKey());
action.setDeviceUserBindEntity(actions.getLastDeviceUserBindEntity());
actions.getActions().add(action);
actions.setLastName(action.getName());// lastName = action.getName();
actions.setLastDeviceUserBindEntity(action.getDeviceUserBindEntity());
action = new Action();
actions.setName("");//name = "";
//action.setName(new ArrayList<>());
action.setLbs(new ArrayList<>());
action.setAsk(actions.getRecordText());
}
int index = Integer.parseInt(key.getKey().replace(">", "").replace("<", ""));
action.setDeviceUserBindEntity(includs.get(index));
actions.setName("");//name = "";
action.setName(action.getDeviceUserBindEntity().getBindName());//.add(action.getDeviceUserBindEntity().getBindName());
actions.setB(1);//b = 1;
}
}
if(StringUtils.isNotEmpty(name)){
SystemTalkAnswerConfigEntity entity = systemTalkAnswerConfigService.getSystemTalkWithKey(name);
//下面判断最后一个名词
if(StringUtils.isNotEmpty(actions.getName())){
//先看是否为自定义指令
SystemTalkAnswerConfigEntity entity = systemTalkAnswerConfigService.getSystemTalkWithKey(actions.getName());
if(entity != null){
systemTalkAnswerConfigEntities.add(entity);
actions.setA(1);//a = 1;
}else{
action.getName().add(name);
action.setName(actions.getName());//.add(name);
actions.setB(1);//b = 1;
}
}else{
if(StringUtils.isNotEmpty(lastName)){
action.getName().add(lastName);
if(StringUtils.isNotEmpty(actions.getLastName())){
action.setName(actions.getLastName());//.add(lastName);
action.setDeviceUserBindEntity(actions.getLastDeviceUserBindEntity());
actions.setB(1);//b = 1;
}
}
if(systemTalkAnswerConfigEntities.size() > 0){//指令按照优先级排序
systemTalkAnswerConfigEntities.sort(Comparator.comparing(SystemTalkAnswerConfigEntity::getKeyOrder));
action.setSystemTalkAnswerConfigEntity(systemTalkAnswerConfigEntities.get(0));
action.setAction(action.getSystemTalkAnswerConfigEntity().getAskKey());
//actions.getActions().add(action);
}else if(lastSystemTalkAnswerConfigEntity != null){
action.setSystemTalkAnswerConfigEntity(lastSystemTalkAnswerConfigEntity);
}else if(actions.getLastSystemTalkAnswerConfigEntity() != null){
action.setSystemTalkAnswerConfigEntity(actions.getLastSystemTalkAnswerConfigEntity());
action.setAction(action.getSystemTalkAnswerConfigEntity().getAskKey());
//actions.getActions().add(action);
action.setDeviceUserBindEntity(actions.getLastDeviceUserBindEntity());
}
if(a + b > 0){
if(actions.getA() + actions.getB() > 0){
actions.getActions().add(action);
}
return actions;
});
}

View File

@ -23,6 +23,7 @@ import com.qiuguo.iot.data.service.device.DeviceUserTalkRecordService;
import com.qiuguo.iot.data.service.system.SystemAddressService;
import com.qiuguo.iot.data.service.system.SystemTalkBindDeviceService;
import com.qiuguo.iot.third.nlp.action.Action;
import com.qiuguo.iot.third.nlp.action.ActionTime;
import com.qiuguo.iot.third.nlp.action.Actions;
import com.qiuguo.iot.third.query.TuyaQuery;
import com.qiuguo.iot.third.resp.SongInfoResponse;
@ -41,6 +42,7 @@ import reactor.core.publisher.Mono;
import javax.annotation.Resource;
import javax.swing.*;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j
@ -89,80 +91,43 @@ public class BaseWebSocketProcess {
sendMessage(action, baseSession, resp);
}else if(action.getSystemTalkAnswerConfigEntity().getAnswerType().equals(AskTypeEnum.IOT.getCode())){
if(action.getName().size() > 0){
String deviceName = action.getName().get(0);
DeviceUserBindRequest deviceUserBindRequest = new DeviceUserBindRequest();
deviceUserBindRequest.setUserId(userId);
deviceUserBindRequest.setPageSize(2);
deviceUserBindRequest.setBindName(deviceName);
if(StringUtils.isNotEmpty(action.getName())){
//查询是否有相关设备
deviceUserBindService.selectDeviceUserBindsByRequest(deviceUserBindRequest)
.defaultIfEmpty(new PagerResult<>(0, null))
.map(binds ->{
if(binds.getTotal() == 0){
//返回告诉没有备
BoxMessageResp resp = new BoxMessageResp();
resp.setType(action.getSystemTalkAnswerConfigEntity().getAnswerType());
resp.setText("未找到相关设备,无法操做!");
sendMessage(action, baseSession, resp);
}else if(binds.getTotal() > 1){
//返回告诉有多个设备请详细说明具体说明设备
BoxMessageResp resp = new BoxMessageResp();
resp.setType(action.getSystemTalkAnswerConfigEntity().getAnswerType());
resp.setText("您有多个相同设备,请明确说明");
sendMessage(action, baseSession, resp);
}else{
//查询是否有相关指令绑定
DeviceUserBindEntity deviceUserBindEntity = binds.getData().get(0);
SystemTalkBindDeviceRequest systemTalkBindDeviceRequest = new SystemTalkBindDeviceRequest();
systemTalkBindDeviceRequest.setCategoryCode(deviceUserBindEntity.getCategoryCode());
systemTalkBindDeviceRequest.setSystemTalkId(action.getSystemTalkAnswerConfigEntity().getId());
systemTalkBindDeviceService.selectSystemTalkBindDeviceByRequest(systemTalkBindDeviceRequest)
.defaultIfEmpty(new SystemTalkBindDeviceEntity())
.map(systemTalkBindDeviceEntity -> {
if(systemTalkBindDeviceEntity.getId() == null){
//通知不支持的指令
BoxMessageResp resp = new BoxMessageResp();
resp.setType(action.getSystemTalkAnswerConfigEntity().getAnswerType());
resp.setText(deviceName + "不支持" + action.getAction() + "指令!");
sendMessage(action, baseSession, resp);
if(action.getDeviceUserBindEntity() == null){
log.info("匹配时未找到对应的设备,模糊匹配{}", action.getName());
DeviceUserBindRequest deviceUserBindRequest = new DeviceUserBindRequest();
deviceUserBindRequest.setUserId(userId);
deviceUserBindRequest.setPageSize(2);
deviceUserBindRequest.setBindName(action.getName());
}else{
//调用涂鸦
TuyaQuery query = new TuyaQuery();
query.setDeviceId(deviceUserBindEntity.getOtherDeviceId());
query.setValue(action.getStatus());
query.setUserHandlingDeviceId(systemTalkBindDeviceEntity.getUserHandlingId());
tuyaDeviceService.controlDevice(query).map(isOk ->{
String msg = "";
if(isOk.getCode().equals(RespCodeEnum.SUCESS.getCode())){
//通知打开灯成功
msg = action.getSystemTalkAnswerConfigEntity().getAnswerValue().replaceAll("#name#", deviceName);
if(StringUtils.isNotEmpty(action.getStatus())){
msg = msg.replace("#value#", action.getStatus());
}
//查询是否有相关设备
deviceUserBindService.selectDeviceUserBindsByRequest(deviceUserBindRequest)
.defaultIfEmpty(new PagerResult<>(0, null))
.map(binds ->{
if(binds.getTotal() == 0){
//返回告诉没有备
BoxMessageResp resp = new BoxMessageResp();
resp.setType(action.getSystemTalkAnswerConfigEntity().getAnswerType());
resp.setText("未找到" + action.getName() + "设备,无法操做!");
sendMessage(action, baseSession, resp);
}else if(binds.getTotal() > 1){
//返回告诉有多个设备请详细说明具体说明设备
BoxMessageResp resp = new BoxMessageResp();
resp.setType(action.getSystemTalkAnswerConfigEntity().getAnswerType());
resp.setText("您有多个" + action.getName() + "相同设备,请明确说明");
sendMessage(action, baseSession, resp);
}else{
//查询是否有相关指令绑定
controllerDevice(action, binds.getData().get(0), baseSession, action.getName());
log.info("执行指令");
}else{
//通知开灯失败;
msg = action.getSystemTalkAnswerConfigEntity().getAnswerValueFaild().replaceAll("#name#", deviceName);
log.info("执行指令失败");
}
BoxMessageResp resp = new BoxMessageResp();
resp.setType(action.getSystemTalkAnswerConfigEntity().getAnswerType());
resp.setText(msg);
sendMessage(action, baseSession, resp);
}
return Mono.empty();
}).subscribe();
}else{
log.info("匹配时已找到对应的设备{}", action.getName());
controllerDevice(action, action.getDeviceUserBindEntity(), baseSession, action.getName());
}
return isOk;
}).subscribe();
}
return systemTalkBindDeviceEntity;
}).subscribe();
}
return Mono.empty();
}).subscribe();
}else{
BoxMessageResp resp = new BoxMessageResp();
resp.setType(action.getSystemTalkAnswerConfigEntity().getAnswerType());
@ -181,6 +146,10 @@ public class BaseWebSocketProcess {
//使用IP查询天气
req.setIp("115.205.2.137");
}
if(action.getTime() == null){
action.setTime(new ActionTime());
action.getTime().setTime("今天");
}
weatherService.tianqiApi(req).map(t ->{
log.info("查询的天气{}", JSONObject.toJSONString(t));
TianqiapiItemResp item = null;
@ -204,7 +173,7 @@ public class BaseWebSocketProcess {
msg = t.getCity() + action.getTime().getTime() + "天气"
+ item.getNarrative().replace("每 km / h", "千米每小时")
+ ",空气质量" + item.getAir_level()
+ ",湿度" + item.getHumidity() + ",最低气温" + item.getTem2();
+ ",湿度" + item.getHumidity() + ",最低气温" + item.getTem2() + "°C";
}else{
msg = action.getSystemTalkAnswerConfigEntity().getAnswerValueFaild();
@ -264,6 +233,54 @@ public class BaseWebSocketProcess {
}
}
private void controllerDevice(Action action, DeviceUserBindEntity deviceUserBindEntity, BaseSession baseSession, String deviceName) {
SystemTalkBindDeviceRequest systemTalkBindDeviceRequest = new SystemTalkBindDeviceRequest();
systemTalkBindDeviceRequest.setCategoryCode(deviceUserBindEntity.getCategoryCode());
systemTalkBindDeviceRequest.setSystemTalkId(action.getSystemTalkAnswerConfigEntity().getId());
systemTalkBindDeviceService.selectSystemTalkBindDeviceByRequest(systemTalkBindDeviceRequest)
.defaultIfEmpty(new SystemTalkBindDeviceEntity())
.map(systemTalkBindDeviceEntity -> {
if(systemTalkBindDeviceEntity.getId() == null){
//通知不支持的指令
BoxMessageResp resp = new BoxMessageResp();
resp.setType(action.getSystemTalkAnswerConfigEntity().getAnswerType());
resp.setText(deviceName + "不支持" + action.getAction() + "指令!");
sendMessage(action, baseSession, resp);
}else{
//调用涂鸦
TuyaQuery query = new TuyaQuery();
query.setDeviceId(deviceUserBindEntity.getOtherDeviceId());
query.setValue(action.getStatus());
query.setUserHandlingDeviceId(systemTalkBindDeviceEntity.getUserHandlingId());
tuyaDeviceService.controlDevice(query).map(isOk ->{
String msg = "";
if(isOk.getCode().equals(RespCodeEnum.SUCESS.getCode())){
//通知打开灯成功
msg = action.getSystemTalkAnswerConfigEntity().getAnswerValue().replaceAll("#name#", deviceName);
if(StringUtils.isNotEmpty(action.getStatus())){
msg = msg.replace("#value#", action.getStatus());
}
log.info("执行指令");
}else{
//通知开灯失败;
msg = action.getSystemTalkAnswerConfigEntity().getAnswerValueFaild().replaceAll("#name#", deviceName);
log.info("执行指令失败");
}
BoxMessageResp resp = new BoxMessageResp();
resp.setType(action.getSystemTalkAnswerConfigEntity().getAnswerType());
resp.setText(msg);
sendMessage(action, baseSession, resp);
return isOk;
}).subscribe();
}
return systemTalkBindDeviceEntity;
}).subscribe();
}
private void sendMessage(Action action, BaseSession baseSession, BoxMessageResp resp){
DeviceUserTalkRecordEntity talkRecord = new DeviceUserTalkRecordEntity();

View File

@ -203,10 +203,11 @@ public class BoxWebSocketHandler extends BaseWebSocketProcess implements WebSock
if(entity.getId() == null){
entity.setUserId(userId);
entity.setDeviceId(dv.getId());
//设置主设备
//设置主设备
entity.setIsMain(YesNo.YES.getCode());
entity.setOtherDeviceId(dv.getSn());
entity.setCategoryCode(DeviceCodeEnum.BOX.getName());
entity.setBindName("果宝儿Box");
deviceUserBindService.setNoMain(userId, DeviceTypeEnum.GUO_BOX.getCode()).defaultIfEmpty(0).map(m ->{
log.info("解除历史isMain标注个数{}", m);
deviceUserBindService.insertDeviceUserBind(entity).map(l ->{

View File

@ -137,7 +137,7 @@ public class CustomerWebSocketHandler extends BaseWebSocketProcess implements We
return Mono.zip(input, output).doFinally(signalType -> {
// MDC.put(LogMdcConfiguration.PRINT_LOG_ID, requestId);
userGroup.remove(userSession.getUserId());//断链后及时移除
log.info("用户断开连接SN{}", userSession.getUserId());
log.info("用户断开连接userId{}", userSession.getUserId());
// MDC.remove(LogMdcConfiguration.PRINT_LOG_ID);
}).then();
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long