fengxiang
2018-01-25 8570af7c6051c3d9a516f39d597ff49e1e1e2840
src/app/routes/systems/organization/organization-config/organization-config.component.ts
@@ -1,14 +1,16 @@
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',
@@ -20,15 +22,17 @@
  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;
  }
@@ -36,126 +40,228 @@
  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['sensorKey'];
      }
    );
    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['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:boolean = false;
  save($event, value, valid) {
    $event.preventDefault();
    if (valid) {
       this.isSaving = true;
       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;
                      }
                }
           }
         }
   }
}