Warning.go 28 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000
  1. package Warning
  2. import (
  3. "ColdP_server/conf"
  4. "ColdP_server/controllers/lib"
  5. "ColdP_server/logs"
  6. "errors"
  7. "fmt"
  8. "github.com/beego/beego/v2/adapter/orm"
  9. orm2 "github.com/beego/beego/v2/client/orm"
  10. _ "github.com/go-sql-driver/mysql"
  11. "strconv"
  12. "strings"
  13. "time"
  14. )
  15. var (
  16. CompanyCallthepolice = "companyCallthepolice" // 公司管理-设备报警
  17. Callthepolice = "callthepolice" // 公司管理-设备报警
  18. )
  19. // 模板
  20. type Warning struct {
  21. Id int64 `orm:"column(ID);size(11);auto;pk"`
  22. T_pid int `orm:"size(256);null"` // Account.Company 绑定公司
  23. T_tp int `orm:"size(200);null"` // 报警类型 ->WarningList
  24. T_sn string `orm:"index;size(256);null"` // 设备序列号
  25. T_D_name string `orm:"size(256);null"` // 设备名称
  26. T_id int `orm:"size(200);null"` // 传感器 ID
  27. T_DS_name string `orm:"size(256);null"` // 传感器名称
  28. T_Remark string `orm:"type(text);null"` // 采集内容
  29. T_Ut time.Time `orm:"type(timestamp);null;"` // 采集时间
  30. T_fUt time.Time `orm:"type(timestamp);null;"` // 首次采集时间
  31. T_Text string `orm:"type(text);null"` // 处理备注
  32. T_Log string `orm:"type(text);null"` // 通知日志
  33. T_Msid int64 `orm:"size(256);null"` // 消息ID
  34. T_State int `orm:"size(2);default(2)"` // 0 删除 1 不处理 2 已处理 3 未处理
  35. CreateTime time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now_add 第一次保存时才设置时间
  36. UpdateTime time.Time `orm:"column(update_time);type(timestamp);null;auto_now"` //auto_now 每次 model 保存时都会对时间自动更新
  37. }
  38. // 多字段索引
  39. func (u *Warning) TableIndex() [][]string {
  40. return [][]string{
  41. []string{"T_pid", "T_tp", "T_State"},
  42. }
  43. }
  44. /*
  45. 分表机制
  46. |--------30天--------|
  47. |-----8月---||--------7月---------||--------6月---------||--------5月---------|
  48. 每天备份 到对应 月份
  49. */
  50. // 模板
  51. type Warning_R struct {
  52. Id int64
  53. T_pid int // Account.Company 绑定公司
  54. T_tp int // 报警类型 ->WarningList
  55. T_tp_name string // 报警类型名称
  56. T_sn string // 设备序列号
  57. T_D_name string // 设备名称
  58. T_id int // 传感器 ID
  59. T_DS_name string // 传感器名称
  60. T_Remark string // 采集内容
  61. T_Ut string // 采集时间
  62. T_fUt string // 首次采集时间
  63. T_Text string // 处理备注
  64. T_Log []string // 处理日志
  65. T_Msid int64 // 消息ID
  66. T_State int // 0 删除 1 未处理 2 已处理
  67. T_history int // 0 40天 1 历史数据
  68. CreateTime string // 创建时间
  69. }
  70. type CompanyWarning_R struct {
  71. Id int64
  72. T_pid int // Account.Company 绑定公司
  73. //T_pid_name string // Account.Company 公司名称
  74. T_tp int // 报警类型 ->WarningList
  75. T_tp_name string // 报警类型名称
  76. T_sn string // 设备序列号
  77. T_D_name string // 设备名称
  78. T_id int // 传感器 ID
  79. T_DS_name string // 传感器名称
  80. T_Remark string // 采集内容
  81. T_Ut string // 采集时间
  82. T_fUt string // 首次采集时间
  83. T_Text string // 处理备注
  84. T_Log []string // 处理日志
  85. T_Msid int64 // 消息ID
  86. T_State int // 0 删除 1 未处理 2 已处理
  87. T_history int // 0 40天 1 历史数据
  88. CreateTime string // 创建时间
  89. }
  90. type Warning_Applet struct {
  91. Id int64
  92. T_pid int // Account.Company 绑定公司
  93. //T_company_name string // 公司名称
  94. T_tp int // 报警类型 ->WarningList
  95. T_tp_name string // 报警类型名称
  96. T_sn string // 设备序列号
  97. T_D_name string // 设备名称
  98. T_id int // 传感器 ID
  99. T_DS_name string // 传感器名称
  100. T_Remark string // 采集内容
  101. T_Ut string // 采集时间
  102. T_fUt string // 首次采集时间
  103. T_Text string // 处理备注
  104. T_Log []string // 处理日志
  105. T_Msid int64 // 消息ID
  106. T_State int // 0 删除 1 未处理 2 已处理
  107. CreateTime string // 创建时间
  108. }
  109. func (t *Warning) TableName() string {
  110. return "warning" // 数据库名称 // ************** 替换 FormulaList **************
  111. }
  112. func init() {
  113. //注册模型
  114. orm.RegisterModel(new(Warning))
  115. }
  116. // ---------------- 特殊方法 -------------------
  117. // T_history 0 40天 1 历史数据
  118. func WarningToWarning_R(T_history int, t Warning) (r Warning_R) {
  119. r.Id = t.Id
  120. r.T_pid = t.T_pid
  121. r.T_tp = t.T_tp
  122. r.T_tp_name = Read_WarningType_Get(t.T_tp)
  123. r.T_sn = t.T_sn
  124. r.T_D_name = t.T_D_name
  125. r.T_id = t.T_id
  126. r.T_DS_name = t.T_DS_name
  127. r.T_Remark = t.T_Remark
  128. r.T_Ut = t.T_Ut.Format("2006-01-02 15:04:05")
  129. if !t.T_fUt.IsZero() {
  130. r.T_fUt = t.T_fUt.Format("2006-01-02 15:04:05")
  131. }
  132. r.T_Text = t.T_Text
  133. if len(t.T_Log) > 0 {
  134. r.T_Log = strings.Split(strings.TrimRight(t.T_Log, "\n"), "\n")
  135. }
  136. r.T_Msid = t.T_Msid
  137. r.T_State = t.T_State
  138. r.T_history = T_history
  139. r.CreateTime = t.CreateTime.Format("2006-01-02 15:04:05")
  140. return r
  141. }
  142. func WarningToCompanyWarning_R(T_history int, t Warning) (r CompanyWarning_R) {
  143. r.Id = t.Id
  144. r.T_pid = t.T_pid
  145. r.T_tp = t.T_tp
  146. r.T_tp_name = Read_WarningType_Get(t.T_tp)
  147. r.T_sn = t.T_sn
  148. r.T_D_name = t.T_D_name
  149. r.T_id = t.T_id
  150. r.T_DS_name = t.T_DS_name
  151. r.T_Remark = t.T_Remark
  152. r.T_Ut = t.T_Ut.Format("2006-01-02 15:04:05")
  153. if !t.T_fUt.IsZero() {
  154. r.T_fUt = t.T_fUt.Format("2006-01-02 15:04:05")
  155. }
  156. r.T_Text = t.T_Text
  157. if len(t.T_Log) > 0 {
  158. r.T_Log = strings.Split(strings.TrimRight(t.T_Log, "\n"), "\n")
  159. }
  160. r.T_Msid = t.T_Msid
  161. r.T_State = t.T_State
  162. r.T_history = T_history
  163. r.CreateTime = t.CreateTime.Format("2006-01-02 15:04:05")
  164. return r
  165. }
  166. func WarningToWarning_Applet(t Warning) (r Warning_Applet) {
  167. r.Id = t.Id
  168. r.T_pid = t.T_pid
  169. //company, _ := Account.Read_Company_ById(t.T_pid)
  170. //r.T_company_name = company.T_name
  171. r.T_tp = t.T_tp
  172. r.T_tp_name = Read_WarningType_Get(t.T_tp)
  173. r.T_sn = t.T_sn
  174. r.T_D_name = t.T_D_name
  175. r.T_id = t.T_id
  176. r.T_DS_name = t.T_DS_name
  177. r.T_Remark = t.T_Remark
  178. r.T_Ut = t.T_Ut.Format("2006-01-02 15:04:05")
  179. if !t.T_fUt.IsZero() {
  180. r.T_fUt = t.T_fUt.Format("2006-01-02 15:04:05")
  181. }
  182. r.T_Text = t.T_Text
  183. if len(t.T_Log) > 0 {
  184. r.T_Log = strings.Split(strings.TrimRight(t.T_Log, "\n"), "\n")
  185. }
  186. r.T_Msid = t.T_Msid
  187. r.T_State = t.T_State
  188. r.CreateTime = t.CreateTime.Format("2006-01-02 15:04:05")
  189. return r
  190. }
  191. // 获取 ById
  192. func Read_Warning_ById(id int64) (r Warning) {
  193. o := orm.NewOrm()
  194. r = Warning{Id: id}
  195. err := o.Read(&r) // o.Read(&r,"Tokey") 如果不是 主键 就得指定字段名
  196. if err != nil {
  197. logs.Error(lib.FuncName(), err)
  198. }
  199. return r
  200. }
  201. // 获取 ById
  202. func Read_Warning_ById_Backups(id int, T_year string, T_month string) (r Warning, err error) {
  203. o := orm.NewOrm()
  204. var maps []Warning
  205. // Warning_2022_07
  206. Wtab := "warning_" + T_year + "_" + T_month
  207. sql_WHERE := fmt.Sprintf(" t__state > 0 AND `ID`= %d", id)
  208. sql := "SELECT ID,t_pid,t_tp,t_sn,t__d_name,t_id,t__d_s_name,t__remark,t__ut,t__text,t__log,t__msid,t__state,create_time,update_time " +
  209. "FROM " + Wtab + " WHERE" + sql_WHERE
  210. fmt.Println(sql)
  211. num, err := o.Raw(sql).QueryRows(&maps)
  212. if err != nil {
  213. logs.Error(lib.FuncName(), err)
  214. return
  215. }
  216. if num == 0 {
  217. return r, orm.ErrNoRows
  218. }
  219. return maps[0], nil
  220. }
  221. // 添加
  222. func Add_Warning(m Warning) (id int64, err error) {
  223. o := orm.NewOrm()
  224. id, err = o.Insert(&m)
  225. if err != nil {
  226. logs.Error(lib.FuncName(), err)
  227. }
  228. return id, err
  229. }
  230. // 修改
  231. func Update_Warning(r Warning, cols ...string) bool {
  232. o := orm.NewOrm()
  233. num, err := o.Update(&r, cols...)
  234. if err != nil {
  235. logs.Error(lib.FuncName(), err)
  236. return false
  237. }
  238. fmt.Println("Number of records updated in database:", num)
  239. return true
  240. }
  241. // 删除
  242. func Delete_Warning(t_pid, Id int) (err error) {
  243. fmt.Println("Delete_Warning : Id", Id)
  244. o := orm.NewOrm()
  245. o.Raw("UPDATE warning SET t__state = 0 WHERE t_pid = ? AND ID = ?", t_pid, Id).Exec()
  246. // 后 一个月
  247. dd, _ := time.ParseDuration(fmt.Sprintf("-%dh", 24*30*1))
  248. dd1 := time.Now().Add(dd)
  249. println(int(dd1.Month()))
  250. xx := fmt.Sprintf("%d_%02d", int(dd1.Year()), int(dd1.Month()))
  251. o.Raw("UPDATE warning_"+xx+" SET t__state = 0 WHERE t_pid = ? AND ID = ?", t_pid, Id).Exec()
  252. return
  253. }
  254. // Delete_Warning_List 批量删除
  255. func Delete_Warning_List(id, ut string, pid int) (err error) {
  256. o := orm.NewOrm()
  257. atoi, _ := strconv.Atoi(id)
  258. layout := "2006-01-02 15:04:05"
  259. parse, _ := time.Parse(layout, ut)
  260. year := parse.Year()
  261. formatMonth := parse.Format("01")
  262. years := strconv.Itoa(year)
  263. Wtab := "warning_" + years + "_" + formatMonth
  264. //在更新状态时需要计算间隔时间,如果T_ut时间和当前时间间隔超过40天就不用更新warning表,反之
  265. //获得当前之间计算两个时间之间的间隔
  266. now := time.Now()
  267. interval := now.Sub(parse)
  268. if interval.Hours() > 40*24 {
  269. o.Raw("UPDATE warning SET t__state = 0 WHERE t_pid = ? AND ID = ?", pid, atoi).Exec()
  270. } else {
  271. o.Raw("UPDATE "+Wtab+" SET t__state = 0 WHERE t_pid = ? AND ID = ?", pid, atoi).Exec()
  272. o.Raw("UPDATE warning SET t__state = 0 WHERE t_pid = ? AND ID = ?", pid, atoi).Exec()
  273. }
  274. return
  275. }
  276. func DeleteWarning(sn, ut string, id int) error {
  277. o := orm.NewOrm()
  278. layout := "2006-01-02 15:04:05"
  279. parse, _ := time.Parse(layout, ut)
  280. year := parse.Year()
  281. formatMonth := parse.Format("01")
  282. years := strconv.Itoa(year)
  283. Wtab := "warning_" + years + "_" + formatMonth
  284. sql1 := fmt.Sprintf("DELETE FROM %v WHERE t_sn='%v' AND t__ut='%v' AND t_id = '%v'", Wtab, sn, ut, id)
  285. sql2 := fmt.Sprintf("DELETE FROM warning WHERE t_sn='%v' AND t__ut='%v' AND t_id = '%v'", sn, ut, id)
  286. _, err := o.Raw(sql1).Exec()
  287. _, err = o.Raw(sql2).Exec()
  288. if err != nil {
  289. return errors.New("删除失败")
  290. }
  291. return nil
  292. }
  293. // Update_DeviceParameter_Warning更新
  294. func Update_DeviceParameter_Warning(columnName, newValue, rowId, T_Ut string) {
  295. o := orm.NewOrm()
  296. layout := "2006-01-02 15:04:05"
  297. parse, _ := time.Parse(layout, T_Ut)
  298. year := parse.Year()
  299. formatMonth := parse.Format("01")
  300. years := strconv.Itoa(year)
  301. Wtab := "warning_" + years + "_" + formatMonth
  302. //在更新状态时需要计算间隔时间,如果T_ut时间和当前时间间隔超过40天就不用更新warning表,反之
  303. //获得当前之间计算两个时间之间的间隔
  304. if columnName == "T_tp_name" {
  305. columnName = "t_tp"
  306. }
  307. now := time.Now()
  308. interval := now.Sub(parse)
  309. //if columnName == "t__d_name,t_sn" {
  310. // splits := strings.Split(columnName, ",")
  311. // Value := strings.Split(newValue, ",")
  312. // log.Printf(splits[0], splits[1], Value[0], Value[1])
  313. // if interval.Hours() > 40*24 {
  314. // o.Raw("UPDATE "+Wtab+" SET `"+splits[0]+"` = ?, `"+splits[1]+"` = ? WHERE `ID` = ?", Value[0], Value[1], rowId).Exec()
  315. // } else {
  316. // o.Raw("UPDATE "+Wtab+" SET `"+splits[0]+"` = ?, `"+splits[1]+"` = ? WHERE `ID` = ?", Value[0], Value[1], rowId).Exec()
  317. // o.Raw("UPDATE warning SET `"+splits[0]+"` = ?,`"+splits[1]+"`=? WHERE `ID` = ?", Value[0], Value[1], rowId).Exec()
  318. // }
  319. // return
  320. //}
  321. //if columnName == "t__d_s_name,t_id" {
  322. // splits := strings.Split(columnName, ",")
  323. // Value := strings.Split(newValue, ",")
  324. // log.Printf(splits[0], splits[1], Value[0], Value[1])
  325. // if interval.Hours() > 40*24 {
  326. // o.Raw("UPDATE "+Wtab+" SET `"+splits[0]+"` = ?, `"+splits[1]+"` = ? WHERE `ID` = ?", Value[0], Value[1], rowId).Exec()
  327. // } else {
  328. // o.Raw("UPDATE "+Wtab+" SET `"+splits[0]+"` = ?, `"+splits[1]+"` = ? WHERE `ID` = ?", Value[0], Value[1], rowId).Exec()
  329. // o.Raw("UPDATE warning SET `"+splits[0]+"` = ?,`"+splits[1]+"`=? WHERE `ID` = ?", Value[0], Value[1], rowId).Exec()
  330. // }
  331. // return
  332. //}
  333. if columnName == "t_sn" {
  334. var t__d_name string
  335. sql := "SELECT t_name FROM device_parameter WHERE t_sn=" + newValue + " LIMIT 1"
  336. o.Raw(sql).QueryRow(&t__d_name)
  337. if interval.Hours() > 40*24 {
  338. o.Raw("UPDATE "+Wtab+" SET `"+columnName+"` = ? , `t__d_name` = ? WHERE `ID` = ?", newValue, t__d_name, rowId).Exec()
  339. } else {
  340. o.Raw("UPDATE "+Wtab+" SET `"+columnName+"` = ? , `t__d_name` = ? WHERE `ID` = ?", newValue, t__d_name, rowId).Exec()
  341. o.Raw("UPDATE warning SET `"+columnName+"` = ? , `t__d_name` = ? WHERE `ID` = ?", newValue, t__d_name, rowId).Exec()
  342. }
  343. return
  344. }
  345. if interval.Hours() > 40*24 {
  346. o.Raw("UPDATE "+Wtab+" SET `"+columnName+"` = ? WHERE `ID` = ?", newValue, rowId).Exec()
  347. } else {
  348. o.Raw("UPDATE "+Wtab+" SET `"+columnName+"` = ? WHERE `ID` = ?", newValue, rowId).Exec()
  349. o.Raw("UPDATE warning SET `"+columnName+"` = ? WHERE `ID` = ?", newValue, rowId).Exec()
  350. }
  351. }
  352. // 修改
  353. func Update_Warning_Backups(r Warning, T_year string, T_month string) bool {
  354. o := orm.NewOrm()
  355. Wtab := "warning_" + T_year + "_" + T_month
  356. num, err := o.Raw("UPDATE "+Wtab+" SET `t__text` = ?,`t__state` = ? WHERE `ID` = ?", r.T_Text, r.T_State, r.Id).Exec()
  357. if err != nil {
  358. logs.Error(lib.FuncName(), err)
  359. return false
  360. }
  361. fmt.Println("Number of records updated in database:", num)
  362. return true
  363. }
  364. // 获取列表
  365. func Read_Warning_List(T_pid int, bindSN, tpList []string, Time_start_ string, Time_end_ string, t_tp, page int, page_z int) (r []Warning_R, cnt int64) {
  366. o := orm.NewOrm()
  367. // 也可以直接使用 Model 结构体作为表名
  368. var map_r []Warning
  369. qs := o.QueryTable(new(Warning))
  370. var offset int64
  371. if page <= 1 {
  372. offset = 0
  373. } else {
  374. offset = int64((page - 1) * page_z)
  375. }
  376. cond1 := orm.NewCondition()
  377. if len(bindSN) > 0 {
  378. cond1 = cond1.And("T_sn__in", bindSN)
  379. }
  380. if T_pid > 0 {
  381. cond1 = cond1.And("T_pid", T_pid)
  382. }
  383. if len(tpList) > 0 {
  384. cond1 = cond1.And("T_tp__in", tpList)
  385. }
  386. if len(Time_start_) > 0 {
  387. cond1 = cond1.And("T_Ut__gte", Time_start_)
  388. }
  389. if len(Time_end_) > 0 {
  390. cond1 = cond1.And("T_Ut__lte", Time_end_)
  391. }
  392. if t_tp > 0 {
  393. cond1 = cond1.And("T_tp", t_tp)
  394. }
  395. var err error
  396. if page_z == 9999 {
  397. // 获取全部
  398. _, err = qs.SetCond((*orm2.Condition)(cond1)).OrderBy("-T_Ut").All(&map_r)
  399. } else {
  400. _, err = qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-T_Ut").All(&map_r)
  401. }
  402. if err != nil {
  403. logs.Error(lib.FuncName(), err)
  404. return
  405. }
  406. cnt, err = qs.SetCond((*orm2.Condition)(cond1)).Count()
  407. if err != nil {
  408. logs.Error(lib.FuncName(), err)
  409. return
  410. }
  411. for _, v := range map_r {
  412. r = append(r, WarningToWarning_R(0, v))
  413. }
  414. return r, cnt
  415. }
  416. // 获取列表备份
  417. func Read_Warning_Backups(T_pid int, bindSN []string, T_year string, T_month string, tpList []string, T_name string, T_handle int, Time_start_ string, Time_end_ string, page int, page_z int) (r []Warning_R, cnt int64) {
  418. o := orm.NewOrm()
  419. var maps []Warning
  420. var maps_z []orm2.ParamsList
  421. // 也可以直接使用 Model 结构体作为表名
  422. // Warning_2022_07
  423. Wtab := "warning_" + T_year + "_" + T_month
  424. var offset int
  425. if page <= 1 {
  426. offset = 0
  427. } else {
  428. offset = (page - 1) * page_z
  429. }
  430. sql_WHERE := ""
  431. //cond := orm.NewCondition()
  432. //
  433. //cond1 := cond.And("T_State__gt", 0)
  434. sql_WHERE += " t__state > 0"
  435. if len(bindSN) > 0 {
  436. sql_WHERE += fmt.Sprintf(" AND t_sn in (%s)", lib.StringListToQuotesDotStr(bindSN))
  437. }
  438. if T_pid > 0 {
  439. sql_WHERE += " AND t_pid = " + strconv.Itoa(T_pid)
  440. }
  441. if len(tpList) > 0 {
  442. tp := lib.StringListToDotStr(tpList)
  443. sql_WHERE += fmt.Sprintf(" AND t_tp in (%s)", tp)
  444. }
  445. if len(T_name) > 0 {
  446. sql_WHERE += " AND (t_sn like '%" + T_name + "%' OR t__d_name like '%" + T_name + "%' OR t_id like '%" + T_name + "%' OR t__d_s_name like '%" + T_name + "%')"
  447. }
  448. if len(Time_start_) > 0 {
  449. //cond1 = cond1.And("T_Ut__gte", Time_start_)
  450. Time_start_ = lib.ReplaceSQL(Time_start_)
  451. sql_WHERE += fmt.Sprintf(" AND t__ut >= '%s'", Time_start_)
  452. }
  453. if len(Time_end_) > 0 {
  454. //cond1 = cond1.And("T_Ut__lte", Time_end_)
  455. Time_end_ = lib.ReplaceSQL(Time_end_)
  456. sql_WHERE += fmt.Sprintf(" AND t__ut <= '%s'", Time_end_)
  457. }
  458. //不填或0:所有 1:已处理 2:未处理
  459. if T_handle == 1 {
  460. //cond1 = cond1.And("T_Text__isnull", true)
  461. sql_WHERE += " AND t__state > 1"
  462. }
  463. if T_handle == 3 {
  464. //cond1 = cond1.And("T_Text__isnull", false).And("T_State", 2)
  465. sql_WHERE += " AND t__state = 3"
  466. }
  467. // -------------
  468. sql := "SELECT COUNT(ID) FROM " + Wtab + " WHERE " + sql_WHERE
  469. fmt.Println(sql)
  470. _, err := o.Raw(sql).ValuesList(&maps_z)
  471. if err != nil {
  472. logs.Error(lib.FuncName(), err)
  473. return r, 0
  474. }
  475. if len(maps_z) == 0 {
  476. return r, 0
  477. }
  478. //fmt.Println("maps_z;",maps_z[0][0])
  479. sql = "SELECT ID,t_pid,t_tp,t_sn,t__d_name,t_id,t__d_s_name,t__remark,t__ut,t__text,t__log,t__msid,t__state,create_time,update_time " +
  480. "FROM " + Wtab + " WHERE" + sql_WHERE + " ORDER BY t__ut DESC"
  481. if page_z != 9999 {
  482. sql = sql + " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(page_z)
  483. }
  484. fmt.Println(sql)
  485. _, err = o.Raw(sql).QueryRows(&maps)
  486. if err != nil {
  487. logs.Error(lib.FuncName(), err)
  488. return
  489. }
  490. key, _ := strconv.ParseInt(maps_z[0][0].(string), 10, 64)
  491. for _, v := range maps {
  492. r = append(r, WarningToWarning_R(1, v))
  493. }
  494. return r, key
  495. }
  496. // 获取管理员列表备份
  497. func Read_Admin_Warning_Backups(T_pids string, T_year string, T_month string, T_tp []string, T_name string, T_handle int, Time_start_ string, Time_end_ string, page int, page_z int) (r []Warning_R, cnt int64) {
  498. if len(T_pids) == 0 {
  499. return r, cnt
  500. }
  501. o := orm.NewOrm()
  502. var maps []Warning
  503. var maps_z []orm2.ParamsList
  504. // 也可以直接使用 Model 结构体作为表名
  505. // Warning_2022_07
  506. Wtab := "warning_" + T_year + "_" + T_month
  507. var offset int
  508. if page_z == 0 {
  509. page_z = conf.Page_size
  510. }
  511. if page <= 1 {
  512. offset = 0
  513. } else {
  514. offset = (page - 1) * page_z
  515. }
  516. sql_WHERE := ""
  517. sql_WHERE += " t__state > 0"
  518. if T_pids != "*" {
  519. list := lib.SplitStringToDotStr(T_pids, "P")
  520. sql_WHERE += fmt.Sprintf(" AND t_pid in (%s)", list)
  521. }
  522. if len(T_tp) > 0 {
  523. tp := lib.StringListToDotStr(T_tp)
  524. sql_WHERE += fmt.Sprintf(" AND t_tp in (%s)", tp)
  525. }
  526. if len(T_name) > 0 {
  527. sql_WHERE += " AND (t_sn like '%" + T_name + "%' OR t__d_name like '%" + T_name + "%' OR t_id like '%" + T_name + "%' OR t__d_s_name like '%" + T_name + "%')"
  528. }
  529. if len(Time_start_) > 0 {
  530. //cond1 = cond1.And("T_Ut__gte", Time_start_)
  531. Time_start_ = lib.ReplaceSQL(Time_start_)
  532. sql_WHERE += fmt.Sprintf(" AND t__ut >= '%s'", Time_start_)
  533. }
  534. if len(Time_end_) > 0 {
  535. //cond1 = cond1.And("T_Ut__lte", Time_end_)
  536. Time_end_ = lib.ReplaceSQL(Time_end_)
  537. sql_WHERE += fmt.Sprintf(" AND t__ut <= '%s'", Time_end_)
  538. }
  539. //1:默认 2:全部记录 3 未处理
  540. if T_handle == 1 {
  541. //cond1 = cond1.And("T_Text__isnull", true)
  542. sql_WHERE += " AND t__state > 1"
  543. }
  544. if T_handle == 3 {
  545. //cond1 = cond1.And("T_Text__isnull", false).And("T_State", 2)
  546. sql_WHERE += " AND t__state = 3"
  547. }
  548. // -------------
  549. sql := "SELECT COUNT(ID) FROM " + Wtab + " WHERE" + sql_WHERE
  550. fmt.Println(sql)
  551. _, err := o.Raw(sql).ValuesList(&maps_z)
  552. if err != nil {
  553. logs.Error(lib.FuncName(), err)
  554. return r, 0
  555. }
  556. if len(maps_z) == 0 {
  557. return r, 0
  558. }
  559. //fmt.Println("maps_z;",maps_z[0][0])
  560. sql = "SELECT ID,t_pid,t_tp,t_sn,t__d_name,t_id,t__d_s_name,t__remark,t__ut,t__text,t__log,t__msid,t__state,create_time,update_time " +
  561. "FROM " + Wtab + " WHERE" + sql_WHERE + " ORDER BY t__ut DESC"
  562. if page_z != 9999 {
  563. sql = sql + " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(page_z)
  564. }
  565. fmt.Println(sql)
  566. _, err = o.Raw(sql).QueryRows(&maps)
  567. if err != nil {
  568. logs.Error(lib.FuncName(), err)
  569. return
  570. }
  571. key, _ := strconv.ParseInt(maps_z[0][0].(string), 10, 64)
  572. for _, v := range maps {
  573. r = append(r, WarningToWarning_R(1, v))
  574. }
  575. return r, key
  576. }
  577. func Read_Warning_ALL_T_State_Count(T_pid int, T_pids []int, T_handle int, bindSN []string, T_Warning string, Is_Today bool) (cnt int64) {
  578. o := orm.NewOrm()
  579. qs := o.QueryTable(new(Warning))
  580. cond := orm.NewCondition()
  581. cond1 := cond.And("T_State__gt", 0)
  582. if T_pid > 0 {
  583. cond1 = cond1.And("T_pid", T_pid)
  584. }
  585. if T_pid == 0 {
  586. cond1 = cond1.And("T_pid__in", T_pids)
  587. }
  588. if len(bindSN) > 0 {
  589. cond1 = cond1.And("T_sn__in", bindSN)
  590. }
  591. if Is_Today {
  592. startTime := time.Now().Format("2006-01-02") + " 00:00:00"
  593. endTime := time.Now().Format("2006-01-02") + " 23:59:59"
  594. cond1 = cond1.And("T_Ut__gte", startTime).And("T_Ut__lte", endTime)
  595. }
  596. if len(T_Warning) > 0 && T_Warning != "*" {
  597. list := lib.SplitStringIds(T_Warning, "W")
  598. cond1 = cond1.And("T_tp__in", list)
  599. }
  600. // T_State 0 删除 1 不处理 2 已处理 3 未处理
  601. // T_handle 1:默认 2:全部记录 3 未处理
  602. if T_handle == 1 {
  603. cond1 = cond1.And("T_State__gt", 1)
  604. }
  605. if T_handle == 3 {
  606. cond1 = cond1.And("T_State", 3)
  607. }
  608. cnt, err := qs.SetCond((*orm2.Condition)(cond1)).Count()
  609. if err != nil {
  610. logs.Error(lib.FuncName(), err)
  611. }
  612. return cnt
  613. }
  614. // 设备日志
  615. type DeviceLogs struct {
  616. Id int64
  617. T_sn string //
  618. Logs_Txt string // 详情
  619. CreateTime string
  620. }
  621. func WarningToDeviceLogs(t Warning) (r DeviceLogs) {
  622. r.Id = t.Id
  623. r.T_sn = t.T_sn
  624. r.Logs_Txt = t.T_Remark
  625. r.CreateTime = t.CreateTime.Format("2006-01-02 15:04:05")
  626. return r
  627. }
  628. // 获取列表
  629. func Read_DeviceLogs_List(T_sn string, page, page_z int) (r []DeviceLogs, cnt int64) {
  630. o := orm.NewOrm()
  631. // 也可以直接使用 Model 结构体作为表名
  632. qs := o.QueryTable(new(Warning))
  633. var maps []Warning
  634. var offset int64
  635. if page <= 1 {
  636. offset = 0
  637. } else {
  638. offset = int64((page - 1) * page_z)
  639. }
  640. _, err := qs.Limit(page_z, offset).Filter("T_sn", T_sn).Filter("T_tp__in", DeviceLogType).OrderBy("-Id").All(&maps)
  641. if err != nil {
  642. logs.Error(lib.FuncName(), err)
  643. return
  644. }
  645. cnt, err = qs.Filter("T_sn", T_sn).Filter("T_tp__in", DeviceLogType).Count()
  646. if err != nil {
  647. logs.Error(lib.FuncName(), err)
  648. return
  649. }
  650. for _, v := range maps {
  651. r = append(r, WarningToDeviceLogs(v))
  652. }
  653. return r, cnt
  654. }
  655. // 通过传感器类型获取报警列表
  656. func Read_Warning_List_By_DS_T_type(T_pid int, bindSN []string, DS_T_type int, T_name string, page int, page_z int) (r []Warning_Applet, cnt int64) {
  657. o := orm.NewOrm()
  658. // 也可以直接使用 Model 结构体作为表名
  659. var maps []Warning
  660. var maps_z []orm2.ParamsList
  661. var offset int
  662. if page <= 1 {
  663. offset = 0
  664. } else {
  665. offset = (page - 1) * page_z
  666. }
  667. // T_State 0 删除 1 不处理 2 已处理 3 未处理
  668. sql_WHERE := " t__state > 1 AND t_pid = " + strconv.Itoa(T_pid)
  669. if len(bindSN) > 0 {
  670. sql_WHERE += fmt.Sprintf(" AND t_sn in (%s)", lib.StringListToQuotesDotStr(bindSN))
  671. }
  672. if DS_T_type > 0 {
  673. sql_WHERE += " AND ds.t_type = " + strconv.Itoa(DS_T_type)
  674. }
  675. if len(T_name) > 0 {
  676. sql_WHERE += " AND (t_sn like '%" + T_name + "%' OR t__d_name like '%" + T_name + "%' OR t_id like '%" + T_name + "%' OR t__d_s_name like '%" + T_name + "%')"
  677. }
  678. sql := "SELECT COUNT(w.ID) FROM warning w " +
  679. "LEFT JOIN ( SELECT t_sn AS tsn,t_id AS tid,t_type FROM device_sensor) AS ds " +
  680. "ON w.t_sn = ds.tsn AND w.t_id = ds.tid " +
  681. "WHERE " + sql_WHERE
  682. fmt.Println(sql)
  683. _, err := o.Raw(sql).ValuesList(&maps_z)
  684. if err != nil {
  685. logs.Error(lib.FuncName(), err)
  686. return r, 0
  687. }
  688. if len(maps_z) == 0 {
  689. return r, 0
  690. }
  691. sql = "SELECT * FROM warning w " +
  692. "LEFT JOIN ( SELECT t_sn AS tsn,t_id AS tid,t_type FROM device_sensor) AS ds " +
  693. "ON w.t_sn = ds.tsn AND w.t_id = ds.tid " +
  694. "WHERE " + sql_WHERE + " ORDER BY t__ut DESC"
  695. if page_z != 9999 {
  696. sql = sql + " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(page_z)
  697. }
  698. fmt.Println(sql)
  699. _, err = o.Raw(sql).QueryRows(&maps)
  700. if err != nil {
  701. logs.Error(lib.FuncName(), err)
  702. return
  703. }
  704. for _, v := range maps {
  705. r = append(r, WarningToWarning_Applet(v))
  706. }
  707. cnt, _ = strconv.ParseInt(maps_z[0][0].(string), 10, 64)
  708. return r, cnt
  709. }
  710. // 获取当天设备报警总数
  711. func Read_WarningCount_byDay(T_pids []int) (cnt int64) {
  712. o := orm.NewOrm()
  713. qs := o.QueryTable(new(Warning))
  714. cond := orm.NewCondition()
  715. yesterday := time.Now().AddDate(0, 0, -1).Format("2006-01-02")
  716. cond = cond.And("T_State__gt", 0).And("T_pid__in", T_pids).And("T_tp__in", RateType).And("CreateTime__gte", yesterday+" 00:00:00").And("CreateTime__lte", yesterday+" 23:59:59")
  717. cnt, err := qs.SetCond((*orm2.Condition)(cond)).Count()
  718. if err != nil {
  719. logs.Error(lib.FuncName(), err)
  720. }
  721. return cnt
  722. }
  723. // 公司管理报警列表
  724. func Read_Company_Warning_List(T_pids []int, T_tp []string, T_name string, T_handle int, Time_start_ string, Time_end_ string, page int, page_z int) (r []CompanyWarning_R, cnt int64) {
  725. o := orm.NewOrm()
  726. // 也可以直接使用 Model 结构体作为表名
  727. var map_r []Warning
  728. qs := o.QueryTable(new(Warning))
  729. var offset int64
  730. if page_z == 0 {
  731. page_z = conf.Page_size
  732. }
  733. if page <= 1 {
  734. offset = 0
  735. } else {
  736. offset = int64((page - 1) * page_z)
  737. }
  738. cond := orm.NewCondition()
  739. cond1 := orm.NewCondition()
  740. cond1 = cond1.And("T_pid__in", T_pids)
  741. if len(T_tp) > 0 {
  742. cond1 = cond1.And("T_tp__in", T_tp)
  743. }
  744. if len(T_name) > 0 {
  745. if len(T_name) == 16 {
  746. cond1 = cond1.And("T_sn", T_name)
  747. } else {
  748. cond1 = cond1.AndCond(cond.Or("T_sn__icontains", T_name).
  749. Or("T_D_name__icontains", T_name).
  750. Or("T_id__icontains", T_name).
  751. Or("T_DS_name__icontains", T_name))
  752. }
  753. }
  754. if len(Time_start_) > 0 {
  755. cond1 = cond1.And("T_Ut__gte", Time_start_)
  756. }
  757. if len(Time_end_) > 0 {
  758. cond1 = cond1.And("T_Ut__lte", Time_end_)
  759. }
  760. //1:默认 2:全部记录 3 未处理
  761. if T_handle == 1 {
  762. cond1 = cond1.And("T_State__gt", 1)
  763. }
  764. if T_handle == 2 {
  765. cond1 = cond1.And("T_State__gt", 0)
  766. }
  767. if T_handle == 3 {
  768. cond1 = cond1.And("T_State", 3)
  769. }
  770. _, err := qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-T_Ut").All(&map_r)
  771. if err != nil {
  772. logs.Error(lib.FuncName(), err)
  773. }
  774. cnt, err = qs.SetCond((*orm2.Condition)(cond1)).Count()
  775. if err != nil {
  776. logs.Error(lib.FuncName(), err)
  777. return
  778. }
  779. for _, v := range map_r {
  780. r = append(r, WarningToCompanyWarning_R(0, v))
  781. }
  782. return r, cnt
  783. }
  784. // 获取公司管理列表备份
  785. func Read_Company_Warning_Backups(T_pids []int, T_year string, T_month string, T_tp []string, T_name string, T_handle int, Time_start_ string, Time_end_ string, page int, page_z int) (r []CompanyWarning_R, cnt int64) {
  786. if len(T_pids) == 0 {
  787. return r, cnt
  788. }
  789. o := orm.NewOrm()
  790. var maps []Warning
  791. var maps_z []orm2.ParamsList
  792. // 也可以直接使用 Model 结构体作为表名
  793. // Warning_2022_07
  794. Wtab := "warning_" + T_year + "_" + T_month
  795. var offset int
  796. if page_z == 0 {
  797. page_z = conf.Page_size
  798. }
  799. if page <= 1 {
  800. offset = 0
  801. } else {
  802. offset = (page - 1) * page_z
  803. }
  804. sql_WHERE := ""
  805. sql_WHERE += " t__state > 0"
  806. if len(T_pids) > 0 {
  807. sql_WHERE += fmt.Sprintf(" AND t_pid in (%s)", lib.IntListToDotStr(T_pids))
  808. }
  809. if len(T_tp) > 0 {
  810. tp := lib.StringListToDotStr(T_tp)
  811. sql_WHERE += fmt.Sprintf(" AND t_tp in (%s)", tp)
  812. }
  813. if len(T_name) > 0 {
  814. sql_WHERE += " AND (t_sn like '%" + T_name + "%' OR t__d_name like '%" + T_name + "%' OR t_id like '%" + T_name + "%' OR t__d_s_name like '%" + T_name + "%')"
  815. }
  816. if len(Time_start_) > 0 {
  817. //cond1 = cond1.And("T_Ut__gte", Time_start_)
  818. Time_start_ = lib.ReplaceSQL(Time_start_)
  819. sql_WHERE += fmt.Sprintf(" AND t__ut >= '%s'", Time_start_)
  820. }
  821. if len(Time_end_) > 0 {
  822. //cond1 = cond1.And("T_Ut__lte", Time_end_)
  823. Time_end_ = lib.ReplaceSQL(Time_end_)
  824. sql_WHERE += fmt.Sprintf(" AND t__ut <= '%s'", Time_end_)
  825. }
  826. //1:默认 2:全部记录 3 未处理
  827. if T_handle == 1 {
  828. //cond1 = cond1.And("T_Text__isnull", true)
  829. sql_WHERE += " AND t__state > 1"
  830. }
  831. if T_handle == 3 {
  832. //cond1 = cond1.And("T_Text__isnull", false).And("T_State", 2)
  833. sql_WHERE += " AND t__state = 3"
  834. }
  835. // -------------
  836. sql := "SELECT COUNT(ID) FROM " + Wtab + " WHERE" + sql_WHERE
  837. fmt.Println(sql)
  838. _, err := o.Raw(sql).ValuesList(&maps_z)
  839. if err != nil {
  840. logs.Error(lib.FuncName(), err)
  841. return r, 0
  842. }
  843. if len(maps_z) == 0 {
  844. return r, 0
  845. }
  846. //fmt.Println("maps_z;",maps_z[0][0])
  847. sql = "SELECT ID,t_pid,t_tp,t_sn,t__d_name,t_id,t__d_s_name,t__remark,t__ut,t__text,t__log,t__msid,t__state,create_time,update_time " +
  848. "FROM " + Wtab + " WHERE" + sql_WHERE + " ORDER BY t__ut DESC"
  849. if page_z != 9999 {
  850. sql = sql + " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(page_z)
  851. }
  852. fmt.Println(sql)
  853. _, err = o.Raw(sql).QueryRows(&maps)
  854. if err != nil {
  855. logs.Error(lib.FuncName(), err)
  856. return
  857. }
  858. key, _ := strconv.ParseInt(maps_z[0][0].(string), 10, 64)
  859. for _, v := range maps {
  860. r = append(r, WarningToCompanyWarning_R(1, v))
  861. }
  862. return r, key
  863. }