DeviceData.go 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944
  1. package Device
  2. import (
  3. "Cold_Api/conf"
  4. "Cold_Api/controllers/lib"
  5. "encoding/json"
  6. "errors"
  7. "fmt"
  8. "github.com/astaxie/beego/cache"
  9. _ "github.com/astaxie/beego/cache/redis"
  10. "github.com/astaxie/beego/logs"
  11. "github.com/beego/beego/v2/adapter/orm"
  12. orm2 "github.com/beego/beego/v2/client/orm"
  13. _ "github.com/go-sql-driver/mysql"
  14. "sort"
  15. "strconv"
  16. "strings"
  17. "time"
  18. )
  19. // 建表
  20. // var CREATEsql = "CREATE TABLE IF NOT EXISTS `z_device_data_" + SN + " ( " +
  21. var CREATEsql = " ( " +
  22. "`t_id` int(6) NOT NULL," +
  23. "`t_sp` int(6) NOT NULL," +
  24. "`t_time` datetime NOT NULL," +
  25. "`t_t` double(6, 1) NULL DEFAULT NULL," +
  26. "`t_rh` double(6, 1) NULL DEFAULT NULL," +
  27. "`t_site` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL," +
  28. "`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP," +
  29. "PRIMARY KEY (`t_time`, `t_id`) USING BTREE" +
  30. ") ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Compact;"
  31. type DeviceData_ struct {
  32. T_id int // 传感器id
  33. T_sp int // 传感器参数id
  34. T_t float32 // 温度
  35. T_rh float32 // 湿度
  36. T_site string // GPS
  37. T_time time.Time // 采集时间
  38. }
  39. // DeviceData_R1 辅助定位更新redis 结构体
  40. type DeviceData_R1 struct {
  41. T_t float32 // 温度
  42. T_rh float32 // 湿度
  43. T_Site string // GPS
  44. T_time time.Time // 采集时间
  45. T_sp int // 传感器参数ID
  46. T_tp int // 传感器参数ID
  47. //create_time
  48. }
  49. // 模板
  50. type DeviceData_R struct {
  51. T_sn string // sn
  52. T_id int // 传感器id
  53. T_name string // 传感器名称
  54. T_t float32 // 温度
  55. T_rh float32 // 湿度
  56. T_site string // GPS
  57. T_tl float32 // 温度下限
  58. T_tu float32 // 温度上限
  59. T_rhl float32 // 湿度下限
  60. T_rhu float32 // 湿度上限
  61. T_time string // 采集时间
  62. T_sp int // 传感器参数id
  63. T_ist int // 温度 1开启 2关闭
  64. T_ish int // 湿度 1开启 2关闭
  65. T_free int // 空库
  66. T_remark string // 备注
  67. Sorts int // 排序
  68. }
  69. type DeviceData_R2 struct {
  70. DeviceData_
  71. Sn string `json:"sn"`
  72. T_name string `json:"t_name"` // 设备名称
  73. Time string `json:"t_time"`
  74. }
  75. // 模板
  76. type DeviceData_Docking struct {
  77. T_monitor int // 监控状态 0 未监控 1 监控
  78. T_online int // 在线状态 0 未启用 1 在线 2 离线
  79. T_online_s int // 在线状态-备用 0 未启用 1 在线 2 离线
  80. T_sn string // sn
  81. T_id int // 传感器id
  82. T_name string // 传感器名称
  83. T_t float32 // 温度
  84. T_rh float32 // 湿度
  85. T_site string // GPS
  86. T_tl float32 // 温度下限
  87. T_tu float32 // 温度上限
  88. T_rhl float32 // 湿度下限
  89. T_rhu float32 // 湿度上限
  90. T_time string // 采集时间
  91. T_sp int // 传感器参数id
  92. }
  93. type DeviceData_Pdf struct {
  94. T_time string // sn
  95. T_id1 *float32 // 传感器id1温度
  96. T_id2 *float32 // 传感器id2温度
  97. }
  98. type DeviceData_BackUp struct {
  99. T_sn string
  100. T_id int // 传感器id
  101. T_name string // 传感器名称
  102. T_date string // 采集日期
  103. T_num int // 数据量
  104. }
  105. //func (t *DeviceData) TableName() string {
  106. // return "DeviceData" // 数据库名称 // ************** 替换 FormulaList **************
  107. //}
  108. var redis_DeviceData cache.Cache
  109. func init() {
  110. config := fmt.Sprintf(`{"key":"%s","conn":"%s","dbNum":"%s","password":"%s"}`,
  111. "redis_DeviceData", conf.Redis_address, conf.Redis_dbNum, conf.Redis_password)
  112. fmt.Println(config)
  113. var err error
  114. redis_DeviceData, err = cache.NewCache("redis", config)
  115. if err != nil || redis_DeviceData == nil {
  116. errMsg := "failed to init redis"
  117. logs.Error(errMsg, err)
  118. panic(errMsg)
  119. }
  120. }
  121. func DeviceData_ToDeviceData_R(d Device, r DeviceData_) (t DeviceData_R) {
  122. t.T_id = r.T_id
  123. t.T_t = r.T_t
  124. t.T_rh = r.T_rh
  125. t.T_site = r.T_site
  126. t.T_time = r.T_time.Format("2006-01-02 15:04:05")
  127. t.T_sp = r.T_sp
  128. sp := Read_DeviceSensorParameter_Map_Get(r.T_sp)
  129. t.T_name = sp.T_name
  130. t.T_tl = sp.T_Tlower
  131. t.T_tu = sp.T_Tupper
  132. t.T_rhl = sp.T_RHlower
  133. t.T_rhu = sp.T_RHupper
  134. t.T_free = sp.T_free
  135. if sp.T_free == 1 {
  136. t.T_remark = "空库"
  137. } else {
  138. t.T_remark = "-"
  139. }
  140. t.T_sn = d.T_sn
  141. t.T_ist = d.T_ist
  142. t.T_ish = d.T_ish
  143. return t
  144. }
  145. func DeviceDataToDeviceData_R2(d Device, sp DeviceSensorParameter_R, r DeviceData_) (t DeviceData_R) {
  146. t.T_id = r.T_id
  147. t.T_t = r.T_t
  148. t.T_rh = r.T_rh
  149. t.T_site = r.T_site
  150. t.T_time = r.T_time.Format("2006-01-02 15:04:05")
  151. // 传感器参数信息
  152. t.T_sp = r.T_sp
  153. t.T_name = sp.T_name
  154. t.T_tl = sp.T_Tlower
  155. t.T_tu = sp.T_Tupper
  156. t.T_rhl = sp.T_RHlower
  157. t.T_rhu = sp.T_RHupper
  158. // 设备信息
  159. t.T_ist = d.T_ist
  160. t.T_ish = d.T_ish
  161. return t
  162. }
  163. // ---------------- Redis -------------------
  164. // Redis_Device_Set(m.T_sn,m) // Redis 更新缓存
  165. func RedisDeviceData_Set(key string, r DeviceData_) (err error) {
  166. if redis_DeviceData.IsExist(key) {
  167. var t DeviceData_
  168. v := redis_DeviceData.Get(key)
  169. json.Unmarshal(v.([]byte), &t)
  170. if t.T_time.Unix() > r.T_time.Unix() {
  171. // 储存的 是最新数据
  172. return
  173. }
  174. }
  175. //json序列化
  176. str, err := json.Marshal(r)
  177. if err != nil {
  178. logs.Error(lib.FuncName(), err)
  179. return
  180. }
  181. err = redis_DeviceData.Put(key, str, 1*time.Hour)
  182. if err != nil {
  183. logs.Error("set key:", key, ",value:", str, err)
  184. }
  185. return
  186. }
  187. // 辅助定位设置redis数据
  188. func RedisDeviceData_SetAssistedPositioning(T_sn string, T_id int, r DeviceData_R1) (err error) {
  189. key := T_sn + "|" + strconv.Itoa(T_id)
  190. if redis_DeviceData.IsExist(key) {
  191. var t DeviceData_R1
  192. v := redis_DeviceData.Get(key)
  193. json.Unmarshal(v.([]byte), &t)
  194. // 防止时间溢出
  195. if time.Now().Unix() <= r.T_time.Unix() {
  196. r.T_time = time.Now()
  197. }
  198. }
  199. //json序列化
  200. str, err := json.Marshal(r)
  201. if err != nil {
  202. logs.Error("RedisDeviceData_Set", err)
  203. return
  204. }
  205. err = redis_DeviceData.Put(key, str, 1*time.Hour)
  206. if err != nil {
  207. logs.Error("set key:", key, ",value:", str, err)
  208. }
  209. return
  210. }
  211. func RedisDeviceData_Get(key string) (r DeviceData_, is bool) {
  212. if redis_DeviceData.IsExist(key) {
  213. v := redis_DeviceData.Get(key)
  214. err := json.Unmarshal(v.([]byte), &r)
  215. if err != nil {
  216. logs.Error(lib.FuncName(), err)
  217. return DeviceData_{}, false
  218. }
  219. return r, true
  220. }
  221. return DeviceData_{}, false
  222. }
  223. // 辅助定位获取redis数据
  224. func AssistedPositioning_Get(T_sn string, T_id int) (r DeviceData_R1, is bool) {
  225. key := T_sn + "|" + strconv.Itoa(T_id)
  226. if redis_DeviceData.IsExist(key) {
  227. v := redis_DeviceData.Get(key)
  228. json.Unmarshal(v.([]byte), &r)
  229. return r, true
  230. }
  231. return DeviceData_R1{}, false
  232. }
  233. // -------------------------------------------------------
  234. // 创建数据库 Device.CREATE_DeviceData("")
  235. func CREATE_DeviceData(SN string) bool {
  236. sql := "CREATE TABLE IF NOT EXISTS `z_device_data_" + SN + "` " + CREATEsql
  237. o := orm.NewOrm()
  238. _, err := o.Raw(sql).Exec()
  239. if err != nil {
  240. logs.Error(lib.FuncName(), err)
  241. return false
  242. }
  243. return true
  244. }
  245. func DELETE_DeviceDatar(SN string) bool {
  246. timeStr := time.Now().Format("2006_01_02_15_04_05")
  247. //sql := "DROP TABLE z_device_data_" + SN
  248. sql := "ALTER TABLE z_device_data_" + SN + " RENAME TO " + "z_device_data_" + SN + "_dle_" + timeStr + ";"
  249. logs.Info("DELETE_DeviceDatar sql:", sql)
  250. o := orm.NewOrm()
  251. _, err := o.Raw(sql).Exec()
  252. if err != nil {
  253. logs.Error(lib.FuncName(), err)
  254. return false
  255. }
  256. return true
  257. }
  258. // ---------------- 特殊方法 ------------------
  259. type DeviceData_T struct {
  260. T_id int // ID
  261. T_t float32 // 温度
  262. T_rh float32 // 湿度
  263. T_Site string // GPS
  264. T_time time.Time // 采集时间
  265. }
  266. // 添加
  267. func Add_DeviceData(SN string, v DeviceData_T) bool {
  268. //if(conf.Test_server){
  269. // return true
  270. //}
  271. key_time := SN + "|" + strconv.Itoa(v.T_id) + "|" + v.T_time.Format("2006-01-02 15:04:05")
  272. logs.Debug(key_time)
  273. if redis_DeviceData.IsExist(key_time) {
  274. //println("找到key:",key)
  275. return true
  276. }
  277. o := orm.NewOrm()
  278. // 检查 超过时间,查询 数据库
  279. logs.Info("Add_DeviceData 时间差s:", time.Now().Unix()-v.T_time.Unix())
  280. if time.Now().Unix()-v.T_time.Unix() >= 60*40 {
  281. // 查看是否 有记录
  282. var maps_z []orm2.ParamsList
  283. sql_c := "SELECT COUNT(ID) FROM z_device_data_" + SN + " WHERE t_time = '" + v.T_time.Format("2006-01-02 15:04:05") + "' AND t_id = " + strconv.Itoa(v.T_id)
  284. logs.Info("检查 超过时间,查询 数据库 SQL:", sql_c)
  285. _, err := o.Raw(sql_c).ValuesList(&maps_z)
  286. if err != nil {
  287. logs.Info(err)
  288. return false
  289. }
  290. if lib.To_int(maps_z[0][0]) > 0 {
  291. logs.Info("存在记录,跳过!")
  292. return true
  293. }
  294. }
  295. // 开始插入数据
  296. sql := "INSERT INTO z_device_data_" + SN + " ( `t_id`, `t_t`, `t_rh`, `t_site`, `t_time`) " +
  297. "VALUES (" + strconv.Itoa(v.T_id) + ", " + lib.To_string(v.T_t) + ", " + lib.To_string(v.T_rh) + ", '" + v.T_Site + "'," + v.T_time.Format("2006-01-02 15:04:05") + "')"
  298. // 这里有时间优化 用于一次 prepare 多次 exec,以提高批量执行的速度
  299. logs.Debug(sql)
  300. res, err := o.Raw(sql).Exec()
  301. if err != nil {
  302. logs.Error(lib.FuncName(), err)
  303. return false
  304. }
  305. res.RowsAffected()
  306. return true
  307. }
  308. // 辅助定位更新缓存
  309. func Update_AssistedPositioning(T_sn, longitude, latitude, T_time string) error {
  310. o := orm.NewOrm()
  311. tableName := "z_device_data_" + T_sn
  312. var deviceData []DeviceData_
  313. tsn, i := Read_DeviceSensor_ByTsn(T_sn)
  314. if i == 0 {
  315. return errors.New("获取设备失败")
  316. }
  317. for _, v := range tsn {
  318. r, is := AssistedPositioning_Get(v.T_sn, v.T_id)
  319. if is {
  320. r.T_Site = longitude + "," + latitude
  321. err := RedisDeviceData_SetAssistedPositioning(v.T_sn, v.T_id, r)
  322. if err != nil {
  323. return err
  324. }
  325. sql := "SELECT * FROM " + tableName + " ORDER BY t_time DESC LIMIT 1"
  326. fmt.Println(sql)
  327. rows, err := o.Raw(sql).QueryRows(&deviceData)
  328. if err != nil {
  329. logs.Error(lib.FuncName(), err)
  330. return err
  331. }
  332. if rows > 0 {
  333. for _, data := range deviceData {
  334. format := data.T_time.Format("2006-01-02 15:04:05")
  335. sql = "UPDATE " + tableName + " SET t_site = '" + longitude + "," + latitude + "' WHERE t_id = " + strconv.Itoa(v.T_id) + " AND t_time = '" + format + "'"
  336. _, err := o.Raw(sql).Exec()
  337. if err != nil {
  338. logs.Error(lib.FuncName(), err)
  339. return err
  340. }
  341. }
  342. }
  343. }
  344. }
  345. return nil
  346. }
  347. func Read_DeviceData_ById_List(SN string, T_id int, Time_start_ string, Time_end_ string, page int, page_z int) ([]DeviceData_R, int) {
  348. o := orm.NewOrm()
  349. var maps []DeviceData_
  350. var maps_z []orm2.ParamsList
  351. var r []DeviceData_R
  352. var offset int
  353. if page_z == 0 {
  354. page_z = conf.Page_size
  355. }
  356. if page <= 1 {
  357. offset = 0
  358. } else {
  359. offset = (page - 1) * page_z
  360. }
  361. sql_time := ""
  362. if len(Time_start_) > 1 {
  363. sql_time += " t_time >= '" + Time_start_ + "' AND "
  364. }
  365. if len(Time_end_) > 1 {
  366. sql_time += " t_time <= '" + Time_end_ + "' AND "
  367. }
  368. sql := "SELECT COUNT(t_id) FROM z_device_data_" + SN + " WHERE " + sql_time + " t_id = " + strconv.Itoa(T_id)
  369. logs.Debug(sql)
  370. _, err := o.Raw(sql).ValuesList(&maps_z)
  371. if err != nil {
  372. logs.Error(lib.FuncName(), err)
  373. return r, 0
  374. }
  375. if len(maps_z) == 0 {
  376. return r, 0
  377. }
  378. sql = "SELECT t_id,t_sp,t_t,t_rh,t_site,DATE_FORMAT(t_time,'%Y-%m-%d %H:%i:%s') AS t_time,t_time AS t_time1 FROM z_device_data_" + SN + " WHERE " + sql_time + " t_id = " + strconv.Itoa(T_id) + " ORDER BY t_time1 DESC,t_id DESC "
  379. if page_z != 9999 {
  380. sql = sql + " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(page_z)
  381. }
  382. logs.Debug(sql)
  383. _, err = o.Raw(sql).QueryRows(&maps)
  384. if err != nil {
  385. logs.Error(lib.FuncName(), err)
  386. return r, 0
  387. }
  388. //value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", cnt), 64)
  389. key, _ := strconv.Atoi(maps_z[0][0].(string))
  390. device, err := Read_Device_ByT_sn(SN)
  391. if err != nil {
  392. logs.Error(lib.FuncName(), err)
  393. }
  394. for _, v := range maps {
  395. r = append(r, DeviceData_ToDeviceData_R(device, v))
  396. }
  397. return r, key
  398. }
  399. func Read_DeviceData_ById_List_OrderByTimeAes(SN string, T_id int, Time_start_ string, Time_end_ string, page int, page_z int) ([]DeviceData_R, int) {
  400. o := orm.NewOrm()
  401. var maps []DeviceData_
  402. var maps_z []orm2.ParamsList
  403. var r []DeviceData_R
  404. var offset int
  405. if page_z == 0 {
  406. page_z = conf.Page_size
  407. }
  408. if page <= 1 {
  409. offset = 0
  410. } else {
  411. offset = (page - 1) * page_z
  412. }
  413. sql_time := ""
  414. if len(Time_start_) > 1 {
  415. sql_time += " t_time >= '" + Time_start_ + "' AND "
  416. }
  417. if len(Time_end_) > 1 {
  418. sql_time += " t_time <= '" + Time_end_ + "' AND "
  419. }
  420. sql := "SELECT COUNT(t_id) FROM z_device_data_" + SN + " WHERE " + sql_time + " t_id = " + strconv.Itoa(T_id)
  421. logs.Debug(sql)
  422. _, err := o.Raw(sql).ValuesList(&maps_z)
  423. if err != nil {
  424. logs.Error(lib.FuncName(), err)
  425. return r, 0
  426. }
  427. if len(maps_z) == 0 {
  428. return r, 0
  429. }
  430. sql = "SELECT t_id,t_sp,t_t,t_rh,t_site,DATE_FORMAT(t_time,'%Y-%m-%d %H:%i:%s') AS t_time,t_time AS t_time1 FROM z_device_data_" + SN + " WHERE " + sql_time + " t_id = " + strconv.Itoa(T_id) + " ORDER BY t_time1,t_id DESC "
  431. if page_z != 9999 {
  432. sql = sql + " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(page_z)
  433. }
  434. logs.Debug(sql)
  435. _, err = o.Raw(sql).QueryRows(&maps)
  436. if err != nil {
  437. logs.Error(lib.FuncName(), err)
  438. return r, 0
  439. }
  440. //value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", cnt), 64)
  441. key, _ := strconv.Atoi(maps_z[0][0].(string))
  442. device, err := Read_Device_ByT_sn(SN)
  443. if err != nil {
  444. logs.Error(lib.FuncName(), err)
  445. }
  446. for _, v := range maps {
  447. r = append(r, DeviceData_ToDeviceData_R(device, v))
  448. }
  449. return r, key
  450. }
  451. func Read_DeviceData_ByIds(SN string, ids []int, Time_start_ string, Time_end_ string, page int, page_z int) ([]DeviceData_R, int) {
  452. o := orm.NewOrm()
  453. var maps []DeviceData_
  454. var maps_z []orm2.ParamsList
  455. var r []DeviceData_R
  456. var offset int
  457. if page_z == 0 {
  458. page_z = conf.Page_size
  459. }
  460. if page <= 1 {
  461. offset = 0
  462. } else {
  463. offset = (page - 1) * page_z
  464. }
  465. sql_time := ""
  466. if len(Time_start_) > 1 {
  467. sql_time += " t_time >= '" + Time_start_ + "' AND "
  468. }
  469. if len(Time_end_) > 1 {
  470. sql_time += " t_time <= '" + Time_end_ + "' AND "
  471. }
  472. sql := "SELECT COUNT(t_id) FROM z_device_data_" + SN + " WHERE " + sql_time + " t_id in (" + lib.IntListToDotStr(ids) + ")"
  473. logs.Debug(sql)
  474. _, err := o.Raw(sql).ValuesList(&maps_z)
  475. if err != nil {
  476. logs.Error(lib.FuncName(), err)
  477. return r, 0
  478. }
  479. if len(maps_z) == 0 {
  480. return r, 0
  481. }
  482. //t_tl,t_tu,t_rhl,t_rhu,
  483. sql = "SELECT t_id,t_sp,t_t,t_rh,t_site,DATE_FORMAT(t_time,'%Y-%m-%d %H:%i:%s') AS t_time,t_time AS t_time1 FROM z_device_data_" + SN + " WHERE " + sql_time + " t_id in (" + lib.IntListToDotStr(ids) + ") ORDER BY t_time1 DESC,t_id ASC "
  484. if page_z != 9999 {
  485. sql = sql + " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(page_z)
  486. }
  487. logs.Debug(sql)
  488. _, err = o.Raw(sql).QueryRows(&maps)
  489. if err != nil {
  490. logs.Error(lib.FuncName(), err)
  491. return r, 0
  492. }
  493. key, _ := strconv.Atoi(maps_z[0][0].(string))
  494. device, err := Read_Device_ByT_sn(SN)
  495. if err != nil {
  496. logs.Error(lib.FuncName(), err)
  497. }
  498. for _, v := range maps {
  499. r = append(r, DeviceData_ToDeviceData_R(device, v))
  500. }
  501. return r, key
  502. }
  503. func Read_DeviceData_ByIds_ForPDF(SN string, ids []int, Time_start_ string, Time_end_ string) []DeviceData_Pdf {
  504. o := orm.NewOrm()
  505. var r []DeviceData_Pdf
  506. if len(ids) == 0 || len(ids) > 2 {
  507. return r
  508. }
  509. sql_time := ""
  510. if len(Time_start_) > 1 {
  511. sql_time += " t_time >= '" + Time_start_ + "' AND "
  512. }
  513. if len(Time_end_) > 1 {
  514. sql_time += " t_time <= '" + Time_end_ + "' AND "
  515. }
  516. selectSql := ""
  517. for i, v := range ids {
  518. selectSql += fmt.Sprintf("MAX(CASE WHEN t_id = %d THEN t_t END) AS t_id%d,", v, i+1)
  519. }
  520. selectSql = strings.Trim(selectSql, ",")
  521. sql := "SELECT DATE_FORMAT(t_time,'%Y-%m-%d %H:%i:%s') AS t_time," + selectSql + " FROM z_device_data_" + SN + " WHERE " + sql_time + " t_id in (" + lib.IntListToDotStr(ids) + ") GROUP BY t_time ORDER BY t_time"
  522. logs.Debug(sql)
  523. _, err := o.Raw(sql).QueryRows(&r)
  524. if err != nil {
  525. logs.Error(lib.FuncName(), err)
  526. return r
  527. }
  528. return r
  529. }
  530. func Read_SqlRawL(T_SQL string, T_data []string) (string, []orm2.Params) {
  531. o := orm.NewOrm()
  532. var lists []orm2.Params
  533. logs.Debug(T_SQL)
  534. _, err := o.Raw(T_SQL, T_data).Values(&lists)
  535. if err != nil {
  536. logs.Error(lib.FuncName(), err)
  537. return err.Error(), lists
  538. }
  539. return "", lists
  540. }
  541. func Read_DeviceData_By_T_snid_List(T_snid string, Time_start_ string, Time_end_ string, page int, page_z int) ([]DeviceData_R, int64) {
  542. T_snid_list := strings.Split(strings.Trim(T_snid, "|"), "|")
  543. var maps []DeviceData_R
  544. var maps_num int64
  545. var offset, offset_z int
  546. for _, v := range T_snid_list {
  547. sn_id := strings.Split(v, ",")
  548. if len(sn_id) == 3 {
  549. Read_DeviceSensorParameter_All_Map(sn_id[0], lib.To_int(sn_id[1]))
  550. r_maps, r_maps_num := Read_DeviceData_ById_List(sn_id[0], lib.To_int(sn_id[1]), Time_start_, Time_end_, 0, 9999)
  551. for i, _ := range r_maps {
  552. atoi, _ := strconv.Atoi(sn_id[2])
  553. r_maps[i].Sorts = atoi
  554. }
  555. maps = append(maps, r_maps...)
  556. maps_num = maps_num + int64(r_maps_num)
  557. logs.Debug("加载数据:", sn_id[0], sn_id[1], r_maps_num)
  558. } else if len(sn_id) == 2 {
  559. Read_DeviceSensorParameter_All_Map(sn_id[0], lib.To_int(sn_id[1]))
  560. r_maps, r_maps_num := Read_DeviceData_ById_List(sn_id[0], lib.To_int(sn_id[1]), Time_start_, Time_end_, 0, 9999)
  561. maps = append(maps, r_maps...)
  562. maps_num = maps_num + int64(r_maps_num)
  563. logs.Debug("加载数据:", sn_id[0], sn_id[1], r_maps_num)
  564. }
  565. }
  566. if maps_num == 0 {
  567. return maps, maps_num
  568. }
  569. // 倒序
  570. sort.Slice(maps, func(i, j int) bool {
  571. if maps[i].T_time == maps[j].T_time {
  572. return maps[i].Sorts < maps[j].Sorts
  573. }
  574. return maps[i].T_time > maps[j].T_time
  575. })
  576. if page <= 1 {
  577. offset = 0
  578. } else {
  579. page -= 1
  580. offset = page * page_z
  581. }
  582. offset_z = offset + page_z
  583. if maps_num < int64(offset_z) {
  584. offset_z = int(maps_num)
  585. }
  586. if offset > offset_z {
  587. offset = offset_z
  588. }
  589. if page_z == 9999 {
  590. logs.Debug("总数据:", maps_num, " 导出")
  591. return maps, maps_num
  592. }
  593. logs.Debug("总数据:", maps_num, " 截取", offset, offset+page_z)
  594. return maps[offset:offset_z], maps_num
  595. }
  596. func Read_DeviceData_ById_Year_List(SN string) []orm2.ParamsList {
  597. o := orm.NewOrm()
  598. var maps_z []orm2.ParamsList
  599. //sql = "SELECT t_name,t_t,t_rh,t_tl,t_tu,t_rhl,t_rhu,t_site,DATE_FORMAT(t_time,'%Y-%c-%d %H:%i:%s') AS t_time FROM z_device_data_"+SN+" WHERE "+sql_time+" t_id = "+ strconv.Itoa(T_id) +" ORDER BY t_time DESC "
  600. sql := "SELECT DATE_FORMAT(t_time,\"%m\") AS m ,DATE_FORMAT(t_time,\"%d\") AS d FROM z_device_data_" + SN + " WHERE t_time > '" + strconv.Itoa(time.Now().Year()) + "-0-0 00:00:00' GROUP BY DATE_FORMAT(t_time,\"%m\");"
  601. logs.Debug(sql)
  602. num, err := o.Raw(sql).ValuesList(&maps_z)
  603. if err == nil && num > 0 {
  604. logs.Debug(maps_z[0][0]) // slene
  605. }
  606. //value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", cnt), 64)
  607. //key,_ := strconv.Atoi(maps_z[0][0].(string))
  608. return maps_z
  609. } //
  610. func Read_DeviceData_ById_Month_List(SN string) []orm2.ParamsList {
  611. o := orm.NewOrm()
  612. var maps_z []orm2.ParamsList
  613. currentTime := time.Now() //获取当前时间,类型是Go的时间类型Time
  614. time_x := currentTime.Format("2006-01") + "-00 00:00:00"
  615. //sql = "SELECT t_name,t_t,t_rh,t_tl,t_tu,t_rhl,t_rhu,t_site,DATE_FORMAT(t_time,'%Y-%c-%d %H:%i:%s') AS t_time FROM z_device_data_"+SN+" WHERE "+sql_time+" t_id = "+ strconv.Itoa(T_id) +" ORDER BY t_time DESC "
  616. sql := "SELECT DATE_FORMAT(t_time,\"%d\") AS d FROM z_device_data_" + SN + " WHERE t_time > '" + time_x + "' GROUP BY DATE_FORMAT(t_time,\"%d\");"
  617. logs.Debug(sql)
  618. o.Raw(sql).ValuesList(&maps_z)
  619. //value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", cnt), 64)
  620. //key,_ := strconv.Atoi(maps_z[0][0].(string))
  621. return maps_z
  622. }
  623. func Read_DeviceData_ById_Day_List(SN string) []orm2.ParamsList {
  624. o := orm.NewOrm()
  625. var maps_z []orm2.ParamsList
  626. currentTime := time.Now() //获取当前时间,类型是Go的时间类型Time
  627. time_x := currentTime.Format("2006-01-02") + " 00:00:00"
  628. //sql = "SELECT t_name,t_t,t_rh,t_tl,t_tu,t_rhl,t_rhu,t_site,DATE_FORMAT(t_time,'%Y-%c-%d %H:%i:%s') AS t_time FROM z_device_data_"+SN+" WHERE "+sql_time+" t_id = "+ strconv.Itoa(T_id) +" ORDER BY t_time DESC "
  629. sql := "SELECT DATE_FORMAT(t_time,\"%H\") AS m FROM z_device_data_" + SN + " WHERE t_time > '" + time_x + "' GROUP BY DATE_FORMAT(t_time,\"%H\");"
  630. logs.Debug(sql)
  631. o.Raw(sql).ValuesList(&maps_z)
  632. //value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", cnt), 64)
  633. //key,_ := strconv.Atoi(maps_z[0][0].(string))
  634. return maps_z
  635. }
  636. func Read_DeviceData_List_GROUP_BY_t_time(SN string, Time_start_ string, Time_end_ string) []orm2.ParamsList {
  637. o := orm.NewOrm()
  638. var maps_z []orm2.ParamsList
  639. sql_time := ""
  640. if len(Time_start_) > 1 {
  641. sql_time += " t_time >= '" + Time_start_ + "' AND " + " t_time <= '" + Time_end_ + "' "
  642. }
  643. sql := "SELECT DATE_FORMAT(t_time,'%Y-%c-%d %H:%i:%s') AS t_time FROM z_device_data_" + SN + " WHERE " + sql_time + " GROUP BY t_time ORDER BY t_time DESC "
  644. logs.Debug(sql)
  645. _, err := o.Raw(sql).ValuesList(&maps_z)
  646. if err != nil {
  647. logs.Error(lib.FuncName(), err)
  648. }
  649. return maps_z
  650. }
  651. func Read_DeviceData(T_sn string, T_id int) (t DeviceData_) {
  652. key := T_sn + "|" + strconv.Itoa(T_id)
  653. if t, is := RedisDeviceData_Get(key); is {
  654. return t
  655. }
  656. o := orm.NewOrm()
  657. var maps []DeviceData_
  658. sql := "SELECT t_id,t_sp,t_t,t_rh,t_site,DATE_FORMAT(t_time,'%Y-%m-%d %H:%i:%s') AS t_time,t_time AS t_time1 FROM z_device_data_" + T_sn + " WHERE" + " t_id = " + strconv.Itoa(T_id) + " ORDER BY t_time1 DESC LIMIT 0,1"
  659. logs.Debug(sql)
  660. _, err := o.Raw(sql).QueryRows(&maps)
  661. if err != nil {
  662. logs.Error(lib.FuncName(), err)
  663. return t
  664. }
  665. if len(maps) == 0 {
  666. RedisDeviceData_Set(key, t)
  667. return t
  668. }
  669. RedisDeviceData_Set(key, maps[0])
  670. return maps[0]
  671. }
  672. // 获取数据备份
  673. func Read_DeviceData_BackUp_List(T_snid string, Time_start_ string, Time_end_ string, page int, page_z int) ([]DeviceData_BackUp, int64) {
  674. T_snid_list := strings.Split(T_snid, "|")
  675. var maps []DeviceData_BackUp
  676. var maps_num int64
  677. var offset, offset_z int
  678. for _, v := range T_snid_list {
  679. sn_id := strings.Split(v, ",")
  680. if len(sn_id) >= 2 {
  681. r_maps, r_maps_num := Read_DeviceData_BackUp(sn_id[0], lib.To_int(sn_id[1]), Time_start_, Time_end_)
  682. maps = append(maps, r_maps...)
  683. maps_num = maps_num + int64(r_maps_num)
  684. logs.Debug("加载数据:", sn_id[0], sn_id[1], r_maps_num)
  685. }
  686. }
  687. if page <= 1 {
  688. offset = 0
  689. } else {
  690. page -= 1
  691. offset = page * page_z
  692. }
  693. offset_z = offset + page_z
  694. if maps_num < int64(offset_z) {
  695. offset_z = int(maps_num)
  696. }
  697. if offset > offset_z {
  698. offset = offset_z
  699. }
  700. if page_z == 9999 {
  701. logs.Debug("总数据:", maps_num, " 导出")
  702. return maps, maps_num
  703. }
  704. logs.Debug("总数据:", maps_num, " 截取", offset, offset+page_z)
  705. return maps[offset:offset_z], maps_num
  706. }
  707. func Read_DeviceData_BackUp(T_sn string, T_id int, Time_start_ string, Time_end_ string) ([]DeviceData_BackUp, int) {
  708. o := orm.NewOrm()
  709. var maps []DeviceData_BackUp
  710. sql_time := ""
  711. if len(Time_start_) > 0 {
  712. sql_time += " t_time >= '" + Time_start_ + "' AND"
  713. }
  714. if len(Time_end_) > 0 {
  715. sql_time += " t_time <= '" + Time_end_ + "' AND"
  716. }
  717. sql := "SELECT t_id,date_format(t_time, '%Y-%m-%d') t_date, count(*) t_num FROM z_device_data_" + T_sn + " WHERE " + sql_time + " t_id = " + strconv.Itoa(T_id) + " GROUP BY t_date ORDER BY t_time DESC "
  718. logs.Debug(sql)
  719. _, err := o.Raw(sql).QueryRows(&maps)
  720. if err != nil {
  721. logs.Error(lib.FuncName(), err)
  722. return maps, 0
  723. }
  724. deviceSensor, _ := Read_DeviceSensor_ByT_sn(T_sn, T_id)
  725. for i := 0; i < len(maps); i++ {
  726. maps[i].T_sn = T_sn
  727. maps[i].T_name = deviceSensor.T_name
  728. }
  729. return maps, len(maps)
  730. }
  731. func Read_DeviceData_By_Time(T_sn string, T_id int, Time string) (t DeviceData_) {
  732. o := orm.NewOrm()
  733. var maps DeviceData_
  734. sql := "SELECT t_id,t_sp,t_t,t_rh,t_site,DATE_FORMAT(t_time,'%Y-%m-%d %H:%i:%s') AS t_time,t_time AS t_time1 FROM z_device_data_" + T_sn + " WHERE" + " t_id = " + strconv.Itoa(T_id) + " AND t_time <= '" + Time + "'" + " ORDER BY t_time1 DESC LIMIT 0,1"
  735. logs.Debug(sql)
  736. err := o.Raw(sql).QueryRow(&maps)
  737. if err != nil {
  738. logs.Error(lib.FuncName(), err)
  739. return t
  740. }
  741. return maps
  742. }
  743. func Read_DeviceData_Start_Time(T_sn string, T_id int, StartTime, EndTime string) (t []DeviceData_, count int64) {
  744. o := orm.NewOrm()
  745. var maps []DeviceData_
  746. var sql string
  747. if len(StartTime) > 0 && len(EndTime) > 0 {
  748. sql = "SELECT t_id,t_sp,t_t,t_rh,t_site,DATE_FORMAT(t_time,'%Y-%m-%d %H:%i:%s') AS t_time,t_time AS t_time1 FROM z_device_data_" + T_sn + " WHERE" + " t_id = " + strconv.Itoa(T_id) + " AND t_time >= '" + StartTime + "'" + " AND t_time <= '" + EndTime + "'" + " ORDER BY t_time1 DESC"
  749. } else if len(StartTime) > 0 && len(EndTime) == 0 {
  750. sql = "SELECT t_id,t_sp,t_t,t_rh,t_site,DATE_FORMAT(t_time,'%Y-%m-%d %H:%i:%s') AS t_time,t_time AS t_time1 FROM z_device_data_" + T_sn + " WHERE" + " t_id = " + strconv.Itoa(T_id) + " AND t_time >= '" + StartTime + "'" + " ORDER BY t_time1 DESC"
  751. }
  752. logs.Debug(sql)
  753. count, err := o.Raw(sql).QueryRows(&maps)
  754. if err != nil {
  755. logs.Error(lib.FuncName(), err)
  756. return t, 0
  757. }
  758. return maps, count
  759. }
  760. // 获取最新轨迹信息
  761. func GetNewLocus(T_sn string, T_id int, list *[]DeviceData_) error {
  762. task, err := Read_DeviceTask_List_By_Condition(T_sn)
  763. if err != nil {
  764. logs.Error(lib.FuncName(), err.Error())
  765. return errors.New("设备未开启监控")
  766. }
  767. // 当最新设备状态为1时,证明设备正在启动中,查询大于开始时间的所有轨迹,设备状态为2时,查询开始时间到结束时间的轨迹
  768. if task.T_State == 1 {
  769. deviceData, count := Read_DeviceData_Start_Time(T_sn, T_id, task.T_Ut_start.Format("2006-01-02 15:04:05"), "")
  770. if count >= 0 {
  771. *list = appendUniqueDeviceData(*list, deviceData)
  772. } else {
  773. logs.Error(lib.FuncName(), err)
  774. return errors.New("获取设备轨迹失败")
  775. }
  776. } else if task.T_State == 2 {
  777. deviceData, count := Read_DeviceData_Start_Time(T_sn, T_id, task.T_Ut_start.Format("2006-01-02 15:04:05"), task.T_Ut_end.Format("2006-01-02 15:04:05"))
  778. if count >= 0 {
  779. *list = appendUniqueDeviceData(*list, deviceData)
  780. } else {
  781. logs.Error(lib.FuncName(), err)
  782. return errors.New("获取设备轨迹失败")
  783. }
  784. }
  785. return nil
  786. }
  787. // 去重并追加设备数据
  788. func appendUniqueDeviceData(list []DeviceData_, newData []DeviceData_) []DeviceData_ {
  789. uniqueMap := make(map[time.Time]bool)
  790. for _, d := range list {
  791. uniqueMap[d.T_time] = true
  792. }
  793. for _, d := range newData {
  794. if !uniqueMap[d.T_time] {
  795. if len(d.T_site) > 0 && d.T_site != "0,0" {
  796. split := strings.Split(d.T_site, ",")
  797. defer func() {
  798. if r := recover(); r != nil {
  799. fmt.Println("数组下标越界:", r)
  800. }
  801. }()
  802. Lng := split[0]
  803. Lat := split[1]
  804. Lngs, _ := strconv.ParseFloat(Lng, 64)
  805. Lats, _ := strconv.ParseFloat(Lat, 64)
  806. mLng, mLat := lib.Wgs84ToGcj02(Lngs, Lats)
  807. d.T_site = fmt.Sprintf("%v,%v", mLng, mLat)
  808. list = append(list, d)
  809. }
  810. }
  811. }
  812. //排序
  813. sort.Slice(list, func(i, j int) bool {
  814. return list[i].T_time.After(list[j].T_time)
  815. })
  816. return list
  817. }