Warning.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536
  1. package Warning
  2. import (
  3. "Cold_Api/conf"
  4. "Cold_Api/controllers/lib"
  5. "Cold_Api/logs"
  6. "Cold_Api/models"
  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. // 模板
  16. type Warning struct {
  17. Id int `orm:"column(ID);size(11);auto;pk"`
  18. T_pid int `orm:"index;size(256);null"` // Account.Company 绑定公司
  19. T_tp int `orm:"index;size(200);null"` // 报警类型 ->WarningList
  20. T_sn string `orm:"index;size(256);null"` // 设备序列号
  21. T_D_name string `orm:"size(256);null"` // 设备名称
  22. T_id int `orm:"index;size(200);null"` // 传感器 ID
  23. T_DS_name string `orm:"size(256);null"` // 传感器名称
  24. T_Remark string `orm:"type(text);null"` // 采集内容
  25. T_Ut time.Time `orm:"index;type(timestamp);null;"` // 采集时间
  26. T_fUt time.Time `orm:"type(timestamp);null;"` // 首次采集时间
  27. T_Text string `orm:"type(text);null"` // 处理备注
  28. T_Log string `orm:"type(text);null"` // 通知日志
  29. T_Msid int64 `orm:"size(256);null"` // 消息ID
  30. T_State int `orm:"size(2);default(2)"` // 0 删除 1 不处理 2 已处理 3 未处理
  31. CreateTime time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now_add 第一次保存时才设置时间
  32. UpdateTime time.Time `orm:"column(update_time);type(timestamp);null;auto_now"` //auto_now 每次 model 保存时都会对时间自动更新
  33. }
  34. /*
  35. 分表机制
  36. |--------30天--------|
  37. |-----8月---||--------7月---------||--------6月---------||--------5月---------|
  38. 每天备份 到对应 月份
  39. */
  40. // 模板
  41. type Warning_R struct {
  42. Id int
  43. T_pid int // Account.Company 绑定公司
  44. T_tp int // 报警类型 ->WarningList
  45. T_tp_name string // 报警类型名称
  46. T_sn string // 设备序列号
  47. T_D_name string // 设备名称
  48. T_id int // 传感器 ID
  49. T_DS_name string // 传感器名称
  50. T_Remark string // 采集内容
  51. T_Ut string // 采集时间
  52. T_Text string // 处理备注
  53. T_Log []string // 处理日志
  54. T_Msid int64 // 消息ID
  55. T_State int // 0 删除 1 未处理 2 已处理
  56. CreateTime string // 创建时间
  57. }
  58. func (t *Warning) TableName() string {
  59. return "warning" // 数据库名称 // ************** 替换 FormulaList **************
  60. }
  61. func init() {
  62. //注册模型
  63. orm.RegisterModel(new(Warning))
  64. }
  65. // ---------------- 特殊方法 -------------------
  66. func WarningToWarning_R(t Warning) (r Warning_R) {
  67. r.Id = t.Id
  68. r.T_pid = t.T_pid
  69. r.T_tp = t.T_tp
  70. r.T_tp_name = Read_WarningType_Get(t.T_tp)
  71. r.T_sn = t.T_sn
  72. r.T_D_name = t.T_D_name
  73. r.T_id = t.T_id
  74. r.T_DS_name = t.T_DS_name
  75. r.T_Remark = t.T_Remark
  76. r.T_Ut = t.T_Ut.Format("2006-01-02 15:04:05")
  77. r.T_Text = t.T_Text
  78. if len(t.T_Log) > 0 {
  79. r.T_Log = strings.Split(strings.TrimRight(t.T_Log, "\n"), "\n")
  80. }
  81. r.T_Msid = t.T_Msid
  82. r.T_State = t.T_State
  83. r.CreateTime = t.CreateTime.Format("2006-01-02 15:04:05")
  84. return r
  85. }
  86. // 获取 ById
  87. func Read_Warning_ById(id int) (r Warning) {
  88. o := orm.NewOrm()
  89. r = Warning{Id: id}
  90. err := o.Read(&r) // o.Read(&r,"Tokey") 如果不是 主键 就得指定字段名
  91. if err != nil {
  92. logs.Error("Read_Warning_ById", err)
  93. }
  94. return r
  95. }
  96. // 添加
  97. func Add_Warning(m Warning) (id int64, err error) {
  98. o := orm.NewOrm()
  99. id, err = o.Insert(&m)
  100. if err != nil {
  101. logs.Error("Read_Warning_ById", err)
  102. }
  103. return id, err
  104. }
  105. // 修改
  106. func Update_Warning(r Warning, cols ...string) bool {
  107. o := orm.NewOrm()
  108. num, err := o.Update(&r, cols...)
  109. if err != nil {
  110. logs.Error("Update_Warning", err)
  111. return false
  112. }
  113. fmt.Println("Number of records updated in database:", num)
  114. return true
  115. }
  116. // 获取列表
  117. func Read_Warning_List(T_pid int, T_tp, T_name string, T_handle int, Time_start_ string, Time_end_ string, page int, page_z int) (r []Warning_R, cnt int64) {
  118. o := orm.NewOrm()
  119. // 也可以直接使用 Model 结构体作为表名
  120. var map_r []Warning
  121. qs := o.QueryTable(new(Warning))
  122. var offset int64
  123. if page <= 1 {
  124. offset = 0
  125. } else {
  126. offset = int64((page - 1) * page_z)
  127. }
  128. cond := orm.NewCondition()
  129. cond1 := cond.And("T_State__gt", 0)
  130. if T_pid > 0 {
  131. cond1 = cond.AndCond(cond1).And("T_pid", T_pid)
  132. }
  133. if len(T_tp) > 0 {
  134. list := models.SplitStringIds(T_tp, "T")
  135. cond1 = cond1.And("T_tp__in", list)
  136. }
  137. if len(T_name) > 0 {
  138. cond1 = cond1.AndCond(cond.Or("T_sn__icontains", T_name).Or("T_D_name__icontains", T_name).Or("T_id__icontains", T_name).Or("T_DS_name", T_name))
  139. }
  140. if len(Time_start_) > 0 {
  141. cond1 = cond1.And("T_Ut__gte", Time_start_)
  142. }
  143. if len(Time_end_) > 0 {
  144. cond1 = cond1.And("T_Ut__lte", Time_end_)
  145. }
  146. // T_State 0 删除 1 不处理 2 已处理 3 未处理
  147. // T_handle 1:默认 2:全部记录 3 未处理
  148. if T_handle == 1 {
  149. cond1 = cond1.And("T_State__gt", 1)
  150. }
  151. if T_handle == 3 {
  152. cond1 = cond1.And("T_State", 3)
  153. }
  154. _, err := qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-T_Ut").All(&map_r)
  155. if err != nil {
  156. logs.Error("Read_Warning_List", err)
  157. return
  158. }
  159. cnt, err = qs.SetCond((*orm2.Condition)(cond1)).Count()
  160. if err != nil {
  161. logs.Error("Read_Warning_List Count", err)
  162. return
  163. }
  164. for _, v := range map_r {
  165. r = append(r, WarningToWarning_R(v))
  166. }
  167. return r, cnt
  168. }
  169. // 管理员报警列表
  170. func Read_Admin_Warning_List(T_pids, T_tp, T_name string, T_handle int, Time_start_ string, Time_end_ string, page int, page_z int) (r []Warning_R, cnt int64) {
  171. if len(T_pids) == 0 {
  172. return r, cnt
  173. }
  174. o := orm.NewOrm()
  175. // 也可以直接使用 Model 结构体作为表名
  176. var map_r []Warning
  177. qs := o.QueryTable(new(Warning))
  178. var offset int64
  179. if page_z == 0 {
  180. page_z = conf.Page_size
  181. }
  182. if page <= 1 {
  183. offset = 0
  184. } else {
  185. offset = int64((page - 1) * page_z)
  186. }
  187. cond := orm.NewCondition()
  188. cond1 := cond.And("T_State__gt", 0)
  189. if T_pids != "*" {
  190. list := models.SplitStringIds(T_pids, "P")
  191. cond1 = cond1.And("T_pid__in", list)
  192. }
  193. if len(T_tp) > 0 {
  194. list := models.SplitStringIds(T_tp, "T")
  195. cond1 = cond1.And("T_tp__in", list)
  196. }
  197. if len(T_name) > 0 {
  198. cond1 = cond1.AndCond(cond.Or("T_sn__icontains", T_name).Or("T_D_name__icontains", T_name).Or("T_id__icontains", T_name).Or("T_DS_name", T_name))
  199. }
  200. if len(Time_start_) > 0 {
  201. cond1 = cond1.And("T_Ut__gte", Time_start_)
  202. }
  203. if len(Time_end_) > 0 {
  204. cond1 = cond1.And("T_Ut__lte", Time_end_)
  205. }
  206. //1:默认 2:全部记录 3 未处理
  207. if T_handle == 1 {
  208. cond1 = cond1.And("T_State__gt", 1)
  209. }
  210. if T_handle == 3 {
  211. cond1 = cond1.And("T_State", 3)
  212. }
  213. _, err := qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond1)).OrderBy("-T_Ut").All(&map_r)
  214. if err != nil {
  215. logs.Error("Read_Admin_Warning_List", err)
  216. }
  217. cnt, err = qs.SetCond((*orm2.Condition)(cond1)).Count()
  218. if err != nil {
  219. logs.Error("Read_Admin_Warning_List Count", err)
  220. return
  221. }
  222. for _, v := range map_r {
  223. r = append(r, WarningToWarning_R(v))
  224. }
  225. return r, cnt
  226. }
  227. // 获取列表备份
  228. func Read_Warning_Backups(T_pid int, T_year string, T_month string, T_tp, T_name string, T_handle int, Time_start_ string, Time_end_ string, page int, page_z int) (r []Warning_R, cnt int64) {
  229. o := orm.NewOrm()
  230. var maps []Warning
  231. var maps_z []orm2.ParamsList
  232. // 也可以直接使用 Model 结构体作为表名
  233. // Warning_2022_07
  234. Wtab := "warning_" + T_year + "_" + T_month
  235. var offset int
  236. if page <= 1 {
  237. offset = 0
  238. } else {
  239. offset = (page - 1) * page_z
  240. }
  241. sql_WHERE := ""
  242. //cond := orm.NewCondition()
  243. //
  244. //cond1 := cond.And("T_State__gt", 0)
  245. sql_WHERE += " t__state > 0"
  246. if T_pid > 0 {
  247. sql_WHERE += " AND t_pid = " + strconv.Itoa(T_pid)
  248. }
  249. if len(T_tp) > 0 {
  250. list := models.SplitStringToDotStr(T_tp, "T")
  251. sql_WHERE += fmt.Sprintf(" AND t_tp in (%s)", list)
  252. }
  253. if len(T_name) > 0 {
  254. 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 + "%')"
  255. }
  256. if len(Time_start_) > 0 {
  257. //cond1 = cond1.And("T_Ut__gte", Time_start_)
  258. Time_start_ = lib.ReplaceSQL(Time_start_)
  259. sql_WHERE += fmt.Sprintf(" AND t__ut >= '%s'", Time_start_)
  260. }
  261. if len(Time_end_) > 0 {
  262. //cond1 = cond1.And("T_Ut__lte", Time_end_)
  263. Time_end_ = lib.ReplaceSQL(Time_end_)
  264. sql_WHERE += fmt.Sprintf(" AND t__ut <= '%s'", Time_end_)
  265. }
  266. //不填或0:所有 1:已处理 2:未处理
  267. if T_handle == 1 {
  268. //cond1 = cond1.And("T_Text__isnull", true)
  269. sql_WHERE += " AND t__tstate > 1"
  270. }
  271. if T_handle == 3 {
  272. //cond1 = cond1.And("T_Text__isnull", false).And("T_State", 2)
  273. sql_WHERE += " AND t__state = 3"
  274. }
  275. // -------------
  276. sql := "SELECT COUNT(ID) FROM " + Wtab + " WHERE " + sql_WHERE
  277. fmt.Println(sql)
  278. _, err := o.Raw(sql).ValuesList(&maps_z)
  279. if err != nil {
  280. logs.Error("Read_Warning_Backups", err)
  281. return r, 0
  282. }
  283. if len(maps_z) == 0 {
  284. return r, 0
  285. }
  286. //fmt.Println("maps_z;",maps_z[0][0])
  287. 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 " +
  288. "FROM " + Wtab + " WHERE" + sql_WHERE + " ORDER BY t__ut DESC"
  289. if page_z != 9999 {
  290. sql = sql + " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(page_z)
  291. }
  292. fmt.Println(sql)
  293. _, err = o.Raw(sql).QueryRows(&maps)
  294. if err != nil {
  295. logs.Error("Read_Warning_Backups", err)
  296. return
  297. }
  298. key, _ := strconv.ParseInt(maps_z[0][0].(string), 10, 64)
  299. for _, v := range maps {
  300. r = append(r, WarningToWarning_R(v))
  301. }
  302. return r, key
  303. }
  304. // 获取管理员列表备份
  305. func Read_Admin_Warning_Backups(T_pids string, T_year string, T_month string, T_tp, T_name string, T_handle int, Time_start_ string, Time_end_ string, page int, page_z int) (r []Warning_R, cnt int64) {
  306. if len(T_pids) == 0 {
  307. return r, cnt
  308. }
  309. o := orm.NewOrm()
  310. var maps []Warning
  311. var maps_z []orm2.ParamsList
  312. // 也可以直接使用 Model 结构体作为表名
  313. // Warning_2022_07
  314. Wtab := "warning_" + T_year + "_" + T_month
  315. var offset int
  316. if page_z == 0 {
  317. page_z = conf.Page_size
  318. }
  319. if page <= 1 {
  320. offset = 0
  321. } else {
  322. offset = (page - 1) * page_z
  323. }
  324. sql_WHERE := ""
  325. sql_WHERE += " t__state > 0"
  326. if T_pids != "*" {
  327. list := models.SplitStringToDotStr(T_pids, "P")
  328. sql_WHERE += fmt.Sprintf(" AND t_pid in (%s)", list)
  329. }
  330. if len(T_tp) > 0 {
  331. list := models.SplitStringToDotStr(T_tp, "T")
  332. sql_WHERE += fmt.Sprintf(" AND t_tp in (%s)", list)
  333. }
  334. if len(T_name) > 0 {
  335. 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 + "%')"
  336. }
  337. if len(Time_start_) > 0 {
  338. //cond1 = cond1.And("T_Ut__gte", Time_start_)
  339. Time_start_ = lib.ReplaceSQL(Time_start_)
  340. sql_WHERE += fmt.Sprintf(" AND t__ut >= '%s'", Time_start_)
  341. }
  342. if len(Time_end_) > 0 {
  343. //cond1 = cond1.And("T_Ut__lte", Time_end_)
  344. Time_end_ = lib.ReplaceSQL(Time_end_)
  345. sql_WHERE += fmt.Sprintf(" AND t__ut <= '%s'", Time_end_)
  346. }
  347. //1:默认 2:全部记录 3 未处理
  348. if T_handle == 1 {
  349. //cond1 = cond1.And("T_Text__isnull", true)
  350. sql_WHERE += " AND t__tstate > 1"
  351. }
  352. if T_handle == 3 {
  353. //cond1 = cond1.And("T_Text__isnull", false).And("T_State", 2)
  354. sql_WHERE += " AND t__state = 3"
  355. }
  356. // -------------
  357. sql := "SELECT COUNT(ID) FROM " + Wtab + " WHERE" + sql_WHERE
  358. fmt.Println(sql)
  359. _, err := o.Raw(sql).ValuesList(&maps_z)
  360. if err != nil {
  361. logs.Error("Read_Admin_Warning_Backups", err)
  362. return r, 0
  363. }
  364. if len(maps_z) == 0 {
  365. return r, 0
  366. }
  367. //fmt.Println("maps_z;",maps_z[0][0])
  368. 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 " +
  369. "FROM " + Wtab + " WHERE" + sql_WHERE + " ORDER BY t__ut DESC"
  370. if page_z != 9999 {
  371. sql = sql + " LIMIT " + strconv.Itoa(offset) + "," + strconv.Itoa(page_z)
  372. }
  373. fmt.Println(sql)
  374. _, err = o.Raw(sql).QueryRows(&maps)
  375. if err != nil {
  376. logs.Error("Read_Admin_Warning_Backups", err)
  377. return
  378. }
  379. key, _ := strconv.ParseInt(maps_z[0][0].(string), 10, 64)
  380. for _, v := range maps {
  381. r = append(r, WarningToWarning_R(v))
  382. }
  383. return r, key
  384. }
  385. func Read_Warning_ALL_T_State_Count(T_pid, T_handle int, T_Warning string, Is_Today bool) (cnt int64) {
  386. o := orm.NewOrm()
  387. qs := o.QueryTable(new(Warning))
  388. cond := orm.NewCondition()
  389. cond1 := cond.And("T_State__gt", 0).And("T_pid", T_pid)
  390. if Is_Today {
  391. today := time.Now().Format("2006-01-02") + " 00:00:00"
  392. cond1 = cond.And("CreateTime__gte", today)
  393. }
  394. if T_Warning != "*" {
  395. list := models.SplitStringIds(T_Warning, "W")
  396. cond1 = cond1.And("T_tp__in", list)
  397. }
  398. // T_State 0 删除 1 不处理 2 已处理 3 未处理
  399. // T_handle 1:默认 2:全部记录 3 未处理
  400. if T_handle == 1 {
  401. cond1 = cond1.And("T_State__gt", 1)
  402. }
  403. if T_handle == 3 {
  404. cond1 = cond1.And("T_State", 3)
  405. }
  406. cnt, err := qs.SetCond((*orm2.Condition)(cond1)).Count()
  407. if err != nil {
  408. logs.Error("Read_Warning_ALL_T_State_Count", err)
  409. }
  410. return cnt
  411. }
  412. // 设备日志
  413. type DeviceLogs struct {
  414. Id int
  415. T_sn string //
  416. Logs_Txt string // 详情
  417. CreateTime string
  418. }
  419. func WarningToDeviceLogs(t Warning) (r DeviceLogs) {
  420. r.Id = t.Id
  421. r.T_sn = t.T_sn
  422. r.Logs_Txt = t.T_Remark
  423. r.CreateTime = t.CreateTime.Format("2006-01-02 15:04:05")
  424. return r
  425. }
  426. // 获取列表
  427. func Read_DeviceLogs_List(T_sn string, page, page_z int) (r []DeviceLogs, cnt int64) {
  428. o := orm.NewOrm()
  429. // 也可以直接使用 Model 结构体作为表名
  430. qs := o.QueryTable(new(Warning))
  431. var maps []Warning
  432. var offset int64
  433. if page <= 1 {
  434. offset = 0
  435. } else {
  436. offset = int64((page - 1) * page_z)
  437. }
  438. _, err := qs.Limit(page_z, offset).Filter("T_sn", T_sn).Filter("T_tp__in", DeviceLogType).OrderBy("-Id").All(&maps)
  439. if err != nil {
  440. logs.Error("Read_DeviceLogs_List", err)
  441. return
  442. }
  443. cnt, err = qs.Filter("T_sn", T_sn).Count()
  444. if err != nil {
  445. logs.Error("Read_DeviceLogs_List", err)
  446. return
  447. }
  448. for _, v := range maps {
  449. r = append(r, WarningToDeviceLogs(v))
  450. }
  451. return r, cnt
  452. }