|  |  | 
 |  |  | import { NzMessageService } from 'ng-zorro-antd'; | 
 |  |  | import { filter } from 'rxjs/operators'; | 
 |  |  | import { HttpClient } from '@angular/common/http'; | 
 |  |  | import { FormGroup, FormBuilder, FormControl, Validators, FormArray } 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, AlarmConfig, AlarmSensorLevel, AlarmConfigValue } from '@business/entity/data'; | 
 |  |  | import { Component, OnInit, OnDestroy } from '@angular/core'; | 
 |  |  | 
 |  |  | 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 formBuilder: FormBuilder, | 
 |  |  |     private http: _HttpClient, | 
 |  |  | 
 |  |  |     setTimeout(() => { | 
 |  |  |       this.grid.loading = true; | 
 |  |  |      }, 1); | 
 |  |  |     let pageBean = this.organizationService.config.pageBean; | 
 |  |  |     const pageBean = this.organizationService.config.pageBean; | 
 |  |  |     let resultBean = this.organizationService.config.resultBean; | 
 |  |  |     resultBean = resultBean == null ? {} : resultBean; | 
 |  |  |     if (pageBean != null && pageBean.data != null) { | 
 |  |  | 
 |  |  |       const alarmConfigValue = alarmConfig.value; | 
 |  |  |  | 
 |  |  |       const alarmLevels = alarmConfigValue.alarmLevels; | 
 |  |  |       let alarmLevelsGroupsConfig = {}; | 
 |  |  |       const alarmLevelsGroupsConfig = {}; | 
 |  |  |       Object.keys(alarmLevels).forEach(key => { | 
 |  |  |  | 
 |  |  |         let increment = alarmLevels[key].increment; | 
 |  |  |         increment = increment == null || increment.length != 3 ? [0, 0, 0] : 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)] | 
 |  |  |           [increment[0]], | 
 |  |  |           [increment[1]], | 
 |  |  |           [increment[2]] | 
 |  |  |         ]); | 
 |  |  |         let degression = alarmLevels[key].degression; | 
 |  |  |         degression = degression == null || degression.length != 3 ? [0, 0, 0] : 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)] | 
 |  |  |             [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, | 
 |  |  | 
 |  |  |             level3: [alarmMode.level3] | 
 |  |  |           } | 
 |  |  |         ), | 
 |  |  |         '_id':alarmConfig.id, | 
 |  |  |         '_id': alarmConfig.id, | 
 |  |  |         '_allChecked': [] | 
 |  |  |       }); | 
 |  |  |       this.validateForm.statusChanges.subscribe( | 
 |  |  |          item => { | 
 |  |  |              this.setErrorMessage(); | 
 |  |  |          } | 
 |  |  |       ) | 
 |  |  |       ); | 
 |  |  |       this.refreshIndeterminate();       | 
 |  |  |     } | 
 |  |  |       this.refreshHasDegression(false); | 
 |  |  |         // 延时加载避免ExpressionChangedAfterItHasBeenCheckedError | 
 |  |  |         setTimeout(() => { | 
 |  |  |           this.grid.loading = false; | 
 |  |  | 
 |  |  |   checkAll(param) { | 
 |  |  |     const keys = this.grid.data.map( | 
 |  |  |       item => { | 
 |  |  |         return item['key']; | 
 |  |  |         return item['sensorKey']; | 
 |  |  |       } | 
 |  |  |     ); | 
 |  |  |     this._allCheckTriggers = 0; | 
 |  |  | 
 |  |  |     ); | 
 |  |  |     this.refreshIndeterminate(); | 
 |  |  |   } | 
 |  |  |   private _allCheckTriggers: number = 0; | 
 |  |  |   private _allCheckTriggers = 0; | 
 |  |  |   refreshIndeterminate() { | 
 |  |  |     const keys = this.grid.data.map( | 
 |  |  |       item => { | 
 |  |  |         return item['key']; | 
 |  |  |         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) { | 
 |  |  |        const data:AlarmConfig = { | 
 |  |  |          id:value._id, | 
 |  |  |          organizationId:this.organization.id, | 
 |  |  |          value:value | 
 |  |  |        } | 
 |  |  |        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+' 配置成功!'); | 
 |  |  |               if (result != null && result.code === 1) { | 
 |  |  |                  this.msgSrv.success(this.organization.name + ' 配置成功!'); | 
 |  |  |                  this.backToList(); | 
 |  |  |               } | 
 |  |  |            } | 
 |  |  | 
 |  |  |     } | 
 |  |  |   }     | 
 |  |  |    | 
 |  |  |   setErrorMessage(){ | 
 |  |  |   setErrorMessage() { | 
 |  |  |     this.errorMessage = ''; | 
 |  |  |     const errObj = this.getLastError(this.validateForm); | 
 |  |  |     if(errObj!=null&&Object.keys(errObj).length>0){ | 
 |  |  |      if(errObj['increment']){ | 
 |  |  |     if (errObj != null && Object.keys(errObj).length > 0) { | 
 |  |  |      if (errObj['increment']) { | 
 |  |  |       this.errorMessage = '一级 二级 三级 依次递增'; | 
 |  |  |      } else if(errObj['degression']){ | 
 |  |  |      } else if (errObj['degression']) { | 
 |  |  |       this.errorMessage = '反向一级 反向二级 反向三级 依次递减'; | 
 |  |  |      } else if(errObj['pattern']!=null&&errObj['pattern']['requiredPattern'] == '^'+patterns.num.toString()+'$'){ | 
 |  |  |      } else if (errObj['pattern'] != null && errObj['pattern']['requiredPattern'] === '^' + patterns.num.toString() + '$') { | 
 |  |  |       this.errorMessage = '阀值只能为数字'; | 
 |  |  |      } | 
 |  |  |     } | 
 |  |  | } | 
 |  |  |   errorMessage:string = ''; | 
 |  |  |   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 } => { | 
 |  |  |     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); | 
 |  |  |         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; | 
 |  |  |         } | 
 |  |  |         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){ | 
 |  |  |         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{ | 
 |  |  |          } else { | 
 |  |  |            const controls =   Object.values(control.controls); | 
 |  |  |            for(let i = controls.length-1;i>=0;i--){ | 
 |  |  |            for (let i = controls.length - 1; i >= 0; i--) { | 
 |  |  |                 const c = controls[i]; | 
 |  |  |                 if(c.errors!=null){ | 
 |  |  |                 if (c.errors != null) { | 
 |  |  |                   return c.errors; | 
 |  |  |                 }else if(c instanceof FormArray||c instanceof FormGroup){ | 
 |  |  |                 } else if (c instanceof FormArray || c instanceof FormGroup) { | 
 |  |  |                       const result = this.getLastError(c); | 
 |  |  |                       if(result != null) { | 
 |  |  |                       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']; | 
 |  |  |              } | 
 |  |  |           ); | 
 |  |  |        } | 
 |  |  |    } | 
 |  |  | } |