|  |  | 
 |  |  | 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 { SensorsService } from '@business/services/http/sensors.service'; | 
 |  |  | import { FormGroup, FormBuilder, FormControl, Validators, FormArray, AbstractControl } from '@angular/forms'; | 
 |  |  | 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'; | 
 |  |  | import { ToolsService } from '@business/services/util/tools.service'; | 
 |  |  |  | 
 |  |  | @Component({ | 
 |  |  |   selector: 'app-organization-config', | 
 |  |  | 
 |  |  |   ngOnDestroy(): void { | 
 |  |  |     this.backToList(); | 
 |  |  |   } | 
 |  |  |   private organization:Organization; | 
 |  |  |   public 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); | 
 |  |  |     const 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; | 
 |  |  |       const 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]], | 
 |  |  |           [increment[1]], | 
 |  |  |           [increment[2]] | 
 |  |  |         ]); | 
 |  |  |         let degression = alarmLevels[key].degression; | 
 |  |  |         degression = degression == null || degression.length !== 3 ? [0, 0, 0] : degression; | 
 |  |  |         const degressionArray = | 
 |  |  |           this.formBuilder.array([ | 
 |  |  |             [degression[0]], | 
 |  |  |             [degression[1]], | 
 |  |  |             [degression[2]] | 
 |  |  |           ]); | 
 |  |  |         // 判断逆向是否启用 | 
 |  |  |         // let _degressionEnable = degression[0] != 0 || degression[1] != 0 || degression[2] != 0; | 
 |  |  |  | 
 |  |  |         const alarmSensorGroup = this.formBuilder.group( | 
 |  |  |           { | 
 |  |  |             degressEnable: [alarmLevels[key].degressEnable], | 
 |  |  |             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();       | 
 |  |  |     } | 
 |  |  |       this.refreshHasDegression(false); | 
 |  |  |         // 延时加载避免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['sensorKey']; | 
 |  |  |       } | 
 |  |  |     ); | 
 |  |  |     this._allCheckTriggers = 0; | 
 |  |  |     keys.forEach( | 
 |  |  |       (key: string) => { | 
 |  |  |         this._allCheckTriggers++; | 
 |  |  |         this.validateForm.get('alarmLevels.' + key + '.enable').setValue(param); | 
 |  |  |       } | 
 |  |  |     ); | 
 |  |  |     this.refreshIndeterminate(); | 
 |  |  |   } | 
 |  |  |   private _allCheckTriggers = 0; | 
 |  |  |   refreshIndeterminate() { | 
 |  |  |     const keys = this.grid.data.map( | 
 |  |  |       item => { | 
 |  |  |         return item['sensorKey']; | 
 |  |  |       } | 
 |  |  |     ); | 
 |  |  |     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); | 
 |  |  |   } | 
 |  |  |   isSaving = false; | 
 |  |  |   save($event, value, valid) { | 
 |  |  |     $event.preventDefault(); | 
 |  |  |     if (valid) { | 
 |  |  |  | 
 |  |  |    | 
 |  |  |        this.isSaving = true; | 
 |  |  |        const data: AlarmConfig = { | 
 |  |  |          id: value._id, | 
 |  |  |          organizationId: this.organization.id, | 
 |  |  |          value: value | 
 |  |  |        }; | 
 |  |  |       //  ToolsService.removePrivate(data.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 = ''; | 
 |  |  |   private removeError(error: 'increment'|'degression', ...controls: AbstractControl[]) { | 
 |  |  |     controls.forEach( | 
 |  |  |       item => { | 
 |  |  |          if (item.hasError(error) && Object.keys(item.errors).length === 1) { | 
 |  |  |            item.setErrors(null); | 
 |  |  |          } | 
 |  |  |       } | 
 |  |  |    );  | 
 |  |  |   } | 
 |  |  |   private addError(error: 'increment'|'degression', ...controls: AbstractControl[]) { | 
 |  |  |     controls.forEach( | 
 |  |  |       item => { | 
 |  |  |         const errs = {}; | 
 |  |  |         errs[error] = true; | 
 |  |  |         item.setErrors(errs); | 
 |  |  |         item.markAsDirty(); | 
 |  |  |       } | 
 |  |  |    );  | 
 |  |  |   } | 
 |  |  |   private alarmLevelValidator = (control: FormControl): { [s: string]: boolean } => { | 
 |  |  |         const enable = control.get('enable').value; | 
 |  |  |         const degressEnable = control.get('degressEnable').value;        | 
 |  |  |         const i0 = control.get('increment.0'); | 
 |  |  |         const i1 = control.get('increment.1'); | 
 |  |  |         const i2 = control.get('increment.2'); | 
 |  |  |         const d0 = control.get('degression.0'); | 
 |  |  |         const d1 = control.get('degression.1'); | 
 |  |  |         const d2 = control.get('degression.2'); | 
 |  |  |         // 如果未启用 删除错误信息,不验证 | 
 |  |  |         if (!enable) { | 
 |  |  |           this.removeError('increment', i0, i1, i2); | 
 |  |  |           this.removeError('degression', d0, d1, d2); | 
 |  |  |           return null; | 
 |  |  |         } | 
 |  |  |         const result = {}; | 
 |  |  |         const i0_value = parseInt(i0.value, 10); | 
 |  |  |         const i1_value = parseInt(i1.value, 10); | 
 |  |  |         const i2_value = parseInt(i2.value, 10); | 
 |  |  |         if ((i0_value !== 0 || i1_value !== 0 || i2_value !== 0) && (i0_value >= i1_value || i1_value >= i2_value)) { | 
 |  |  |           this.addError('increment', i0, i1, i2); | 
 |  |  |           result['increment'] = true; | 
 |  |  |         } else { | 
 |  |  |           this.removeError('increment', i0, i1, i2); | 
 |  |  |         }  | 
 |  |  |         const d0_value = parseInt(d0.value, 10); | 
 |  |  |         const d1_value = parseInt(d1.value, 10); | 
 |  |  |         const d2_value = parseInt(d2.value, 10); | 
 |  |  |           if (degressEnable && (d0_value !== 0 || d1_value !== 0 || d2_value !== 0) && (d1_value >= d0_value || d2_value >= d1_value)) { | 
 |  |  |             this.addError('degression', d0, d1, d2); | 
 |  |  |             result['degression'] = true; | 
 |  |  |           } else { | 
 |  |  |             this.removeError('degression', d0, d1, d2); | 
 |  |  |           } | 
 |  |  |         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; | 
 |  |  |                       } | 
 |  |  |                 } | 
 |  |  |            } | 
 |  |  |          } | 
 |  |  |    } | 
 |  |  |    public hasDegression = false; | 
 |  |  |    public refreshHasDegression(value) { | 
 |  |  |        if (value) { | 
 |  |  |          this.hasDegression = true; | 
 |  |  |        } else { | 
 |  |  |         this.hasDegression = Object.values(this.validateForm.value['alarmLevels']).some( | 
 |  |  |              ( item: any) => { | 
 |  |  |                 return item['degressEnable']; | 
 |  |  |              } | 
 |  |  |           ); | 
 |  |  |        } | 
 |  |  |    } | 
 |  |  | } |