Warning.go 45 KB

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