From 928d55a8fde33200bb1ca4016ce5b86e9a1118a8 Mon Sep 17 00:00:00 2001
From: fengxiang <110431245@qq.com>
Date: Tue, 16 Jan 2018 16:57:13 +0800
Subject: [PATCH] 组织配置

---
 src/app/business/enum/types.enum.ts                                                        |    1 
 src/app/business/entity/data.ts                                                            |   26 ++
 src/app/business/services/http/sensors.service.ts                                          |    4 
 src/app/routes/systems/organization/organization.component.ts                              |    1 
 src/app/routes/systems/systems.module.ts                                                   |    1 
 src/app/routes/systems/organization/organization-config/organization-config.component.ts   |  330 ++++++++++++++++++++++++------------
 src/app/routes/systems/organization/organization-config/organization-config.component.html |  119 +++++--------
 src/app/business/enum/patterns.enum.ts                                                     |    3 
 src/app/business/services/http/alarm-config.service.ts                                     |   39 ++++
 9 files changed, 329 insertions(+), 195 deletions(-)

diff --git a/src/app/business/entity/data.ts b/src/app/business/entity/data.ts
index d6f454c..595ad88 100644
--- a/src/app/business/entity/data.ts
+++ b/src/app/business/entity/data.ts
@@ -1,4 +1,5 @@
 import { Column } from '@business/entity/grid';
+import { AlarmStyle } from '@business/enum/types.enum';
 
 
 export interface AreaNames {
@@ -63,10 +64,31 @@
   }
 
  // ������������
+
+
  export interface AlarmConfig {
-  createTime?: number;
   id?: number;
   organizationId?: number;
+  createTime?: number;
   updateTime?: number;
-  value?: object;
+  value: AlarmConfigValue;
 }
+
+export interface AlarmConfigValue {
+  alarmMode: AlarmMode;
+  alarmLevels:{[key: string]:AlarmSensorLevel};
+}
+
+
+export interface AlarmSensorLevel {
+  enable: boolean|any [];
+  increment: number []|any[];
+  degression: number []|any [];
+}
+
+export interface AlarmMode {
+  enable: boolean|any[];
+  level1: AlarmStyle[]|any[];
+  level2: AlarmStyle[]|any[];
+  level3: AlarmStyle[]|any[];
+}
\ No newline at end of file
diff --git a/src/app/business/enum/patterns.enum.ts b/src/app/business/enum/patterns.enum.ts
new file mode 100644
index 0000000..ce81f20
--- /dev/null
+++ b/src/app/business/enum/patterns.enum.ts
@@ -0,0 +1,3 @@
+export enum patterns{
+    num = '\\d+(\\.\\d+)?'
+} 
diff --git a/src/app/business/enum/types.enum.ts b/src/app/business/enum/types.enum.ts
index b1a5157..7fdb678 100644
--- a/src/app/business/enum/types.enum.ts
+++ b/src/app/business/enum/types.enum.ts
@@ -1,7 +1,6 @@
 export enum Types {
     Date, Json
 }
-
 export enum AlarmStyle {
     //���������������������������������
     weixin='weixin',email='email',sms='sms',voice='voice'
diff --git a/src/app/business/services/http/alarm-config.service.ts b/src/app/business/services/http/alarm-config.service.ts
index 6db6cbf..9a925c2 100644
--- a/src/app/business/services/http/alarm-config.service.ts
+++ b/src/app/business/services/http/alarm-config.service.ts
@@ -3,17 +3,52 @@
 import { environment } from '@env/environment';
 import { Observable } from 'rxjs/Observable';
 import { ResultBean } from '@business/entity/grid';
-import { AlarmConfig } from '@business/entity/data';
+import { AlarmConfig, AlarmConfigValue,AlarmSensorLevel, AlarmMode } from '@business/entity/data';
 
 @Injectable()
 export class AlarmConfigService {
   private urls = {
-    getByOid: environment.SERVER_BASH_URL + 'alarm-config/get-by-oid'
+    getByOid: environment.SERVER_BASH_URL + 'alarm-config/get-by-oid',
+    save: environment.SERVER_BASH_URL + '/alarm-config/add-or-modify',
   };
   constructor( private http: _HttpClient) {
      
   }
+  public generateAlarmConfig(sensors: {key:string} [],alarmConfig?: AlarmConfig): AlarmConfig{
+        const _alarmConfig : AlarmConfig = alarmConfig==null || alarmConfig.value == null ? {value:{
+            alarmLevels:null,
+            alarmMode:null
+        }}: alarmConfig;
+        let alarmLevels = _alarmConfig.value.alarmLevels;
+        alarmLevels = alarmLevels ==null ?{} :alarmLevels;
+        sensors.forEach(
+          sensor => {
+                const key = sensor.key;
+                alarmLevels[key]  = 
+                alarmLevels[key] == null ?
+                {
+                  enable: false,
+                  increment: [0,0,0],
+                  degression:  [0,0,0]
+                } : alarmLevels[key];
+             }
+         );
+         _alarmConfig.value.alarmLevels = alarmLevels;
+         //������������
+         let alarmMode = _alarmConfig.value.alarmMode;
+         alarmMode = alarmMode == null ? {
+          enable: false,
+          level1: null,
+          level2: null,
+          level3: null
+        } : alarmMode;
+        _alarmConfig.value.alarmMode = alarmMode;
+        return _alarmConfig;
+  }
   public getByOid(oid:number):Observable<ResultBean<AlarmConfig>>{
      return this.http.get(this.urls.getByOid,{organizationId:oid});
   }
+  public save(data: any): Observable<ResultBean<any>> {
+    return this.http.post(this.urls.save, data);
+  }
 }
diff --git a/src/app/business/services/http/sensors.service.ts b/src/app/business/services/http/sensors.service.ts
index af04f91..5ba7466 100644
--- a/src/app/business/services/http/sensors.service.ts
+++ b/src/app/business/services/http/sensors.service.ts
@@ -10,7 +10,7 @@
 @Injectable()
 export class SensorsService {
   private urls = {
-    edit: environment.SERVER_BASH_URL + '/sensor/page-list',
+    list: environment.SERVER_BASH_URL + '/sensor/page-list',
     save: environment.SERVER_BASH_URL + '/sensor/add-or-modify',
     delete: environment.SERVER_BASH_URL + '/sensor/delete-by-ids'
 };
@@ -27,7 +27,7 @@
   }
   const param: PageBean = {pageSize: page.pageSize, pageIndex: page.pageIndex, 
       queryParams: example.getSqlParam(), orderByClause: orderByClause};
-      return this.http.get(this.urls.edit, param);
+      return this.http.get(this.urls.list, param);
 }
 public save(data: any): Observable<any> {
       return this.http.post(this.urls.save, data);
diff --git a/src/app/routes/systems/organization/organization-config/organization-config.component.html b/src/app/routes/systems/organization/organization-config/organization-config.component.html
index b5a2a48..5d53391 100644
--- a/src/app/routes/systems/organization/organization-config/organization-config.component.html
+++ b/src/app/routes/systems/organization/organization-config/organization-config.component.html
@@ -8,7 +8,7 @@
                         <label nz-checkbox formControlName="_allChecked" [nzIndeterminate]="indeterminate" (ngModelChange)="checkAll($event)"></label>
                     </th>
                     <th nz-th>
-                        ���������������
+                        ���������������(������)
                     </th>
                     <th nz-th>
                         ������
@@ -30,94 +30,67 @@
                     </th>
                 </tr>
             </thead>
-            <tbody nz-tbody>
-                <tr nz-tbody-tr *ngFor="let row of nzTable.data">
+            <tbody formGroupName="alarmLevels" nz-tbody>
+                <tr nz-tbody-tr *ngFor="let row of nzTable.data" formGroupName="{{row.key}}">
+
                     <td nz-td [nzCheckbox]="true">
-                        <label nz-checkbox formControlName="{{row.key}}_enable"></label>
+                        <label nz-checkbox formControlName="enable"></label>
                     </td>
                     <td>
                         <span>
-                            {{ row.name }}
+                            {{ row.name }}({{ row.unit }})
                         </span>
                     </td>
-                    <td>
+                    <td formArrayName="increment" *ngFor="let in of validateForm.get('alarmLevels.'+row.key+'.increment').controls; index as i">
+                            <div nz-form-item>
+                                <div nz-form-control nzHasFeedback>
+                                    <nz-input [formControlName]="i" maxlength="20" nzDisabled="{{ !f.value['alarmLevels'][row.key]['enable'] }}"></nz-input>
+                                </div>
+                            </div>
+                    </td>
+                    <td formArrayName="degression" *ngFor="let in of validateForm.get('alarmLevels.'+row.key+'.degression').controls; index as i">
                         <div nz-form-item>
                             <div nz-form-control nzHasFeedback>
-                                <nz-input formControlName="{{row.key}}_level_increment_1" maxlength="20" nzDisabled="{{ !f.value[row.key+'_enable'] }}"></nz-input>
+                                <nz-input [formControlName]="i" maxlength="20" nzDisabled="{{ !f.value['alarmLevels'][row.key]['enable'] }}"></nz-input>
                             </div>
                         </div>
-                    </td>
-                    <td>
-                        <div nz-form-item>
-                            <div nz-form-control nzHasFeedback>
-                                <nz-input formControlName="{{row.key}}_level_increment_2" maxlength="20" nzDisabled="{{ !f.value[row.key+'_enable'] }}" 
-                                validateGreater></nz-input>                                
-                            </div>
-                        </div>
-                    </td>
-                    <td>
-                        <div nz-form-item>
-                            <div nz-form-control nzHasFeedback>
-                                <nz-input formControlName="{{row.key}}_level_increment_3" maxlength="20" nzDisabled="{{ !f.value[row.key+'_enable'] }}"></nz-input>
-                            </div>
-                        </div>
-                    </td>
-                    <td>
-                        <div nz-form-item>
-                            <div nz-form-control nzHasFeedback>
-                                <nz-input formControlName="{{row.key}}_level_degression_1" maxlength="20" nzDisabled="{{ !f.value[row.key+'_enable'] }}"></nz-input>
-                            </div>
-                        </div>
-                    </td>
-                    <td>
-                        <div nz-form-item>
-                            <div nz-form-control nzHasFeedback>
-                                <nz-input formControlName="{{row.key}}_level_degression_2" maxlength="20" nzDisabled="{{ !f.value[row.key+'_enable'] }}"></nz-input>
-                            </div>
-                        </div>
-                    </td>
-                    <td>
-                    <div nz-form-item>
-                        <div nz-form-control nzHasFeedback>
-                            <nz-input formControlName="{{row.key}}_level_degression_3" maxlength="20" nzDisabled="{{ !f.value[row.key+'_enable'] }}"></nz-input>
-                        </div>
-                    </div>
-                    </td>
+                   </td>   
                 </tr>
             </tbody>
         </nz-table>
     </nz-card>
     <div [ngStyle]="{'background-color':'#f5f7fa','width':'110%','left':'-5%','height':'20px','position':'relative'}"></div>
-    <nz-card [nzBordered]="false" nzTitle="������������">
-        <label nz-checkbox formControlName="mode_enable">
-            <span>������������</span>
-        </label>
-        <div [ngStyle]="{'margin-left': '20%'}">
-            <br/>
-            <br/>
-            <br/>
-            <div *ngFor="let i of [1,2,3]" nz-form-item nz-row class="mb-sm">
-                <div nz-form-label nz-col [nzSm]="3" [nzXs]="24">
-                    <span [ngSwitch]="i">
-                        <label *ngSwitchCase="1">������������������:</label>
-                        <label *ngSwitchCase="2">������������������:</label>
-                        <label *ngSwitchCase="3">������������������:</label>
-                    </span>
+    <nz-card [nzBordered]="false" nzTitle="������������"  formGroupName="alarmMode">
+            <label nz-checkbox formControlName="enable">
+                <span>������������</span>
+            </label>
+            <div [ngStyle]="{'margin-left': '20%'}">
+                <br/>
+                <br/>
+                <br/>
+                  <div *ngFor="let i of [1,2,3]" nz-form-item nz-row class="mb-sm">
+                    <div nz-form-label nz-col [nzSm]="3" [nzXs]="24">
+                        <span [ngSwitch]="i">
+                            <label *ngSwitchCase="1">������������������:</label>
+                            <label *ngSwitchCase="2">������������������:</label>
+                            <label *ngSwitchCase="3">������������������:</label>
+                        </span>
+                    </div>
+                    <div nz-form-control nz-col [nzSpan]="12" nzHasFeedback>
+                        <nz-select formControlName="{{ 'level'+i }}" [nzMode]="'multiple'" [nzPlaceHolder]="'������ ������������'" [nzNotFoundContent]="'������������'"
+                            nzDisabled="{{ !f.value['alarmMode']['enable'] }}">
+                            <nz-option *ngFor="let option of alarmModes" [nzLabel]="option.label" [nzValue]="option.value" [nzDisabled]="option.disabled">
+                            </nz-option>
+                        </nz-select>
+                    </div>
+                    <br/>
+                    <br/>
+                    <br/>
                 </div>
-                <div nz-form-control nz-col [nzSpan]="12" nzHasFeedback>
-                    <nz-select formControlName="mode_level{{i}}" [nzMode]="'multiple'" [nzPlaceHolder]="'������ ������������'" [nzNotFoundContent]="'������������'"
-                        nzDisabled="{{ !f.value['mode_enable'] }}">
-                        <nz-option *ngFor="let option of alarmModes" [nzLabel]="option.label" [nzValue]="option.value" [nzDisabled]="option.disabled">
-                        </nz-option>
-                    </nz-select>
-                </div>
-                <br/>
-                <br/>
-                <br/>
             </div>
-        </div>
-    </nz-card>
-    <footer-toolbar ng-content = '������������' errorCollect>
+        </nz-card>
+    <footer-toolbar errorCollect>
+        <span [ngStyle]="{'color':'red','width':'300px','margin-right':'40px'}">{{ errorMessage }}</span>
         <label>���������������</label>
         <span [ngStyle]="{'font-size': '16px','font-weight': 'bold','margin-right':'30px'}">{{ organization.name }}</span>
         <button nz-button type="button" (click)="backToList()">������</button>
@@ -127,5 +100,5 @@
                 <span *ngIf="isSaving">���</span>
             </span>
         </button>
-    </footer-toolbar>
+    </footer-toolbar>    
 </form>
diff --git a/src/app/routes/systems/organization/organization-config/organization-config.component.ts b/src/app/routes/systems/organization/organization-config/organization-config.component.ts
index 100d3a0..3d385de 100644
--- a/src/app/routes/systems/organization/organization-config/organization-config.component.ts
+++ b/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,226 @@
   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;
+                      }
+                }
+           }
+         }
+   }
 }
diff --git a/src/app/routes/systems/organization/organization.component.ts b/src/app/routes/systems/organization/organization.component.ts
index d417498..474aac0 100644
--- a/src/app/routes/systems/organization/organization.component.ts
+++ b/src/app/routes/systems/organization/organization.component.ts
@@ -10,7 +10,6 @@
 })
 export class OrganizationComponent implements OnInit {
   ngOnInit(): void {
-  
   }
   constructor(
     private organizationService: OrganizationService
diff --git a/src/app/routes/systems/systems.module.ts b/src/app/routes/systems/systems.module.ts
index 257790b..eae0bff 100644
--- a/src/app/routes/systems/systems.module.ts
+++ b/src/app/routes/systems/systems.module.ts
@@ -1,4 +1,3 @@
-import { EqualValidator } from '@business/validators/equal-validator.directive';
 import { FormBuilder } from '@angular/forms';
 import { _HttpClient } from '@delon/theme';
 import { Component, OnInit } from '@angular/core';

--
Gitblit v1.8.0