Warning.go 44 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456
  1. package controllers
  2. import (
  3. "Cold_Api/Nats/NatsServer"
  4. "Cold_Api/conf"
  5. "Cold_Api/controllers/lib"
  6. db "Cold_Api/initialize"
  7. "Cold_Api/models/Account"
  8. "Cold_Api/models/Device"
  9. "Cold_Api/models/System"
  10. "Cold_Api/models/Warning"
  11. "Cold_Api/models/openApi"
  12. "encoding/json"
  13. "fmt"
  14. "github.com/beego/beego/v2/core/logs"
  15. beego "github.com/beego/beego/v2/server/web"
  16. "github.com/robfig/cron/v3"
  17. "github.com/xuri/excelize/v2"
  18. "math"
  19. "net/http"
  20. "os"
  21. "strconv"
  22. "time"
  23. )
  24. // 设备告警 ------------------------------------------
  25. // 告警列表
  26. func (c *DeviceController) DeviceWarning_List() {
  27. type R_JSONS struct {
  28. //必须的大写开头
  29. Data []Warning.Warning_R
  30. Num int64
  31. Page int
  32. Page_size int
  33. }
  34. var r_jsons R_JSONS
  35. page, _ := c.GetInt("page")
  36. if page < 1 {
  37. page = 1
  38. }
  39. page_z, _ := c.GetInt("page_z")
  40. if page_z < 1 {
  41. page_z = conf.Page_size
  42. }
  43. T_name := c.GetString("T_name")
  44. T_tp := c.GetString("T_tp")
  45. Time_start := c.GetString("Time_start")
  46. Time_end := c.GetString("Time_end")
  47. T_handle, _ := c.GetInt("T_handle")
  48. T_admin, _ := c.GetInt("T_admin")
  49. T_history, _ := c.GetInt("T_history")
  50. tpCount := Warning.Read_WarningType_Count()
  51. var tpList []string
  52. if len(T_tp) > 0 {
  53. tpList = lib.SplitStringIds(T_tp, "T")
  54. if len(tpList) == int(tpCount) {
  55. // 类型全选,替换为空,不进行查询筛选(查询全部)
  56. tpList = []string{}
  57. }
  58. } else {
  59. power, _ := Account.Read_Power_ById(c.Admin_r.T_power)
  60. if power.T_warning != "*" {
  61. tpList = lib.SplitStringIds(power.T_warning, "W")
  62. }
  63. }
  64. 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)
  65. bindSN, err := Account.Read_UserDevice_List(*c.Admin_r)
  66. if err != nil {
  67. c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
  68. c.ServeJSON()
  69. return
  70. }
  71. var T_year, T_month string
  72. if T_history == 1 {
  73. date, err := time.Parse("2006-01-02 15:04:05", Time_start)
  74. if err != nil {
  75. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误"}
  76. c.ServeJSON()
  77. return
  78. }
  79. T_year, T_month = date.Format("2006"), date.Format("01")
  80. }
  81. // 管理员界面
  82. if T_admin == 1 {
  83. if T_history == 1 {
  84. // 获取备份
  85. 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)
  86. } else {
  87. // 获取最新
  88. 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)
  89. }
  90. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  91. c.ServeJSON()
  92. return
  93. }
  94. // 公司报警界面
  95. if T_history == 1 {
  96. 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)
  97. } else {
  98. // 获取最新
  99. 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)
  100. }
  101. r_jsons.Page = page
  102. r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
  103. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  104. c.ServeJSON()
  105. return
  106. }
  107. func (c *DeviceController) DeviceWarning_List2() {
  108. type R_JSONS struct {
  109. //必须的大写开头
  110. Data []Warning.Warning_R
  111. Num int64
  112. Page int
  113. Page_size int
  114. }
  115. var r_jsons R_JSONS
  116. page, _ := c.GetInt("page")
  117. if page < 1 {
  118. page = 1
  119. }
  120. page_z, _ := c.GetInt("page_z")
  121. if page_z < 1 {
  122. page_z = conf.Page_size
  123. }
  124. T_name := c.GetString("T_name")
  125. T_tp := c.GetString("T_tp")
  126. Time_start := c.GetString("Time_start")
  127. Time_end := c.GetString("Time_end")
  128. T_handle, _ := c.GetInt("T_handle")
  129. T_admin, _ := c.GetInt("T_admin")
  130. T_history, _ := c.GetInt("T_history")
  131. T_abandon, _ := c.GetInt("T_abandon") // 1 弃用设备
  132. if len(Time_start) == 0 {
  133. c.Data["json"] = lib.JSONS{Code: 202, Msg: "开始时间不能为空!"}
  134. c.ServeJSON()
  135. return
  136. }
  137. if len(Time_end) == 0 {
  138. c.Data["json"] = lib.JSONS{Code: 202, Msg: "结束时间不能为空!"}
  139. c.ServeJSON()
  140. return
  141. }
  142. tpCount := Warning.Read_WarningType_Count()
  143. var tpList []string
  144. if len(T_tp) > 0 {
  145. tpList = lib.SplitStringIds(T_tp, "T")
  146. if len(tpList) == int(tpCount) {
  147. // 类型全选,替换为空,不进行查询筛选(查询全部)
  148. tpList = []string{}
  149. }
  150. } else {
  151. power, _ := Account.Read_Power_ById(c.Admin_r.T_power)
  152. if power.T_warning != "*" {
  153. tpList = lib.SplitStringIds(power.T_warning, "W")
  154. }
  155. }
  156. countRedisKey := fmt.Sprintf("Warning_Count_%d_%s_%s_%s_%s_%d_%d_%d_%d", c.T_pid, T_name, T_tp, Time_start, Time_end, T_handle, T_admin, T_history, T_abandon)
  157. bindSN, err := Account.Read_UserDevice_List(*c.Admin_r)
  158. if err != nil {
  159. c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
  160. c.ServeJSON()
  161. return
  162. }
  163. // 查询弃用设备
  164. abandonDeviceList, _ := Device.Read_Device_List_ByT_State(bindSN, c.T_pid, 0)
  165. abandonSN := make([]string, 0)
  166. for _, r := range abandonDeviceList {
  167. abandonSN = append(abandonSN, r.T_sn)
  168. }
  169. // 管理员界面
  170. if T_admin == 1 {
  171. // 获取最新 获取绑定的sn 如果未绑定则获取全部
  172. r_jsons.Data, r_jsons.Num = Warning.Gorm_Read_Admin_Warning_List(*c.Admin_r, tpList, T_name, T_handle, Time_start, Time_end, T_abandon, abandonSN, page, page_z, countRedisKey)
  173. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  174. c.ServeJSON()
  175. return
  176. }
  177. r_jsons.Data, r_jsons.Num = Warning.Gorm_Read_Warning_List(c.T_pid, bindSN, tpList, T_name, T_handle, Time_start, Time_end, T_abandon, abandonSN, page, page_z, countRedisKey)
  178. r_jsons.Page = page
  179. r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
  180. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  181. c.ServeJSON()
  182. return
  183. }
  184. func (c *DeviceController) DeviceWarning_List_Sse() {
  185. page, _ := c.GetInt("page")
  186. if page < 1 {
  187. page = 1
  188. }
  189. page_z, _ := c.GetInt("page_z")
  190. if page_z < 1 {
  191. page_z = conf.Page_size
  192. }
  193. T_name := c.GetString("T_name")
  194. T_tp := c.GetString("T_tp")
  195. Time_start := c.GetString("Time_start")
  196. Time_end := c.GetString("Time_end")
  197. T_handle, _ := c.GetInt("T_handle")
  198. T_admin, _ := c.GetInt("T_admin")
  199. T_abandon, _ := c.GetInt("T_abandon") // 1 弃用设备
  200. tpCount := Warning.Read_WarningType_Count()
  201. bindSN, err := Account.Read_UserDevice_List(*c.Admin_r)
  202. if err != nil {
  203. c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
  204. c.ServeJSON()
  205. return
  206. }
  207. // 查询弃用设备
  208. abandonDeviceList, _ := Device.Read_Device_List_ByT_State(bindSN, c.T_pid, 0)
  209. abandonSN := make([]string, 0)
  210. for _, r := range abandonDeviceList {
  211. abandonSN = append(abandonSN, r.T_sn)
  212. }
  213. var tpList []string
  214. if len(T_tp) > 0 {
  215. tpList = lib.SplitStringIds(T_tp, "T")
  216. if len(tpList) == int(tpCount) {
  217. // 类型全选,替换为空,不进行查询筛选(查询全部)
  218. tpList = []string{}
  219. }
  220. } else {
  221. power, _ := Account.Read_Power_ById(c.Admin_r.T_power)
  222. if power.T_warning != "*" {
  223. tpList = lib.SplitStringIds(power.T_warning, "W")
  224. }
  225. }
  226. countRedisKey := fmt.Sprintf("Warning_Count_%d_%s_%s_%s_%s_%d_%d_%d_%d", c.T_pid, T_name, T_tp, Time_start, Time_end, T_handle, T_admin, 0, T_abandon)
  227. tableNames := Warning.GenerateWarningTableNames(Time_start, Time_end)
  228. // 设置响应头
  229. c.Ctx.ResponseWriter.Header().Set("Content-Type", "text/event-stream")
  230. c.Ctx.ResponseWriter.Header().Set("Cache-Control", "no-cache")
  231. c.Ctx.ResponseWriter.Header().Set("Connection", "keep-alive")
  232. c.Ctx.ResponseWriter.WriteHeader(http.StatusOK)
  233. var cnt int64
  234. tableCount := make(map[string]int64)
  235. // 管理员界面
  236. if T_admin == 1 {
  237. gormReadWarningListScopes := Warning.GormReadAdminWarningListScopes(*c.Admin_r, tpList, T_name, T_handle, Time_start, Time_end, T_abandon, abandonSN)
  238. cnt, tableCount, err = Warning.Redis_WarningCount_GetOne(c.Admin_r.Id, countRedisKey)
  239. offset := (page - 1) * page_z
  240. remaining := offset
  241. var warningsCount int
  242. for _, tableName := range tableNames {
  243. tableDB := db.DB.Table(tableName)
  244. var count int64
  245. if tableName == fmt.Sprintf("warning_%d_%02d", time.Now().Year(), time.Now().Month()) {
  246. if saveTime, ok := tableCount["SaveTime"]; ok {
  247. t1 := time.Unix(saveTime, 0)
  248. if time.Now().Sub(t1) < 5*time.Minute {
  249. if count, ok = tableCount[tableName]; !ok {
  250. tableDB.Scopes(gormReadWarningListScopes).Count(&count)
  251. tableCount[tableName] = count
  252. }
  253. } else {
  254. tableDB.Scopes(gormReadWarningListScopes).Count(&count)
  255. tableCount[tableName] = count
  256. }
  257. }
  258. } else {
  259. var ok bool
  260. if count, ok = tableCount[tableName]; !ok {
  261. tableDB.Scopes(gormReadWarningListScopes).Count(&count)
  262. tableCount[tableName] = count
  263. }
  264. }
  265. cnt += count
  266. if remaining >= int(count) {
  267. remaining -= int(count)
  268. continue
  269. }
  270. var tableWarning []Warning.Warning
  271. if warningsCount < page_z {
  272. tableDB.Scopes(gormReadWarningListScopes).
  273. Order("t__ut desc").Offset(remaining).Limit(page_z - warningsCount).Find(&tableWarning)
  274. }
  275. warningsCount += len(tableWarning)
  276. remaining = 0
  277. var r_jsons lib.R_JSONS
  278. r_jsons.Num = cnt
  279. r_jsons.Data = tableWarning
  280. json_b, _ := json.Marshal(r_jsons)
  281. c.Ctx.ResponseWriter.Write(json_b)
  282. c.Ctx.ResponseWriter.Flush()
  283. // 可以根据需要调整间隔时间
  284. time.Sleep(1 * time.Second)
  285. }
  286. Warning.Redis_WarningCount_Set(c.Admin_r.Id, countRedisKey, cnt, tableCount)
  287. return
  288. }
  289. //从redis获取报警统计数量
  290. gormReadWarningListScopes := Warning.GormReadWarningListScopes(c.T_pid, bindSN, tpList, T_name, T_handle, Time_start, Time_end, T_abandon, abandonSN)
  291. cnt, tableCount, err = Warning.Redis_WarningCount_GetOne(c.T_pid, countRedisKey)
  292. offset := (page - 1) * page_z
  293. remaining := offset
  294. var warningsCount int
  295. for _, tableName := range tableNames {
  296. tableDB := db.DB.Table(tableName)
  297. var count int64
  298. if tableName == fmt.Sprintf("warning_%d_%02d", time.Now().Year(), time.Now().Month()) {
  299. if saveTime, ok := tableCount["SaveTime"]; ok {
  300. t1 := time.Unix(saveTime, 0)
  301. if time.Now().Sub(t1) < 5*time.Minute {
  302. if count, ok = tableCount[tableName]; !ok {
  303. tableDB.Scopes(gormReadWarningListScopes).Count(&count)
  304. tableCount[tableName] = count
  305. }
  306. } else {
  307. tableDB.Scopes(gormReadWarningListScopes).Count(&count)
  308. tableCount[tableName] = count
  309. }
  310. }
  311. } else {
  312. var ok bool
  313. if count, ok = tableCount[tableName]; !ok {
  314. tableDB.Scopes(gormReadWarningListScopes).Count(&count)
  315. tableCount[tableName] = count
  316. }
  317. }
  318. cnt += count
  319. if remaining >= int(count) {
  320. remaining -= int(count)
  321. continue
  322. }
  323. var tableWarning []Warning.Warning
  324. if warningsCount < page_z {
  325. tableDB.Scopes(gormReadWarningListScopes).
  326. Order("t__ut desc").Offset(remaining).Limit(page_z - warningsCount).Find(&tableWarning)
  327. }
  328. warningsCount += len(tableWarning)
  329. remaining = 0
  330. var r_jsons lib.R_JSONS
  331. r_jsons.Num = cnt
  332. r_jsons.Data = tableWarning
  333. json_b, _ := json.Marshal(r_jsons)
  334. c.Ctx.ResponseWriter.Write(json_b)
  335. c.Ctx.ResponseWriter.Flush()
  336. // 可以根据需要调整间隔时间
  337. time.Sleep(1 * time.Second)
  338. }
  339. Warning.Redis_WarningCount_Set(c.T_pid, countRedisKey, cnt, tableCount)
  340. }
  341. func (c *DeviceController) CompanyWarning_List() {
  342. var r_jsons lib.R_JSONS
  343. page, _ := c.GetInt("page")
  344. if page < 1 {
  345. page = 1
  346. }
  347. page_z, _ := c.GetInt("page_z")
  348. if page_z < 1 {
  349. page_z = conf.Page_size
  350. }
  351. T_name := c.GetString("T_name")
  352. T_tp := c.GetString("T_tp")
  353. Time_start := c.GetString("Time_start")
  354. Time_end := c.GetString("Time_end")
  355. T_handle, _ := c.GetInt("T_handle")
  356. T_history, _ := c.GetInt("T_history")
  357. tpCount := Warning.Read_WarningType_Count()
  358. var tpList []string
  359. if len(T_tp) > 0 {
  360. tpList = lib.SplitStringIds(T_tp, "T")
  361. if len(tpList) == int(tpCount) {
  362. // 类型全选,替换为空,不进行查询筛选(查询全部)
  363. tpList = []string{}
  364. }
  365. } else {
  366. power, _ := Account.Read_Power_ById(c.Admin_r.T_power)
  367. if power.T_warning != "*" {
  368. tpList = lib.SplitStringIds(power.T_warning, "W")
  369. }
  370. }
  371. 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)
  372. Company_r, err := Account.Read_Company_ById(c.T_pid)
  373. if err != nil {
  374. c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id Err!"}
  375. c.ServeJSON()
  376. return
  377. }
  378. T_pids := Account.ReadCompanyIds_T_path(Company_r.T_path)
  379. var T_year, T_month string
  380. if T_history == 1 {
  381. date, err := time.Parse("2006-01-02 15:04:05", Time_start)
  382. if err != nil {
  383. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误"}
  384. c.ServeJSON()
  385. return
  386. }
  387. T_year, T_month = date.Format("2006"), date.Format("01")
  388. }
  389. Account.Read_Company_All_Maps()
  390. if T_history == 1 {
  391. 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)
  392. } else {
  393. // 获取最新
  394. 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)
  395. }
  396. r_jsons.Page = page
  397. r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
  398. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  399. c.ServeJSON()
  400. return
  401. }
  402. func (c *DeviceController) CompanyWarning_List2() {
  403. var r_jsons lib.R_JSONS
  404. page, _ := c.GetInt("page")
  405. if page < 1 {
  406. page = 1
  407. }
  408. page_z, _ := c.GetInt("page_z")
  409. if page_z < 1 {
  410. page_z = conf.Page_size
  411. }
  412. T_name := c.GetString("T_name")
  413. T_tp := c.GetString("T_tp")
  414. Time_start := c.GetString("Time_start")
  415. Time_end := c.GetString("Time_end")
  416. T_handle, _ := c.GetInt("T_handle")
  417. if len(Time_start) == 0 {
  418. c.Data["json"] = lib.JSONS{Code: 202, Msg: "开始时间不能为空!"}
  419. c.ServeJSON()
  420. return
  421. }
  422. if len(Time_end) == 0 {
  423. c.Data["json"] = lib.JSONS{Code: 202, Msg: "结束时间不能为空!"}
  424. c.ServeJSON()
  425. return
  426. }
  427. tpCount := Warning.Read_WarningType_Count()
  428. var tpList []string
  429. if len(T_tp) > 0 {
  430. tpList = lib.SplitStringIds(T_tp, "T")
  431. if len(tpList) == int(tpCount) {
  432. // 类型全选,替换为空,不进行查询筛选(查询全部)
  433. tpList = []string{}
  434. }
  435. } else {
  436. power, _ := Account.Read_Power_ById(c.Admin_r.T_power)
  437. if power.T_warning != "*" {
  438. tpList = lib.SplitStringIds(power.T_warning, "W")
  439. }
  440. }
  441. countRedisKey := fmt.Sprintf("Company_Warning_Count_%d_%s_%s_%s_%s_%d_%d", c.T_pid, T_name, T_tp, Time_start, Time_end, T_handle, 0)
  442. Company_r, err := Account.Read_Company_ById(c.T_pid)
  443. if err != nil {
  444. c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id Err!"}
  445. c.ServeJSON()
  446. return
  447. }
  448. T_pids := Account.ReadCompanyIds_T_path(Company_r.T_path)
  449. Account.Read_Company_All_Maps()
  450. // 获取最新
  451. r_jsons.Data, r_jsons.Num = Warning.Gorm_Read_Company_Warning_List(T_pids, tpList, T_name, T_handle, Time_start, Time_end, page, page_z, c.T_pid, countRedisKey)
  452. r_jsons.Page = page
  453. r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
  454. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  455. c.ServeJSON()
  456. return
  457. }
  458. // 查询告警 暂时没有用到
  459. func (c *DeviceController) DeviceWarning_Get() {
  460. id, _ := c.GetInt("T_id")
  461. T_time := c.GetString("T_time")
  462. if len(T_time) == 0 {
  463. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误"}
  464. c.ServeJSON()
  465. return
  466. }
  467. var T_year, T_month string
  468. date, err := time.Parse("2006-01-02 15:04:05", T_time)
  469. if err != nil {
  470. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误"}
  471. c.ServeJSON()
  472. return
  473. }
  474. T_year, T_month = date.Format("2006"), date.Format("01")
  475. Wtab := "warning"
  476. Wtab += "_" + T_year + "_" + T_month
  477. T, err := Warning.Read_Warning_ById_Backups(id, T_year, T_month)
  478. if err != nil {
  479. c.Data["json"] = lib.JSONS{Code: 202, Msg: "T_id Err!"}
  480. c.ServeJSON()
  481. return
  482. }
  483. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Warning.WarningToWarning_R(0, T)}
  484. c.ServeJSON()
  485. return
  486. }
  487. // 编辑告警(处理告警)
  488. func (c *DeviceController) DeviceWarning_Post() {
  489. id, _ := c.GetInt("T_id")
  490. T_Text := c.GetString("T_Text")
  491. T_time := c.GetString("T_time")
  492. T_history, _ := c.GetInt("T_history") // TODO 后期废弃
  493. if len(T_time) == 0 {
  494. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误"}
  495. c.ServeJSON()
  496. return
  497. }
  498. var T_year, T_month string
  499. var warning Warning.Warning
  500. Wtab := "warning"
  501. if T_history == 1 {
  502. date, err := time.Parse("2006-01-02 15:04:05", T_time)
  503. if err != nil {
  504. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误"}
  505. c.ServeJSON()
  506. return
  507. }
  508. T_year, T_month = date.Format("2006"), date.Format("01")
  509. Wtab += "_" + T_year + "_" + T_month
  510. warning, err = Warning.Read_Warning_ById_Backups(id, T_year, T_month)
  511. if err != nil && err.Error() != "<QuerySeter> no row found" {
  512. c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
  513. c.ServeJSON()
  514. return
  515. }
  516. warning.T_Text = T_Text
  517. warning.T_State = 2
  518. warning.UpdateTime = time.Now()
  519. if is := Warning.Update_Warning_Backups(warning, T_year, T_month); !is {
  520. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  521. c.ServeJSON()
  522. return
  523. }
  524. warning = Warning.Read_Warning_ById(int64(id))
  525. if warning.Id > 0 {
  526. warning.T_Text = T_Text
  527. warning.T_State = 2
  528. warning.UpdateTime = time.Now()
  529. if is := Warning.Update_Warning(warning, "T_Text", "T_State", "UpdateTime"); !is {
  530. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  531. c.ServeJSON()
  532. return
  533. }
  534. }
  535. } else {
  536. // 使用新的查询方式后 warning表不做更新
  537. warning = Warning.Read_Warning_ById(int64(id))
  538. if warning.Id > 0 {
  539. warning.T_Text = T_Text
  540. warning.T_State = 2
  541. warning.UpdateTime = time.Now()
  542. if is := Warning.Update_Warning(warning, "T_Text", "T_State", "UpdateTime"); !is {
  543. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  544. c.ServeJSON()
  545. return
  546. }
  547. }
  548. // 同步处理历史数据
  549. date, err := time.Parse("2006-01-02 15:04:05", T_time)
  550. T_year, T_month = date.Format("2006"), date.Format("01")
  551. Wtab += "_" + T_year + "_" + T_month
  552. warningBackups, err := Warning.Read_Warning_ById_Backups(id, T_year, T_month)
  553. if err != nil && err.Error() != "<QuerySeter> no row found" {
  554. c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
  555. c.ServeJSON()
  556. return
  557. }
  558. if warningBackups.Id > 0 {
  559. warningBackups.T_Text = T_Text
  560. warningBackups.T_State = 2
  561. warningBackups.UpdateTime = time.Now()
  562. if is := Warning.Update_Warning_Backups(warningBackups, T_year, T_month); !is {
  563. c.Data["json"] = lib.JSONS{Code: 202, Msg: "修改失败!"}
  564. c.ServeJSON()
  565. return
  566. }
  567. }
  568. }
  569. // 删除报警列表统计的缓存
  570. Warning.Redis_WarningCount_DelK(c.T_pid)
  571. Warning.Redis_WarningCount_DelK(c.Admin_r.Id)
  572. System.Add_UserLogs(c.Admin_r.T_uuid, "设备管理", "报警处理操作", Wtab+":"+strconv.Itoa(id)+"->"+T_Text)
  573. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  574. c.ServeJSON()
  575. return
  576. }
  577. // 删除告警
  578. func (c *DeviceController) DeviceWarning_Del() {
  579. id, _ := c.GetInt("T_id")
  580. T_time := c.GetString("T_time")
  581. T_history, _ := c.GetInt("T_history") // TODO 后期废弃
  582. if len(T_time) == 0 {
  583. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误"}
  584. c.ServeJSON()
  585. return
  586. }
  587. var T_year, T_month string
  588. var warning Warning.Warning
  589. Wtab := "warning"
  590. if T_history == 1 {
  591. date, err := time.Parse("2006-01-02 15:04:05", T_time)
  592. if err != nil {
  593. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误"}
  594. c.ServeJSON()
  595. return
  596. }
  597. T_year, T_month = date.Format("2006"), date.Format("01")
  598. Wtab += "_" + T_year + "_" + T_month
  599. warningBackups, err := Warning.Read_Warning_ById_Backups(id, T_year, T_month)
  600. if err != nil && err.Error() != "<QuerySeter> no row found" {
  601. c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
  602. c.ServeJSON()
  603. return
  604. }
  605. if warningBackups.Id > 0 {
  606. warning.T_State = 0
  607. warning.UpdateTime = time.Now()
  608. if is := Warning.Update_Warning_Backups(warning, T_year, T_month); !is {
  609. c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
  610. c.ServeJSON()
  611. return
  612. }
  613. }
  614. warning = Warning.Read_Warning_ById(int64(id))
  615. if warning.Id > 0 {
  616. warning.T_State = 0
  617. if is := Warning.Update_Warning(warning, "T_State"); !is {
  618. c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
  619. c.ServeJSON()
  620. return
  621. }
  622. }
  623. } else {
  624. // 删除主表
  625. warning = Warning.Read_Warning_ById(int64(id))
  626. if warning.Id > 0 {
  627. warning.T_State = 0
  628. if is := Warning.Update_Warning(warning, "T_State"); !is {
  629. c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
  630. c.ServeJSON()
  631. return
  632. }
  633. }
  634. // 删除分表
  635. date, err := time.Parse("2006-01-02 15:04:05", T_time)
  636. T_year, T_month = date.Format("2006"), date.Format("01")
  637. Wtab += "_" + T_year + "_" + T_month
  638. warningBackups, err := Warning.Read_Warning_ById_Backups(id, T_year, T_month)
  639. if err != nil && err.Error() != "<QuerySeter> no row found" {
  640. c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
  641. c.ServeJSON()
  642. return
  643. }
  644. if warningBackups.Id > 0 {
  645. warningBackups.T_State = 0
  646. warningBackups.UpdateTime = time.Now()
  647. if is := Warning.Update_Warning_Backups(warningBackups, T_year, T_month); !is {
  648. c.Data["json"] = lib.JSONS{Code: 202, Msg: "删除失败!"}
  649. c.ServeJSON()
  650. return
  651. }
  652. }
  653. }
  654. // 删除报警列表统计的缓存
  655. Warning.Redis_WarningCount_DelK(c.T_pid)
  656. Warning.Redis_WarningCount_DelK(c.Admin_r.Id)
  657. System.Add_UserLogs(c.Admin_r.T_uuid, "设备管理", "报警删除操作", Wtab+":"+strconv.Itoa(id))
  658. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!"}
  659. c.ServeJSON()
  660. return
  661. }
  662. // 导出告警
  663. func (c *DeviceController) DeviceWarning_Data_Excel() {
  664. T_name := c.GetString("T_name")
  665. T_tp := c.GetString("T_tp")
  666. Time_start := c.GetString("Time_start")
  667. Time_end := c.GetString("Time_end")
  668. T_handle, _ := c.GetInt("T_handle")
  669. T_admin, _ := c.GetInt("T_admin")
  670. T_history, _ := c.GetInt("T_history")
  671. tpCount := Warning.Read_WarningType_Count()
  672. var tpList []string
  673. if len(T_tp) > 0 {
  674. tpList = lib.SplitStringIds(T_tp, "T")
  675. if len(tpList) == int(tpCount) {
  676. // 类型全选,替换为空,不进行查询筛选(查询全部)
  677. tpList = []string{}
  678. }
  679. } else {
  680. power, _ := Account.Read_Power_ById(c.Admin_r.T_power)
  681. if power.T_warning != "*" {
  682. tpList = lib.SplitStringIds(power.T_warning, "W")
  683. }
  684. }
  685. 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)
  686. bindSN, err := Account.Read_UserDevice_List(*c.Admin_r)
  687. if err != nil {
  688. c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
  689. c.ServeJSON()
  690. return
  691. }
  692. var T_year, T_month string
  693. if T_history == 1 {
  694. date, err := time.Parse("2006-01-02 15:04:05", Time_start)
  695. if err != nil {
  696. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误"}
  697. c.ServeJSON()
  698. return
  699. }
  700. T_year, T_month = date.Format("2006"), date.Format("01")
  701. }
  702. var Device_data []Warning.Warning_R
  703. // 管理员界面
  704. if T_admin == 1 {
  705. if T_history == 1 {
  706. // 获取备份
  707. 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)
  708. } else {
  709. // 获取最新
  710. Device_data, _ = Warning.Read_Admin_Warning_List(*c.Admin_r, tpList, T_name, T_handle, Time_start, Time_end, 0, 9999, countRedisKey)
  711. }
  712. }
  713. if T_history == 1 {
  714. // 获取备份
  715. 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)
  716. } else {
  717. // 获取最新
  718. Device_data, _ = Warning.Read_Warning_List(c.T_pid, bindSN, tpList, T_name, T_handle, Time_start, Time_end, 0, 9999, countRedisKey)
  719. }
  720. f := excelize.NewFile() // 设置单元格的值
  721. // 这里设置表头ÒÒ
  722. f.SetCellValue("Sheet1", "A1", "报警类型")
  723. f.SetCellValue("Sheet1", "B1", "Sn")
  724. f.SetCellValue("Sheet1", "C1", "设备名称")
  725. f.SetCellValue("Sheet1", "D1", "传感器")
  726. f.SetCellValue("Sheet1", "E1", "报警内容")
  727. f.SetCellValue("Sheet1", "F1", "记录时间")
  728. f.SetCellValue("Sheet1", "G1", "处理")
  729. f.SetCellValue("Sheet1", "H1", "处理时间")
  730. // 设置列宽
  731. f.SetColWidth("Sheet1", "A", "A", 20)
  732. f.SetColWidth("Sheet1", "B", "B", 25)
  733. f.SetColWidth("Sheet1", "C", "C", 30)
  734. f.SetColWidth("Sheet1", "D", "D", 30)
  735. f.SetColWidth("Sheet1", "G", "E", 30)
  736. f.SetColWidth("Sheet1", "H", "F", 15)
  737. f.SetColWidth("Sheet1", "I", "G", 30)
  738. f.SetColWidth("Sheet1", "J", "H", 15)
  739. line := 1
  740. // 循环写入数据
  741. for _, v := range Device_data {
  742. line++
  743. f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), Warning.Read_WarningType_Get(v.T_tp))
  744. f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), fmt.Sprintf("%s[%d]", v.T_sn, v.T_id))
  745. f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), v.T_D_name)
  746. f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), v.T_DS_name)
  747. f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), v.T_Remark)
  748. f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), v.T_Ut)
  749. f.SetCellValue("Sheet1", fmt.Sprintf("G%d", line), v.T_Text)
  750. f.SetCellValue("Sheet1", fmt.Sprintf("H%d", line), v.UpdateTime)
  751. }
  752. timeStr := time.Now().Format("20060102150405")
  753. // 保存文件
  754. if err := f.SaveAs("ofile/" + timeStr + ".xlsx"); err != nil {
  755. logs.Error(err)
  756. }
  757. url, is := NatsServer.Qiniu_UploadFile(lib.GetCurrentDirectory()+"/ofile/"+timeStr+".xlsx", "ofile/"+timeStr+".xlsx")
  758. if !is {
  759. c.Data["json"] = lib.JSONS{Code: 202, Msg: "oss!"}
  760. c.ServeJSON()
  761. return
  762. }
  763. // 删除文件
  764. err = os.Remove("ofile/" + timeStr + ".xlsx")
  765. if err != nil {
  766. logs.Error(err)
  767. }
  768. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: url}
  769. c.ServeJSON()
  770. return
  771. }
  772. func (c *DeviceController) DeviceWarning_Data_Excel2() {
  773. T_name := c.GetString("T_name")
  774. T_tp := c.GetString("T_tp")
  775. Time_start := c.GetString("Time_start")
  776. Time_end := c.GetString("Time_end")
  777. T_handle, _ := c.GetInt("T_handle")
  778. if len(Time_start) == 0 {
  779. c.Data["json"] = lib.JSONS{Code: 202, Msg: "开始时间不能为空!"}
  780. c.ServeJSON()
  781. return
  782. }
  783. if len(Time_end) == 0 {
  784. c.Data["json"] = lib.JSONS{Code: 202, Msg: "结束时间不能为空!"}
  785. c.ServeJSON()
  786. return
  787. }
  788. T_admin, _ := c.GetInt("T_admin")
  789. T_abandon, _ := c.GetInt("T_abandon") // 1 弃用设备
  790. tpCount := Warning.Read_WarningType_Count()
  791. var tpList []string
  792. if len(T_tp) > 0 {
  793. tpList = lib.SplitStringIds(T_tp, "T")
  794. if len(tpList) == int(tpCount) {
  795. // 类型全选,替换为空,不进行查询筛选(查询全部)
  796. tpList = []string{}
  797. }
  798. } else {
  799. power, _ := Account.Read_Power_ById(c.Admin_r.T_power)
  800. if power.T_warning != "*" {
  801. tpList = lib.SplitStringIds(power.T_warning, "W")
  802. }
  803. }
  804. 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_abandon)
  805. bindSN, err := Account.Read_UserDevice_List(*c.Admin_r)
  806. if err != nil {
  807. c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
  808. c.ServeJSON()
  809. return
  810. }
  811. // 查询弃用设备
  812. abandonDeviceList, _ := Device.Read_Device_List_ByT_State(bindSN, c.T_pid, 0)
  813. abandonSN := make([]string, 0)
  814. for _, r := range abandonDeviceList {
  815. abandonSN = append(abandonSN, r.T_sn)
  816. }
  817. var Device_data []Warning.Warning_R
  818. // 管理员界面
  819. if T_admin == 1 {
  820. // 获取最新
  821. //Device_data, _ = Warning.Gorm_Read_Admin_Warning_List(*c.Admin_r, tpList, T_name, T_handle, Time_start, Time_end, 0, 9999, countRedisKey)
  822. Device_data, _ = Warning.Gorm_Read_Admin_Warning_List_Excel(*c.Admin_r, tpList, T_name, T_handle, Time_start, Time_end, T_abandon, abandonSN, 0, 9999, countRedisKey)
  823. } else {
  824. // 获取最新
  825. //Device_data, _ = Warning.Gorm_Read_Warning_List(c.T_pid, bindSN, tpList, T_name, T_handle, Time_start, Time_end, 0, 9999, countRedisKey)
  826. Device_data, _ = Warning.Gorm_Read_Warning_List_Excel(c.T_pid, bindSN, tpList, T_name, T_handle, Time_start, Time_end, T_abandon, abandonSN, 0, 9999, countRedisKey)
  827. }
  828. f := excelize.NewFile() // 设置单元格的值
  829. // 这里设置表头ÒÒ
  830. f.SetCellValue("Sheet1", "A1", "报警类型")
  831. f.SetCellValue("Sheet1", "B1", "Sn")
  832. f.SetCellValue("Sheet1", "C1", "设备名称")
  833. f.SetCellValue("Sheet1", "D1", "传感器")
  834. f.SetCellValue("Sheet1", "E1", "报警内容")
  835. f.SetCellValue("Sheet1", "F1", "记录时间")
  836. f.SetCellValue("Sheet1", "G1", "处理")
  837. f.SetCellValue("Sheet1", "H1", "处理时间")
  838. // 设置列宽
  839. f.SetColWidth("Sheet1", "A", "A", 20)
  840. f.SetColWidth("Sheet1", "B", "B", 25)
  841. f.SetColWidth("Sheet1", "C", "C", 30)
  842. f.SetColWidth("Sheet1", "D", "D", 30)
  843. f.SetColWidth("Sheet1", "G", "E", 30)
  844. f.SetColWidth("Sheet1", "H", "F", 15)
  845. f.SetColWidth("Sheet1", "I", "G", 30)
  846. f.SetColWidth("Sheet1", "J", "H", 15)
  847. line := 1
  848. // 循环写入数据
  849. for _, v := range Device_data {
  850. line++
  851. f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), Warning.Read_WarningType_Get(v.T_tp))
  852. f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), fmt.Sprintf("%s[%d]", v.T_sn, v.T_id))
  853. f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), v.T_D_name)
  854. f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), v.T_DS_name)
  855. f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), v.T_Remark)
  856. f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), v.T_Ut)
  857. f.SetCellValue("Sheet1", fmt.Sprintf("G%d", line), v.T_Text)
  858. f.SetCellValue("Sheet1", fmt.Sprintf("H%d", line), v.UpdateTime)
  859. }
  860. timeStr := time.Now().Format("20060102150405")
  861. // 保存文件
  862. if err := f.SaveAs("ofile/" + timeStr + ".xlsx"); err != nil {
  863. logs.Error(err)
  864. }
  865. url, is := NatsServer.Qiniu_UploadFile(lib.GetCurrentDirectory()+"/ofile/"+timeStr+".xlsx", "ofile/"+timeStr+".xlsx")
  866. if !is {
  867. c.Data["json"] = lib.JSONS{Code: 202, Msg: "oss!"}
  868. c.ServeJSON()
  869. return
  870. }
  871. // 删除文件
  872. err = os.Remove("ofile/" + timeStr + ".xlsx")
  873. if err != nil {
  874. logs.Error(err)
  875. }
  876. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: url}
  877. c.ServeJSON()
  878. return
  879. }
  880. // 公司管理 - 导出告警
  881. func (c *DeviceController) CompanyWarning_Data_Excel() {
  882. T_name := c.GetString("T_name")
  883. T_tp := c.GetString("T_tp")
  884. Time_start := c.GetString("Time_start")
  885. Time_end := c.GetString("Time_end")
  886. T_handle, _ := c.GetInt("T_handle")
  887. T_history, _ := c.GetInt("T_history")
  888. tpCount := Warning.Read_WarningType_Count()
  889. var tpList []string
  890. if len(T_tp) > 0 {
  891. tpList = lib.SplitStringIds(T_tp, "T")
  892. if len(tpList) == int(tpCount) {
  893. // 类型全选,替换为空,不进行查询筛选(查询全部)
  894. tpList = []string{}
  895. }
  896. } else {
  897. power, _ := Account.Read_Power_ById(c.Admin_r.T_power)
  898. if power.T_warning != "*" {
  899. tpList = lib.SplitStringIds(power.T_warning, "W")
  900. }
  901. }
  902. 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)
  903. Account.Read_Company_All_Maps()
  904. Company_r, err := Account.Read_Company_ById(c.T_pid)
  905. if err != nil {
  906. c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id Err!"}
  907. c.ServeJSON()
  908. return
  909. }
  910. T_pids := Account.ReadCompanyIds_T_path(Company_r.T_path)
  911. var T_year, T_month string
  912. if T_history == 1 {
  913. date, err := time.Parse("2006-01-02 15:04:05", Time_start)
  914. if err != nil {
  915. c.Data["json"] = lib.JSONS{Code: 202, Msg: "时间格式错误"}
  916. c.ServeJSON()
  917. return
  918. }
  919. T_year, T_month = date.Format("2006"), date.Format("01")
  920. }
  921. var Device_data []Warning.CompanyWarning_R
  922. if T_history == 1 {
  923. // 获取备份
  924. 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)
  925. } else {
  926. // 获取最新
  927. Device_data, _ = Warning.Read_Company_Warning_List(T_pids, tpList, T_name, T_handle, Time_start, Time_end, 0, 9999, c.T_pid, countRedisKey)
  928. }
  929. f := excelize.NewFile() // 设置单元格的值
  930. // 这里设置表头
  931. f.SetCellValue("Sheet1", "A1", "报警类型")
  932. f.SetCellValue("Sheet1", "A1", "公司名称")
  933. f.SetCellValue("Sheet1", "B1", "Sn")
  934. f.SetCellValue("Sheet1", "C1", "设备名称")
  935. f.SetCellValue("Sheet1", "D1", "传感器")
  936. f.SetCellValue("Sheet1", "E1", "报警内容")
  937. f.SetCellValue("Sheet1", "F1", "记录时间")
  938. f.SetCellValue("Sheet1", "G1", "处理")
  939. f.SetCellValue("Sheet1", "H1", "处理时间")
  940. // 设置列宽
  941. f.SetColWidth("Sheet1", "A", "A", 20)
  942. f.SetColWidth("Sheet1", "B", "B", 40)
  943. f.SetColWidth("Sheet1", "C", "C", 25)
  944. f.SetColWidth("Sheet1", "D", "D", 30)
  945. f.SetColWidth("Sheet1", "E", "E", 30)
  946. f.SetColWidth("Sheet1", "F", "F", 30)
  947. f.SetColWidth("Sheet1", "J", "J", 15)
  948. f.SetColWidth("Sheet1", "H", "H", 30)
  949. f.SetColWidth("Sheet1", "I", "I", 15)
  950. line := 1
  951. // 循环写入数据
  952. for _, v := range Device_data {
  953. line++
  954. f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), Warning.Read_WarningType_Get(v.T_tp))
  955. f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), fmt.Sprintf("%s", v.T_pid_name))
  956. f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), fmt.Sprintf("%s[%d]", v.T_sn, v.T_id))
  957. f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), v.T_D_name)
  958. f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), v.T_DS_name)
  959. f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), v.T_Remark)
  960. f.SetCellValue("Sheet1", fmt.Sprintf("J%d", line), v.T_Ut)
  961. f.SetCellValue("Sheet1", fmt.Sprintf("H%d", line), v.T_Text)
  962. f.SetCellValue("Sheet1", fmt.Sprintf("I%d", line), v.UpdateTime)
  963. }
  964. timeStr := time.Now().Format("20060102150405")
  965. // 保存文件
  966. if err := f.SaveAs("ofile/" + timeStr + ".xlsx"); err != nil {
  967. logs.Error(err)
  968. }
  969. url, is := NatsServer.Qiniu_UploadFile(lib.GetCurrentDirectory()+"/ofile/"+timeStr+".xlsx", "ofile/"+timeStr+".xlsx")
  970. if !is {
  971. c.Data["json"] = lib.JSONS{Code: 202, Msg: "oss!"}
  972. c.ServeJSON()
  973. return
  974. }
  975. // 删除文件
  976. err = os.Remove("ofile/" + timeStr + ".xlsx")
  977. if err != nil {
  978. logs.Error(err)
  979. }
  980. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: url}
  981. c.ServeJSON()
  982. return
  983. }
  984. func (c *DeviceController) CompanyWarning_Data_Excel2() {
  985. T_name := c.GetString("T_name")
  986. T_tp := c.GetString("T_tp")
  987. Time_start := c.GetString("Time_start")
  988. Time_end := c.GetString("Time_end")
  989. T_handle, _ := c.GetInt("T_handle")
  990. if len(Time_start) == 0 {
  991. c.Data["json"] = lib.JSONS{Code: 202, Msg: "开始时间不能为空!"}
  992. c.ServeJSON()
  993. return
  994. }
  995. if len(Time_end) == 0 {
  996. c.Data["json"] = lib.JSONS{Code: 202, Msg: "结束时间不能为空!"}
  997. c.ServeJSON()
  998. return
  999. }
  1000. tpCount := Warning.Read_WarningType_Count()
  1001. var tpList []string
  1002. if len(T_tp) > 0 {
  1003. tpList = lib.SplitStringIds(T_tp, "T")
  1004. if len(tpList) == int(tpCount) {
  1005. // 类型全选,替换为空,不进行查询筛选(查询全部)
  1006. tpList = []string{}
  1007. }
  1008. } else {
  1009. power, _ := Account.Read_Power_ById(c.Admin_r.T_power)
  1010. if power.T_warning != "*" {
  1011. tpList = lib.SplitStringIds(power.T_warning, "W")
  1012. }
  1013. }
  1014. countRedisKey := fmt.Sprintf("Company_Warning_Count_%d_%s_%s_%s_%s_%d_%d", c.T_pid, T_name, T_tp, Time_start, Time_end, T_handle, 0)
  1015. Account.Read_Company_All_Maps()
  1016. Company_r, err := Account.Read_Company_ById(c.T_pid)
  1017. if err != nil {
  1018. c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id Err!"}
  1019. c.ServeJSON()
  1020. return
  1021. }
  1022. T_pids := Account.ReadCompanyIds_T_path(Company_r.T_path)
  1023. var Device_data []Warning.CompanyWarning_R
  1024. // 获取最新
  1025. Device_data, _ = Warning.Gorm_Read_Company_Warning_List_Excel(T_pids, tpList, T_name, T_handle, Time_start, Time_end, 0, 9999, c.T_pid, countRedisKey)
  1026. f := excelize.NewFile() // 设置单元格的值
  1027. // 这里设置表头
  1028. f.SetCellValue("Sheet1", "A1", "报警类型")
  1029. f.SetCellValue("Sheet1", "B1", "公司名称")
  1030. f.SetCellValue("Sheet1", "C1", "Sn")
  1031. f.SetCellValue("Sheet1", "D1", "设备名称")
  1032. f.SetCellValue("Sheet1", "E1", "传感器")
  1033. f.SetCellValue("Sheet1", "F1", "报警内容")
  1034. f.SetCellValue("Sheet1", "G1", "记录时间")
  1035. f.SetCellValue("Sheet1", "H1", "处理")
  1036. f.SetCellValue("Sheet1", "I1", "处理时间")
  1037. // 设置列宽
  1038. f.SetColWidth("Sheet1", "A", "A", 20)
  1039. f.SetColWidth("Sheet1", "B", "B", 40)
  1040. f.SetColWidth("Sheet1", "C", "C", 25)
  1041. f.SetColWidth("Sheet1", "D", "D", 30)
  1042. f.SetColWidth("Sheet1", "E", "E", 30)
  1043. f.SetColWidth("Sheet1", "F", "F", 30)
  1044. f.SetColWidth("Sheet1", "J", "J", 15)
  1045. f.SetColWidth("Sheet1", "H", "H", 30)
  1046. f.SetColWidth("Sheet1", "I", "I", 15)
  1047. line := 1
  1048. // 循环写入数据
  1049. for _, v := range Device_data {
  1050. line++
  1051. f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), Warning.Read_WarningType_Get(v.T_tp))
  1052. f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), fmt.Sprintf("%s", v.T_pid_name))
  1053. f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), fmt.Sprintf("%s[%d]", v.T_sn, v.T_id))
  1054. f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), v.T_D_name)
  1055. f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), v.T_DS_name)
  1056. f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), v.T_Remark)
  1057. f.SetCellValue("Sheet1", fmt.Sprintf("G%d", line), v.T_Ut)
  1058. f.SetCellValue("Sheet1", fmt.Sprintf("H%d", line), v.T_Text)
  1059. f.SetCellValue("Sheet1", fmt.Sprintf("I%d", line), v.UpdateTime)
  1060. }
  1061. timeStr := time.Now().Format("20060102150405")
  1062. // 保存文件
  1063. if err := f.SaveAs("ofile/" + timeStr + ".xlsx"); err != nil {
  1064. logs.Error(err)
  1065. }
  1066. url, is := NatsServer.Qiniu_UploadFile(lib.GetCurrentDirectory()+"/ofile/"+timeStr+".xlsx", "ofile/"+timeStr+".xlsx")
  1067. if !is {
  1068. c.Data["json"] = lib.JSONS{Code: 202, Msg: "oss!"}
  1069. c.ServeJSON()
  1070. return
  1071. }
  1072. // 删除文件
  1073. err = os.Remove("ofile/" + timeStr + ".xlsx")
  1074. if err != nil {
  1075. logs.Error(err)
  1076. }
  1077. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: url}
  1078. c.ServeJSON()
  1079. return
  1080. }
  1081. // 告警提示列表
  1082. func (c *DeviceController) DeviceWarningList_T_Tips() {
  1083. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Warning.Read_WarningType_All_T_Notice_mechanism()}
  1084. c.ServeJSON()
  1085. return
  1086. }
  1087. // 告警类型列表
  1088. func (c *DeviceController) WarningType_List_All() {
  1089. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Warning.Read_WarningType_All()}
  1090. c.ServeJSON()
  1091. return
  1092. }
  1093. // 告警类型列表 - 权限关联列表
  1094. func (c *DeviceController) WarningType_Power_List_All() {
  1095. power, err := Account.Read_Power_ById(c.Admin_r.T_power)
  1096. if err != nil {
  1097. c.Data["json"] = lib.JSONS{Code: 200, Msg: "获取菜单失败"}
  1098. c.ServeJSON()
  1099. return
  1100. }
  1101. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Warning.Read_WarningType_Power_All(power.T_warning)}
  1102. c.ServeJSON()
  1103. return
  1104. }
  1105. // 通过传感器类型获取报警列表
  1106. func (c *DeviceController) Read_Warning_List_By_DS_T_type() {
  1107. var r_jsons lib.R_JSONS
  1108. page, _ := c.GetInt("page")
  1109. if page < 1 {
  1110. page = 1
  1111. }
  1112. page_z, _ := c.GetInt("page_z")
  1113. if page_z < 1 {
  1114. page_z = conf.Page_size
  1115. }
  1116. T_type, _ := c.GetInt("T_type")
  1117. T_name := c.GetString("T_name")
  1118. bindSN, err := Account.Read_UserDevice_List(*c.Admin_r)
  1119. if err != nil {
  1120. c.Data["json"] = lib.JSONS{Code: 202, Msg: "查询失败!"}
  1121. c.ServeJSON()
  1122. return
  1123. }
  1124. var T_pids []int
  1125. if c.Admin_r.T_pid > 0 {
  1126. // 查询公司
  1127. Company_r, err := Account.Read_Company_ById(c.Admin_r.T_pid)
  1128. if err != nil {
  1129. c.Data["json"] = lib.JSONS{Code: 202, Msg: "Id Err!"}
  1130. c.ServeJSON()
  1131. return
  1132. }
  1133. // 查询公司下面所有子公司id
  1134. T_pids = Account.ReadCompanyIds_T_path(Company_r.T_path)
  1135. }
  1136. var tpList []string
  1137. power, _ := Account.Read_Power_ById(c.Admin_r.T_power)
  1138. if power.T_warning != "*" {
  1139. tpList = lib.SplitStringIds(power.T_warning, "W")
  1140. }
  1141. 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)
  1142. 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)
  1143. r_jsons.Page = page
  1144. r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
  1145. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  1146. c.ServeJSON()
  1147. return
  1148. }
  1149. func (c *DeviceController) Read_WarningSend_List() {
  1150. var r_jsons lib.R_JSONS
  1151. page, _ := c.GetInt("page")
  1152. if page < 1 {
  1153. page = 1
  1154. }
  1155. page_z, _ := c.GetInt("page_z")
  1156. if page_z < 1 {
  1157. page_z = conf.Page_size
  1158. }
  1159. T_ntype, _ := c.GetInt("T_ntype")
  1160. r_jsons.Data, r_jsons.Num = Warning.Read_WarningSand_List(c.T_pid, T_ntype, page, page_z)
  1161. r_jsons.Page = page
  1162. r_jsons.Page_size = int(math.Ceil(float64(r_jsons.Num) / float64(page_z)))
  1163. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: r_jsons}
  1164. c.ServeJSON()
  1165. return
  1166. }
  1167. func (c *DeviceController) Read_WarningRate_List() {
  1168. page, _ := c.GetInt("page")
  1169. if page < 1 {
  1170. page = 1
  1171. }
  1172. page_z, _ := c.GetInt("page_z")
  1173. if page_z < 1 {
  1174. page_z = conf.Page_size
  1175. }
  1176. T_uuid := c.GetString("T_uuid")
  1177. T_year, _ := c.GetInt("T_year")
  1178. T_month, _ := c.GetInt("T_month")
  1179. var startTime, endTime string
  1180. now := time.Now()
  1181. var month time.Month
  1182. // 默认本月
  1183. if T_year == 0 {
  1184. T_year = now.Year()
  1185. }
  1186. if T_month == 0 {
  1187. month = now.Month()
  1188. } else {
  1189. month = time.Month(T_month)
  1190. }
  1191. T_type := Warning.WarningRateDay
  1192. if T_month == 0 {
  1193. T_type = Warning.WarningRateMonth
  1194. }
  1195. if T_type == Warning.WarningRateDay {
  1196. startTime = time.Date(T_year, month, 1, 0, 0, 0, 0, time.Local).Format("2006-01-02")
  1197. endTime = time.Date(T_year, month+1, 0, 0, 0, 0, 0, time.Local).Format("2006-01-02")
  1198. }
  1199. // 默认本年
  1200. if T_type == Warning.WarningRateMonth {
  1201. startTime = time.Date(T_year, 1, 1, 0, 0, 0, 0, time.Local).Format("2006-01")
  1202. endTime = time.Date(T_year, 12, 31, 0, 0, 0, 0, time.Local).Format("2006-01")
  1203. }
  1204. if len(T_uuid) == 0 {
  1205. T_uuid = c.Admin_r.T_uuid
  1206. }
  1207. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Warning.Read_WarningRate_List(T_uuid, T_type, startTime, endTime)}
  1208. c.ServeJSON()
  1209. return
  1210. }
  1211. func (c *DeviceController) Read_WarningHandle_List() {
  1212. c.Data["json"] = lib.JSONS{Code: 200, Msg: "ok!", Data: Warning.Read_WarningHandle_List()}
  1213. c.ServeJSON()
  1214. return
  1215. }
  1216. func Cron_WarningRate() {
  1217. // 创建一个定时任务对象
  1218. c := cron.New(cron.WithSeconds())
  1219. // 给对象增加定时任务
  1220. // @daily 每日运行一次
  1221. // c.AddFunc("0 */1 * * * ?", Cron_WarningRateDay_Add)
  1222. // c.AddFunc("0 */1 * * * ?", Cron_WarningRateMonth_Add)
  1223. jc, _ := beego.AppConfig.String("jcCron")
  1224. c.AddFunc("@daily", Cron_WarningRateDay_Add)
  1225. c.AddFunc("@monthly", Cron_WarningRateMonth_Add)
  1226. c.AddFunc(jc, openApi.GetRealtime)
  1227. // 启动定时任务
  1228. c.Start()
  1229. defer c.Stop()
  1230. // 查询语句,阻塞,让main函数不退出,保持程序运行
  1231. select {}
  1232. }
  1233. // 保存每天的设备报警率
  1234. func Cron_WarningRateDay_Add() {
  1235. T_date := time.Now().AddDate(0, 0, -1).Format("2006-01-02")
  1236. logs.Info("开始统计" + T_date + "设备报警率")
  1237. // 获取管理员用户列表
  1238. adminList := Account.Read_Admin_List_All()
  1239. // 获取内部用户关联的pid
  1240. for _, admin := range adminList {
  1241. // 内部用户已绑定公司,* 绑定所有公司
  1242. if len(admin.T_pids) == 0 || admin.T_pids == "*" {
  1243. continue
  1244. }
  1245. // 获取排除后的pid
  1246. T_pids := lib.SplitStringToIntIds(admin.T_pids, "P")
  1247. if len(T_pids) == 0 {
  1248. continue
  1249. }
  1250. pids := Account.ReadCompanyWarningIds_T_pids(T_pids)
  1251. if len(pids) == 0 {
  1252. continue
  1253. }
  1254. // 获取探头数量
  1255. dsCnt := Device.Read_DeviceSensorCount_ByT_pids(pids)
  1256. // 获取当天报警数量
  1257. warningCount := Warning.Read_WarningCount_byDay(pids)
  1258. T_rate, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", float64(warningCount)/float64(dsCnt)), 64) // 保留2位小数
  1259. // 保存设备报警率
  1260. warningRate := Warning.WarningRate{
  1261. T_uuid: admin.T_uuid,
  1262. T_date: T_date,
  1263. T_type: Warning.WarningRateDay,
  1264. T_device_num: dsCnt,
  1265. T_warning_num: warningCount,
  1266. T_rate: float32(T_rate),
  1267. }
  1268. Warning.Add_WarningRate(warningRate)
  1269. }
  1270. }
  1271. // 保存每月的设备报警率
  1272. func Cron_WarningRateMonth_Add() {
  1273. now := time.Now()
  1274. // fixme 测试
  1275. //now := time.Now().AddDate(0, 1, 0)
  1276. T_date := now.AddDate(0, -1, 0).Format("2006-01")
  1277. firstOfMonth := time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, time.Local)
  1278. startTime := firstOfMonth.AddDate(0, -1, 0).Format("2006-01-02") // 上月第一天
  1279. endTime := firstOfMonth.AddDate(0, 0, -1).Format("2006-01-02") // 上月最后一天
  1280. logs.Info("开始统计" + T_date + "设备报警率")
  1281. logs.Info("开始时间" + startTime)
  1282. logs.Info("结束时间" + endTime)
  1283. rateAvgList := Warning.Read_WarningRateAvg_Month(startTime, endTime)
  1284. // 获取内部用户关联的pid
  1285. for _, rate := range rateAvgList {
  1286. T_rate, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", float64(rate.T_warning_num)/float64(rate.T_device_num)), 64) // 保留2位小数
  1287. // 保存设备报警率
  1288. warningRate := Warning.WarningRate{
  1289. T_uuid: rate.T_uuid,
  1290. T_date: T_date,
  1291. T_type: Warning.WarningRateMonth,
  1292. T_device_num: rate.T_device_num,
  1293. T_warning_num: rate.T_warning_num,
  1294. T_rate: float32(T_rate),
  1295. }
  1296. Warning.Add_WarningRate(warningRate)
  1297. }
  1298. }