Warning.go 43 KB

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