|
@@ -1,4 +1,4 @@
|
|
|
-use crate::{AppState};
|
|
|
|
|
|
|
+use crate::{AppState, log,LogLevel::*};
|
|
|
use super::{JsonBack};
|
|
use super::{JsonBack};
|
|
|
use super::{token_fail,check_token, errcode0};
|
|
use super::{token_fail,check_token, errcode0};
|
|
|
use crate::datasource::{Datasource, SqliteParams};
|
|
use crate::datasource::{Datasource, SqliteParams};
|
|
@@ -53,7 +53,7 @@ pub async fn d_edit(
|
|
|
State(state): State<AppState>,
|
|
State(state): State<AppState>,
|
|
|
Json(u): axum::extract::Json<Dedit>
|
|
Json(u): axum::extract::Json<Dedit>
|
|
|
) -> Json<JsonBack> {
|
|
) -> Json<JsonBack> {
|
|
|
- let uid =match check_token(&state, u.token).await {
|
|
|
|
|
|
|
+ let (uid,_) = match check_token(&state, u.token).await {
|
|
|
Ok(id) => {id},
|
|
Ok(id) => {id},
|
|
|
Err(_) => {
|
|
Err(_) => {
|
|
|
return token_fail();
|
|
return token_fail();
|
|
@@ -93,7 +93,7 @@ pub async fn d_cancel_share(
|
|
|
State(state): State<AppState>,
|
|
State(state): State<AppState>,
|
|
|
Json(d): axum::extract::Json<Dshare>
|
|
Json(d): axum::extract::Json<Dshare>
|
|
|
) -> Json<JsonBack> {
|
|
) -> Json<JsonBack> {
|
|
|
- let uid=match check_token(&state, d.token).await {
|
|
|
|
|
|
|
+ let (uid,_) = match check_token(&state, d.token).await {
|
|
|
Ok(id) => {id},
|
|
Ok(id) => {id},
|
|
|
Err(_) => {
|
|
Err(_) => {
|
|
|
return token_fail();
|
|
return token_fail();
|
|
@@ -112,26 +112,56 @@ pub async fn d_cancel_share(
|
|
|
errcode0()
|
|
errcode0()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// 设备转移::旧用户主动转移设备给新用户
|
|
|
pub async fn d_remove(
|
|
pub async fn d_remove(
|
|
|
State(state): State<AppState>,
|
|
State(state): State<AppState>,
|
|
|
- Json(u): axum::extract::Json<Dedit>
|
|
|
|
|
|
|
+ Json(d): axum::extract::Json<Dedit>
|
|
|
) -> Json<JsonBack> {
|
|
) -> Json<JsonBack> {
|
|
|
- let uid=match check_token(&state, u.token).await {
|
|
|
|
|
|
|
+ let (uid, mqid) = match check_token(&state, d.token).await {
|
|
|
Ok(id) => {id},
|
|
Ok(id) => {id},
|
|
|
Err(_) => {
|
|
Err(_) => {
|
|
|
return token_fail();
|
|
return token_fail();
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
+ let sn = if let Ok(sn)= state.db_lite.query(
|
|
|
|
|
+ "select sn from device where id=? and belongto=?", [d.id,uid], |r|{r.get::<usize,String>(0)}).await{
|
|
|
|
|
+ sn
|
|
|
|
|
+ }else{
|
|
|
|
|
+ return Json(JsonBack{errcode: 3000, errmsg: Some(format!("删除设备失败: 设备不存在"))});
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ let mqnew = if let Ok(sn)= state.db_lite.query(
|
|
|
|
|
+ "select mqid from user where id=?", [d.id], |r|{r.get::<usize,String>(0)}).await{
|
|
|
|
|
+ sn
|
|
|
|
|
+ }else{
|
|
|
|
|
+ return Json(JsonBack{errcode: 3000, errmsg: Some(format!("删除设备失败: 设备不存在"))});
|
|
|
|
|
+ };
|
|
|
if let Err(e) = state.db_lite.execute(
|
|
if let Err(e) = state.db_lite.execute(
|
|
|
"update device set belongto=0 where id=? and belongto=?",
|
|
"update device set belongto=0 where id=? and belongto=?",
|
|
|
- [u.id, uid]).await {
|
|
|
|
|
|
|
+ [d.id, uid]).await {
|
|
|
return Json(JsonBack{errcode: 3000, errmsg: Some(format!("更改设备从属失败: {e}"))});
|
|
return Json(JsonBack{errcode: 3000, errmsg: Some(format!("更改设备从属失败: {e}"))});
|
|
|
}
|
|
}
|
|
|
if let Err(e) = state.db_lite.execute(
|
|
if let Err(e) = state.db_lite.execute(
|
|
|
"delete from map_user_device where did=? and uid=?",
|
|
"delete from map_user_device where did=? and uid=?",
|
|
|
- [u.id, uid]).await {
|
|
|
|
|
|
|
+ [d.id, uid]).await {
|
|
|
return Json(JsonBack{errcode: 3000, errmsg: Some(format!("删除用户设备关系失败: {e}"))});
|
|
return Json(JsonBack{errcode: 3000, errmsg: Some(format!("删除用户设备关系失败: {e}"))});
|
|
|
}
|
|
}
|
|
|
|
|
+ if let Some(s)=state.mq_detail{
|
|
|
|
|
+ // 移除旧关系
|
|
|
|
|
+ if let Err(e)=s.db_mq_map.execute("delete from pub where clientid=? and topic in (?,?)", (mqid.clone(),format!("{sn}/cmd",),format!("/wf/Iot/device/{sn}",))).await{
|
|
|
|
|
+ log(Error, format!("删除设备失败: {e}"));
|
|
|
|
|
+ }
|
|
|
|
|
+ if let Err(e)=s.db_mq_map.execute("delete from sub where clientid=? and topic in (?,?)", (mqid,format!("{sn}/state",),format!("/wf/Iot/client/{sn}",))).await{
|
|
|
|
|
+ log(Error, format!("删除设备失败: {e}"));
|
|
|
|
|
+ }
|
|
|
|
|
+ // 插入新关系
|
|
|
|
|
+ if let Err(e)=s.db_mq_map.execute("insert into pub (clientid,topic)values(?,?,9223372036854775807),(?,?,9223372036854775807)", (mqnew.clone(),format!("{sn}/cmd",),mqnew.clone(),format!("/wf/Iot/device/{sn}",))).await{
|
|
|
|
|
+ log(Error, format!("添加设备失败: {e}"));
|
|
|
|
|
+ }
|
|
|
|
|
+ if let Err(e)=s.db_mq_map.execute("insert into sub (clientid,topic)values(?,?,9223372036854775807),(?,?,9223372036854775807)", (mqnew.clone(),format!("{sn}/state",),mqnew,format!("/wf/Iot/client/{sn}",))).await{
|
|
|
|
|
+ log(Error, format!("添加设备失败: {e}"));
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
errcode0()
|
|
errcode0()
|
|
|
}
|
|
}
|
|
@@ -139,15 +169,21 @@ pub async fn d_del(
|
|
|
State(state): State<AppState>,
|
|
State(state): State<AppState>,
|
|
|
Json(d): axum::extract::Json<Dedit>
|
|
Json(d): axum::extract::Json<Dedit>
|
|
|
) -> Json<JsonBack> {
|
|
) -> Json<JsonBack> {
|
|
|
- let uid=match check_token(&state, d.token).await {
|
|
|
|
|
|
|
+ let (uid,mqid) = match check_token(&state, d.token).await {
|
|
|
Ok(id) => {id},
|
|
Ok(id) => {id},
|
|
|
Err(_) => {
|
|
Err(_) => {
|
|
|
return token_fail();
|
|
return token_fail();
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
+ let sn = if let Ok(sn)= state.db_lite.query(
|
|
|
|
|
+ "select sn from device where id=? and belongto=?", [d.id,uid], |r|{r.get::<usize,String>(0)}).await{
|
|
|
|
|
+ sn
|
|
|
|
|
+ }else{
|
|
|
|
|
+ return Json(JsonBack{errcode: 3000, errmsg: Some(format!("删除设备失败: 设备不存在"))});
|
|
|
|
|
+ };
|
|
|
if let Err(e) = state.db_lite.execute(
|
|
if let Err(e) = state.db_lite.execute(
|
|
|
- "update device set belongto=0 where belongto=? and id=?",
|
|
|
|
|
- [uid,d.id]).await {
|
|
|
|
|
|
|
+ "update device set belongto=0 where id=?",
|
|
|
|
|
+ [d.id]).await {
|
|
|
return Json(JsonBack{errcode: 3000, errmsg: Some(format!("删除设备失败: {e}"))});
|
|
return Json(JsonBack{errcode: 3000, errmsg: Some(format!("删除设备失败: {e}"))});
|
|
|
}
|
|
}
|
|
|
if let Err(e) = state.db_lite.execute(
|
|
if let Err(e) = state.db_lite.execute(
|
|
@@ -155,6 +191,14 @@ pub async fn d_del(
|
|
|
[d.id,uid]).await {
|
|
[d.id,uid]).await {
|
|
|
return Json(JsonBack{errcode: 3000, errmsg: Some(format!("删除设备失败: {e}"))});
|
|
return Json(JsonBack{errcode: 3000, errmsg: Some(format!("删除设备失败: {e}"))});
|
|
|
}
|
|
}
|
|
|
|
|
+ if let Some(s)=state.mq_detail{
|
|
|
|
|
+ if let Err(e)=s.db_mq_map.execute("delete from pub where clientid=?, topic in (?,?)", (mqid.clone(),format!("{sn}/cmd",),format!("/wf/Iot/device/{sn}",))).await{
|
|
|
|
|
+ log(Error, format!("删除设备失败: {e}"));
|
|
|
|
|
+ }
|
|
|
|
|
+ if let Err(e)=s.db_mq_map.execute("delete from sub where clientid=?, topic in (?,?)", (mqid,format!("{sn}/state",),format!("/wf/Iot/client/{sn}",))).await{
|
|
|
|
|
+ log(Error, format!("删除设备失败: {e}"));
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
errcode0()
|
|
errcode0()
|
|
|
}
|
|
}
|
|
|
#[derive(Deserialize)]
|
|
#[derive(Deserialize)]
|
|
@@ -166,7 +210,7 @@ pub async fn burn(
|
|
|
State(state): State<AppState>,
|
|
State(state): State<AppState>,
|
|
|
Json(u): axum::extract::Json<TokenPath>
|
|
Json(u): axum::extract::Json<TokenPath>
|
|
|
) -> Json<JsonBack> {
|
|
) -> Json<JsonBack> {
|
|
|
- let uid=match check_token(&state, u.token).await {
|
|
|
|
|
|
|
+ let (uid,_) = match check_token(&state, u.token).await {
|
|
|
Ok(id) => {id},
|
|
Ok(id) => {id},
|
|
|
Err(_) => {
|
|
Err(_) => {
|
|
|
return token_fail();
|
|
return token_fail();
|
|
@@ -198,6 +242,45 @@ pub struct Area{
|
|
|
pub sup: u64,
|
|
pub sup: u64,
|
|
|
createby: bool,
|
|
createby: bool,
|
|
|
}
|
|
}
|
|
|
|
|
+#[derive(serde::Serialize)]
|
|
|
|
|
+pub struct DV{
|
|
|
|
|
+ pub clientid: String,
|
|
|
|
|
+ #[serde(skip_serializing_if = "Option::is_none")]
|
|
|
|
|
+ pub di0: Option<u8>,
|
|
|
|
|
+ #[serde(skip_serializing_if = "Option::is_none")]
|
|
|
|
|
+ pub di1: Option<u8>,
|
|
|
|
|
+ #[serde(skip_serializing_if = "Option::is_none")]
|
|
|
|
|
+ pub di2: Option<u8>,
|
|
|
|
|
+ #[serde(skip_serializing_if = "Option::is_none")]
|
|
|
|
|
+ pub di3: Option<u8>,
|
|
|
|
|
+ #[serde(skip_serializing_if = "Option::is_none")]
|
|
|
|
|
+ pub di4: Option<u8>,
|
|
|
|
|
+ #[serde(skip_serializing_if = "Option::is_none")]
|
|
|
|
|
+ pub di5: Option<u8>,
|
|
|
|
|
+ #[serde(skip_serializing_if = "Option::is_none")]
|
|
|
|
|
+ pub di6: Option<u8>,
|
|
|
|
|
+ #[serde(skip_serializing_if = "Option::is_none")]
|
|
|
|
|
+ pub di7: Option<u8>,
|
|
|
|
|
+ #[serde(skip_serializing_if = "Option::is_none")]
|
|
|
|
|
+ pub do0: Option<u8>,
|
|
|
|
|
+ #[serde(skip_serializing_if = "Option::is_none")]
|
|
|
|
|
+ pub do1: Option<u8>,
|
|
|
|
|
+ #[serde(skip_serializing_if = "Option::is_none")]
|
|
|
|
|
+ pub do2: Option<u8>,
|
|
|
|
|
+ #[serde(skip_serializing_if = "Option::is_none")]
|
|
|
|
|
+ pub do3: Option<u8>,
|
|
|
|
|
+ #[serde(skip_serializing_if = "Option::is_none")]
|
|
|
|
|
+ pub do4: Option<u8>,
|
|
|
|
|
+ #[serde(skip_serializing_if = "Option::is_none")]
|
|
|
|
|
+ pub do5: Option<u8>,
|
|
|
|
|
+ #[serde(skip_serializing_if = "Option::is_none")]
|
|
|
|
|
+ pub do6: Option<u8>,
|
|
|
|
|
+ #[serde(skip_serializing_if = "Option::is_none")]
|
|
|
|
|
+ pub do7: Option<u8>,
|
|
|
|
|
+ #[serde(skip_serializing_if = "Option::is_none")]
|
|
|
|
|
+ pub beep: Option<u8>,
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
|
|
|
#[derive(serde::Serialize)]
|
|
#[derive(serde::Serialize)]
|
|
|
pub struct UTokenBack{
|
|
pub struct UTokenBack{
|
|
@@ -207,7 +290,9 @@ pub struct UTokenBack{
|
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
|
pub devices: Option<Vec<Devices>>,
|
|
pub devices: Option<Vec<Devices>>,
|
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
|
- pub area: Option<Vec<Area>>
|
|
|
|
|
|
|
+ pub area: Option<Vec<Area>>,
|
|
|
|
|
+ #[serde(skip_serializing_if = "Option::is_none")]
|
|
|
|
|
+ pub latest: Option<Vec<DV>>
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// #[derive(serde::Deserialize)]
|
|
// #[derive(serde::Deserialize)]
|
|
@@ -253,11 +338,13 @@ pub async fn d_all(
|
|
|
State(state): State<AppState>,
|
|
State(state): State<AppState>,
|
|
|
Json(u): axum::extract::Json<super::Ident>
|
|
Json(u): axum::extract::Json<super::Ident>
|
|
|
) -> Json<UTokenBack> {
|
|
) -> Json<UTokenBack> {
|
|
|
- let uid = if let Ok( id) = check_token(&state, u.token).await {
|
|
|
|
|
|
|
+ let uid = if let Ok( (id,_)) = check_token(&state, u.token).await {
|
|
|
id
|
|
id
|
|
|
} else {
|
|
} else {
|
|
|
- return Json(UTokenBack{errcode: 2000, errmsg: Some("鉴权失败: token无效".to_string()),devices: None,area: None})
|
|
|
|
|
|
|
+ return Json(UTokenBack{errcode: 2000, errmsg: Some("鉴权失败: token无效".to_string()),devices: None,area: None,latest:None})
|
|
|
};
|
|
};
|
|
|
|
|
+ let mut sqls = Vec::new();
|
|
|
|
|
+ let mut devices: Vec<String> = Vec::new();
|
|
|
// 区域是否为自己创建的
|
|
// 区域是否为自己创建的
|
|
|
Json(UTokenBack{
|
|
Json(UTokenBack{
|
|
|
errcode: 0,
|
|
errcode: 0,
|
|
@@ -266,10 +353,14 @@ pub async fn d_all(
|
|
|
match state.db_lite.query_rows(
|
|
match state.db_lite.query_rows(
|
|
|
"select d.id,d.name,d.sn,d.area,d.belongto,d.info from device d left join map_user_device m on d.id=m.did where d.isdelete=0 and m.uid=?",
|
|
"select d.id,d.name,d.sn,d.area,d.belongto,d.info from device d left join map_user_device m on d.id=m.did where d.isdelete=0 and m.uid=?",
|
|
|
[uid],
|
|
[uid],
|
|
|
- |r|{Ok(Devices{
|
|
|
|
|
|
|
+ |r|{
|
|
|
|
|
+ let sn = r.get::<usize,String>(2)?;
|
|
|
|
|
+ sqls.push("?");
|
|
|
|
|
+ devices.push(sn.clone());
|
|
|
|
|
+ Ok(Devices{
|
|
|
id: r.get::<usize,u64>(0)?,
|
|
id: r.get::<usize,u64>(0)?,
|
|
|
name: r.get::<usize,String>(1)?,
|
|
name: r.get::<usize,String>(1)?,
|
|
|
- sn: r.get::<usize,String>(2)?,
|
|
|
|
|
|
|
+ sn: sn,
|
|
|
area: r.get::<usize,u64>(3)?,
|
|
area: r.get::<usize,u64>(3)?,
|
|
|
belongto: r.get::<usize,u64>(4)?==uid,
|
|
belongto: r.get::<usize,u64>(4)?==uid,
|
|
|
info: r.get::<usize,String>(5)?
|
|
info: r.get::<usize,String>(5)?
|
|
@@ -281,12 +372,13 @@ pub async fn d_all(
|
|
|
errcode: 3000,
|
|
errcode: 3000,
|
|
|
errmsg: Some(format!("设备信息获取失败")),
|
|
errmsg: Some(format!("设备信息获取失败")),
|
|
|
devices: None,
|
|
devices: None,
|
|
|
- area: None
|
|
|
|
|
|
|
+ area: None,
|
|
|
|
|
+ latest: None
|
|
|
})
|
|
})
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- ),
|
|
|
|
|
- area: Some(
|
|
|
|
|
|
|
+ ),
|
|
|
|
|
+ area: Some(
|
|
|
match state.db_lite.query_rows(
|
|
match state.db_lite.query_rows(
|
|
|
"select a.id,a.name,a.sup,a.createby from area a left join map_user_area m on a.id=m.aid where a.isdelete=0 and m.uid=?",
|
|
"select a.id,a.name,a.sup,a.createby from area a left join map_user_area m on a.id=m.aid where a.isdelete=0 and m.uid=?",
|
|
|
[uid],
|
|
[uid],
|
|
@@ -303,11 +395,44 @@ pub async fn d_all(
|
|
|
errcode: 3000,
|
|
errcode: 3000,
|
|
|
errmsg: Some(format!("设备信息获取失败")),
|
|
errmsg: Some(format!("设备信息获取失败")),
|
|
|
devices: None,
|
|
devices: None,
|
|
|
- area: None
|
|
|
|
|
|
|
+ area: None,
|
|
|
|
|
+ latest: None
|
|
|
})
|
|
})
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- )
|
|
|
|
|
|
|
+ ),
|
|
|
|
|
+ latest: match state.mq_detail{
|
|
|
|
|
+ Some(s)=>{
|
|
|
|
|
+ s.db_mq_latest.query_rows(
|
|
|
|
|
+ format!("select clientid,
|
|
|
|
|
+ DI0,DI1,DI2,DI3,DI4,DI5,DI6,DI7,
|
|
|
|
|
+ DO0,DO1,DO2,DO3,DO4,DO5,DO6,DO7,BEEP
|
|
|
|
|
+ from dev where clientid in ({})", sqls.join(",")).as_str(),
|
|
|
|
|
+ rusqlite::params_from_iter(devices),|r|{
|
|
|
|
|
+ Ok(DV{
|
|
|
|
|
+ clientid: r.get(0)?,
|
|
|
|
|
+ di0: r.get(1)?,
|
|
|
|
|
+ di1: r.get(2)?,
|
|
|
|
|
+ di2: r.get(3)?,
|
|
|
|
|
+ di3: r.get(4)?,
|
|
|
|
|
+ di4: r.get(5)?,
|
|
|
|
|
+ di5: r.get(6)?,
|
|
|
|
|
+ di6: r.get(7)?,
|
|
|
|
|
+ di7: r.get(8)?,
|
|
|
|
|
+ do0: r.get(9)?,
|
|
|
|
|
+ do1: r.get(10)?,
|
|
|
|
|
+ do2: r.get(11)?,
|
|
|
|
|
+ do3: r.get(12)?,
|
|
|
|
|
+ do4: r.get(13)?,
|
|
|
|
|
+ do5: r.get(14)?,
|
|
|
|
|
+ do6: r.get(15)?,
|
|
|
|
|
+ do7: r.get(16)?,
|
|
|
|
|
+ beep: r.get(17)?,
|
|
|
|
|
+ })
|
|
|
|
|
+ }).await.ok()
|
|
|
|
|
+ },
|
|
|
|
|
+ None =>None
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
)
|
|
)
|
|
|
}
|
|
}
|