| | |
| | | import { NzMessageService } from 'ng-zorro-antd'; |
| | | import { filter } from 'rxjs/operators'; |
| | | import { HttpClient } from '@angular/common/http'; |
| | | import { FormGroup, FormBuilder, FormControl, Validators } from '@angular/forms'; |
| | | import { FormGroup, FormBuilder, FormControl, Validators, FormArray } from '@angular/forms'; |
| | | import { SensorsService } from '@business/services/http/sensors.service'; |
| | | import { Grid, PageBean } from '@business/entity/grid'; |
| | | import { Organization } from '@business/entity/data'; |
| | | import { Organization, AlarmConfig, AlarmSensorLevel, AlarmConfigValue } from '@business/entity/data'; |
| | | import { Component, OnInit, OnDestroy } from '@angular/core'; |
| | | import { OrganizationService } from '@business/services/http/organization.service'; |
| | | import { _HttpClient } from '@delon/theme'; |
| | | import { AlarmConfigService } from '@business/services/http/alarm-config.service'; |
| | | import { AlarmStyle } from '@business/enum/types.enum'; |
| | | import { patterns } from '@business/enum/patterns.enum'; |
| | | |
| | | @Component({ |
| | | selector: 'app-organization-config', |
| | |
| | | ngOnDestroy(): void { |
| | | this.backToList(); |
| | | } |
| | | private organization:Organization; |
| | | private organization: Organization; |
| | | grid: Grid<object> = new Grid<object>(null); |
| | | validateForm: FormGroup; |
| | | constructor( |
| | | private organizationService: OrganizationService, |
| | | private sensorsService: SensorsService, |
| | | private alarmConfigService:AlarmConfigService, |
| | | private alarmConfigService: AlarmConfigService, |
| | | private formBuilder: FormBuilder, |
| | | private http: _HttpClient |
| | | private http: _HttpClient, |
| | | public msgSrv: NzMessageService |
| | | |
| | | ) { |
| | | this.organization = this.organizationService.data; |
| | | } |
| | |
| | | ngOnInit() { |
| | | this.load(); |
| | | } |
| | | load(reload: boolean = false) { |
| | | load(reload: boolean = false) { |
| | | if (reload) { |
| | | this.grid.pageIndex = 1 ; |
| | | this.grid.pageIndex = 1; |
| | | } |
| | | // TODO |
| | | // 延时加载避免ExpressionChangedAfterItHasBeenCheckedError |
| | | // setTimeout(() => { |
| | | // this.grid.loading = true; |
| | | // }, 1); |
| | | let pageBean = this.organizationService.config.pageBean;// |
| | | let resultBean = this.organizationService.config.resultBean; |
| | | resultBean = resultBean == null?{} : resultBean; |
| | | if (pageBean != null && pageBean.data != null) { |
| | | this.grid.initData(pageBean); |
| | | this.grid.refreshStatus(); |
| | | setTimeout(() => { |
| | | this.grid.loading = true; |
| | | }, 1); |
| | | let pageBean = this.organizationService.config.pageBean; |
| | | let resultBean = this.organizationService.config.resultBean; |
| | | resultBean = resultBean == null ? {} : resultBean; |
| | | if (pageBean != null && pageBean.data != null) { |
| | | this.grid.initData(pageBean); |
| | | let alarmConfig: AlarmConfig = null; |
| | | if (resultBean == null || resultBean.data == null) { |
| | | alarmConfig = this.alarmConfigService.generateAlarmConfig(pageBean.data); |
| | | } else { |
| | | // 防止 新增 传感器 |
| | | alarmConfig = this.alarmConfigService.generateAlarmConfig(pageBean.data, resultBean.data); |
| | | } |
| | | const alarmConfigValue = alarmConfig.value; |
| | | |
| | | const alarmLevels = alarmConfigValue.alarmLevels; |
| | | let alarmLevelsGroupsConfig = {}; |
| | | Object.keys(alarmLevels).forEach(key => { |
| | | |
| | | let increment = alarmLevels[key].increment; |
| | | increment = increment == null || increment.length != 3 ? [0, 0, 0] : increment; |
| | | const incrementArray = this.formBuilder.array([ |
| | | [increment[0], Validators.pattern(patterns.num)], |
| | | [increment[1], Validators.pattern(patterns.num)], |
| | | [increment[2], Validators.pattern(patterns.num)] |
| | | ]); |
| | | let degression = alarmLevels[key].degression; |
| | | degression = degression == null || degression.length != 3 ? [0, 0, 0] : degression; |
| | | const degressionArray = |
| | | this.formBuilder.array([ |
| | | [degression[0], Validators.pattern(patterns.num)], |
| | | [degression[1], Validators.pattern(patterns.num)], |
| | | [degression[2], Validators.pattern(patterns.num)] |
| | | ]); |
| | | const alarmSensorGroup = this.formBuilder.group( |
| | | { |
| | | enable: [alarmLevels[key].enable], |
| | | increment: incrementArray, |
| | | degression: degressionArray, |
| | | }, { validator: this.alarmLevelValidator } |
| | | ); |
| | | alarmSensorGroup.get('enable').valueChanges.subscribe( |
| | | (value: any) => { |
| | | if (this._allCheckTriggers <= 0) { |
| | | this.refreshIndeterminate(); |
| | | } else { |
| | | this._allCheckTriggers--; |
| | | } |
| | | } |
| | | ); |
| | | alarmLevelsGroupsConfig[key] = alarmSensorGroup; |
| | | }); |
| | | this.alarmModes.push( |
| | | { label: '邮件', value: AlarmStyle.email, disabled: false }, |
| | | { label: '短信', value: AlarmStyle.sms, disabled: false }, |
| | | { label: '语音', value: AlarmStyle.voice, disabled: false }, |
| | | { label: '微信', value: AlarmStyle.weixin, disabled: false } |
| | | ); |
| | | const alarmMode = alarmConfigValue.alarmMode; |
| | | this.validateForm = this.formBuilder.group({ |
| | | alarmLevels: this.formBuilder.group(alarmLevelsGroupsConfig), |
| | | alarmMode: this.formBuilder.group( |
| | | { |
| | | enable: [alarmMode.enable], |
| | | level1: [alarmMode.level1], |
| | | level2: [alarmMode.level2], |
| | | level3: [alarmMode.level3] |
| | | } |
| | | ), |
| | | '_id':alarmConfig.id, |
| | | '_allChecked': [] |
| | | }); |
| | | this.validateForm.statusChanges.subscribe( |
| | | item => { |
| | | this.setErrorMessage(); |
| | | } |
| | | ) |
| | | this.refreshIndeterminate(); |
| | | } |
| | | // 延时加载避免ExpressionChangedAfterItHasBeenCheckedError |
| | | setTimeout(() => { |
| | | this.grid.loading = false; |
| | | }, 1); |
| | | let validates = {}; |
| | | let data = resultBean.data == null ?{}:resultBean.data; |
| | | const value = data['value'] == null ? {} : data['value']; |
| | | let alarmLevels = value['alarmLevels']; |
| | | alarmLevels = alarmLevels==null ? {} : alarmLevels; |
| | | // 三级警报 |
| | | const level_num = 3; |
| | | this.grid.data.forEach( |
| | | (sensor: object) => { |
| | | const sensorLevel = alarmLevels[sensor['key']] == null ?{}:alarmLevels[sensor['key']]; |
| | | const enable_key = sensor['key'] + '_enable'; |
| | | const enable_value = sensorLevel['enable'] == null ? false : sensorLevel['enable'] == 1; |
| | | validates[enable_key] = enable_value; |
| | | const increments:number[] = sensorLevel['increment']; |
| | | const degression:number[] = sensorLevel['degression']; |
| | | for(let i=0;i<level_num;i++){ |
| | | const increment_key = sensor['key']+'_level_increment_'+(i+1); |
| | | if( increments == null || increments.length == 0 ){ |
| | | validates[increment_key] = [null,[Validators.pattern('^\\d+(\\.\\d+)?$')]]; |
| | | }else{ |
| | | const increment_value = increments.length>i ? increments[i]:null ; |
| | | validates[increment_key] = [increment_value,[Validators.pattern('^\\d+(\\.\\d+)?$')]]; |
| | | } |
| | | const degression_key = sensor['key']+'_level_degression_'+(i+1); |
| | | if( degression == null || degression.length == 0 ){ |
| | | validates[degression_key] = [null,[Validators.pattern('^\\d+(\\.\\d+)?$')]]; |
| | | }else{ |
| | | const degression_value = degression.length>i ? degression[i]:null ; |
| | | validates[degression_key] = [degression_value,[Validators.pattern('^\\d+(\\.\\d+)?$')]]; |
| | | } |
| | | } |
| | | |
| | | } |
| | | ); |
| | | validates['_allChecked'] = [this.grid.allChecked]; |
| | | //报警方式加载 |
| | | let alarmMode = value['alarmMode']; |
| | | alarmMode = alarmMode==null ? {}: alarmMode; |
| | | this.alarmModes.push( |
| | | {label:'邮件',value:AlarmStyle.email, disabled: false}, |
| | | {label:'短信',value:AlarmStyle.sms, disabled: false}, |
| | | {label:'语音',value:AlarmStyle.voice, disabled: false}, |
| | | {label:'微信',value:AlarmStyle.weixin, disabled: false} |
| | | ); |
| | | validates['mode_enable'] = [alarmMode['enable']]; |
| | | for(let i = 0; i<level_num; i++){ |
| | | const n = i+1; |
| | | validates['mode_level'+n] = [AlarmStyle[alarmMode['level'+n]]]; |
| | | } |
| | | this.validateForm = this.formBuilder.group(validates); |
| | | this.grid.loading = false; |
| | | this.enableKeys = Object.keys(this.validateForm.value).filter( |
| | | (key: string) => { |
| | | return key.endsWith('_enable'); |
| | | } |
| | | ); |
| | | this.enableKeys.forEach( |
| | | (key: string) => { |
| | | this.validateForm.controls[key].valueChanges.subscribe( |
| | | (value: any) => { |
| | | if(this._allCheckTriggers <= 0){ |
| | | this.refreshIndeterminate(); |
| | | } else { |
| | | this._allCheckTriggers--; |
| | | } |
| | | } |
| | | ); |
| | | } |
| | | ); |
| | | this.refreshIndeterminate(); |
| | | } |
| | | |
| | | } |
| | | alarmModes: {label:string,value:AlarmStyle,disabled: boolean} [] = []; |
| | | |
| | | alarmModes: { label: string, value: AlarmStyle, disabled: boolean }[] = []; |
| | | backToList() { |
| | | this.organizationService.handle = 'list'; |
| | | this.organizationService.title = '组织列表'; |
| | | } |
| | | enableKeys: string []; |
| | | indeterminate: boolean; |
| | | checkAll(param){ |
| | | this._allCheckTriggers = 0; |
| | | this.enableKeys.forEach( |
| | | (key: string) => { |
| | | this._allCheckTriggers++; |
| | | this.validateForm.controls[key].setValue(param); |
| | | } |
| | | ); |
| | | this.refreshIndeterminate(); |
| | | } |
| | | private _allCheckTriggers: number = 0; |
| | | refreshIndeterminate(){ |
| | | const allChecked = this.enableKeys.every(key => this.validateForm.controls[key].value); |
| | | const allUnChecked = this.enableKeys.every(key => !this.validateForm.controls[key].value); |
| | | this.indeterminate = (!allChecked) && (!allUnChecked); |
| | | } |
| | | save($event, value, valid) { |
| | | indeterminate: boolean; |
| | | checkAll(param) { |
| | | const keys = this.grid.data.map( |
| | | item => { |
| | | return item['key']; |
| | | } |
| | | ); |
| | | this._allCheckTriggers = 0; |
| | | keys.forEach( |
| | | (key: string) => { |
| | | this._allCheckTriggers++; |
| | | this.validateForm.get('alarmLevels.' + key + '.enable').setValue(param); |
| | | } |
| | | ); |
| | | this.refreshIndeterminate(); |
| | | } |
| | | private _allCheckTriggers: number = 0; |
| | | refreshIndeterminate() { |
| | | const keys = this.grid.data.map( |
| | | item => { |
| | | return item['key']; |
| | | } |
| | | ); |
| | | const allChecked = keys.every(key => this.validateForm.get('alarmLevels.' + key + '.enable').value); |
| | | const allUnChecked = keys.every(key => !this.validateForm.get('alarmLevels.' + key + '.enable').value); |
| | | this.indeterminate = (!allChecked) && (!allUnChecked); |
| | | } |
| | | save($event, value, valid) { |
| | | $event.preventDefault(); |
| | | if (valid) { |
| | | |
| | | |
| | | const data:AlarmConfig = { |
| | | id:value._id, |
| | | organizationId:this.organization.id, |
| | | value:value |
| | | } |
| | | this.alarmConfigService.save(data).subscribe( |
| | | result => { |
| | | if(result!=null&&result.code==1){ |
| | | this.msgSrv.success(this.organization.name+' 配置成功!'); |
| | | this.backToList(); |
| | | } |
| | | } |
| | | ); |
| | | } |
| | | } |
| | | } |
| | | |
| | | setErrorMessage(){ |
| | | this.errorMessage = ''; |
| | | const errObj = this.getLastError(this.validateForm); |
| | | if(errObj!=null&&Object.keys(errObj).length>0){ |
| | | if(errObj['increment']){ |
| | | this.errorMessage = '一级 二级 三级 依次递增'; |
| | | } else if(errObj['degression']){ |
| | | this.errorMessage = '反向一级 反向二级 反向三级 依次递减'; |
| | | } else if(errObj['pattern']!=null&&errObj['pattern']['requiredPattern'] == '^'+patterns.num.toString()+'$'){ |
| | | this.errorMessage = '阀值只能为数字'; |
| | | } |
| | | } |
| | | } |
| | | errorMessage:string = ''; |
| | | private alarmLevelValidator = (control: FormControl): { [s: string]: boolean } => { |
| | | let result = {}; |
| | | const i0 = control.get("increment.0"); |
| | | const i1 = control.get("increment.1"); |
| | | const i2 = control.get("increment.2"); |
| | | if ((i0.value != 0 || i1.value != 0 || i2.value != 0)&&(i0.value >= i1.value||i1.value >= i2.value)) { |
| | | i0.setErrors({ increment: true }); |
| | | i0.markAsDirty(); |
| | | i1.setErrors({ increment: true }); |
| | | i1.markAsDirty(); |
| | | i2.setErrors({ increment: true }); |
| | | i2.markAsDirty(); |
| | | result["increment"] = true; |
| | | }else{ |
| | | if(i0.hasError('increment')&&Object.keys(i0.errors).length==1){ |
| | | i0.setErrors(null); |
| | | } |
| | | if(i1.hasError('increment')&&Object.keys(i1.errors).length==1){ |
| | | i1.setErrors(null); |
| | | } |
| | | if(i2.hasError('increment')&&Object.keys(i2.errors).length==1){ |
| | | i2.setErrors(null); |
| | | } |
| | | } |
| | | const d0 = control.get("degression.0"); |
| | | const d1 = control.get("degression.1"); |
| | | const d2 = control.get("degression.2"); |
| | | if ((d0.value != 0 || d1.value != 0 || d2.value != 0)&&(d1.value >= d0.value||d2.value >= d1.value)) { |
| | | d0.setErrors({ degression: true }); |
| | | d0.markAsDirty(); |
| | | d1.setErrors({ degression: true }); |
| | | d1.markAsDirty(); |
| | | d2.setErrors({ degression: true }); |
| | | d2.markAsDirty(); |
| | | result["degression"] = true; |
| | | }else{ |
| | | if(d0.hasError('degression')&&Object.keys(d0.errors).length==1){ |
| | | d0.setErrors(null); |
| | | } |
| | | if(d1.hasError('degression')&&Object.keys(d1.errors).length==1){ |
| | | d1.setErrors(null); |
| | | } |
| | | if(d2.hasError('degression')&&Object.keys(d2.errors).length==1){ |
| | | d2.setErrors(null); |
| | | } |
| | | } |
| | | return Object.keys(result).length == 0?null:result; |
| | | }; |
| | | getLastError(control:FormGroup|FormArray){ |
| | | if(control.errors!=null){ |
| | | return control.errors; |
| | | }else{ |
| | | const controls = Object.values(control.controls); |
| | | for(let i = controls.length-1;i>=0;i--){ |
| | | const c = controls[i]; |
| | | if(c.errors!=null){ |
| | | return c.errors; |
| | | }else if(c instanceof FormArray||c instanceof FormGroup){ |
| | | const result = this.getLastError(c); |
| | | if(result != null) { |
| | | return result; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |