alert-setting.component.ts 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. import { Component, OnInit } from '@angular/core';
  2. import {NzTableQueryParams} from "ng-zorro-antd/table";
  3. import {NzModalService} from "ng-zorro-antd/modal";
  4. import {NzNotificationService} from "ng-zorro-antd/notification";
  5. import {AlertDefineService} from "../../../service/alert-define.service";
  6. import {AlertDefine} from "../../../pojo/AlertDefine";
  7. import {finalize, map} from "rxjs/operators";
  8. import {AppDefineService} from "../../../service/app-define.service";
  9. import {TransferChange, TransferItem} from "ng-zorro-antd/transfer";
  10. import {zip} from "rxjs";
  11. import {MonitorService} from "../../../service/monitor.service";
  12. import {Message} from "../../../pojo/Message";
  13. import {AlertDefineBind} from "../../../pojo/AlertDefineBind";
  14. import {Monitor} from "../../../pojo/Monitor";
  15. @Component({
  16. selector: 'app-alert-setting',
  17. templateUrl: './alert-setting.component.html',
  18. styles: [
  19. ]
  20. })
  21. export class AlertSettingComponent implements OnInit {
  22. constructor(private modal: NzModalService,
  23. private notifySvc: NzNotificationService,
  24. private appDefineSvc: AppDefineService,
  25. private monitorSvc: MonitorService,
  26. private alertDefineSvc: AlertDefineService) { }
  27. pageIndex: number = 1;
  28. pageSize: number = 8;
  29. total: number = 0;
  30. defines!: AlertDefine[];
  31. tableLoading: boolean = true;
  32. checkedDefineIds = new Set<number>();
  33. appHierarchies!: any[];
  34. ngOnInit(): void {
  35. this.loadAlertDefineTable();
  36. // 查询监控层级
  37. const getHierarchy$ = this.appDefineSvc.getAppHierarchy()
  38. .pipe(finalize(() => {
  39. getHierarchy$.unsubscribe();
  40. }))
  41. .subscribe(message => {
  42. if (message.code === 0) {
  43. this.appHierarchies = message.data;
  44. } else {
  45. console.warn(message.msg);
  46. }
  47. }, error => {
  48. console.warn(error.msg);
  49. })
  50. }
  51. sync() {
  52. this.loadAlertDefineTable();
  53. }
  54. loadAlertDefineTable() {
  55. this.tableLoading = true;
  56. let alertDefineInit$ = this.alertDefineSvc.getAlertDefines(this.pageIndex - 1, this.pageSize)
  57. .subscribe(message => {
  58. this.tableLoading = false;
  59. this.checkedAll = false;
  60. this.checkedDefineIds.clear();
  61. if (message.code === 0) {
  62. let page = message.data;
  63. this.defines = page.content;
  64. this.pageIndex = page.number + 1;
  65. this.total = page.totalElements;
  66. } else {
  67. console.warn(message.msg);
  68. }
  69. alertDefineInit$.unsubscribe();
  70. }, error => {
  71. this.tableLoading = false;
  72. alertDefineInit$.unsubscribe();
  73. });
  74. }
  75. onNewAlertDefine() {
  76. this.define = new AlertDefine();
  77. this.isManageModalAdd = true;
  78. this.isManageModalVisible = true;
  79. this.isManageModalOkLoading = false;
  80. }
  81. onEditOneAlertDefine(alertDefineId: number) {
  82. if (alertDefineId == null) {
  83. this.notifySvc.warning("未选中任何待编辑项!","");
  84. return;
  85. }
  86. this.editAlertDefine(alertDefineId);
  87. }
  88. onEditAlertDefine() {
  89. // 编辑时只能选中一个
  90. if (this.checkedDefineIds == null || this.checkedDefineIds.size === 0) {
  91. this.notifySvc.warning("未选中任何待编辑项!","");
  92. return;
  93. }
  94. if (this.checkedDefineIds.size > 1) {
  95. this.notifySvc.warning("只能对一个选中项进行编辑!","");
  96. return;
  97. }
  98. let alertDefineId = 0;
  99. this.checkedDefineIds.forEach(item => alertDefineId = item);
  100. this.editAlertDefine(alertDefineId);
  101. }
  102. editAlertDefine(alertDefineId: number) {
  103. this.isManageModalAdd = false;
  104. this.isManageModalVisible = true;
  105. this.isManageModalOkLoading = false;
  106. // 查询告警定义信息
  107. const getDefine$ = this.alertDefineSvc.getAlertDefine(alertDefineId)
  108. .pipe(finalize(() => {
  109. getDefine$.unsubscribe();
  110. }))
  111. .subscribe(message => {
  112. if (message.code === 0) {
  113. this.define = message.data;
  114. this.cascadeValues = [this.define.app, this.define.metric, this.define.field];
  115. } else {
  116. this.notifySvc.error("查询此监控定义详情失败!",message.msg);
  117. }
  118. }, error => {
  119. this.notifySvc.error("查询此监控定义详情失败!",error.msg);
  120. })
  121. }
  122. onDeleteAlertDefines() {
  123. if (this.checkedDefineIds == null || this.checkedDefineIds.size === 0) {
  124. this.notifySvc.warning("未选中任何待删除项!","");
  125. return;
  126. }
  127. this.modal.confirm({
  128. nzTitle: '请确认是否批量删除!',
  129. nzOkText: '确定',
  130. nzCancelText: '取消',
  131. nzOkDanger: true,
  132. nzOkType: "primary",
  133. nzOnOk: () => this.deleteAlertDefines(this.checkedDefineIds)
  134. });
  135. }
  136. onDeleteOneAlertDefine(alertDefineId: number) {
  137. let defineIds = new Set<number>();
  138. defineIds.add(alertDefineId);
  139. this.modal.confirm({
  140. nzTitle: '请确认是否删除!',
  141. nzOkText: '确定',
  142. nzCancelText: '取消',
  143. nzOkDanger: true,
  144. nzOkType: "primary",
  145. nzOnOk: () => this.deleteAlertDefines(defineIds)
  146. });
  147. }
  148. deleteAlertDefines(defineIds: Set<number>) {
  149. if (defineIds == null || defineIds.size == 0) {
  150. this.notifySvc.warning("未选中任何待删除项!","");
  151. return;
  152. }
  153. this.tableLoading = true;
  154. const deleteDefines$ = this.alertDefineSvc.deleteAlertDefines(defineIds)
  155. .subscribe(message => {
  156. deleteDefines$.unsubscribe();
  157. if (message.code === 0) {
  158. this.notifySvc.success("删除成功!", "");
  159. this.loadAlertDefineTable();
  160. } else {
  161. this.tableLoading = false;
  162. this.notifySvc.error("删除失败!", message.msg);
  163. }
  164. }, error => {
  165. this.tableLoading = false;
  166. deleteDefines$.unsubscribe();
  167. this.notifySvc.error("删除失败!", error.msg)
  168. })
  169. }
  170. // begin: 列表多选分页逻辑
  171. checkedAll: boolean = false;
  172. onAllChecked(checked: boolean) {
  173. if (checked) {
  174. this.defines.forEach(monitor => this.checkedDefineIds.add(monitor.id));
  175. } else {
  176. this.checkedDefineIds.clear();
  177. }
  178. }
  179. onItemChecked(monitorId: number, checked: boolean) {
  180. if (checked) {
  181. this.checkedDefineIds.add(monitorId);
  182. } else {
  183. this.checkedDefineIds.delete(monitorId);
  184. }
  185. }
  186. /**
  187. * 分页回调
  188. * @param params 页码信息
  189. */
  190. onTablePageChange(params: NzTableQueryParams) {
  191. const { pageSize, pageIndex, sort, filter } = params;
  192. this.pageIndex = pageIndex;
  193. this.pageSize = pageSize;
  194. this.loadAlertDefineTable();
  195. }
  196. // end: 列表多选逻辑
  197. // start 新增修改告警定义model
  198. isManageModalVisible = false;
  199. isManageModalOkLoading = false;
  200. isManageModalAdd = true;
  201. define!: AlertDefine;
  202. cascadeValues: string[] = [];
  203. onManageModalCancel() {
  204. this.isManageModalVisible = false;
  205. }
  206. onManageModalOk() {
  207. this.isManageModalOkLoading = true;
  208. this.define.app = this.cascadeValues[0];
  209. this.define.metric = this.cascadeValues[1];
  210. this.define.field = this.cascadeValues[2];
  211. if (this.isManageModalAdd) {
  212. const modalOk$ = this.alertDefineSvc.newAlertDefine(this.define)
  213. .pipe(finalize(() => {
  214. modalOk$.unsubscribe();
  215. this.isManageModalOkLoading = false;
  216. }))
  217. .subscribe(message => {
  218. if (message.code === 0) {
  219. this.isManageModalVisible = false;
  220. this.notifySvc.success("新增成功!", "");
  221. this.loadAlertDefineTable();
  222. } else {
  223. this.notifySvc.error("新增失败!", message.msg);
  224. }
  225. }, error => {
  226. this.notifySvc.error("新增失败!", error.msg);
  227. })
  228. } else {
  229. const modalOk$ = this.alertDefineSvc.editAlertDefine(this.define)
  230. .pipe(finalize(() => {
  231. modalOk$.unsubscribe();
  232. this.isManageModalOkLoading = false;
  233. }))
  234. .subscribe(message => {
  235. if (message.code === 0) {
  236. this.isManageModalVisible = false;
  237. this.notifySvc.success("修改成功!", "");
  238. this.loadAlertDefineTable();
  239. } else {
  240. this.notifySvc.error("修改失败!", message.msg);
  241. }
  242. }, error => {
  243. this.notifySvc.error("修改失败!", error.msg);
  244. })
  245. }
  246. }
  247. // end 新增修改告警定义model
  248. // start 告警定义与监控关联model
  249. isConnectModalVisible = false;
  250. isConnectModalOkLoading = false;
  251. transferData: TransferItem[] = [];
  252. currentAlertDefineId!: number;
  253. $asTransferItems = (data: unknown): TransferItem[] => data as TransferItem[];
  254. onOpenConnectModal(alertDefineId: number, app: string) {
  255. this.isConnectModalVisible = true;
  256. this.currentAlertDefineId = alertDefineId;
  257. zip(this.alertDefineSvc.getAlertDefineMonitorsBind(alertDefineId), this.monitorSvc.getMonitorsByApp(app))
  258. .pipe(
  259. map(([defineBindData, monitorData]: [Message<AlertDefineBind[]>, Message<Monitor[]>]) => {
  260. let bindRecode: Record<number, string> = {};
  261. if (defineBindData.data != undefined) {
  262. defineBindData.data.forEach(bind => {
  263. bindRecode[bind.monitorId] = bind.monitorName;
  264. })
  265. }
  266. let listTmp: any[] = [];
  267. if (monitorData.data != undefined) {
  268. monitorData.data.forEach(monitor => {
  269. listTmp.push({
  270. id: monitor.id,
  271. name: monitor.name,
  272. key: monitor.id,
  273. direction: bindRecode[monitor.id] == undefined ? 'left' : 'right'
  274. })
  275. })
  276. }
  277. return listTmp;
  278. })
  279. ).subscribe(list => this.transferData = list);
  280. }
  281. onConnectModalCancel() {
  282. this.isConnectModalVisible = false;
  283. }
  284. onConnectModalOk() {
  285. this.isConnectModalOkLoading = true;
  286. let defineBinds: AlertDefineBind[] = [];
  287. this.transferData.forEach(item => {
  288. if (item.direction == 'right') {
  289. let bind = new AlertDefineBind();
  290. bind.alertDefineId = this.currentAlertDefineId;
  291. bind.monitorId = item.id;
  292. bind.monitorName = item.name;
  293. defineBinds.push(bind);
  294. }
  295. })
  296. const applyBind$ = this.alertDefineSvc.applyAlertDefineMonitorsBind(this.currentAlertDefineId, defineBinds)
  297. .pipe(finalize(() => {
  298. applyBind$.unsubscribe();
  299. }))
  300. .subscribe(message => {
  301. this.isConnectModalOkLoading = false;
  302. if (message.code === 0) {
  303. this.notifySvc.success("应用成功!", "");
  304. this.isConnectModalVisible = false;
  305. this.loadAlertDefineTable();
  306. } else {
  307. this.notifySvc.error("应用失败!", message.msg);
  308. }
  309. }, error => {
  310. this.notifySvc.error("应用失败!", error.msg);
  311. })
  312. }
  313. change(ret: TransferChange): void {
  314. const listKeys = ret.list.map(l => l.key);
  315. const hasOwnKey = (e: TransferItem): boolean => e.hasOwnProperty('key');
  316. this.transferData = this.transferData.map(e => {
  317. if (listKeys.includes(e.key) && hasOwnKey(e)) {
  318. if (ret.to === 'left') {
  319. delete e.hide;
  320. } else if (ret.to === 'right') {
  321. e.hide = false;
  322. }
  323. }
  324. return e;
  325. });
  326. }
  327. // end 告警定义与监控关联model
  328. }