Warning.go 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868
  1. package controllers
  2. import (
  3. "Cold_Api/Nats/NatsServer"
  4. "Cold_Api/conf"
  5. "Cold_Api/controllers/lib"
  6. "Cold_Api/logs"
  7. "Cold_Api/models/Account"
  8. "Cold_Api/models/Device"
  9. "Cold_Api/models/System"
  10. "Cold_Api/models/Warning"
  11. "fmt"
  12. "github.com/robfig/cron/v3"
  13. "github.com/xuri/excelize/v2"
  14. "math"
  15. "os"
  16. "strconv"
  17. "time"
  18. )
  19. // 设备告警 ------------------------------------------
  20. // 告警列表
  21. func (c *DeviceController) DeviceWarning_List() {
  22. type R_JSONS struct {
  23. //必须的大写开头
  24. Data []Warning.Warning_R
  25. Num int64
  26. Page int
  27. Page_size int
  28. }
  29. var r_jsons R_JSONS
  30. page, _ := c.GetInt("page")
  31. if page < 1 {
  32. page = 1
  33. }
  34. page_z, _ := c.GetInt("page_z")
  35. if page_z < 1 {
  36. page_z = conf.Page_size
  37. }
  38. T_name := c.GetString("T_name")
  39. T_tp := c.GetString("T_tp")
  40. Time_start := c.GetString("Time_start")
  41. Time_end := c.GetString("Time_end")
  42. T_handle, _ := c.GetInt("T_handle")
  43. T_admin, _ := c.GetInt("T_admin")
  44. T_history, _ := c.GetInt("T_history")
  45. tpCount := Warning.Read_WarningType_Count()
  46. var tpList []string
  47. if len(T_tp) > 0 {
  48. tpList = lib.SplitStringIds(T_tp, "T")
  49. if len(tpList) == int(tpCount) {
  50. // 类型全选,替换为空,不进行查询筛选(查询全部)
  51. tpList = []string{}
  52. }
  53. } else {
  54. power, _ := Account.Read_Power_ById(c.Admin_r.T_power)
  55. if power.T_warning != "*" {
  56. tpList = lib.SplitStringIds(power.T_warning, "W")
  57. }
  58. }
  59. countRedisKey := fmt.Sprintf("Warning_Count_%d_%s_%s_%s_%s_%d_%d_%d", c.T_pid, T_name, T_tp, Time_start, Time_end, T_handle, T_admin, T_history)
  60. bindSN, err := Account.Read_UserDevice_List(*c.Admin_r)
  61. if err != nil {
  62. c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
  63. c.ServeJSON()
  64. return
  65. }
  66. var T_year, T_month string
  67. if T_history == 1 {
  68. date, err := time.Parse("2006-01-02 15:04:05", Time_start)
  69. if err != nil {
  70. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误"}
  71. c.ServeJSON()
  72. return
  73. }
  74. T_year, T_month = date.Format("2006"), date.Format("01")
  75. }
  76. // 管理员界面
  77. if T_admin == 1 {
  78. if T_history == 1 {
  79. // 获取备份
  80. r_jsons.Data, r_jsons.Num = Warning.Read_Admin_Warning_Backups(*c.Admin_r, T_year, T_month, tpList, T_name, T_handle, Time_start, Time_end, page, page_z, countRedisKey)
  81. } else {
  82. // 获取最新
  83. r_jsons.Data, r_jsons.Num = Warning.Read_Admin_Warning_List(*c.Admin_r, tpList, T_name, T_handle, Time_start, Time_end, page, page_z, countRedisKey)
  84. }
  85. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  86. c.ServeJSON()
  87. return
  88. }
  89. // 公司报警界面
  90. if T_history == 1 {
  91. r_jsons.Data, r_jsons.Num = Warning.Read_Warning_Backups(c.T_pid, bindSN, T_year, T_month, tpList, T_name, T_handle, Time_start, Time_end, page, page_z, countRedisKey)
  92. } else {
  93. // 获取最新
  94. r_jsons.Data, r_jsons.Num = Warning.Read_Warning_List(c.T_pid, bindSN, tpList, T_name, T_handle, Time_start, Time_end, page, page_z, countRedisKey)
  95. }
  96. r_jsons.Page = page
  97. r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
  98. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  99. c.ServeJSON()
  100. return
  101. }
  102. func (c *DeviceController) CompanyWarning_List() {
  103. var r_jsons lib.R_JSONS
  104. page, _ := c.GetInt("page")
  105. if page < 1 {
  106. page = 1
  107. }
  108. page_z, _ := c.GetInt("page_z")
  109. if page_z < 1 {
  110. page_z = conf.Page_size
  111. }
  112. T_name := c.GetString("T_name")
  113. T_tp := c.GetString("T_tp")
  114. Time_start := c.GetString("Time_start")
  115. Time_end := c.GetString("Time_end")
  116. T_handle, _ := c.GetInt("T_handle")
  117. T_history, _ := c.GetInt("T_history")
  118. tpCount := Warning.Read_WarningType_Count()
  119. var tpList []string
  120. if len(T_tp) > 0 {
  121. tpList = lib.SplitStringIds(T_tp, "T")
  122. if len(tpList) == int(tpCount) {
  123. // 类型全选,替换为空,不进行查询筛选(查询全部)
  124. tpList = []string{}
  125. }
  126. } else {
  127. power, _ := Account.Read_Power_ById(c.Admin_r.T_power)
  128. if power.T_warning != "*" {
  129. tpList = lib.SplitStringIds(power.T_warning, "W")
  130. }
  131. }
  132. countRedisKey := fmt.Sprintf("Company_Warning_Count_%d_%s_%s_%s_%s_%d_%d_%d", c.T_pid, T_name, T_tp, Time_start, Time_end, T_handle, 0, T_history)
  133. Company_r, err := Account.Read_Company_ById(c.T_pid)
  134. if err != nil {
  135. c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id Err!"}
  136. c.ServeJSON()
  137. return
  138. }
  139. T_pids := Account.ReadCompanyIds_T_path(Company_r.T_path)
  140. var T_year, T_month string
  141. if T_history == 1 {
  142. date, err := time.Parse("2006-01-02 15:04:05", Time_start)
  143. if err != nil {
  144. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误"}
  145. c.ServeJSON()
  146. return
  147. }
  148. T_year, T_month = date.Format("2006"), date.Format("01")
  149. }
  150. Account.Read_Company_All_Maps()
  151. if T_history == 1 {
  152. r_jsons.Data, r_jsons.Num = Warning.Read_Company_Warning_Backups(T_pids, T_year, T_month, tpList, T_name, T_handle, Time_start, Time_end, page, page_z, c.T_pid, countRedisKey)
  153. } else {
  154. // 获取最新
  155. r_jsons.Data, r_jsons.Num = Warning.Read_Company_Warning_List(T_pids, tpList, T_name, T_handle, Time_start, Time_end, page, page_z, c.T_pid, countRedisKey)
  156. }
  157. r_jsons.Page = page
  158. r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
  159. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  160. c.ServeJSON()
  161. return
  162. }
  163. // 查询告警
  164. func (c *DeviceController) DeviceWarning_Get() {
  165. id, _ := c.GetInt("T_id")
  166. T_history, _ := c.GetInt("T_history")
  167. T := Warning.Read_Warning_ById(int64(id))
  168. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Warning.WarningToWarning_R(T_history, T)}
  169. c.ServeJSON()
  170. return
  171. }
  172. // 编辑告警(处理告警)
  173. func (c *DeviceController) DeviceWarning_Post() {
  174. id, _ := c.GetInt("T_id")
  175. T_Text := c.GetString("T_Text")
  176. T_time := c.GetString("T_time")
  177. T_history, _ := c.GetInt("T_history")
  178. var T_year, T_month string
  179. var warning Warning.Warning
  180. Wtab := "warning"
  181. if T_history == 1 {
  182. date, err := time.Parse("2006-01-02 15:04:05", T_time)
  183. if err != nil {
  184. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误"}
  185. c.ServeJSON()
  186. return
  187. }
  188. T_year, T_month = date.Format("2006"), date.Format("01")
  189. Wtab += "_" + T_year + "_" + T_month
  190. warning, err = Warning.Read_Warning_ById_Backups(id, T_year, T_month)
  191. if err != nil {
  192. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_id Err!"}
  193. c.ServeJSON()
  194. return
  195. }
  196. warning.T_Text = T_Text
  197. warning.T_State = 2
  198. if is := Warning.Update_Warning_Backups(warning, T_year, T_month); !is {
  199. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  200. c.ServeJSON()
  201. return
  202. }
  203. warning = Warning.Read_Warning_ById(int64(id))
  204. if warning.Id > 0 {
  205. warning.T_Text = T_Text
  206. warning.T_State = 2
  207. if is := Warning.Update_Warning(warning, "T_Text", "T_State"); !is {
  208. c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
  209. c.ServeJSON()
  210. return
  211. }
  212. }
  213. } else {
  214. warning = Warning.Read_Warning_ById(int64(id))
  215. if warning.Id == 0 {
  216. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_id Err!"}
  217. c.ServeJSON()
  218. return
  219. }
  220. warning.T_Text = T_Text
  221. warning.T_State = 2
  222. if is := Warning.Update_Warning(warning, "T_Text", "T_State"); !is {
  223. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  224. c.ServeJSON()
  225. return
  226. }
  227. // 同步处理历史数据
  228. date := warning.T_Ut
  229. T_year, T_month = date.Format("2006"), date.Format("01")
  230. Wtab += "_" + T_year + "_" + T_month
  231. warningBackups, err := Warning.Read_Warning_ById_Backups(id, T_year, T_month)
  232. if err != nil && err.Error() != "<QuerySeter> no row found" {
  233. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_id Err!"}
  234. c.ServeJSON()
  235. return
  236. }
  237. if warningBackups.Id > 0 {
  238. warningBackups.T_Text = T_Text
  239. warningBackups.T_State = 2
  240. if is := Warning.Update_Warning_Backups(warningBackups, T_year, T_month); !is {
  241. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  242. c.ServeJSON()
  243. return
  244. }
  245. }
  246. }
  247. // 删除报警列表统计的缓存
  248. Warning.Redis_WarningCount_DelK(c.T_pid)
  249. Warning.Redis_WarningCount_DelK(c.Admin_r.Id)
  250. System.Add_UserLogs(c.Admin_r.T_uuid, "设备管理", "报警处理操作", Wtab+":"+strconv.Itoa(id)+"->"+T_Text)
  251. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  252. c.ServeJSON()
  253. return
  254. }
  255. // 删除告警
  256. func (c *DeviceController) DeviceWarning_Del() {
  257. id, _ := c.GetInt("T_id")
  258. T_time := c.GetString("T_time")
  259. T_history, _ := c.GetInt("T_history")
  260. var T_year, T_month string
  261. var warning Warning.Warning
  262. Wtab := "warning"
  263. if T_history == 1 {
  264. date, err := time.Parse("2006-01-02 15:04:05", T_time)
  265. if err != nil {
  266. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误"}
  267. c.ServeJSON()
  268. return
  269. }
  270. T_year, T_month = date.Format("2006"), date.Format("01")
  271. Wtab += "_" + T_year + "_" + T_month
  272. warning, err = Warning.Read_Warning_ById_Backups(id, T_year, T_month)
  273. if err != nil {
  274. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_id Err!"}
  275. c.ServeJSON()
  276. return
  277. }
  278. warning.T_State = 0
  279. if is := Warning.Update_Warning_Backups(warning, T_year, T_month); !is {
  280. c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
  281. c.ServeJSON()
  282. return
  283. }
  284. warning = Warning.Read_Warning_ById(int64(id))
  285. if warning.Id > 0 {
  286. warning.T_State = 0
  287. if is := Warning.Update_Warning(warning, "T_State"); !is {
  288. c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
  289. c.ServeJSON()
  290. return
  291. }
  292. }
  293. } else {
  294. warning = Warning.Read_Warning_ById(int64(id))
  295. if warning.Id == 0 {
  296. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_id Err!"}
  297. c.ServeJSON()
  298. return
  299. }
  300. warning.T_State = 0
  301. if is := Warning.Update_Warning(warning, "T_State"); !is {
  302. c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
  303. c.ServeJSON()
  304. return
  305. }
  306. date := warning.T_Ut
  307. T_year, T_month = date.Format("2006"), date.Format("01")
  308. Wtab += "_" + T_year + "_" + T_month
  309. warningBackups, err := Warning.Read_Warning_ById_Backups(id, T_year, T_month)
  310. if err != nil && err.Error() != "<QuerySeter> no row found" {
  311. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_id Err!"}
  312. c.ServeJSON()
  313. return
  314. }
  315. if warningBackups.Id > 0 {
  316. warningBackups.T_State = 0
  317. if is := Warning.Update_Warning_Backups(warningBackups, T_year, T_month); !is {
  318. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  319. c.ServeJSON()
  320. return
  321. }
  322. }
  323. }
  324. // 删除报警列表统计的缓存
  325. Warning.Redis_WarningCount_DelK(c.T_pid)
  326. Warning.Redis_WarningCount_DelK(c.Admin_r.Id)
  327. System.Add_UserLogs(c.Admin_r.T_uuid, "设备管理", "报警删除操作", Wtab+":"+strconv.Itoa(id))
  328. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  329. c.ServeJSON()
  330. return
  331. }
  332. // 导出告警
  333. func (c *DeviceController) DeviceWarning_Data_Excel() {
  334. T_name := c.GetString("T_name")
  335. T_tp := c.GetString("T_tp")
  336. Time_start := c.GetString("Time_start")
  337. Time_end := c.GetString("Time_end")
  338. T_handle, _ := c.GetInt("T_handle")
  339. T_admin, _ := c.GetInt("T_admin")
  340. T_history, _ := c.GetInt("T_history")
  341. tpCount := Warning.Read_WarningType_Count()
  342. var tpList []string
  343. if len(T_tp) > 0 {
  344. tpList = lib.SplitStringIds(T_tp, "T")
  345. if len(tpList) == int(tpCount) {
  346. // 类型全选,替换为空,不进行查询筛选(查询全部)
  347. tpList = []string{}
  348. }
  349. } else {
  350. power, _ := Account.Read_Power_ById(c.Admin_r.T_power)
  351. if power.T_warning != "*" {
  352. tpList = lib.SplitStringIds(power.T_warning, "W")
  353. }
  354. }
  355. countRedisKey := fmt.Sprintf("Warning_Count_%d_%s_%s_%s_%s_%d_%d_%d", c.T_pid, T_name, T_tp, Time_start, Time_end, T_handle, 0, T_history)
  356. bindSN, err := Account.Read_UserDevice_List(*c.Admin_r)
  357. if err != nil {
  358. c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
  359. c.ServeJSON()
  360. return
  361. }
  362. var T_year, T_month string
  363. if T_history == 1 {
  364. date, err := time.Parse("2006-01-02 15:04:05", Time_start)
  365. if err != nil {
  366. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误"}
  367. c.ServeJSON()
  368. return
  369. }
  370. T_year, T_month = date.Format("2006"), date.Format("01")
  371. }
  372. var Device_data []Warning.Warning_R
  373. // 管理员界面
  374. if T_admin == 1 {
  375. if T_history == 1 {
  376. // 获取备份
  377. Device_data, _ = Warning.Read_Admin_Warning_Backups(*c.Admin_r, T_year, T_month, tpList, T_name, T_handle, Time_start, Time_end, 0, 9999, countRedisKey)
  378. } else {
  379. // 获取最新
  380. Device_data, _ = Warning.Read_Admin_Warning_List(*c.Admin_r, tpList, T_name, T_handle, Time_start, Time_end, 0, 9999, countRedisKey)
  381. }
  382. }
  383. if T_history == 1 {
  384. // 获取备份
  385. Device_data, _ = Warning.Read_Warning_Backups(c.T_pid, bindSN, T_year, T_month, tpList, T_name, T_handle, Time_start, Time_end, 0, 9999, countRedisKey)
  386. } else {
  387. // 获取最新
  388. Device_data, _ = Warning.Read_Warning_List(c.T_pid, bindSN, tpList, T_name, T_handle, Time_start, Time_end, 0, 9999, countRedisKey)
  389. }
  390. f := excelize.NewFile() // 设置单元格的值
  391. // 这里设置表头ÒÒ
  392. f.SetCellValue("Sheet1", "A1", "报警类型")
  393. f.SetCellValue("Sheet1", "B1", "Sn")
  394. f.SetCellValue("Sheet1", "C1", "设备名称")
  395. f.SetCellValue("Sheet1", "D1", "传感器")
  396. f.SetCellValue("Sheet1", "E1", "报警内容")
  397. f.SetCellValue("Sheet1", "F1", "记录时间")
  398. f.SetCellValue("Sheet1", "G1", "处理")
  399. f.SetCellValue("Sheet1", "H1", "处理时间")
  400. // 设置列宽
  401. f.SetColWidth("Sheet1", "A", "A", 20)
  402. f.SetColWidth("Sheet1", "B", "B", 25)
  403. f.SetColWidth("Sheet1", "C", "C", 30)
  404. f.SetColWidth("Sheet1", "D", "D", 30)
  405. f.SetColWidth("Sheet1", "G", "E", 30)
  406. f.SetColWidth("Sheet1", "H", "F", 15)
  407. f.SetColWidth("Sheet1", "I", "G", 30)
  408. f.SetColWidth("Sheet1", "J", "H", 15)
  409. line := 1
  410. // 循环写入数据
  411. for _, v := range Device_data {
  412. line++
  413. f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), Warning.Read_WarningType_Get(v.T_tp))
  414. f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), fmt.Sprintf("%s[%d]", v.T_sn, v.T_id))
  415. f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), v.T_D_name)
  416. f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), v.T_DS_name)
  417. f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), v.T_Remark)
  418. f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), v.T_Ut)
  419. f.SetCellValue("Sheet1", fmt.Sprintf("G%d", line), v.T_Text)
  420. f.SetCellValue("Sheet1", fmt.Sprintf("H%d", line), v.CreateTime)
  421. }
  422. timeStr := time.Now().Format("20060102150405")
  423. // 保存文件
  424. if err := f.SaveAs("ofile/" + timeStr + ".xlsx"); err != nil {
  425. fmt.Println(err)
  426. }
  427. url, is := NatsServer.Qiniu_UploadFile(lib.GetCurrentDirectory()+"/ofile/"+timeStr+".xlsx", "ofile/"+timeStr+".xlsx")
  428. if !is {
  429. c.Data["json"] = lib.JSONS{Code: 202, Msg: "oss!"}
  430. c.ServeJSON()
  431. return
  432. }
  433. // 删除文件
  434. err = os.Remove("ofile/" + timeStr + ".xlsx")
  435. if err != nil {
  436. fmt.Println(err)
  437. }
  438. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: url}
  439. c.ServeJSON()
  440. return
  441. }
  442. // 公司管理 - 导出告警
  443. func (c *DeviceController) CompanyWarning_Data_Excel() {
  444. T_name := c.GetString("T_name")
  445. T_tp := c.GetString("T_tp")
  446. Time_start := c.GetString("Time_start")
  447. Time_end := c.GetString("Time_end")
  448. T_handle, _ := c.GetInt("T_handle")
  449. T_history, _ := c.GetInt("T_history")
  450. tpCount := Warning.Read_WarningType_Count()
  451. var tpList []string
  452. if len(T_tp) > 0 {
  453. tpList = lib.SplitStringIds(T_tp, "T")
  454. if len(tpList) == int(tpCount) {
  455. // 类型全选,替换为空,不进行查询筛选(查询全部)
  456. tpList = []string{}
  457. }
  458. } else {
  459. power, _ := Account.Read_Power_ById(c.Admin_r.T_power)
  460. if power.T_warning != "*" {
  461. tpList = lib.SplitStringIds(power.T_warning, "W")
  462. }
  463. }
  464. countRedisKey := fmt.Sprintf("Company_Warning_Count_%d_%s_%s_%s_%s_%d_%d_%d", c.T_pid, T_name, T_tp, Time_start, Time_end, T_handle, 0, T_history)
  465. Account.Read_Company_All_Maps()
  466. Company_r, err := Account.Read_Company_ById(c.T_pid)
  467. if err != nil {
  468. c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id Err!"}
  469. c.ServeJSON()
  470. return
  471. }
  472. T_pids := Account.ReadCompanyIds_T_path(Company_r.T_path)
  473. var T_year, T_month string
  474. if T_history == 1 {
  475. date, err := time.Parse("2006-01-02 15:04:05", Time_start)
  476. if err != nil {
  477. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误"}
  478. c.ServeJSON()
  479. return
  480. }
  481. T_year, T_month = date.Format("2006"), date.Format("01")
  482. }
  483. var Device_data []Warning.CompanyWarning_R
  484. if T_history == 1 {
  485. // 获取备份
  486. Device_data, _ = Warning.Read_Company_Warning_Backups(T_pids, T_year, T_month, tpList, T_name, T_handle, Time_start, Time_end, 0, 9999, c.T_pid, countRedisKey)
  487. } else {
  488. // 获取最新
  489. Device_data, _ = Warning.Read_Company_Warning_List(T_pids, tpList, T_name, T_handle, Time_start, Time_end, 0, 9999, c.T_pid, countRedisKey)
  490. }
  491. f := excelize.NewFile() // 设置单元格的值
  492. // 这里设置表头
  493. f.SetCellValue("Sheet1", "A1", "报警类型")
  494. f.SetCellValue("Sheet1", "A1", "公司名称")
  495. f.SetCellValue("Sheet1", "B1", "Sn")
  496. f.SetCellValue("Sheet1", "C1", "设备名称")
  497. f.SetCellValue("Sheet1", "D1", "传感器")
  498. f.SetCellValue("Sheet1", "E1", "报警内容")
  499. f.SetCellValue("Sheet1", "F1", "记录时间")
  500. f.SetCellValue("Sheet1", "G1", "处理")
  501. f.SetCellValue("Sheet1", "H1", "处理时间")
  502. // 设置列宽
  503. f.SetColWidth("Sheet1", "A", "A", 20)
  504. f.SetColWidth("Sheet1", "B", "B", 40)
  505. f.SetColWidth("Sheet1", "C", "C", 25)
  506. f.SetColWidth("Sheet1", "D", "D", 30)
  507. f.SetColWidth("Sheet1", "E", "E", 30)
  508. f.SetColWidth("Sheet1", "F", "F", 30)
  509. f.SetColWidth("Sheet1", "J", "J", 15)
  510. f.SetColWidth("Sheet1", "H", "H", 30)
  511. f.SetColWidth("Sheet1", "I", "I", 15)
  512. line := 1
  513. // 循环写入数据
  514. for _, v := range Device_data {
  515. line++
  516. f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), Warning.Read_WarningType_Get(v.T_tp))
  517. f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), fmt.Sprintf("%s", v.T_pid_name))
  518. f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), fmt.Sprintf("%s[%d]", v.T_sn, v.T_id))
  519. f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), v.T_D_name)
  520. f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), v.T_DS_name)
  521. f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), v.T_Remark)
  522. f.SetCellValue("Sheet1", fmt.Sprintf("J%d", line), v.T_Ut)
  523. f.SetCellValue("Sheet1", fmt.Sprintf("H%d", line), v.T_Text)
  524. f.SetCellValue("Sheet1", fmt.Sprintf("I%d", line), v.CreateTime)
  525. }
  526. timeStr := time.Now().Format("20060102150405")
  527. // 保存文件
  528. if err := f.SaveAs("ofile/" + timeStr + ".xlsx"); err != nil {
  529. fmt.Println(err)
  530. }
  531. url, is := NatsServer.Qiniu_UploadFile(lib.GetCurrentDirectory()+"/ofile/"+timeStr+".xlsx", "ofile/"+timeStr+".xlsx")
  532. if !is {
  533. c.Data["json"] = lib.JSONS{Code: 202, Msg: "oss!"}
  534. c.ServeJSON()
  535. return
  536. }
  537. // 删除文件
  538. err = os.Remove("ofile/" + timeStr + ".xlsx")
  539. if err != nil {
  540. fmt.Println(err)
  541. }
  542. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: url}
  543. c.ServeJSON()
  544. return
  545. }
  546. // 告警提示列表
  547. func (c *DeviceController) DeviceWarningList_T_Tips() {
  548. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Warning.Read_WarningType_All_T_Notice_mechanism()}
  549. c.ServeJSON()
  550. return
  551. }
  552. // 告警类型列表
  553. func (c *DeviceController) WarningType_List_All() {
  554. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Warning.Read_WarningType_All()}
  555. c.ServeJSON()
  556. return
  557. }
  558. // 告警类型列表 - 权限关联列表
  559. func (c *DeviceController) WarningType_Power_List_All() {
  560. power, err := Account.Read_Power_ById(c.Admin_r.T_power)
  561. if err != nil {
  562. c.Data["json"] = lib.JSONS{Code: 200, Msg: "获取菜单失败"}
  563. c.ServeJSON()
  564. return
  565. }
  566. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Warning.Read_WarningType_Power_All(power.T_warning)}
  567. c.ServeJSON()
  568. return
  569. }
  570. // 通过传感器类型获取报警列表
  571. func (c *DeviceController) Read_Warning_List_By_DS_T_type() {
  572. var r_jsons lib.R_JSONS
  573. page, _ := c.GetInt("page")
  574. if page < 1 {
  575. page = 1
  576. }
  577. page_z, _ := c.GetInt("page_z")
  578. if page_z < 1 {
  579. page_z = conf.Page_size
  580. }
  581. T_type, _ := c.GetInt("T_type")
  582. T_name := c.GetString("T_name")
  583. bindSN, err := Account.Read_UserDevice_List(*c.Admin_r)
  584. if err != nil {
  585. c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
  586. c.ServeJSON()
  587. return
  588. }
  589. var T_pids []int
  590. if c.Admin_r.T_pid > 0 {
  591. // 查询公司
  592. Company_r, err := Account.Read_Company_ById(c.Admin_r.T_pid)
  593. if err != nil {
  594. c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id Err!"}
  595. c.ServeJSON()
  596. return
  597. }
  598. // 查询公司下面所有子公司id
  599. T_pids = Account.ReadCompanyIds_T_path(Company_r.T_path)
  600. }
  601. var tpList []string
  602. power, _ := Account.Read_Power_ById(c.Admin_r.T_power)
  603. if power.T_warning != "*" {
  604. tpList = lib.SplitStringIds(power.T_warning, "W")
  605. }
  606. countRedisKey := fmt.Sprintf("Company_Warning_Count_By_DS_T_type_%d_%s_%d_%d", c.T_pid, T_name, T_type, c.Admin_r.T_pid)
  607. r_jsons.Data, r_jsons.Num = Warning.Read_Warning_List_By_DS_T_type(c.Admin_r, c.T_pid, bindSN, T_pids, T_type, T_name, tpList, page, page_z, countRedisKey)
  608. r_jsons.Page = page
  609. r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
  610. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  611. c.ServeJSON()
  612. return
  613. }
  614. func (c *DeviceController) Read_WarningSend_List() {
  615. var r_jsons lib.R_JSONS
  616. page, _ := c.GetInt("page")
  617. if page < 1 {
  618. page = 1
  619. }
  620. page_z, _ := c.GetInt("page_z")
  621. if page_z < 1 {
  622. page_z = conf.Page_size
  623. }
  624. T_ntype, _ := c.GetInt("T_ntype")
  625. r_jsons.Data, r_jsons.Num = Warning.Read_WarningSand_List(c.T_pid, T_ntype, page, page_z)
  626. r_jsons.Page = page
  627. r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
  628. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  629. c.ServeJSON()
  630. return
  631. }
  632. func (c *DeviceController) Read_WarningRate_List() {
  633. page, _ := c.GetInt("page")
  634. if page < 1 {
  635. page = 1
  636. }
  637. page_z, _ := c.GetInt("page_z")
  638. if page_z < 1 {
  639. page_z = conf.Page_size
  640. }
  641. T_uuid := c.GetString("T_uuid")
  642. T_year, _ := c.GetInt("T_year")
  643. T_month, _ := c.GetInt("T_month")
  644. var startTime, endTime string
  645. now := time.Now()
  646. var month time.Month
  647. // 默认本月
  648. if T_year == 0 {
  649. T_year = now.Year()
  650. }
  651. if T_month == 0 {
  652. month = now.Month()
  653. } else {
  654. month = time.Month(T_month)
  655. }
  656. T_type := Warning.WarningRateDay
  657. if T_month == 0 {
  658. T_type = Warning.WarningRateMonth
  659. }
  660. if T_type == Warning.WarningRateDay {
  661. startTime = time.Date(T_year, month, 1, 0, 0, 0, 0, time.Local).Format("2006-01-02")
  662. endTime = time.Date(T_year, month+1, 0, 0, 0, 0, 0, time.Local).Format("2006-01-02")
  663. }
  664. // 默认本年
  665. if T_type == Warning.WarningRateMonth {
  666. startTime = time.Date(T_year, 1, 1, 0, 0, 0, 0, time.Local).Format("2006-01")
  667. endTime = time.Date(T_year, 12, 31, 0, 0, 0, 0, time.Local).Format("2006-01")
  668. }
  669. if len(T_uuid) == 0 {
  670. T_uuid = c.Admin_r.T_uuid
  671. }
  672. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Warning.Read_WarningRate_List(T_uuid, T_type, startTime, endTime)}
  673. c.ServeJSON()
  674. return
  675. }
  676. func (c *DeviceController) Read_WarningHandle_List() {
  677. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Warning.Read_WarningHandle_List()}
  678. c.ServeJSON()
  679. return
  680. }
  681. func Cron_WarningRate() {
  682. // 创建一个定时任务对象
  683. c := cron.New(cron.WithSeconds())
  684. // 给对象增加定时任务
  685. // @daily 每日运行一次
  686. // c.AddFunc("0 */1 * * * ?", Cron_WarningRateDay_Add)
  687. // c.AddFunc("0 */1 * * * ?", Cron_WarningRateMonth_Add)
  688. c.AddFunc("@daily", Cron_WarningRateDay_Add)
  689. c.AddFunc("@monthly", Cron_WarningRateMonth_Add)
  690. // 启动定时任务
  691. c.Start()
  692. defer c.Stop()
  693. // 查询语句,阻塞,让main函数不退出,保持程序运行
  694. select {}
  695. }
  696. // 保存每天的设备报警率
  697. func Cron_WarningRateDay_Add() {
  698. T_date := time.Now().AddDate(0, 0, -1).Format("2006-01-02")
  699. logs.Info("开始统计" + T_date + "设备报警率")
  700. // 获取管理员用户列表
  701. adminList := Account.Read_Admin_List_All()
  702. // 获取内部用户关联的pid
  703. for _, admin := range adminList {
  704. // 内部用户已绑定公司,* 绑定所有公司
  705. if len(admin.T_pids) == 0 || admin.T_pids == "*" {
  706. continue
  707. }
  708. // 获取排除后的pid
  709. T_pids := lib.SplitStringToIntIds(admin.T_pids, "P")
  710. if len(T_pids) == 0 {
  711. continue
  712. }
  713. pids := Account.ReadCompanyWarningIds_T_pids(T_pids)
  714. if len(pids) == 0 {
  715. continue
  716. }
  717. // 获取探头数量
  718. dsCnt := Device.Read_DeviceSensorCount_ByT_pids(pids)
  719. // 获取当天报警数量
  720. warningCount := Warning.Read_WarningCount_byDay(pids)
  721. T_rate, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", float64(warningCount)/float64(dsCnt)), 64) // 保留2位小数
  722. // 保存设备报警率
  723. warningRate := Warning.WarningRate{
  724. T_uuid: admin.T_uuid,
  725. T_date: T_date,
  726. T_type: Warning.WarningRateDay,
  727. T_device_num: dsCnt,
  728. T_warning_num: warningCount,
  729. T_rate: float32(T_rate),
  730. }
  731. Warning.Add_WarningRate(warningRate)
  732. }
  733. }
  734. // 保存每月的设备报警率
  735. func Cron_WarningRateMonth_Add() {
  736. now := time.Now()
  737. // fixme 测试
  738. //now := time.Now().AddDate(0, 1, 0)
  739. T_date := now.AddDate(0, -1, 0).Format("2006-01")
  740. firstOfMonth := time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, time.Local)
  741. startTime := firstOfMonth.AddDate(0, -1, 0).Format("2006-01-02") // 上月第一天
  742. endTime := firstOfMonth.AddDate(0, 0, -1).Format("2006-01-02") // 上月最后一天
  743. logs.Info("开始统计" + T_date + "设备报警率")
  744. logs.Info("开始时间" + startTime)
  745. logs.Info("结束时间" + endTime)
  746. rateAvgList := Warning.Read_WarningRateAvg_Month(startTime, endTime)
  747. // 获取内部用户关联的pid
  748. for _, rate := range rateAvgList {
  749. T_rate, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", float64(rate.T_warning_num)/float64(rate.T_device_num)), 64) // 保留2位小数
  750. // 保存设备报警率
  751. warningRate := Warning.WarningRate{
  752. T_uuid: rate.T_uuid,
  753. T_date: T_date,
  754. T_type: Warning.WarningRateMonth,
  755. T_device_num: rate.T_device_num,
  756. T_warning_num: rate.T_warning_num,
  757. T_rate: float32(T_rate),
  758. }
  759. Warning.Add_WarningRate(warningRate)
  760. }
  761. }