From 8570af7c6051c3d9a516f39d597ff49e1e1e2840 Mon Sep 17 00:00:00 2001
From: fengxiang <110431245@qq.com>
Date: Thu, 25 Jan 2018 09:31:37 +0800
Subject: [PATCH] 设备模块 坐标 校准值 配置 等功能

---
 src/app/routes/devices/basic-info/adjust-config/adjust-config.component.html               |   45 +
 src/app/routes/devices/devices.module.ts                                                   |   21 
 src/app/routes/map/coordinates-picker/coordinates-picker.component.html                    |   44 +
 src/app/routes/devices/monitor-point/monitor-point-edit/monitor-point-edit.component.html  |    5 
 src/app/business/services/http/device-adjust-value.service.ts                              |   25 +
 src/app/business/services/http/organization.service.ts                                     |    4 
 src/app/routes/systems/account/account.component.ts                                        |    1 
 src/app/routes/devices/version/version-sensor-config/version-sensor-config.component.ts    |    2 
 src/app/routes/sensors/basic-info/sensor-edit/sensor-edit.component.html                   |    2 
 src/app/routes/map/coordinates-picker/coordinates-picker.component.ts                      |  120 +++++
 src/app/routes/devices/basic-info/device-edit/device-edit.component.ts                     |  133 +++++
 src/app/routes/map/coordinates-picker/coordinates-picker.component.css                     |   19 
 src/app/routes/devices/monitor-point/monitor-point.component.ts                            |  182 ++++---
 src/app/business/services/http/device.service.ts                                           |   34 +
 src/app/business/services/http/operate-user.service.ts                                     |   32 +
 src/app/routes/devices/monitor-point/monitor-point.component.html                          |    6 
 src/app/routes/map/coordinates-picker/coordinates-picker.service.ts                        |   15 
 src/app/business/services/http/alarm-config.service.ts                                     |    6 
 src/app/business/services/http/monitor-point.service.ts                                    |   20 
 src/app/routes/devices/basic-info/basic-info.component.ts                                  |  186 +++++++
 src/app/routes/dashboard/workplace/workplace.component.ts                                  |    6 
 src/app/routes/map/map.module.ts                                                           |   21 
 src/app/routes/systems/organization/organization-config/organization-config.component.html |   10 
 src/app/routes/sensors/basic-info/basic-info.component.ts                                  |    2 
 src/assets/img/map_coordinates.png                                                         |    0 
 src/app/business/services/util/tools.service.ts                                            |   14 
 src/app/business/entity/data.ts                                                            |   35 +
 src/app/routes/dashboard/monitor/monitor.component.ts                                      |    4 
 src/app/routes/systems/organization/organization-config/organization-config.component.ts   |    6 
 yarn.lock                                                                                  |   44 
 package.json                                                                               |   14 
 src/app/business/services/http/version.service.ts                                          |   10 
 src/app/routes/devices/basic-info/basic-info.component.html                                |   30 +
 src/app/routes/devices/basic-info/adjust-config/adjust-config.component.ts                 |  120 +++++
 src/app/routes/devices/basic-info/device-edit/device-edit.component.html                   |  105 ++++
 src/app/routes/sensors/basic-info/sensor-edit/sensor-edit.component.ts                     |    2 
 36 files changed, 1,171 insertions(+), 154 deletions(-)

diff --git a/package.json b/package.json
index ef3b7f9..4de5bdb 100644
--- a/package.json
+++ b/package.json
@@ -40,15 +40,15 @@
     "@antv/data-set": "^0.8.3",
     "@antv/g2": "^3.0.1",
     "@antv/g2-plugin-slider": "^2.0.0",
-    "@delon/abc": "^0.6.0-rc.2",
-    "@delon/acl": "^0.6.0-rc.2",
-    "@delon/auth": "^0.6.0-rc.2",
-    "@delon/theme": "^0.6.0-rc.2",
-    "@delon/mock": "^0.6.0-rc.2",
-    "@delon/cache": "^0.6.0-rc.2",
+    "@delon/abc": "0.6.1",
+    "@delon/acl": "0.6.1",
+    "@delon/auth": "0.6.1",
+    "@delon/theme": "0.6.1",
+    "@delon/mock": "0.6.1",
+    "@delon/cache": "0.6.1",
     "@ngx-translate/core": "^9.0.0",
     "@ngx-translate/http-loader": "^2.0.0",
-    "angular-baidu-maps": "^1.0.1",
+    "angular2-baidu-map": "^4.1.0",
     "angular-qq-maps": "^1.0.1",
     "angular-split": "^1.0.0-rc.0",
     "angular-tree-component": "^7.0.1",
diff --git a/src/app/business/entity/data.ts b/src/app/business/entity/data.ts
index 595ad88..93354c3 100644
--- a/src/app/business/entity/data.ts
+++ b/src/app/business/entity/data.ts
@@ -11,7 +11,7 @@
 export interface Sensor {
     description?: any|Column;
     id?: any|Column;
-    key?: any|Column;
+    sensorKey?: any|Column;
     lower?: any|Column;
     name?: any|Column;
     unit?: any|Column;
@@ -85,10 +85,43 @@
   increment: number []|any[];
   degression: number []|any [];
 }
+export interface Device {
+  address?: any|Column;
+  createTime?: any|Column;
+  deviceVersion?: any|Column;
+  deviceVersionId?: any|Column;
+  id?: any|Column;
+  installTime?: any|Column;
+  isDelete?: any|Column;
+  latitude?: any|Column;
+  longitude?: any|Column;
+  mac?: any|Column;
+  monitorPoint?: any|Column;
+  monitorPointId?: any|Column;
+  name?: any|Column;
+  operateUser?: any|Column;
+  operateUserId?: any|Column;
+  state?: any|Column;
+}
 
 export interface AlarmMode {
   enable: boolean|any[];
   level1: AlarmStyle[]|any[];
   level2: AlarmStyle[]|any[];
   level3: AlarmStyle[]|any[];
+}
+export interface DeviceAdjustValue {
+  createTime?: number|any[];
+  deviceId?: number|any[];
+  id?: number|any[];
+  updateTime?: number|any[];
+  value?:{[s:string] : number}|any[];
+}
+
+export interface CoorPicker{
+  longitude:number;//  ������
+  latitude:number;// ������
+  address:string;
+  describe:string;
+  name:string;
 }
\ No newline at end of file
diff --git a/src/app/business/services/http/alarm-config.service.ts b/src/app/business/services/http/alarm-config.service.ts
index 9a925c2..9296a4e 100644
--- a/src/app/business/services/http/alarm-config.service.ts
+++ b/src/app/business/services/http/alarm-config.service.ts
@@ -9,12 +9,12 @@
 export class AlarmConfigService {
   private urls = {
     getByOid: environment.SERVER_BASH_URL + 'alarm-config/get-by-oid',
-    save: environment.SERVER_BASH_URL + '/alarm-config/add-or-modify',
+    save: environment.SERVER_BASH_URL + 'alarm-config/add-or-modify',
   };
   constructor( private http: _HttpClient) {
      
   }
-  public generateAlarmConfig(sensors: {key:string} [],alarmConfig?: AlarmConfig): AlarmConfig{
+  public generateAlarmConfig(sensors: {sensorKey:string} [],alarmConfig?: AlarmConfig): AlarmConfig{
         const _alarmConfig : AlarmConfig = alarmConfig==null || alarmConfig.value == null ? {value:{
             alarmLevels:null,
             alarmMode:null
@@ -23,7 +23,7 @@
         alarmLevels = alarmLevels ==null ?{} :alarmLevels;
         sensors.forEach(
           sensor => {
-                const key = sensor.key;
+                const key = sensor.sensorKey;
                 alarmLevels[key]  = 
                 alarmLevels[key] == null ?
                 {
diff --git a/src/app/business/services/http/device-adjust-value.service.ts b/src/app/business/services/http/device-adjust-value.service.ts
new file mode 100644
index 0000000..abf2f97
--- /dev/null
+++ b/src/app/business/services/http/device-adjust-value.service.ts
@@ -0,0 +1,25 @@
+import { environment } from 'environments/environment';
+import { _HttpClient } from '@delon/theme';
+import { Injectable } from '@angular/core';
+import { Observable } from 'rxjs/Observable';
+import { ResultBean } from '@business/entity/grid';
+import { AlarmConfig, DeviceAdjustValue } from '@business/entity/data';
+
+@Injectable()
+export class DeviceAdjustValueService {
+  private urls = {
+    getByDid: environment.SERVER_BASH_URL + 'device-adjust/get-by-did',
+    save: environment.SERVER_BASH_URL + 'device-adjust/add-or-modify',
+  };
+  constructor(private http:_HttpClient) { }
+  /**
+   * 
+   * @param did ������ID
+   */
+  public getByDid(did:number):Observable<ResultBean<DeviceAdjustValue>>{
+    return this.http.get(this.urls.getByDid,{deviceId:did});
+  }
+  public save(data:DeviceAdjustValue): Observable<any> {
+    return this.http.post(this.urls.save, data);
+  }
+}
diff --git a/src/app/business/services/http/device.service.ts b/src/app/business/services/http/device.service.ts
new file mode 100644
index 0000000..9771877
--- /dev/null
+++ b/src/app/business/services/http/device.service.ts
@@ -0,0 +1,34 @@
+import { _HttpClient } from '@delon/theme';
+import { environment } from 'environments/environment';
+import { Injectable } from '@angular/core';
+import { ResultBean } from '@business/entity/grid';
+import { Observable } from 'rxjs/Observable';
+import { ExampleService } from '@business/services/util/example.service';
+import { Device } from '@business/entity/data';
+
+@Injectable()
+export class DeviceService {
+  private urls = {
+    list: environment.SERVER_BASH_URL + 'device/page-list',
+    save: environment.SERVER_BASH_URL + 'device/add-or-modify',
+    delete: environment.SERVER_BASH_URL + 'device/delete-by-ids'
+  };
+  public getListUrl (){
+    return this.urls.list;
+  }
+  public getSqlParams(queryText:string){
+    const example = new ExampleService();
+    if (queryText != null && queryText !== '') {
+      example.or().andLike({name: 'name', value: '%' + queryText + '%'});
+      example.or().andLike({name: 'mac', value: '%' + queryText + '%'});
+    }
+    return example.getSqlParam();
+  }
+  constructor(private http: _HttpClient) { }
+  delete(...ids: number[]): Observable< ResultBean<any> > {
+      return this.http.post(this.urls.delete, ids);
+  }
+  public save(data:Device): Observable<any> {
+    return this.http.post(this.urls.save, data);
+  }
+}
diff --git a/src/app/business/services/http/monitor-point.service.ts b/src/app/business/services/http/monitor-point.service.ts
index 2dc0c02..90a65d2 100644
--- a/src/app/business/services/http/monitor-point.service.ts
+++ b/src/app/business/services/http/monitor-point.service.ts
@@ -1,4 +1,4 @@
-import { PageBean } from '@business/entity/grid';
+import { PageBean, ResultBean } from '@business/entity/grid';
 import { ExampleService } from '@business/services/util/example.service';
 import { _HttpClient } from '@delon/theme';
 import { environment } from 'environments/environment';
@@ -6,14 +6,16 @@
 import { Injectable } from '@angular/core';
 import { equal } from 'assert';
 import { Observable } from 'rxjs/Observable';
+import { MonitorPoint } from '@business/entity/data';
 
 @Injectable()
 export class MonitorPointService {
 
   private urls = {
-    edit: environment.SERVER_BASH_URL + '/monitor-point/page-list',
+    list: environment.SERVER_BASH_URL + '/monitor-point/page-list',
     save: environment.SERVER_BASH_URL + '/monitor-point/add-or-modify',
-    delete: environment.SERVER_BASH_URL + '/monitor-point/delete-by-ids'
+    delete: environment.SERVER_BASH_URL + '/monitor-point/delete-by-ids',
+    getOne:environment.SERVER_BASH_URL + '/monitor-point/get-by-id'
 };
 constructor(private http: _HttpClient) { }
  public getPagingList(page: PageBean, queryText: string): Observable<PageBean> {
@@ -21,9 +23,13 @@
   if (queryText != null && queryText !== '') {
     example.or().andLike({name: 'name', value: '%' + queryText + '%'});
   }
+  let orderByClause = '';
+  if ( page.getOrderByClause != null && page.getOrderByClause instanceof Function) {
+    orderByClause = page.getOrderByClause();
+  }
   const param: PageBean = {pageSize: page.pageSize, pageIndex: page.pageIndex, 
-      queryParams: example.getSqlParam(), orderByClause: page.getOrderByClause()};
-      return this.http.get(this.urls.edit, param);
+      queryParams: example.getSqlParam(), orderByClause: orderByClause};
+      return this.http.get(this.urls.list, param);
 }
 public save(data: any): Observable<any> {
       return this.http.post(this.urls.save, data);
@@ -31,5 +37,7 @@
 public delete(...ids: number[]): Observable<any> {             
       return this.http.post(this.urls.delete, ids);
 }
-
+public getEntity(id:number):Observable<ResultBean<MonitorPoint>>{
+      return this.http.get(this.urls.getOne,{id:id});
+}
 }
diff --git a/src/app/business/services/http/operate-user.service.ts b/src/app/business/services/http/operate-user.service.ts
new file mode 100644
index 0000000..9d13599
--- /dev/null
+++ b/src/app/business/services/http/operate-user.service.ts
@@ -0,0 +1,32 @@
+import { PageBean } from '@business/entity/grid';
+import { ExampleService } from '@business/services/util/example.service';
+import { _HttpClient } from '@delon/theme';
+import { environment } from 'environments/environment';
+import { RouteConfigLoadStart } from '@angular/router';
+import { Injectable } from '@angular/core';
+import { equal } from 'assert';
+import { Observable } from 'rxjs/Observable';
+
+@Injectable()
+export class OperateUserService {
+
+  private urls = {
+    list: environment.SERVER_BASH_URL + 'operateUser/page-list'
+};
+constructor(private http: _HttpClient) { }
+ public getPagingList(page: PageBean, queryText: string): Observable<PageBean> {
+  const example = new ExampleService();
+  if (queryText != null && queryText !== '') {
+    example.or().andLike({name: 'name', value: '%' + queryText + '%'});
+    example.or().andLike({name: 'jobNumber', value: '%' + queryText + '%'});
+  }
+  let orderByClause = '';
+  if ( page.getOrderByClause != null && page.getOrderByClause instanceof Function) {
+    orderByClause = page.getOrderByClause();
+  }
+  const param: PageBean = {pageSize: page.pageSize, pageIndex: page.pageIndex, 
+      queryParams: example.getSqlParam(), orderByClause: orderByClause};
+      return this.http.get(this.urls.list, param);
+}
+
+}
diff --git a/src/app/business/services/http/organization.service.ts b/src/app/business/services/http/organization.service.ts
index 0284ab9..479e611 100644
--- a/src/app/business/services/http/organization.service.ts
+++ b/src/app/business/services/http/organization.service.ts
@@ -16,7 +16,7 @@
   data: Organization;
   title: '������������'|'������������' = '������������';
   private urls = {
-      edit: environment.SERVER_BASH_URL + '/organization/page-list',
+      list: environment.SERVER_BASH_URL + '/organization/page-list',
       save: environment.SERVER_BASH_URL + '/organization/add-or-modify',
       delete: environment.SERVER_BASH_URL + '/organization/delete-by-ids'
   };
@@ -32,7 +32,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/business/services/http/version.service.ts b/src/app/business/services/http/version.service.ts
index 8bc27ae..da3387b 100644
--- a/src/app/business/services/http/version.service.ts
+++ b/src/app/business/services/http/version.service.ts
@@ -11,7 +11,7 @@
 @Injectable()
 export class VersionService {
   private urls = {
-      edit: environment.SERVER_BASH_URL + '/device-version/page-list',
+      list: environment.SERVER_BASH_URL + '/device-version/page-list',
       save: environment.SERVER_BASH_URL + '/device-version/add-or-modify',
       delete: environment.SERVER_BASH_URL + '/device-version/delete-by-ids',
       getSensorIds: environment.SERVER_BASH_URL + '/device-version/get-sensor-ids',
@@ -24,9 +24,13 @@
       example.or().andLike({name: 'name', value: '%' + queryText + '%'});
       example.or().andEqualTo({name: 'version', value: queryText});
     }
+    let orderByClause = '';
+    if ( page.getOrderByClause != null && page.getOrderByClause instanceof Function) {
+      orderByClause = page.getOrderByClause();
+    }
     const param: PageBean = {pageSize: page.pageSize, pageIndex: page.pageIndex, 
-      queryParams: example.getSqlParam(), orderByClause: page.getOrderByClause()};
-    return this.http.get(this.urls.edit, param);
+      queryParams: example.getSqlParam(), orderByClause:orderByClause};
+    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/business/services/util/tools.service.ts b/src/app/business/services/util/tools.service.ts
index b2eb6f8..3afa1b1 100644
--- a/src/app/business/services/util/tools.service.ts
+++ b/src/app/business/services/util/tools.service.ts
@@ -1,6 +1,18 @@
+import { FormGroup, FormArray, AbstractControl } from '@angular/forms';
 import { Injectable } from '@angular/core';
 
 @Injectable()
 export class ToolsService {
-
+      public static markAsDirty(controlSet:FormGroup|FormArray){
+         const controls = controlSet.controls;
+         Object.values(controls).forEach(
+             (control:AbstractControl) => {
+                    if(control instanceof FormGroup || control instanceof FormArray){
+                        ToolsService.markAsDirty(control);
+                    }else{
+                          control.markAsDirty();
+                    }
+             }
+         )
+      }
 }
diff --git a/src/app/routes/dashboard/monitor/monitor.component.ts b/src/app/routes/dashboard/monitor/monitor.component.ts
index 7eca535..82c4074 100644
--- a/src/app/routes/dashboard/monitor/monitor.component.ts
+++ b/src/app/routes/dashboard/monitor/monitor.component.ts
@@ -26,8 +26,8 @@
             this.http.get('/chart/tags')
         ).subscribe(([ res, tags ]) => {
             this.data = res;
-            tags.list[Math.floor(Math.random() * tags.list.length) + 1].value = 1000;
-            this.tags = tags.list;
+            tags['list'][Math.floor(Math.random() *  tags['list'].length) + 1].value = 1000;
+            this.tags =  tags['list'];
             this.loading = false;
         });
 
diff --git a/src/app/routes/dashboard/workplace/workplace.component.ts b/src/app/routes/dashboard/workplace/workplace.component.ts
index 9b997a1..db768ac 100644
--- a/src/app/routes/dashboard/workplace/workplace.component.ts
+++ b/src/app/routes/dashboard/workplace/workplace.component.ts
@@ -84,9 +84,9 @@
             this.http.get('/api/notice'),
             this.http.get('/api/activities')
         ).subscribe(([ chart, notice, activities ]) => {
-            this.radarData = chart.radarData;
-            this.notice = notice;
-            this.activities = activities.map((item: any) => {
+            this.radarData = chart['radarData'];
+            this.notice = <any []>notice;
+            this.activities = (<any []>activities).map((item: any) => {
                 item.template = item.template.split(/@\{([^{}]*)\}/gi).map((key: string) => {
                     if (item[key]) return `<a>${item[key].name}</a>`;
                     return key;
diff --git a/src/app/routes/devices/basic-info/adjust-config/adjust-config.component.html b/src/app/routes/devices/basic-info/adjust-config/adjust-config.component.html
new file mode 100644
index 0000000..0905782
--- /dev/null
+++ b/src/app/routes/devices/basic-info/adjust-config/adjust-config.component.html
@@ -0,0 +1,45 @@
+<div class="modal-header">
+    <div class="modal-title">���������������</div>
+  </div>
+  <nz-table #nzTable [nzDataSource]="grid.data"  [nzPageSize]="8"
+    [nzLoading]="grid.loading" [nzShowTotal]="true">
+    <thead nz-thead>
+      <tr>
+        <th nz-th style="width:45px;">
+            <label>������</label>
+        </th>
+        <th nz-th *ngFor="let col of grid.columns" [ngStyle]="{'width':col.width,'text-align':col['align'] === undefined?'left':col.align}">
+          <span>{{ col.text }}</span>
+          <nz-table-sort *ngIf="col.isSort" [(nzValue)]="col.sort" (nzValueChange)="sort(col.name,$event)"></nz-table-sort>
+        </th>
+        <th nz-th>
+             <span>���������</span>
+        </th>
+      </tr>
+    </thead>
+    <tbody nz-tbody>
+      <tr nz-tbody-tr *ngFor="let row of nzTable.data,index as i">
+        <td nz-td  [ngClass]="{'bg-grey-1':true}" style="text-align:center">
+            {{ i }}
+        </td>
+        <td nz-td *ngFor="let col of grid.columns" [ngStyle]="{'width':col.width,'text-align':col['align'] === undefined?'left':col.align}">
+          <span [ngSwitch]="col.type">
+            <!-- ������������������������������������ -->
+            <span *ngSwitchDefault> {{ row[col.name]|tyepHandle:col:row }} </span>
+            <!-- ������������������������������������ -->
+          </span>
+        </td>
+         <td>
+             <nz-input-number [(ngModel)]="data.value[row.sensorKey]" [nzStep]="0.1"></nz-input-number>
+         </td>
+      </tr>
+    </tbody>
+  </nz-table>
+  <div class="modal-footer">
+    <button nz-button type="button" (click)="close()">������</button>
+    <button nz-button [nzType]="'primary'" (click)="save($event)" [nzLoading]="isSaving">               
+           <span >
+              ������<span *ngIf="isSaving" >���</span>
+           </span>
+    </button>
+  </div>
\ No newline at end of file
diff --git a/src/app/routes/devices/basic-info/adjust-config/adjust-config.component.ts b/src/app/routes/devices/basic-info/adjust-config/adjust-config.component.ts
new file mode 100644
index 0000000..2ae7c10
--- /dev/null
+++ b/src/app/routes/devices/basic-info/adjust-config/adjust-config.component.ts
@@ -0,0 +1,120 @@
+import { zip } from 'rxjs/observable/zip';
+import { DeviceAdjustValueService } from '@business/services/http/device-adjust-value.service';
+import { NzModalSubject, NzMessageService } from 'ng-zorro-antd';
+import { SensorsService } from '@business/services/http/sensors.service';
+import { Component, OnInit } from '@angular/core';
+import { DeviceAdjustValue, Sensor, Device } from '@business/entity/data';
+import { Grid, PageBean, ResultBean } from '@business/entity/grid';
+
+@Component({
+  selector: 'app-adjust-config',
+  templateUrl: './adjust-config.component.html',
+  styles: []
+})
+export class AdjustConfigComponent implements OnInit {
+  record:Device;
+  _dataValue:{[s:string]:number} = {};
+  data:DeviceAdjustValue;
+  deviceVersionId: number;
+  isSaving = false;
+  grid: Grid<Sensor> = new Grid(null);
+  private initPage() {    
+    const sensor: Sensor = {
+      name: {
+        text: '������',
+        width: '200px'
+      },
+      sensorKey: {
+        text: '������',
+        width: '60px'
+      },
+      lower: {
+        text: '���������',
+        width: '90px'
+      },
+      upper: {
+        text: '���������',
+        width: '90px'
+      },
+      unit: {
+        text: '������',
+        width: '100px'
+      },
+      description: {
+        text: '������'
+      }
+    };
+    this.grid.title = '���������';
+    this.grid.setColumns(sensor);
+    this.grid.pageSize = 0;
+  }
+  constructor(
+    private subject: NzModalSubject,
+    private sensorsService: SensorsService,
+    private adjustValueService:DeviceAdjustValueService,
+    public msgSrv: NzMessageService,
+  ) { }
+
+  ngOnInit() {
+    this.initPage();
+    this.load();
+  }
+  load() {
+    // ������������������ExpressionChangedAfterItHasBeenCheckedError
+    setTimeout(() => {
+      this.grid.loading = true;
+    }, 1);
+    zip(
+      this.adjustValueService.getByDid(this.record.id),
+      this.sensorsService.getPagingList(this.grid, null)
+    ).subscribe(
+        ([adjustRes,sensorsRes]) => {
+            if(adjustRes!=null && adjustRes.code==1 && sensorsRes != null && sensorsRes.data != null){
+               this.data = adjustRes.data;
+               if(this.data == null||this.data.deviceId== null){
+                  this.data = {};
+                  this.data.value = {};
+                  this.data['deviceId'] = this.record.id;
+               }
+              // ���������������������
+              Object.assign(this._dataValue,this.data.value);
+               this.grid.initData(sensorsRes);
+               sensorsRes.data.forEach(
+                (item:Sensor) => {
+                  this.data.value[item.sensorKey] = this.data.value[item.sensorKey] == null?0:this.data.value[item.sensorKey];                
+                  }
+              );
+              this.grid.refreshStatus();
+              setTimeout(() => {
+                this.grid.loading = false;
+              }, 1);
+            }
+        }
+    );
+  }
+  close() {
+    this.subject.destroy();
+  }
+  save($event) {
+    // $event.preventDefault();
+    let isModify = Object.keys(this.data.value).some(
+        key => {
+            return this.data.value[key] !== this._dataValue[key];
+        }
+    );
+    debugger;
+    if(isModify){
+      this.adjustValueService.save(this.data).subscribe(
+        (res:ResultBean<any>) =>{
+               if(res!=null&&res.code==1){
+                   this.subject.destroy();                   
+                   this.msgSrv.success('���������������������');
+               }
+        }
+    );
+    }else{
+        this.subject.destroy();
+        this.msgSrv.success('������������������������');
+    }
+  }
+}
diff --git a/src/app/routes/devices/basic-info/basic-info.component.html b/src/app/routes/devices/basic-info/basic-info.component.html
index 6103db8..3b0a7bb 100644
--- a/src/app/routes/devices/basic-info/basic-info.component.html
+++ b/src/app/routes/devices/basic-info/basic-info.component.html
@@ -1,3 +1,27 @@
-<p>
-  device basic-info works!
-</p>
+<div class="content__title">
+    <h1>
+        ������������
+        <small>���������������������������������������������������������</small>
+    </h1>
+</div>
+<nz-card [nzBordered]="false">
+        <div class="mb-md">
+                <button nz-button (click)="addOrModify()" [nzType]="'primary'" [nzSize]="'large'">
+                    <i class="anticon anticon-plus"></i><span>������</span>
+                </button>
+                <ng-container *ngIf="selectedRows.length > 0"> &nbsp;
+                <button nz-button [nzSize]="'large'" (click)="deleteSelected()">������������</button>
+                </ng-container>
+                <nz-input [ngStyle]="{'width': '280px','float':'right'}" [(ngModel)]="queryText" name=""  [nzPlaceHolder]="'������������������mac'"
+                (keyup)="queryTextChanged($event)" (change)="queryTextChanged($event)" ></nz-input>
+        </div>
+    	<div class="mb-md">
+                <nz-alert *ngIf="selectedRows.length > 0" [nzType]="'info'" [nzShowIcon]="true"> 
+                    <span alert-body>
+                         ���������<strong class="text-primary">{{selectedRows.length}}</strong>���
+                    </span> 
+                </nz-alert>
+         </div>
+<simple-table #simpleTable  [data]="listUrl" [extraParams]="extraParams"  [columns]="columns" [showTotal]="true"
+[reqReName]="{pi: 'pageIndex',ps: 'pageSize'}"  (checkboxChange)="checkboxChange($event)" [ps]="10" [resReName]="{list: 'data',total: 'total'}"></simple-table>
+</nz-card>
\ No newline at end of file
diff --git a/src/app/routes/devices/basic-info/basic-info.component.ts b/src/app/routes/devices/basic-info/basic-info.component.ts
index 434f272..b468826 100644
--- a/src/app/routes/devices/basic-info/basic-info.component.ts
+++ b/src/app/routes/devices/basic-info/basic-info.component.ts
@@ -1,4 +1,16 @@
-import { Component, OnInit } from '@angular/core';
+import { MonitorPointService } from '@business/services/http/monitor-point.service';
+import { CoorPicker, Device } from '@business/entity/data';
+import { AdjustConfigComponent } from './adjust-config/adjust-config.component';
+import { DeviceEditComponent } from './device-edit/device-edit.component';
+import { ModalHelper } from '@delon/theme';
+import { NzModalService, NzMessageService } from 'ng-zorro-antd';
+import { PageBean, ResultBean } from '@business/entity/grid';
+import { DeviceService } from '@business/services/http/device.service';
+import { Component, OnInit, ElementRef, ViewChild } from '@angular/core';
+import { SimpleTableColumn } from '@delon/abc';
+import { Subject } from 'rxjs/Subject';
+import { CoordinatesPickerComponent } from 'app/routes/map/coordinates-picker/coordinates-picker.component';
+import { CoorPickerService } from 'app/routes/map/coordinates-picker/coordinates-picker.service';
 
 @Component({
   selector: 'app-basic-info',
@@ -6,10 +18,178 @@
   styles: []
 })
 export class BasicInfoComponent implements OnInit {
-
-  constructor() { }
+  columns: SimpleTableColumn[] = [
+    { title: '������', index: 'id', type: 'checkbox' },
+    { title: '������', index: 'name' },
+    { title: 'mac', index: 'mac' },
+    { title: '������', index: 'deviceVersion.name' },
+    { title: '���������', index: 'monitorPoint.name' },
+    { title: '���������', index: 'operateUser.name' },
+    { title: '������������',width: '100px', type: 'date', index: 'createTime' },
+    { title: '������������', width: '100px',type: 'date', index: 'installTime' },
+    {
+      title: '���������',
+      buttons: [
+        {
+          text: '������',
+          type: 'none',
+          click: (record: any) => this.addOrModify(record)
+        },
+        {
+          text: '������',
+          type: 'del',
+          click: (record: any) => this.delete(record.id)
+        },
+        {
+            text: '������',
+            children: [
+                {
+                    text: `���������������`,
+                    type: 'static',
+                    component:AdjustConfigComponent,
+                    format: (record: any) => `<i class="anticon anticon-setting"></i>���������������`
+                },
+                {
+                  text: `������������`,
+                  type: 'none',
+                  click: (record: any) => this.configCoord(record),
+                  format: (record: any) => `<i class="anticon anticon-environment-o"></i>������������`
+              }
+            ]
+        }
+      ]
+    }
+  ];
+  queryTextStream: Subject<string> = new Subject<string>();
+  constructor(
+    private monitorPointService:MonitorPointService,
+    private deviceService: DeviceService,
+    private confirmServ: NzModalService,
+    public msgSrv: NzMessageService,
+    private modalHelper: ModalHelper,
+    private coorPickerService:CoorPickerService
+  ) { }
 
   ngOnInit() {
+    this.queryTextStream
+      .debounceTime(900)
+      .distinctUntilChanged()
+      .subscribe(value => {
+        this.extraParams.queryParams = this.deviceService.getSqlParams(value);
+        this.load();
+      });
   }
+  get listUrl() {
+    return this.deviceService.getListUrl();;
+  }
+  extraParams = { queryParams: null };
+  queryText: string;
+  selectedRows: any[] = [];
+  checkboxChange(list: any[]) {
+    this.selectedRows = list;
+  }
+  deleteSelected() {
+    this.confirmServ.confirm({
+      title: '������������',
+      content: '������������������������������������������������',
+      okText: '������',
+      cancelText: '������'
+    }).on('onOk', () => {
+      if (this.selectedRows != null && this.selectedRows.length > 0) {
+        const ids = this.selectedRows.map(
+          (row: any) => {
 
+            return Number.parseInt(row.id);
+          }
+        );
+        this.delete(...ids);
+      }
+    });
+  }
+  load() {
+    this.selectedRows = [];
+    this.simpleTable.load();
+  }
+  delete(...id: number[]) {
+    this.deviceService.delete(...id).subscribe(
+      (res: any) => {
+        if (res.code === 1) {
+          this.load();
+          this.msgSrv.success('���������������');
+        }
+      }
+    );
+  }
+  @ViewChild('simpleTable') simpleTable: { load: Function };
+  queryTextChanged(event) {
+    this.queryTextStream.next(this.queryText);
+  }
+  addOrModify(d) {
+    const data = {};
+    if (d != null) {
+      Object.assign(data, d);
+    }
+    this.modalHelper.static(DeviceEditComponent, { data }).subscribe(
+      (ret: { data: any, close: Function }) => {
+        // ������������
+        if (ret.data['id'] != null) {
+          const origData = d;
+          const isModified = Object.keys(ret.data).some(
+            (key: string) => {
+              return ret.data[key] !== origData[key];
+            }
+          );
+          // ������������
+          if (!isModified) {
+            ret.close();
+            this.msgSrv.success('���������������������������');
+            return;
+          }
+        }
+        this.deviceService.save(ret.data).subscribe(
+          (res: any) => {
+            if (res.code === 1) {
+              this.load();
+              ret.close();
+              this.msgSrv.success('���������������������');
+            }
+          }
+        );
+      });
+  }
+  configCoord(record:Device):void {  
+    Object.assign(this.coorPickerService.data,record);
+    let _data = this.coorPickerService.data;
+    this.monitorPointService.getEntity(record.monitorPointId).subscribe(
+         res => {
+            if(res!=null && res.code==1 && res.data!=null){
+                const areaNames = res.data.areaNames;
+                let adress = null;
+                if(areaNames != null){
+                  adress = areaNames.provinceName+areaNames.cityName+areaNames.areaName+res.data.address;
+                }
+                this.coorPickerService.data.address = adress;
+                this.coorPickerService.data['describe'] = '������������';
+            }
+            this.modalHelper.static(CoordinatesPickerComponent).subscribe(
+              (staticComp) => {
+                     const data:Device = {
+                        id:record.id,
+                        longitude:_data.longitude,
+                        latitude:_data.latitude,
+                     }
+                     this.deviceService.save(data).subscribe(
+                      (res: any) => {
+                        if (res.code === 1) {
+                          this.load();
+                          this.msgSrv.success('���������������������');
+                        }
+                      }
+                     );
+                     
+              }
+           );
+         }
+    )
+  }
 }
diff --git a/src/app/routes/devices/basic-info/device-edit/device-edit.component.html b/src/app/routes/devices/basic-info/device-edit/device-edit.component.html
new file mode 100644
index 0000000..840dbd7
--- /dev/null
+++ b/src/app/routes/devices/basic-info/device-edit/device-edit.component.html
@@ -0,0 +1,105 @@
+  <div class="modal-header">
+    <div class="modal-title">{{ data.id != null ? '������' : '������'}} - ������</div>
+  </div>
+  <form [formGroup]="validateForm" (ngSubmit)="save($event,validateForm.value,validateForm.valid)" nz-form [nzType]="'horizontal'">
+      <div nz-form-item nz-row class="mb-sm">
+          <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+            <label nz-form-item-required>������</label>
+          </div>
+          <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
+            <nz-input formControlName="name" maxlength="20" [nzPlaceHolder]="'������������'">
+            </nz-input>
+          </div>
+          <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+            <label>mac</label>
+          </div>
+          <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
+                <nz-input formControlName="mac" maxlength="20" [nzPlaceHolder]="'mac������'">
+                </nz-input>
+          </div>
+        </div>
+        <div nz-form-item nz-row class="mb-sm">
+            <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+              <label>������</label>
+            </div>
+            <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
+              <nz-input-number [ngStyle]="{'width': '100%' }" formControlName="longitude"  [nzMin]="-180" [nzMax]="180" [nzStep]="0.000001"
+              [nzPlaceHolder]="'-180~180������'">
+              </nz-input-number>
+            </div>
+            <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+              <label>������</label>
+            </div>
+            <div nz-form-control nz-col [nzSpan]="6" nzHasFeedback>
+              <nz-input-number [ngStyle]="{'width': '100%' }" formControlName="latitude" [nzMin]="-90" [nzMax]="90" [nzStep]="0.000001"
+              [nzPlaceHolder]="'-90~90������'">
+              </nz-input-number>
+            </div>
+          </div>
+          <div nz-form-item  nz-row class="mb-sm">
+              <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+                <label>������������</label>
+              </div>
+              <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
+                  <nz-select formControlName="deviceVersionId" [nzPlaceHolder]="'������ ������(������������������)'"
+                  nzAllowClear [nzFilter]="false" nzShowSearch (nzSearchChange)="deviceVersionChange($event)" [nzNotFoundContent]="'������������'" >
+                    <nz-option *ngFor="let option of deviceVersions" [nzLabel]="option.name" [nzValue]="option.id" [nzDisabled]="option.disabled">
+                    </nz-option>
+                  </nz-select>
+              </div>
+              <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+                <label>���������</label>
+              </div>
+              <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
+                  <nz-select formControlName="operateUserId" [nzPlaceHolder]="'������ ���������(������������������)'"
+                  nzAllowClear [nzFilter]="false" nzShowSearch (nzSearchChange)="operateUserChange($event)" [nzNotFoundContent]="'������������'" >
+                    <nz-option *ngFor="let option of operateUsers" [nzLabel]="option.name" [nzValue]="option.id" [nzDisabled]="option.disabled">
+                    </nz-option>
+                  </nz-select>
+              </div>
+          </div>  
+          <div nz-form-item  nz-row class="mb-sm">
+            <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+              <label>���������</label>
+            </div>
+            <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
+                <nz-select formControlName="monitorPointId" [nzPlaceHolder]="'������ ���������(������������������)'"
+                nzAllowClear [nzFilter]="false" nzShowSearch (nzSearchChange)="monitorPointChange($event)" [nzNotFoundContent]="'������������'" >
+                  <nz-option *ngFor="let option of monitorPoints" [nzLabel]="option.name" [nzValue]="option.id" [nzDisabled]="option.disabled">
+                  </nz-option>
+                </nz-select>
+            </div>
+            <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+              <label>������������</label>
+            </div>
+            <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
+                <nz-input formControlName="address" maxlength="20" [nzPlaceHolder]="'���������������������������'">
+                </nz-input>
+            </div>
+          </div>   
+          <div nz-form-item  nz-row class="mb-sm">
+              <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+                <label>������������</label>
+              </div>
+              <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
+                  <nz-datepicker nzSize="large"  style="width: 100%;" formControlName="createTime" nzShowTime  [nzPlaceHolder]="'������������'"
+                  [nzFormat]="'YYYY-MM-DD HH:mm:ss'" ></nz-datepicker>          
+              </div>
+              <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+                <label>������������</label>
+              </div>
+              <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
+                  <nz-datepicker nzSize="large"  style="width: 100%;" formControlName="installTime" nzShowTime  [nzPlaceHolder]="'������������'"
+                  [nzFormat]="'YYYY-MM-DD HH:mm:ss'" ></nz-datepicker>          
+              </div>
+            </div>   
+    <div class="modal-footer">
+        <button nz-button type="button" (click)="close()">������</button>
+        <button nz-button [nzType]="'primary'" [nzLoading]="isSaving">
+          <span>
+            ������
+            <span *ngIf="isSaving">���</span>
+          </span>
+        </button>
+    </div>
+  </form>
\ No newline at end of file
diff --git a/src/app/routes/devices/basic-info/device-edit/device-edit.component.ts b/src/app/routes/devices/basic-info/device-edit/device-edit.component.ts
new file mode 100644
index 0000000..cd51a45
--- /dev/null
+++ b/src/app/routes/devices/basic-info/device-edit/device-edit.component.ts
@@ -0,0 +1,133 @@
+import { ToolsService } from '@business/services/util/tools.service';
+import { OperateUserService } from '@business/services/http/operate-user.service';
+import { VersionService } from '@business/services/http/version.service';
+import { MonitorPointService } from '@business/services/http/monitor-point.service';
+import { NzModalSubject } from 'ng-zorro-antd';
+import { FormBuilder, FormGroup, Validators } from '@angular/forms';
+import { DeviceService } from '@business/services/http/device.service';
+import { Component, OnInit } from '@angular/core';
+import { Device} from '@business/entity/data';
+import { _Validators } from '@delon/abc';
+import { PageBean } from '@business/entity/grid';
+
+@Component({
+  selector: 'app-device-edit',
+  templateUrl: './device-edit.component.html',
+  styles: []
+})
+export class DeviceEditComponent implements OnInit {
+  private monitorPoints:any [] = [];
+  private deviceVersions:any [] = [];
+  private operateUsers:any [] = [];
+  private isSaving = false;
+  constructor(
+    private subject: NzModalSubject,
+    private formBuilder: FormBuilder,
+    private monitorPointService:MonitorPointService,
+    private versionService:VersionService,
+    private operateUserService:OperateUserService
+  ) { }
+  data:Device;
+  validateForm:FormGroup;
+  ngOnInit() {
+    const data = this.data;
+    this.monitorPointChange(null);
+    this.deviceVersionChange(null);
+    this.operateUserChange(null);
+    if (this.data.createTime == null) {
+        this.data.createTime = new Date().getTime();
+    }
+    const validates:Device = {
+         name:[data.name,[Validators.required]],
+         mac:[data.mac],
+         deviceVersionId:[data.deviceVersionId],
+         monitorPointId:[data.monitorPointId],
+         operateUserId:[data.operateUserId],
+         address:[data.address],
+         id:[data.id],
+         longitude:[data.longitude],
+         latitude:[data.latitude],
+         createTime:[data.createTime],
+         installTime:[data.installTime]
+    };
+    this.validateForm = this.formBuilder.group(
+      validates
+    );
+  }
+  close(){
+     this.subject.destroy();
+   }
+   save($event, value, valid){
+    $event.preventDefault();
+    if(valid){
+      this.isSaving = true;
+      this.data = value;
+      this.subject.next( this );
+    }else{
+        ToolsService.markAsDirty(this.validateForm);
+    }
+   }
+   monitorPointChange(text){
+    const pageBean: PageBean = {pageIndex: 0, pageSize: 20};
+    this.monitorPointService.getPagingList(pageBean, text).subscribe(
+      (res: PageBean) => {
+           if (res != null && res.data != null) {               
+               this.monitorPoints = res.data;
+           }
+           const monitorPoint = this.data.monitorPoint;
+           if (monitorPoint != null && text == null) {
+               const hasSelectedValue = this.monitorPoints.some(
+                   (item: any) => {
+                      return item.id === monitorPoint.id;
+                   }
+               );
+               if ( hasSelectedValue ) {
+                  this.monitorPoints.push(monitorPoint);
+               }                     
+           }
+      }
+   );
+   }
+   deviceVersionChange(text){
+    const pageBean: PageBean = {pageIndex: 0, pageSize: 20};
+    this.versionService.getPagingList(pageBean, text).subscribe(
+      (res: PageBean) => {
+           if (res != null && res.data != null) {               
+               this.deviceVersions = res.data;
+           }
+           const deviceVersion = this.data.deviceVersion;
+           if (deviceVersion != null && text == null) {
+               const hasSelectedValue = this.deviceVersions.some(
+                   (item: any) => {
+                      return item.id === deviceVersion.id;
+                   }
+               );
+               if ( hasSelectedValue ) {
+                  this.monitorPoints.push(deviceVersion);
+               }                     
+           }
+      }
+   );
+   }
+   operateUserChange(text){
+    const pageBean: PageBean = {pageIndex: 0, pageSize: 20};
+    this.operateUserService.getPagingList(pageBean, text).subscribe(
+      (res: PageBean) => {
+           if (res != null && res.data != null) {               
+               this.operateUsers = res.data;
+           }
+           const operateUser = this.data.operateUser;
+           if (operateUser != null && text == null) {
+               const hasSelectedValue = this.operateUsers.some(
+                   (item: any) => {
+                      return item.id === operateUser.id;
+                   }
+               );
+               if ( hasSelectedValue ) {
+                  this.monitorPoints.push(operateUser);
+               }                     
+           }
+      }
+   );
+   }
+}
diff --git a/src/app/routes/devices/devices.module.ts b/src/app/routes/devices/devices.module.ts
index 9ad3e5b..7a05990 100644
--- a/src/app/routes/devices/devices.module.ts
+++ b/src/app/routes/devices/devices.module.ts
@@ -1,3 +1,5 @@
+import { DeviceAdjustValueService } from '@business/services/http/device-adjust-value.service';
+import { ToolsService } from '@business/services/util/tools.service';
 import { SensorsService } from '@business/services/http/sensors.service';
 import { OrganizationService } from '@business/services/http/organization.service';
 import { MonitorPointService } from '@business/services/http/monitor-point.service';
@@ -17,8 +19,14 @@
 import { VersionEditComponent } from './version/version-edit/version-edit.component';
 import { MonitorPointEditComponent } from './monitor-point/monitor-point-edit/monitor-point-edit.component';
 import { VersionSensorConfigComponent } from './version/version-sensor-config/version-sensor-config.component';
-
-const COMPONENTS_NOROUNT = [  VersionEditComponent, MonitorPointEditComponent, VersionSensorConfigComponent  ];
+import { DeviceService } from '@business/services/http/device.service';
+import { DeviceEditComponent } from './basic-info/device-edit/device-edit.component';
+import { OperateUserService } from '@business/services/http/operate-user.service';
+import { AdjustConfigComponent } from './basic-info/adjust-config/adjust-config.component';
+import { CoordinatesPickerComponent } from 'app/routes/map/coordinates-picker/coordinates-picker.component';
+import { MapModule } from 'app/routes/map/map.module';
+import { CoorPickerService } from 'app/routes/map/coordinates-picker/coordinates-picker.service';
+const COMPONENTS_NOROUNT = [AdjustConfigComponent,DeviceEditComponent,VersionEditComponent, MonitorPointEditComponent, VersionSensorConfigComponent  ];
 
 const routes: Routes = [
   {
@@ -37,17 +45,18 @@
     PipeModule,
     CommonModule,
     SharedModule,
+    MapModule,
     RouterModule.forChild(routes)
   ],
   declarations: [
     BasicInfoComponent,
     VersionComponent,
     MonitorPointComponent,
-    ...COMPONENTS_NOROUNT     
+        ...COMPONENTS_NOROUNT     
   ],
-  providers: [OrganizationService, VersionService, 
+  providers: [CoorPickerService,DeviceAdjustValueService,OrganizationService, VersionService, 
     SensorsService, AreacodeService, MonitorPointService,
-    _HttpClient, FormBuilder],
-  entryComponents: COMPONENTS_NOROUNT
+    _HttpClient, FormBuilder,DeviceService,OperateUserService,ToolsService],
+  entryComponents: [CoordinatesPickerComponent,...COMPONENTS_NOROUNT]
 })
 export class DevicesModule { }
diff --git a/src/app/routes/devices/monitor-point/monitor-point-edit/monitor-point-edit.component.html b/src/app/routes/devices/monitor-point/monitor-point-edit/monitor-point-edit.component.html
index e01c902..e7555b9 100644
--- a/src/app/routes/devices/monitor-point/monitor-point-edit/monitor-point-edit.component.html
+++ b/src/app/routes/devices/monitor-point/monitor-point-edit/monitor-point-edit.component.html
@@ -15,8 +15,7 @@
     </div>
     <div nz-form-control nz-col [nzSpan]="6" nzHasFeedback>
       <nz-select formControlName="organizationId" [nzPlaceHolder]="'������ ������(������������������)'"
-	    nzAllowClear [nzFilter]="false" nzShowSearch 
-		      formControlName="organizationId" (nzSearchChange)="OrgSelectChange($event)" [nzNotFoundContent]="'������������'" >
+	    nzAllowClear [nzFilter]="false" nzShowSearch  (nzSearchChange)="OrgSelectChange($event)" [nzNotFoundContent]="'������������'" >
         <nz-option *ngFor="let option of orgOptions" [nzLabel]="option.name" [nzValue]="option.id" [nzDisabled]="option.disabled">
         </nz-option>
       </nz-select>
@@ -46,7 +45,7 @@
     </div>
     <div nz-form-control nz-col [nzSpan]="5" nzHasFeedback>
         <nz-input-number [ngStyle]="{'width': '100%' }" formControlName="longitude"  [nzMin]="-180" [nzMax]="180" [nzStep]="0.000001">
-          </nz-input-number>
+        </nz-input-number>
     </div>
     <div nz-form-control nz-col [nzSpan]="2" nzHasFeedback></div>
     <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
diff --git a/src/app/routes/devices/monitor-point/monitor-point.component.html b/src/app/routes/devices/monitor-point/monitor-point.component.html
index fd431c6..deffe36 100644
--- a/src/app/routes/devices/monitor-point/monitor-point.component.html
+++ b/src/app/routes/devices/monitor-point/monitor-point.component.html
@@ -54,9 +54,11 @@
                     <td nz-td>
                             <a (click)="addOrModify(row)">������</a>
                             <span nz-table-divider></span>
-                              <nz-popconfirm [nzTitle]="'������������������'+grid.title+'���?'" [nzOkText]="'Yes'" [nzCancelText]="'No'" (nzOnConfirm)="delete(row.id)" >
+                            <nz-popconfirm [nzTitle]="'������������������'+grid.title+'���?'" [nzOkText]="'Yes'" [nzCancelText]="'No'" (nzOnConfirm)="delete(row.id)" >
                                 <a nz-popconfirm>������</a>
-                              </nz-popconfirm>
+                            </nz-popconfirm>
+                            <span nz-table-divider></span>
+                            <a (click)="configCoord(row)">������������</a>                            
                      </td>
                 </tr>
               </tbody>
diff --git a/src/app/routes/devices/monitor-point/monitor-point.component.ts b/src/app/routes/devices/monitor-point/monitor-point.component.ts
index db33f86..2b2d1c4 100644
--- a/src/app/routes/devices/monitor-point/monitor-point.component.ts
+++ b/src/app/routes/devices/monitor-point/monitor-point.component.ts
@@ -1,4 +1,5 @@
-import {  AreaNames, MonitorPoint } from '@business/entity/data';
+import { CoorPickerService } from 'app/routes/map/coordinates-picker/coordinates-picker.service';
+import { AreaNames, MonitorPoint } from '@business/entity/data';
 import { Version, ValueTransformer } from '@angular/compiler/src/util';
 import { Subject } from 'rxjs/Subject';
 import { Component, OnInit } from '@angular/core';
@@ -12,6 +13,7 @@
 import { filter } from 'rxjs/operators/filter';
 import { MonitorPointEditComponent } from 'app/routes/devices/monitor-point/monitor-point-edit/monitor-point-edit.component';
 import { MonitorPointService } from '@business/services/http/monitor-point.service';
+import { CoordinatesPickerComponent } from 'app/routes/map/coordinates-picker/coordinates-picker.component';
 
 
 @Component({
@@ -24,25 +26,25 @@
 
   private monitorPoint: MonitorPoint;
   grid: Grid<MonitorPoint> = new Grid(null);
-  queryMap = { text: '���������������', value: ''};
+  queryMap = { text: '���������������', value: '' };
   queryTextStream: Subject<string> = new Subject<string>();
-    private initPage() {
-    this.monitorPoint =  {
+  private initPage() {
+    this.monitorPoint = {
       name: {
         text: '������',
-        width: '300px'  
+        width: '300px'
       },
       address: {
         text: '������',
         width: '300px',
         format: (value: any, col: Column, row: any) => {
-              value = value == null ? '' : value ;
-              if (row['areaNames'] != null) {
-                return row['areaNames']['provinceName'] + row['areaNames']['cityName'] + row['areaNames']['areaName'] + value;
-              } else {
-                return value;
-              }
-              
+          value = value == null ? '' : value;
+          if (row['areaNames'] != null) {
+            return row['areaNames']['provinceName'] + row['areaNames']['cityName'] + row['areaNames']['areaName'] + value;
+          } else {
+            return value;
+          }
+
         }
       },
       description: {
@@ -55,123 +57,153 @@
     this.grid.pageSize = 10;
   }
   constructor(
+    private coorPickerService:CoorPickerService,
     private monitorPointService: MonitorPointService,
-    
+
     private confirmServ: NzModalService,
     public msgSrv: NzMessageService,
     private modalHelper: ModalHelper,
-  ) {}
+  ) { }
 
   ngOnInit() {
     this.initPage();
     this.queryTextStream
-    .debounceTime(500)
-    .distinctUntilChanged()
-    .subscribe(queryText => {
+      .debounceTime(500)
+      .distinctUntilChanged()
+      .subscribe(queryText => {
         this.load();
-    });
+      });
   }
   queryTextChanged($event) {
-      this.queryTextStream.next(this.queryMap.value);
+    this.queryTextStream.next(this.queryMap.value);
   }
-  load(reload: boolean = false) {   
+  load(reload: boolean = false) {
     if (reload) {
-      this.grid.pageIndex = 1 ;
+      this.grid.pageIndex = 1;
     }
     // ������������������ExpressionChangedAfterItHasBeenCheckedError
     setTimeout(() => {
       this.grid.loading = true;
-     }, 1);
+    }, 1);
     this.monitorPointService.getPagingList(this.grid, this.queryMap.value).subscribe(
-       (res: PageBean) => {
-            this.grid.loading = true;
-            if (res != null && res.data != null) {
-              this.grid.initData(res);
-              this.grid.refreshStatus();
-              setTimeout(() => {
-                this.grid.loading = false;
-               }, 1);
-            }
-       }
+      (res: PageBean) => {
+        this.grid.loading = true;
+        if (res != null && res.data != null) {
+          this.grid.initData(res);
+          this.grid.refreshStatus();
+          setTimeout(() => {
+            this.grid.loading = false;
+          }, 1);
+        }
+      }
     );
   }
 
-// rowData���null���������������
+  // rowData���null���������������
   addOrModify(d) {
     const data = {};
-    if ( d != null) {
+    if (d != null) {
       Object.assign(data, d);
     }
-    this.modalHelper.static(MonitorPointEditComponent, { data }).subscribe( 
-      ( ret: { data: any, close: Function} ) => {
-      // ������������
-      if (ret.data['index'] != null ) {
-          const index: number = ret.data['index'] ;
+    this.modalHelper.static(MonitorPointEditComponent, { data }).subscribe(
+      (ret: { data: any, close: Function }) => {
+        // ������������
+        if (ret.data['index'] != null) {
+          const index: number = ret.data['index'];
           const origData = this.grid.data[index];
-          const isModified =  Object.keys(origData).some(
+          const isModified = Object.keys(origData).some(
             (key: string) => {
-                return ret.data[key] !== origData[key];    
-            } 
+              return ret.data[key] !== origData[key];
+            }
           );
           // ������������
-          if (!isModified) { 
+          if (!isModified) {
             ret.close();
             this.msgSrv.success(this.grid.title + '���������������������');
             return;
           }
-      }
-      this.monitorPointService.save(ret.data).subscribe(
-         ( res: any) => {
+        }
+        this.monitorPointService.save(ret.data).subscribe(
+          (res: any) => {
             if (res.code === 1) {
               this.load();
               ret.close();
               this.msgSrv.success(this.grid.title + '���������������');
             }
-         }
-      );
-    });
+          }
+        );
+      });
   }
 
   delete(...id: number[]) {
-    this.monitorPointService.delete( ...id ).subscribe(
-      ( res: any) => {
-         if (res.code === 1) {
-           this.load();
-           this.msgSrv.success(this.grid.title + '���������������');
-         }
+    this.monitorPointService.delete(...id).subscribe(
+      (res: any) => {
+        if (res.code === 1) {
+          this.load();
+          this.msgSrv.success(this.grid.title + '���������������');
+        }
       }
-   );
+    );
   }
 
-   deleteSelected() {
+  deleteSelected() {
     this.confirmServ.confirm({
       title: '������������',
       content: '������������������������������������������������',
       okText: '������',
       cancelText: '������'
     }).on('onOk', () => {
-       if (this.grid.selectedIndexs != null && this.grid.selectedIndexs.length > 0) {
-          const ids = this.grid.selectedIndexs.map(
-              (index: number) => {
-                  const id = this.grid.data[index].id;
-                  return Number.parseInt(id);
-              }
-          );
-          this.delete( ...ids );
-       }
+      if (this.grid.selectedIndexs != null && this.grid.selectedIndexs.length > 0) {
+        const ids = this.grid.selectedIndexs.map(
+          (index: number) => {
+            const id = this.grid.data[index].id;
+            return Number.parseInt(id);
+          }
+        );
+        this.delete(...ids);
+      }
     });
   }
   sort(field: string, value: string) {
     // ������������field
     this.grid.sorts = this.grid.sorts.filter(
-       (fn: string) => {
-          return fn !== field;
-       }
-     );
-     // ������value������null������������������������������filed
-     if ( value != null ) {
-        this.grid.sorts.push(field);
-     }
-     this.load();
+      (fn: string) => {
+        return fn !== field;
+      }
+    );
+    // ������value������null������������������������������filed
+    if (value != null) {
+      this.grid.sorts.push(field);
+    }
+    this.load();
+  }
+  configCoord(record: MonitorPoint): void {
+    Object.assign(this.coorPickerService.data, record);
+    let _data = this.coorPickerService.data;
+    const areaNames = record.areaNames;
+    let adress = null;
+    if (areaNames != null) {
+      adress = areaNames.provinceName + areaNames.cityName + areaNames.areaName + record.address;
+    }
+    this.coorPickerService.data.address = adress;
+    this.coorPickerService.data['describe'] = '���������������';
+    this.modalHelper.static(CoordinatesPickerComponent).subscribe(
+      (staticComp) => {
+        const data: MonitorPoint = {
+          id: record.id,
+          longitude: _data.longitude,
+          latitude: _data.latitude,
+        }
+        this.monitorPointService.save(data).subscribe(
+          (res: any) => {
+            if (res.code === 1) {
+              this.load();
+              this.msgSrv.success('���������������������');
+            }
+          }
+        );
+
+      }
+    );
   }
 }
diff --git a/src/app/routes/devices/version/version-sensor-config/version-sensor-config.component.ts b/src/app/routes/devices/version/version-sensor-config/version-sensor-config.component.ts
index db44f3c..600dd37 100644
--- a/src/app/routes/devices/version/version-sensor-config/version-sensor-config.component.ts
+++ b/src/app/routes/devices/version/version-sensor-config/version-sensor-config.component.ts
@@ -21,7 +21,7 @@
         text: '������',
         width: '200px'
       },
-      key: {
+      sensorKey: {
         text: '������',
         width: '60px'
       },
diff --git a/src/app/routes/map/coordinates-picker/coordinates-picker.component.css b/src/app/routes/map/coordinates-picker/coordinates-picker.component.css
new file mode 100644
index 0000000..871f89b
--- /dev/null
+++ b/src/app/routes/map/coordinates-picker/coordinates-picker.component.css
@@ -0,0 +1,19 @@
+.anchorBL {
+	display: none;
+}
+.top_transparent {
+	width: 98%;
+	height: 40px;
+	background: #fff;
+	position: absolute;
+    margin-top: 0;
+	opacity: 0.6;
+	z-index: 1;
+}
+
+.coordinate_title {
+	width: 90%;
+	position: absolute;
+	top: 4%;
+	z-index: 2;
+}
diff --git a/src/app/routes/map/coordinates-picker/coordinates-picker.component.html b/src/app/routes/map/coordinates-picker/coordinates-picker.component.html
new file mode 100644
index 0000000..df2ada9
--- /dev/null
+++ b/src/app/routes/map/coordinates-picker/coordinates-picker.component.html
@@ -0,0 +1,44 @@
+          <div class="top_transparent">
+          </div>
+          <div class="coordinate_title">
+              <div nz-row class="mb-sm">
+                    <div nz-col [nzSm]="1">
+                      <span></span>
+                    </div>
+                    <div  nz-col [nzSpan]="7">
+                        <nz-input maxlength="20" [(ngModel)]="queryTest" [nzPlaceHolder]="'���������������(��� ��� ��� ��� ���������)'">
+                        </nz-input>
+                    </div>
+                    <div nz-col [nzSpan]="1">
+                        <button nz-button [nzType]="'primary'" [disabled]="disabled"  (click)="mapSearch($event)" class="mr-sm">
+                            <i class="anticon anticon-search"></i><span>������</span>
+                        </button>
+                    </div>
+                    <div nz-col [nzSpan]="4">
+                         <span></span>
+                    </div>
+                    <div nz-col [nzSpan]="11">
+                            <label>
+                                ���������
+                            </label>
+                            <span>
+                               ( {{markerOption.point.lng}} <strong>,</strong> {{markerOption.point.lat}} )
+                            </span>
+                    </div>
+              </div>
+          </div>
+          <baidu-map #map [options]="options"  (loaded)="loadMap($event)" (clicked)="clickMap($event)"  style="display: block;height:400px;">
+              <control type="navigation" [options]="navigationOpts"></control>
+              <marker #marker  [point]="markerOption.point" [options]="markerOption.options" (loaded)="loadMarker($event)"></marker>
+          </baidu-map>
+<div class="modal-footer">
+        <label>{{data.describe}}���</label>
+  <span [ngStyle]="{'font-size': '16px','font-weight': 'bold','margin-right':'30px'}">{{data.name}}</span>
+  <button nz-button type="button" (click)="close()">������</button>
+  <button nz-button [nzType]="'primary'" (click)="save()" [nzLoading]="isSaving">
+    <span>
+      ������
+      <span *ngIf="isSaving">���</span>
+    </span>
+  </button>
+</div>
diff --git a/src/app/routes/map/coordinates-picker/coordinates-picker.component.ts b/src/app/routes/map/coordinates-picker/coordinates-picker.component.ts
new file mode 100644
index 0000000..f7ba6b6
--- /dev/null
+++ b/src/app/routes/map/coordinates-picker/coordinates-picker.component.ts
@@ -0,0 +1,120 @@
+import { NzModalSubject } from 'ng-zorro-antd';
+import { ReactiveFormsModule } from '@angular/forms';
+import { ViewEncapsulation,Component,  ViewChild, ElementRef, NgZone } from '@angular/core';
+import { MapOptions,Point,MarkerOptions,ControlAnchor,NavigationControlOptions,NavigationControlType,BMapInstance } from 'angular2-baidu-map';
+import { CoorPicker } from '@business/entity/data';
+import { CoorPickerService } from 'app/routes/map/coordinates-picker/coordinates-picker.service';
+
+
+
+@Component({
+  encapsulation: ViewEncapsulation.None,
+  selector: 'app-coordinates-picker',
+  templateUrl: './coordinates-picker.component.html',
+  styleUrls: [ './coordinates-picker.component.css' ],
+})
+export class CoordinatesPickerComponent{
+    Default_LNG = 121;
+    Default_LAT = 31.4;
+    markerOption:{
+      point:Point,
+      options:MarkerOptions
+    }= {
+      point:null,
+      options:null
+    };
+    data:CoorPicker;
+    navigationOpts:NavigationControlOptions;
+    options: MapOptions;
+    _BMap:any = null;
+
+  constructor(private subject:NzModalSubject,private coorPickerService:CoorPickerService) {
+    this.data = this.coorPickerService.data;
+    let lng = this.data.longitude;
+    lng = lng ==0 || lng == null ? this.Default_LNG:lng;
+    this.data.longitude = lng;
+    let lat = this.data.latitude;
+    lat = lat == 0||lat == null ? this.Default_LAT:lat;
+    this.data.latitude = lat;
+    this.options = {
+        minZoom:3,
+        maxZoom:19,
+        cursor:'default',
+        centerAndZoom: {
+          lng:lng,          
+          lat:lat,
+          zoom: 19
+        },
+        enableKeyboard: true
+      };  
+      this.navigationOpts = {
+        anchor: ControlAnchor.BMAP_ANCHOR_BOTTOM_RIGHT,
+        type: NavigationControlType.BMAP_NAVIGATION_CONTROL_LARGE
+      }
+      this.markerOption.point = {
+        lng:lng,
+        lat:lat
+      };
+      this.markerOption.options = {
+        icon: {
+          imageUrl: './assets/img/map_coordinates.png',
+          size: {
+            height: 30,
+            width: 30
+          }
+        },
+        offset:{
+           height:-30,
+           width:-15
+        }
+       };
+  } 
+  private _marker:any = null;
+  loadMarker(marker){
+    if(this._marker==null){
+      this._marker = marker;      
+    }
+  }
+  private _map: any;
+  private _localSearch;
+  loadMap(map: any) {      
+      this._map = map;
+      this._BMap = window.BMap;  
+      this._map.addEventListener(
+        'tilesloaded',
+        (type, fn) => {
+           this._map.clearOverlays();
+           this._map.addOverlay(this._marker);          
+        }
+      ); 
+      this._localSearch= new  this._BMap.LocalSearch(map, {
+        renderOptions:{map: map}
+      });
+      if(this.data.latitude==this.Default_LAT&&this.data.longitude==this.Default_LNG
+      &&this.data.address!=null){
+          this._localSearch.search(this.data.address);
+      }
+
+  }
+  queryTest:string;
+   mapSearch(param:any){
+      let text = this.queryTest;
+      text = text == null || text.trim() ==''?'���������':text;
+      this._localSearch.search(text);
+  }
+  clickMap(e: any) {
+       this.markerOption.point = {
+         lng: e.point.lng,
+         lat: e.point.lat
+       };
+       this.coorPickerService.data.longitude = e.point.lng;
+       this.coorPickerService.data.latitude = e.point.lat;
+  }
+  close() {
+      this.subject.destroy();
+  }
+  save() {
+      this.subject.next();
+      this.subject.destroy();
+  }
+}
diff --git a/src/app/routes/map/coordinates-picker/coordinates-picker.service.ts b/src/app/routes/map/coordinates-picker/coordinates-picker.service.ts
new file mode 100644
index 0000000..e3ef2dd
--- /dev/null
+++ b/src/app/routes/map/coordinates-picker/coordinates-picker.service.ts
@@ -0,0 +1,15 @@
+import { CoorPicker } from '@business/entity/data';
+import { Injectable } from '@angular/core';
+
+@Injectable()
+export class CoorPickerService {
+  public data:CoorPicker = {
+    longitude:0,
+    latitude:0,
+    name:'',
+    describe:'',
+    address:''
+  };
+  constructor() { }
+
+}
diff --git a/src/app/routes/map/map.module.ts b/src/app/routes/map/map.module.ts
new file mode 100644
index 0000000..7c79fce
--- /dev/null
+++ b/src/app/routes/map/map.module.ts
@@ -0,0 +1,21 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { CoordinatesPickerComponent } from './coordinates-picker/coordinates-picker.component';
+import { Routes, RouterModule } from '@angular/router';
+import { BaiduMapModule  } from 'angular2-baidu-map';
+import { AqmModule } from 'angular-qq-maps';
+import { SharedModule } from '@shared/shared.module';
+
+
+@NgModule({
+    imports: [
+      CommonModule,
+      SharedModule,
+        BaiduMapModule.forRoot({
+          ak:'rER1sgBIcQxkfNSlm2wmBGZGgEERrooM'
+        })
+    ],
+  declarations: [CoordinatesPickerComponent],
+  exports:[CoordinatesPickerComponent]
+})
+export class MapModule { }
diff --git a/src/app/routes/sensors/basic-info/basic-info.component.ts b/src/app/routes/sensors/basic-info/basic-info.component.ts
index e53d4f6..18ffc48 100644
--- a/src/app/routes/sensors/basic-info/basic-info.component.ts
+++ b/src/app/routes/sensors/basic-info/basic-info.component.ts
@@ -27,7 +27,7 @@
         text: '������',
         width: '200px'  
       },
-      key: {
+      sensorKey: {
         text: '������',
         width: '60px'  
       },
diff --git a/src/app/routes/sensors/basic-info/sensor-edit/sensor-edit.component.html b/src/app/routes/sensors/basic-info/sensor-edit/sensor-edit.component.html
index 0147609..e401333 100644
--- a/src/app/routes/sensors/basic-info/sensor-edit/sensor-edit.component.html
+++ b/src/app/routes/sensors/basic-info/sensor-edit/sensor-edit.component.html
@@ -16,7 +16,7 @@
       <label nz-form-item-required>������</label>
     </div>
     <div nz-form-control nz-col [nzSpan]="5" nzHasFeedback>
-      <nz-input formControlName="key" maxlength="20" [nzPlaceHolder]="'������'">
+      <nz-input formControlName="sensorKey" maxlength="20" [nzPlaceHolder]="'������'">
       </nz-input>
     </div>
     <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
diff --git a/src/app/routes/sensors/basic-info/sensor-edit/sensor-edit.component.ts b/src/app/routes/sensors/basic-info/sensor-edit/sensor-edit.component.ts
index 4d06e27..1d644a1 100644
--- a/src/app/routes/sensors/basic-info/sensor-edit/sensor-edit.component.ts
+++ b/src/app/routes/sensors/basic-info/sensor-edit/sensor-edit.component.ts
@@ -23,7 +23,7 @@
      const data = this.data;
      const validates: Sensor  = {
           name: [data.name, [Validators.required] ],
-          key: [data.key, [Validators.required] ],
+          sensorKey: [data.sensorKey, [Validators.required] ],
           lower: [data.lower ],
           upper: [data.upper ],
           unit: [data.unit ],
diff --git a/src/app/routes/systems/account/account.component.ts b/src/app/routes/systems/account/account.component.ts
index 4524daa..209ad3a 100644
--- a/src/app/routes/systems/account/account.component.ts
+++ b/src/app/routes/systems/account/account.component.ts
@@ -141,5 +141,4 @@
       return this.dateSrv.date_format(date, 'YYYY-MM-DD');
     }
   }
-
 }
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 5d53391..20c2c97 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
@@ -31,7 +31,7 @@
                 </tr>
             </thead>
             <tbody formGroupName="alarmLevels" nz-tbody>
-                <tr nz-tbody-tr *ngFor="let row of nzTable.data" formGroupName="{{row.key}}">
+                <tr nz-tbody-tr *ngFor="let row of nzTable.data" formGroupName="{{row.sensorKey}}">
 
                     <td nz-td [nzCheckbox]="true">
                         <label nz-checkbox formControlName="enable"></label>
@@ -41,17 +41,17 @@
                             {{ row.name }}({{ row.unit }})
                         </span>
                     </td>
-                    <td formArrayName="increment" *ngFor="let in of validateForm.get('alarmLevels.'+row.key+'.increment').controls; index as i">
+                    <td formArrayName="increment" *ngFor="let in of validateForm.get('alarmLevels.'+row.sensorKey+'.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>
+                                    <nz-input [formControlName]="i" maxlength="20" nzDisabled="{{ !f.value['alarmLevels'][row.sensorKey]['enable'] }}"></nz-input>
                                 </div>
                             </div>
                     </td>
-                    <td formArrayName="degression" *ngFor="let in of validateForm.get('alarmLevels.'+row.key+'.degression').controls; index as i">
+                    <td formArrayName="degression" *ngFor="let in of validateForm.get('alarmLevels.'+row.sensorKey+'.degression').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>
+                                <nz-input [formControlName]="i" maxlength="20" nzDisabled="{{ !f.value['alarmLevels'][row.sensorKey]['enable'] }}"></nz-input>
                             </div>
                         </div>
                    </td>   
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 3d385de..a40ad12 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
@@ -140,7 +140,7 @@
   checkAll(param) {
     const keys = this.grid.data.map(
       item => {
-        return item['key'];
+        return item['sensorKey'];
       }
     );
     this._allCheckTriggers = 0;
@@ -156,16 +156,18 @@
   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:boolean = false;
   save($event, value, valid) {
     $event.preventDefault();
     if (valid) {
+       this.isSaving = true;
        const data:AlarmConfig = {
          id:value._id,
          organizationId:this.organization.id,
diff --git a/src/assets/img/map_coordinates.png b/src/assets/img/map_coordinates.png
new file mode 100644
index 0000000..1c6a7e4
--- /dev/null
+++ b/src/assets/img/map_coordinates.png
Binary files differ
diff --git a/yarn.lock b/yarn.lock
index 73e87a9..7132ee2 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -219,29 +219,29 @@
     lodash "^4.17.4"
     wolfy87-eventemitter "^5.1.0"
 
-"@delon/abc@^0.6.0-rc.2":
-  version "0.6.0-rc.2"
-  resolved "http://registry.npm.taobao.org/@delon/abc/download/@delon/abc-0.6.0-rc.2.tgz#29042b329147492d2900eff5266dce2f760118c9"
+"@delon/abc@0.6.1":
+  version "0.6.1"
+  resolved "http://registry.npm.taobao.org/@delon/abc/download/@delon/abc-0.6.1.tgz#161ab09848715700fd00d073c55ac0a51268195d"
 
-"@delon/acl@^0.6.0-rc.2":
-  version "0.6.0-rc.2"
-  resolved "http://registry.npm.taobao.org/@delon/acl/download/@delon/acl-0.6.0-rc.2.tgz#3e62d7ea2b7b5faa03644354e9bc9c0e496baa8e"
+"@delon/acl@0.6.1":
+  version "0.6.1"
+  resolved "http://registry.npm.taobao.org/@delon/acl/download/@delon/acl-0.6.1.tgz#2728f2c24684640caff36db98c0777589b59f747"
 
-"@delon/auth@^0.6.0-rc.2":
-  version "0.6.0-rc.2"
-  resolved "http://registry.npm.taobao.org/@delon/auth/download/@delon/auth-0.6.0-rc.2.tgz#2aab1245f114845b29f3d127846efa19d617ce5c"
+"@delon/auth@0.6.1":
+  version "0.6.1"
+  resolved "http://registry.npm.taobao.org/@delon/auth/download/@delon/auth-0.6.1.tgz#26b0945008663b7126ea30aca6372a6bc5d6a9cb"
 
-"@delon/cache@^0.6.0-rc.2":
-  version "0.6.0-rc.2"
-  resolved "http://registry.npm.taobao.org/@delon/cache/download/@delon/cache-0.6.0-rc.2.tgz#d65789d375c7939d398395e97adf66b9f87a2fa4"
+"@delon/cache@0.6.1":
+  version "0.6.1"
+  resolved "http://registry.npm.taobao.org/@delon/cache/download/@delon/cache-0.6.1.tgz#13b412897743dc2ad612c4c4fca280c3dc044825"
 
-"@delon/mock@^0.6.0-rc.2":
-  version "0.6.0-rc.2"
-  resolved "http://registry.npm.taobao.org/@delon/mock/download/@delon/mock-0.6.0-rc.2.tgz#9e7b677c692241845425e82116755f3c0dfed439"
+"@delon/mock@0.6.1":
+  version "0.6.1"
+  resolved "http://registry.npm.taobao.org/@delon/mock/download/@delon/mock-0.6.1.tgz#e52bbdd708ff83680c985d0aa4ace282168de873"
 
-"@delon/theme@^0.6.0-rc.2":
-  version "0.6.0-rc.2"
-  resolved "http://registry.npm.taobao.org/@delon/theme/download/@delon/theme-0.6.0-rc.2.tgz#906f81ba8fe292aa86dea2cb97f7dffff37ffef3"
+"@delon/theme@0.6.1":
+  version "0.6.1"
+  resolved "http://registry.npm.taobao.org/@delon/theme/download/@delon/theme-0.6.1.tgz#4e98b1dc565c2f0684717c44ed73509cd866f120"
 
 "@ngtools/json-schema@1.1.0", "@ngtools/json-schema@^1.1.0":
   version "1.1.0"
@@ -420,10 +420,6 @@
   version "1.0.1"
   resolved "http://registry.npm.taobao.org/amdefine/download/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
 
-angular-baidu-maps@^1.0.1:
-  version "1.0.1"
-  resolved "http://registry.npm.taobao.org/angular-baidu-maps/download/angular-baidu-maps-1.0.1.tgz#000f206b1992336baca42cc7a4ae8575726a96b9"
-
 angular-qq-maps@^1.0.1:
   version "1.0.1"
   resolved "http://registry.npm.taobao.org/angular-qq-maps/download/angular-qq-maps-1.0.1.tgz#ba4f312f501bb208837081ed9dd7e595ba53c810"
@@ -442,6 +438,10 @@
     mobx ">=3"
     mobx-angular ">=1"
 
+angular2-baidu-map@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/angular2-baidu-map/-/angular2-baidu-map-4.1.0.tgz#9992840349a78e3d3c3eaf3b3857fd85e59ccb32"
+
 ansi-escapes@^1.0.0:
   version "1.4.0"
   resolved "http://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"

--
Gitblit v1.8.0