From 3517e796f650b8aed52165c1a5905456f54033ef Mon Sep 17 00:00:00 2001
From: fengxiang <110431245@qq.com>
Date: Wed, 10 Jan 2018 14:31:40 +0800
Subject: [PATCH] 项目路径 配置,以适应可能的框架更新

---
 src/app/routes/systems/organization/organization.component.ts                              |  227 ------
 src/app/routes/users/installer/edit/edit.component.ts                                      |    4 
 src/app/business/services/http/organization.service.ts                                     |   17 
 src/app/routes/systems/account/account.component.ts                                        |    2 
 src/app/routes/devices/version/version-sensor-config/version-sensor-config.component.ts    |  105 +++
 src/app/business/pipe/tyep-handle.pipe.ts                                                  |    4 
 src/app/routes/devices/monitor-point/monitor-point.component.ts                            |   72 +-
 src/app/routes/systems/organization/organization-list/organization-list.component.ts       |  212 ++++++
 src/app/routes/routes.module.ts                                                            |   12 
 src/app/business/entity/grid.ts                                                            |    9 
 src/app/app.module.ts                                                                      |    3 
 src/app/routes/sensors/sensors.module.ts                                                   |   18 
 src/app/routes/sensors/basic-info/basic-info.component.ts                                  |  162 +++++
 src/app/routes/devices/version/version.component.ts                                        |   83 +
 src/app/business/entity/data.ts                                                            |   63 +
 src/app/routes/systems/organization/organization-edit/organization-edit.component.ts       |    4 
 tsconfig.json                                                                              |    4 
 src/app/business/services/http/version.service.ts                                          |   17 
 src/app/business/services/util/date.service.ts                                             |    0 
 src/app/routes/sensors/basic-info/sensor-edit/sensor-edit.component.ts                     |   64 ++
 src/app/routes/devices/devices.module.ts                                                   |   20 
 src/tsconfig.spec.json                                                                     |    4 
 src/app/routes/devices/monitor-point/monitor-point-edit/monitor-point-edit.component.html  |   80 ++
 src/app/business/services/http/sensors.service.ts                                          |   39 +
 src/app/routes/systems/organization/organization-edit/organization-edit.component.html     |    9 
 src/app/routes/devices/monitor-point/monitor-point-edit/monitor-point-edit.component.ts    |  118 +++
 src/app/routes/devices/version/version-edit/version-edit.component.ts                      |    5 
 src/app/routes/sensors/basic-info/sensor-edit/sensor-edit.component.html                   |   64 ++
 src/app/routes/devices/version/version-edit/version-edit.component.html                    |    7 
 src/app/routes/systems/organization/organization.component.html                            |   71 --
 src/app/routes/users/alarm-user/alarm-user.component.ts                                    |    2 
 src/app/routes/devices/monitor-point/monitor-point.component.html                          |    2 
 src/app/business/services/http/monitor-point.service.ts                                    |    6 
 src/app/business/services/util/example.service.ts                                          |   45 +
 src/tsconfig.app.json                                                                      |    4 
 src/app/routes/users/installer/installer.component.ts                                      |    2 
 src/app/routes/systems/organization/organization-config/organization-config.component.html |   67 ++
 src/app/shared/shared.module.ts                                                            |   13 
 src/app/routes/systems/organization/organization-list/organization-list.component.html     |   66 ++
 src/app/business/enum/types.enum.ts                                                        |    0 
 src/app/business/services/util/tools.service.ts                                            |    0 
 /dev/null                                                                                  |   45 -
 src/app/business/services/http/areacode.service.ts                                         |    2 
 src/app/routes/systems/systems.module.ts                                                   |   15 
 src/app/routes/systems/organization/organization-config/organization-config.component.ts   |   24 
 src/app/routes/devices/version/version.component.html                                      |    4 
 src/app/routes/devices/version/version-sensor-config/version-sensor-config.component.html  |   39 +
 src/app/routes/sensors/basic-info/basic-info.component.html                                |   69 ++
 src/app/business/pipe/pipe.module.ts                                                       |    2 
 49 files changed, 1,433 insertions(+), 473 deletions(-)

diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index 5aeeadf..a5e4a7d 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -1,3 +1,4 @@
+import { DateService } from '@business/services/util/date.service';
 import { BrowserModule } from '@angular/platform-browser';
 import { NgModule, LOCALE_ID, APP_INITIALIZER, Injector } from '@angular/core';
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
@@ -9,7 +10,6 @@
 import { AppComponent } from './app.component';
 import { RoutesModule } from './routes/routes.module';
 import { LayoutModule } from './layout/layout.module';
-import { DateService } from './core/services/date.service';
 import { StartupService } from './core/services/startup.service';
 import { DefaultInterceptor } from '@core/net/default.interceptor';
 import { AlainAuthModule, SimpleInterceptor } from '@delon/auth';
@@ -20,6 +20,7 @@
 
 import { registerLocaleData } from '@angular/common';
 import localeZhHans from '@angular/common/locales/zh-Hans';
+
 registerLocaleData(localeZhHans);
 
 // AoT requires an exported function for factories
diff --git a/src/app/business/entity/data.ts b/src/app/business/entity/data.ts
new file mode 100644
index 0000000..2ea1eba
--- /dev/null
+++ b/src/app/business/entity/data.ts
@@ -0,0 +1,63 @@
+import { Column } from '@business/entity/grid';
+
+
+export interface AreaNames {
+    provinceName?: string;
+    cityName?: string;
+    areaName?: string;
+}
+// ���������
+export interface Sensor {
+    description?: any|Column;
+    id?: any|Column;
+    key?: any|Column;
+    lower?: any|Column;
+    name?: any|Column;
+    unit?: any|Column;
+    upper?: any|Column;
+  }
+
+// ������ 
+export interface Organization {
+    address?: Column|any;
+    areaCode?: Column|any;
+    cityCode?: Column|any;
+    createTime?: Column|any;
+    description?: Column|any;
+    email?: Column|any;
+    expireTime?: Column|any;
+    id?: Column|any;
+    isDelete?: Column|any;
+    name?: Column|any;
+    provinceCode?: Column|any;
+    rank?: Column|any;
+    telephone?: Column|any;
+    areaNames?: AreaNames|any ;
+  }
+
+  // ������������
+
+  export interface DeviceVersion {
+    createTime?: Column|any;
+    description?: Column|any;
+    id?: Column|any;
+    name?: Column|any;
+    version?: Column|any;
+  }
+
+  // ���������
+  export interface MonitorPoint {
+    address?: any|Column;
+    areaCode?: any|Column;
+    cityCode?: any|Column;
+    description?: any|Column;
+    id?: any|Column;
+    isDelete?: any|Column;
+    latitude?: any|Column;
+    longitude?: any|Column;
+    name?: any|Column;
+    organizationId?: any|Column;
+    provinceCode?: any|Column;
+    areaNames?: AreaNames|any ;
+    organization?: Organization;
+  }
diff --git a/src/app/core/entity/grid.ts b/src/app/business/entity/grid.ts
similarity index 94%
rename from src/app/core/entity/grid.ts
rename to src/app/business/entity/grid.ts
index 3a1ac82..628fea5 100644
--- a/src/app/core/entity/grid.ts
+++ b/src/app/business/entity/grid.ts
@@ -1,11 +1,6 @@
-import { Column } from '@core/entity/grid';
-import { Types } from '@core/enum/types.enum';
+import { Types } from '@business/enum/types.enum';
 
-export interface AreaNames {
-    provinceName?: string;
-    cityName?: string;
-    areaName?: string;
-}
+
 export interface Column {
    text?: string;
    name?: string;
diff --git a/src/app/core/enum/types.enum.ts b/src/app/business/enum/types.enum.ts
similarity index 100%
rename from src/app/core/enum/types.enum.ts
rename to src/app/business/enum/types.enum.ts
diff --git a/src/app/core/pipe/pipe.module.ts b/src/app/business/pipe/pipe.module.ts
similarity index 82%
rename from src/app/core/pipe/pipe.module.ts
rename to src/app/business/pipe/pipe.module.ts
index 069d891..c845221 100644
--- a/src/app/core/pipe/pipe.module.ts
+++ b/src/app/business/pipe/pipe.module.ts
@@ -1,7 +1,7 @@
 import { NgModule } from '@angular/core';
 import { CommonModule } from '@angular/common';
 import { TyepHandlePipe } from './tyep-handle.pipe';
-import { DateService } from '@core/services/date.service';
+import { DateService } from '@business/services/util/date.service';
 
 @NgModule({
   imports: [
diff --git a/src/app/core/pipe/tyep-handle.pipe.ts b/src/app/business/pipe/tyep-handle.pipe.ts
similarity index 89%
rename from src/app/core/pipe/tyep-handle.pipe.ts
rename to src/app/business/pipe/tyep-handle.pipe.ts
index 47acc5f..6005cfc 100644
--- a/src/app/core/pipe/tyep-handle.pipe.ts
+++ b/src/app/business/pipe/tyep-handle.pipe.ts
@@ -4,8 +4,8 @@
 import { Pipe, PipeTransform } from '@angular/core';
 import { TranslateService } from '@ngx-translate/core';
 import { NzDatePipe } from 'ng-zorro-antd/src/util/nz-date.pipe';
-import { DateService } from '@core/services/date.service';
-import { Column } from '@core/entity/grid';
+import { DateService } from '@business/services/util/date.service';
+import { Column } from '@business/entity/grid';
 
 
 
diff --git a/src/app/core/services/areacode.service.ts b/src/app/business/services/http/areacode.service.ts
similarity index 95%
rename from src/app/core/services/areacode.service.ts
rename to src/app/business/services/http/areacode.service.ts
index cb0670e..51254b2 100644
--- a/src/app/core/services/areacode.service.ts
+++ b/src/app/business/services/http/areacode.service.ts
@@ -1,4 +1,3 @@
-import { environment } from './../../../environments/environment.prod';
 import { Injectable } from '@angular/core';
 import { _HttpClient } from '@delon/theme/services/http/http.client';
 // Statics
@@ -7,6 +6,7 @@
 import 'rxjs/add/operator/catch';
 import 'rxjs/add/operator/map';
 import { Observable } from 'rxjs/Observable';
+import { environment } from 'environments/environment';
 
 @Injectable()
 export class AreacodeService {
diff --git a/src/app/routes/devices/monitor-point/monitor-point.service.ts b/src/app/business/services/http/monitor-point.service.ts
similarity index 85%
rename from src/app/routes/devices/monitor-point/monitor-point.service.ts
rename to src/app/business/services/http/monitor-point.service.ts
index 89045e4..2dc0c02 100644
--- a/src/app/routes/devices/monitor-point/monitor-point.service.ts
+++ b/src/app/business/services/http/monitor-point.service.ts
@@ -1,11 +1,11 @@
-import { ExampleService } from './../../../core/services/example.service';
+import { PageBean } from '@business/entity/grid';
+import { ExampleService } from '@business/services/util/example.service';
 import { _HttpClient } from '@delon/theme';
-import { environment } from './../../../../environments/environment.prod';
+import { environment } from 'environments/environment';
 import { RouteConfigLoadStart } from '@angular/router';
 import { Injectable } from '@angular/core';
 import { equal } from 'assert';
 import { Observable } from 'rxjs/Observable';
-import {  PageBean } from '@core/entity/grid';
 
 @Injectable()
 export class MonitorPointService {
diff --git a/src/app/routes/systems/organization/organization.service.ts b/src/app/business/services/http/organization.service.ts
similarity index 66%
rename from src/app/routes/systems/organization/organization.service.ts
rename to src/app/business/services/http/organization.service.ts
index 85b97ba..da161a8 100644
--- a/src/app/routes/systems/organization/organization.service.ts
+++ b/src/app/business/services/http/organization.service.ts
@@ -1,15 +1,20 @@
-import { ExampleService } from './../../../core/services/example.service';
+import { Organization } from '@business/entity/data';
+import { ExampleService } from '@business/services/util/example.service';
 import { _HttpClient } from '@delon/theme';
-import { environment } from './../../../../environments/environment';
+import { environment } from 'environments/environment';
 import { RouteConfigLoadStart } from '@angular/router';
 import { Injectable } from '@angular/core';
 import { equal } from 'assert';
 import { Observable } from 'rxjs/Observable';
-import {  PageBean } from '@core/entity/grid';
+import {  PageBean } from '@business/entity/grid';
 
 
 @Injectable()
 export class OrganizationService {
+  handle: 'list'|'config' = 'list';
+  
+  data: Organization;
+  title: '������������'|'������������' = '������������';
   private urls = {
       edit: environment.SERVER_BASH_URL + '/organization/page-list',
       save: environment.SERVER_BASH_URL + '/organization/add-or-modify',
@@ -21,8 +26,12 @@
     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()};
+        queryParams: example.getSqlParam(), orderByClause: orderByClause};
         return this.http.get(this.urls.edit, param);
   }
   public save(data: any): Observable<any> {
diff --git a/src/app/business/services/http/sensors.service.ts b/src/app/business/services/http/sensors.service.ts
new file mode 100644
index 0000000..af04f91
--- /dev/null
+++ b/src/app/business/services/http/sensors.service.ts
@@ -0,0 +1,39 @@
+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';
+import {  PageBean } from '@business/entity/grid';
+
+@Injectable()
+export class SensorsService {
+  private urls = {
+    edit: 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'
+};
+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().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: orderByClause};
+      return this.http.get(this.urls.edit, param);
+}
+public save(data: any): Observable<any> {
+      return this.http.post(this.urls.save, data);
+}
+public delete(...ids: number[]): Observable<any> {             
+      return this.http.post(this.urls.delete, ids);
+}
+
+}
diff --git a/src/app/routes/devices/version/version.service.ts b/src/app/business/services/http/version.service.ts
similarity index 63%
rename from src/app/routes/devices/version/version.service.ts
rename to src/app/business/services/http/version.service.ts
index b94059e..8bc27ae 100644
--- a/src/app/routes/devices/version/version.service.ts
+++ b/src/app/business/services/http/version.service.ts
@@ -1,11 +1,11 @@
-import { ExampleService } from './../../../core/services/example.service';
+import { ExampleService } from '@business/services/util/example.service';
+import { PageBean } from '@business/entity/grid';
 import { _HttpClient } from '@delon/theme';
-import { environment } from './../../../../environments/environment';
+import { environment } from 'environments/environment';
 import { RouteConfigLoadStart } from '@angular/router';
 import { Injectable } from '@angular/core';
 import { equal } from 'assert';
 import { Observable } from 'rxjs/Observable';
-import {  PageBean } from '@core/entity/grid';
 
 
 @Injectable()
@@ -13,7 +13,9 @@
   private urls = {
       edit: 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'
+      delete: environment.SERVER_BASH_URL + '/device-version/delete-by-ids',
+      getSensorIds: environment.SERVER_BASH_URL + '/device-version/get-sensor-ids',
+      versionSensorConfig: environment.SERVER_BASH_URL + '/device-version/version-sensor-config'
   };
   constructor(private http: _HttpClient) { }
    public getPagingList(page: PageBean, queryText: string): Observable<PageBean> {
@@ -32,4 +34,11 @@
   public delete(...ids: number[]): Observable<any> {             
         return this.http.post(this.urls.delete, ids);
   }
+  public getSensorIds(deviceVersionId: number): Observable< number []> {
+      return this.http.get(this.urls.getSensorIds, {deviceVersionId: deviceVersionId});
+  }
+  public versionSensorConfig(deviceVersionId: number, sensorIds: number[]): Observable<any> {
+    const url = this.urls.versionSensorConfig + '/' + deviceVersionId;
+    return this.http.post(url, sensorIds);
+  }
 }
diff --git a/src/app/core/services/date.service.ts b/src/app/business/services/util/date.service.ts
similarity index 100%
rename from src/app/core/services/date.service.ts
rename to src/app/business/services/util/date.service.ts
diff --git a/src/app/business/services/util/example.service.ts b/src/app/business/services/util/example.service.ts
new file mode 100644
index 0000000..e1427dd
--- /dev/null
+++ b/src/app/business/services/util/example.service.ts
@@ -0,0 +1,45 @@
+
+import { Injectable } from '@angular/core';
+
+export class  Criteria {
+    private static CONDITION_SPLIT = '||';
+     private conditions: string[] = [];
+     public getConditions(): string[] {
+       return this.conditions;
+     }
+
+     public addCondition(condition: string, colName:string, ...values: any[]){
+        const split = Criteria.CONDITION_SPLIT; // '||'
+        this.conditions.push(condition+split + colName + split + values.join(split));
+     }
+     public andLike(col: { name: string, value: any}): Criteria{
+         this.addCondition('andLike', col.name, col.value);
+         return this;
+     }
+     public andEqualTo(col: { name: string, value: any}): Criteria{
+        this.addCondition('andEqualTo', col.name, col.value);
+        return this;
+     }
+}
+
+@Injectable()
+export class ExampleService {
+  private static OR_SPLIT = 'or|';
+  private static  CRITERIA_SPLIT = '|||';
+  private criterion: Criteria[] = [];
+  
+  public getSqlParam(): string {
+      let whereSql = '';
+     for (const cri of this.criterion){
+            const conditions = cri.getConditions();
+            whereSql += ExampleService.OR_SPLIT + conditions.join(ExampleService.CRITERIA_SPLIT);
+     }
+     return encodeURI(whereSql);
+  }
+  constructor() { }
+    public or() {
+        const cri = new Criteria();
+        this.criterion.push(cri);
+        return cri;
+    }
+}
diff --git a/src/app/core/services/tools.service.ts b/src/app/business/services/util/tools.service.ts
similarity index 100%
rename from src/app/core/services/tools.service.ts
rename to src/app/business/services/util/tools.service.ts
diff --git a/src/app/core/services/example.service.ts b/src/app/core/services/example.service.ts
deleted file mode 100644
index 9d32660..0000000
--- a/src/app/core/services/example.service.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-
-import { Injectable } from '@angular/core';
-
-export class  Criteria{
-    private static CONDITION_SPLIT = '||';
-     private conditions: string[] = [];
-     public getConditions(): string[]{
-       return this.conditions;
-     }
-
-     public addCondition(condition: string,colName:string,...values: any[]){
-        const split = Criteria.CONDITION_SPLIT; // '||'
-        this.conditions.push(condition+split+colName+split+ values.join(split));
-     }
-     public andLike(col: { name: string, value: any}): Criteria{
-         this.addCondition('andLike',col.name,col.value);
-         return this;
-     }
-     public andEqualTo(col: { name: string, value: any}): Criteria{
-        this.addCondition('andEqualTo',col.name,col.value);
-        return this;
-     }
-}
-
-@Injectable()
-export class ExampleService {
-  private static OR_SPLIT = "or|";
-  private static  CRITERIA_SPLIT = "|||";
-  private criterion: Criteria[]=[];
-  
-  public getSqlParam():string{
-      let whereSql = '';
-     for(let cri of this.criterion){
-            const conditions = cri.getConditions();
-            whereSql += ExampleService.OR_SPLIT+conditions.join(ExampleService.CRITERIA_SPLIT);
-     }
-     return encodeURI(whereSql);
-  }
-  constructor() { }
-    public or(){
-        const cri = new Criteria();
-        this.criterion.push(cri);
-        return cri;
-    }
-}
diff --git a/src/app/routes/devices/devices.module.ts b/src/app/routes/devices/devices.module.ts
index e65f3b7..9ad3e5b 100644
--- a/src/app/routes/devices/devices.module.ts
+++ b/src/app/routes/devices/devices.module.ts
@@ -1,6 +1,8 @@
-import { MonitorPointService } from 'app/routes/devices/monitor-point/monitor-point.service';
-
-import { ToolsService } from './../../core/services/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';
+import { VersionService } from '@business/services/http/version.service';
+import { AreacodeService } from '@business/services/http/areacode.service';
 import { NgModule } from '@angular/core';
 import { CommonModule } from '@angular/common';
 import { BasicInfoComponent } from './basic-info/basic-info.component';
@@ -8,15 +10,15 @@
 import { MonitorPointComponent } from './monitor-point/monitor-point.component';
 import {RouterModule, Routes} from '@angular/router';
 import { SharedModule } from '@shared/shared.module';
-import { VersionService } from 'app/routes/devices/version/version.service';
 import { Version } from '@angular/compiler/src/util';
 import { _HttpClient } from '@delon/theme/services/http/http.client';
-import { PipeModule } from '@core/pipe/pipe.module';
+import { PipeModule } from '@business/pipe/pipe.module';
 import { FormBuilder } from '@angular/forms';
 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  ];
+const COMPONENTS_NOROUNT = [  VersionEditComponent, MonitorPointEditComponent, VersionSensorConfigComponent  ];
 
 const routes: Routes = [
   {
@@ -41,9 +43,11 @@
     BasicInfoComponent,
     VersionComponent,
     MonitorPointComponent,
-       ...COMPONENTS_NOROUNT     
+    ...COMPONENTS_NOROUNT     
   ],
-  providers: [ToolsService, VersionService, MonitorPointService, _HttpClient, FormBuilder],
+  providers: [OrganizationService, VersionService, 
+    SensorsService, AreacodeService, MonitorPointService,
+    _HttpClient, FormBuilder],
   entryComponents: 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 ad9f119..e01c902 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
@@ -1,3 +1,77 @@
-<p>
-  monitor-point-edit works!
-</p>
+<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 nz-form-item-required>������</label>
+    </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]="'������������'" >
+        <nz-option *ngFor="let option of orgOptions" [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 nz-form-item-required>���/���/���</label>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
+      <nz-cascader [class.class123]="true" (nzChange)="setAreaCodes($event)" formControlName="_areas" (nzLoad)="areaLazyLoad($event)"
+      [nzPlaceHolder]="'������ ���/���/���'" >
+      </nz-cascader>
+    </div>
+    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+      <label>������������</label>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="9" nzHasFeedback>
+      <nz-input formControlName="address" maxlength="20" 
+      [nzPlaceHolder]="'������������(���)������������120���'">
+      </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]="5" nzHasFeedback>
+        <nz-input-number [ngStyle]="{'width': '100%' }" formControlName="longitude"  [nzMin]="-180" [nzMax]="180" [nzStep]="0.000001">
+          </nz-input-number>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="2" nzHasFeedback></div>
+    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+      <label>������</label>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="5" nzHasFeedback>
+          <nz-input-number [ngStyle]="{'width': '100%' }" formControlName="latitude" [nzMin]="-90" [nzMax]="90" [nzStep]="0.000001">
+          </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]="16" nzHasFeedback>
+      <nz-input formControlName="description" maxlength="100"></nz-input>
+    </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>
diff --git a/src/app/routes/devices/monitor-point/monitor-point-edit/monitor-point-edit.component.ts b/src/app/routes/devices/monitor-point/monitor-point-edit/monitor-point-edit.component.ts
index a99f4d1..9ca1b95 100644
--- a/src/app/routes/devices/monitor-point/monitor-point-edit/monitor-point-edit.component.ts
+++ b/src/app/routes/devices/monitor-point/monitor-point-edit/monitor-point-edit.component.ts
@@ -1,4 +1,11 @@
+import { MonitorPoint } from '@business/entity/data';
+import { PageBean } from '@business/entity/grid';
+import { OrganizationService } from '@business/services/http//organization.service';
+import { AreacodeService } from '@business/services/http/areacode.service';
 import { Component, OnInit } from '@angular/core';
+import { NzMessageService, NzModalSubject } from 'ng-zorro-antd';
+import { FormGroup, FormBuilder, FormControl, Validators } from '@angular/forms';
+import { CascaderOption } from 'ng-zorro-antd/src/cascader/nz-cascader.component';
 
 @Component({
   selector: 'app-monitor-point-edit',
@@ -7,9 +14,116 @@
 })
 export class MonitorPointEditComponent implements OnInit {
 
-  constructor() { }
+   orgOptions = [];
+
+  data: MonitorPoint;
+  isSaving = false;
+  validateForm: FormGroup;
+  constructor(    
+    private subject: NzModalSubject,
+    private formBuilder: FormBuilder,
+    private areacodeService: AreacodeService,
+    private organizationService: OrganizationService
+    ) { }
 
   ngOnInit() {
+    const data = this.data;
+    const areaNames = data.areaNames;   
+    let _areas = null;
+    if (areaNames != null) {
+      _areas = {
+       label: Object.values(areaNames).join('/'),
+       value: data.areaCode
+      };
+    }
+     this.OrgSelectChange(null);
+     const validates: MonitorPoint|object  = {
+          name: [data.name, [Validators.required] ],
+          organizationId: [data.organizationId, [Validators.required]],
+          longitude: [data.longitude],
+          latitude: [data.latitude],
+          address: [data.address ],
+          _areas: [_areas,  [Validators.required]],
+          description: [data.description ]
+     };
+     this.validateForm = this.formBuilder.group(
+         validates
+     );
   }
-
+  close() {
+       this.subject.destroy();
+  }
+  save($event, value, valid) {
+      $event.preventDefault();
+      if (valid) {
+        for (const i in this.validateForm.controls) {
+          this.validateForm.controls[ i ].disable();
+        } 
+        this.isSaving = true;
+        Object.keys(value).forEach( (key: string) => {
+              // '_'������������������������������
+              if (!key.startsWith('_') && value[key] != null) {
+                   this.data[key] = value[key];
+              }
+        } );
+        this.subject.next( this );
+      }else {
+        this.validate(); 
+      }
+  }
+  validate() {
+     for (const i in this.validateForm.controls) {
+       this.validateForm.controls[ i ].markAsDirty();
+     }
+  }
+  areaLazyLoad(event: { option: CascaderOption, index: number, resolve: (children: CascaderOption[]) => void, reject: () => void }) {
+    const index = event['index'];
+    const option = event.option;  
+    switch (index) {
+       case -1:
+       this.areacodeService.getProvinces().subscribe(
+         (res: {label: string, value: string}[]) => {
+             event.resolve( res );
+         }
+       ); break;
+       case 0:
+       this.areacodeService.getCities(option.value).subscribe(
+         (res: {label: string, value: string}[]) => {
+             event.resolve( res );
+         }
+       ); break;
+       case 1:
+       this.areacodeService.getAreas(option.value).subscribe(
+         (res: {label: string, value: string}[]) => {
+             event.resolve( res );
+         }
+       ); break;
+    }
+  }
+  setAreaCodes(codes: string[]) {
+      this.data.provinceCode = codes[0];
+      this.data.cityCode = codes[1];
+      this.data.areaCode = codes[2];
+  }
+  OrgSelectChange(text) {
+      const pageBean: PageBean = {pageIndex: 0, pageSize: 20};
+      this.organizationService.getPagingList(pageBean, text).subscribe(
+        (res: PageBean) => {
+             if (res != null && res.data != null) {               
+                 this.orgOptions = res.data;
+             }
+             const organization = this.data.organization;
+             if (organization != null && text == null) {
+                 const num: number = this.orgOptions.filter(
+                     (item: any) => {
+                        return item.id === organization.id;
+                     }
+                 ).length;
+                 if ( num === 0 ) {
+                    this.orgOptions.push(organization);
+                 }                     
+             }
+        }
+     );
+  }
 }
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 b580411..fd431c6 100644
--- a/src/app/routes/devices/monitor-point/monitor-point.component.html
+++ b/src/app/routes/devices/monitor-point/monitor-point.component.html
@@ -54,7 +54,7 @@
                     <td nz-td>
                             <a (click)="addOrModify(row)">������</a>
                             <span nz-table-divider></span>
-                              <nz-popconfirm [nzTitle]="'���������������������������?'" [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>
                      </td>
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 e1a6b84..db33f86 100644
--- a/src/app/routes/devices/monitor-point/monitor-point.component.ts
+++ b/src/app/routes/devices/monitor-point/monitor-point.component.ts
@@ -1,33 +1,19 @@
-import { DataType, AreaNames } from './../../../core/entity/grid';
+import {  AreaNames, MonitorPoint } from '@business/entity/data';
 import { Version, ValueTransformer } from '@angular/compiler/src/util';
 import { Subject } from 'rxjs/Subject';
-import { ToolsService } from '@core/services/tools.service';
 import { Component, OnInit } from '@angular/core';
 import { NzMessageService, NzModalService } from 'ng-zorro-antd';
 import { ModalHelper } from '@delon/theme';
 import { HttpClient } from '@angular/common/http';
-import { environment } from '../../../../environments/environment';
-import { DateService } from '@core/services/date.service';
-import { VersionService } from 'app/routes/devices/version/version.service';
-import { Types } from '@core/enum/types.enum';
-import { Column, Grid, PageBean } from '@core/entity/grid';
+import { environment } from 'environments/environment';
+import { VersionService } from '@business/services/http/version.service';
+import { Types } from '@business/enum/types.enum';
+import { Column, Grid, PageBean, DataType } from '@business/entity/grid';
 import { filter } from 'rxjs/operators/filter';
 import { MonitorPointEditComponent } from 'app/routes/devices/monitor-point/monitor-point-edit/monitor-point-edit.component';
-import { MonitorPointService } from 'app/routes/devices/monitor-point/monitor-point.service';
+import { MonitorPointService } from '@business/services/http/monitor-point.service';
 
-interface MonitorPoint {
-  address?: any|Column;
-  areaCode?: any|Column;
-  cityCode?: any|Column;
-  description?: any|Column;
-  id?: any|Column;
-  isDelete?: any|Column;
-  latitude?: any|Column;
-  longitude?: any|Column;
-  name?: any|Column;
-  organizationId?: any|Column;
-  provinceCode?: any|Column;
-}
+
 @Component({
   selector: 'app-monitor-point',
   templateUrl: './monitor-point.component.html',
@@ -36,19 +22,36 @@
 export class MonitorPointComponent implements OnInit {
 
 
-  private organization: MonitorPoint;
+  private monitorPoint: MonitorPoint;
   grid: Grid<MonitorPoint> = new Grid(null);
   queryMap = { text: '���������������', value: ''};
   queryTextStream: Subject<string> = new Subject<string>();
     private initPage() {
-    this.organization =  {
+    this.monitorPoint =  {
       name: {
         text: '������',
-        width: '120px'  
+        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;
+              }
+              
+        }
+      },
+      description: {
+        text: '������',
+        width: '300px'
       }
     };
-    this.grid.title = '������������';
-    this.grid.setColumns(this.organization);
+    this.grid.title = '���������';
+    this.grid.setColumns(this.monitorPoint);
     this.grid.pageSize = 10;
   }
   constructor(
@@ -99,13 +102,12 @@
     if ( d != null) {
       Object.assign(data, d);
     }
-    const cols = this.organization;
-    this.modalHelper.static(MonitorPointEditComponent, { cols , data }).subscribe( 
+    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.getData()[index];
+          const origData = this.grid.data[index];
           const isModified =  Object.keys(origData).some(
             (key: string) => {
                 return ret.data[key] !== origData[key];    
@@ -114,7 +116,7 @@
           // ������������
           if (!isModified) { 
             ret.close();
-            this.msgSrv.success('���������������������������');
+            this.msgSrv.success(this.grid.title + '���������������������');
             return;
           }
       }
@@ -123,7 +125,7 @@
             if (res.code === 1) {
               this.load();
               ret.close();
-              this.msgSrv.success('���������������������');
+              this.msgSrv.success(this.grid.title + '���������������');
             }
          }
       );
@@ -135,7 +137,7 @@
       ( res: any) => {
          if (res.code === 1) {
            this.load();
-           this.msgSrv.success('���������������������������');
+           this.msgSrv.success(this.grid.title + '���������������');
          }
       }
    );
@@ -172,10 +174,4 @@
      }
      this.load();
   }
-
-  reset(ls: any[]) {
-    for (const item of ls) item.value = false;
-    this.load(true);
-  }
-
 }
diff --git a/src/app/routes/devices/version/version-edit/version-edit.component.html b/src/app/routes/devices/version/version-edit/version-edit.component.html
index 7f8f399..950ab4c 100644
--- a/src/app/routes/devices/version/version-edit/version-edit.component.html
+++ b/src/app/routes/devices/version/version-edit/version-edit.component.html
@@ -15,7 +15,7 @@
       </label>
     </div>
      <div nz-form-control nz-col [nzSpan]="3" nzHasFeedback>
-         <nz-input-number formControlName="{{ cols.version.name }}" [nzMin]="1" [nzMax]="100" [nzStep]="1">
+         <nz-input-number style="width: 100%;" formControlName="{{ cols.version.name }}" [nzMin]="1" [nzMax]="100" [nzStep]="1">
          </nz-input-number>
     </div>
   </div> 
@@ -23,10 +23,11 @@
       <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
             <label nz-form-item-required>{{ cols.createTime.text }}</label>
       </div>
-      <div nz-form-control nz-col [nzSpan]="7" nzHasFeedback>
-        <nz-datepicker nzSize="large"  style="width: 90%;" formControlName="{{ cols.createTime.name }}" nzShowTime  [nzPlaceHolder]="'������������'"
+      <div nz-form-control nz-col [nzSpan]="6" nzHasFeedback>
+        <nz-datepicker nzSize="large"  style="width: 100%;" formControlName="{{ cols.createTime.name }}" nzShowTime  [nzPlaceHolder]="'������������'"
         [nzFormat]="'YYYY-MM-DD HH:mm:ss'" ></nz-datepicker>
       </div>
+      <div nz-form-control nz-col [nzSpan]="1" nzHasFeedback></div>
       <div nz-form-label nz-col [nzSpan]="4">
         <label>{{ cols.description.text }}</label>
       </div>
diff --git a/src/app/routes/devices/version/version-edit/version-edit.component.ts b/src/app/routes/devices/version/version-edit/version-edit.component.ts
index 2137673..9624084 100644
--- a/src/app/routes/devices/version/version-edit/version-edit.component.ts
+++ b/src/app/routes/devices/version/version-edit/version-edit.component.ts
@@ -1,7 +1,7 @@
+import { DeviceVersion } from '@business/entity/data';
 import { Component, OnInit } from '@angular/core';
 import { NzMessageService, NzModalSubject } from 'ng-zorro-antd';
 import { FormGroup, FormBuilder, Validators } from '@angular/forms';
-import { DeviceVersion } from 'app/routes/devices/version/version.component';
 
 @Component({
   selector: 'app-version-edit',
@@ -21,6 +21,9 @@
     ) { }
 
   ngOnInit() {
+     if (this.data.createTime == null) {
+      this.data.createTime = new Date().getTime();
+     }
      const validates: DeviceVersion = {
           name: [this.data.name, [Validators.required] ],
           version: [this.data.version == null ? 1 : this.data.version, [Validators.required] ],
diff --git a/src/app/routes/devices/version/version-sensor-config/version-sensor-config.component.html b/src/app/routes/devices/version/version-sensor-config/version-sensor-config.component.html
new file mode 100644
index 0000000..8ad08af
--- /dev/null
+++ b/src/app/routes/devices/version/version-sensor-config/version-sensor-config.component.html
@@ -0,0 +1,39 @@
+<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 [nzCheckbox]="true">
+        <label nz-checkbox [(ngModel)]="grid.allChecked" [nzIndeterminate]="grid.indeterminate" (ngModelChange)="grid.checkAll($event)"></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>
+    </tr>
+  </thead>
+  <tbody nz-tbody>
+    <tr nz-tbody-tr *ngFor="let row of nzTable.data">
+      <td nz-td [nzCheckbox]="true">
+        <label nz-checkbox [(ngModel)]="row.checked" (ngModelChange)="grid.refreshStatus($event)"></label>
+      </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>
+    </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>
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
new file mode 100644
index 0000000..db44f3c
--- /dev/null
+++ b/src/app/routes/devices/version/version-sensor-config/version-sensor-config.component.ts
@@ -0,0 +1,105 @@
+import { NzModalSubject } from 'ng-zorro-antd';
+import { Component, OnInit } from '@angular/core';
+import { SensorsService } from '@business/services/http/sensors.service';
+import { PageBean,  Grid } from '@business/entity/grid';
+import { Sensor } from '@business/entity/data';
+import { Subject } from 'rxjs/Subject';
+
+@Component({
+  selector: 'app-version-sensor-config',
+  templateUrl: './version-sensor-config.component.html',
+  styles: []
+})
+export class VersionSensorConfigComponent implements OnInit {
+  deviceVersionId: number;
+  selectedSensorIds: number[];
+  isSaving = false;
+  grid: Grid<Sensor> = new Grid(null);
+  private initPage() {
+    const sensor: Sensor = {
+      name: {
+        text: '������',
+        width: '200px'
+      },
+      key: {
+        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,
+  ) { }
+
+  ngOnInit() {
+    this.initPage();
+    this.load();
+  }
+  load() {
+    // ������������������ExpressionChangedAfterItHasBeenCheckedError
+    setTimeout(() => {
+      this.grid.loading = true;
+    }, 1);
+    this.sensorsService.getPagingList(this.grid, null).subscribe(
+      (res: PageBean) => {
+        this.grid.loading = true;
+        if (res != null && res.data != null) {
+          this.grid.initData(res);
+          this.grid.data.map(
+            (row: any) => {
+               row['checked'] = this.selectedSensorIds.filter(
+                (id: number) => {
+                  return row.id === id;
+                }
+              ).length > 0;
+            }
+          );
+          this.grid.refreshStatus();
+          setTimeout(() => {
+            this.grid.loading = false;
+          }, 1);
+        }
+      }
+    );
+  }
+  close() {
+    this.subject.destroy();
+  }
+  save($event, value, valid) {
+    $event.preventDefault();
+    this.subject.next( this );
+  }
+
+  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();
+  }
+}
diff --git a/src/app/routes/devices/version/version.component.html b/src/app/routes/devices/version/version.component.html
index 9832a1e..31d2d18 100644
--- a/src/app/routes/devices/version/version.component.html
+++ b/src/app/routes/devices/version/version.component.html
@@ -54,9 +54,11 @@
                     <td nz-td>
                             <a (click)="addOrModify(row)">������</a>
                             <span nz-table-divider></span>
-                              <nz-popconfirm [nzTitle]="'���������������������������?'" [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>
+                              <span nz-table-divider></span>
+                              <a (click)="configSensor(row)">���������������</a>
                      </td>
                 </tr>
               </tbody>
diff --git a/src/app/routes/devices/version/version.component.ts b/src/app/routes/devices/version/version.component.ts
index 304d9e7..6e970b7 100644
--- a/src/app/routes/devices/version/version.component.ts
+++ b/src/app/routes/devices/version/version.component.ts
@@ -1,26 +1,20 @@
-import { DataType } from './../../../core/entity/grid';
+import { VersionSensorConfigComponent } from './version-sensor-config/version-sensor-config.component';
+import { DataType } from '@business/entity/grid';
+import { DeviceVersion, Sensor } from '@business/entity/data';
 import { Version } from '@angular/compiler/src/util';
 import { Subject } from 'rxjs/Subject';
-import { ToolsService } from '@core/services/tools.service';
+import { ToolsService } from '@business/services/util/tools.service';
 import { Component, OnInit } from '@angular/core';
 import { NzMessageService, NzModalService } from 'ng-zorro-antd';
 import { ModalHelper } from '@delon/theme';
 import { HttpClient } from '@angular/common/http';
-import { environment } from '../../../../environments/environment';
-import { DateService } from '@core/services/date.service';
-import { VersionService } from 'app/routes/devices/version/version.service';
-import { Types } from '@core/enum/types.enum';
-import { Column, Grid, PageBean } from '@core/entity/grid';
-import { filter } from 'rxjs/operators/filter';
+import { DateService } from '@business/services/util/date.service';
+import { VersionService } from '@business/services/http/version.service';
+import { Types } from '@business/enum/types.enum';
+import { Column, Grid, PageBean } from '@business/entity/grid';
 import { VersionEditComponent } from 'app/routes/devices/version/version-edit/version-edit.component';
 
-export interface DeviceVersion {
-  createTime?: Column|any;
-  description?: Column|any;
-  id?: Column|any;
-  name?: Column|any;
-  version?: Column|any;
-}
+
 @Component({
   selector: 'app-version',
   templateUrl: './version.component.html',
@@ -115,7 +109,7 @@
             if (res.code === 1) {
               this.load();
               ret.close();
-              this.msgSrv.success('���������������������������');
+              this.msgSrv.success(this.grid.title + '���������������');
             }
          }
       );
@@ -127,7 +121,7 @@
       ( res: any) => {
          if (res.code === 1) {
            this.load();
-           this.msgSrv.success('���������������������������');
+           this.msgSrv.success(this.grid.title + '���������������');
          }
       }
    );
@@ -164,10 +158,55 @@
      }
      this.load();
   }
+    configSensor(data) {
+     const deviceVersionId = data.id;
+     this.versionService.getSensorIds(deviceVersionId).subscribe(
+        (selectedSensorIds: number[]) => {
+          this.modalHelper.static(VersionSensorConfigComponent, { deviceVersionId, selectedSensorIds }).subscribe( 
+            ( ret: { grid: Grid<Sensor>, close: Function} ) => {
+            // ������������id
+            const selectedIds = ret.grid.data.filter(
+              (r: any) => {
+                 return r['checked'] === true;
+              }
+            ).map(
+              (r: any) => {
+                return r['id'];
+             }
+            );
+            // ������������������������������
+            let isModified = selectedIds.length !== selectedSensorIds.length;
+            // ���������������������������
+            if (!isModified) {
+              isModified = !selectedIds.every(
+                (id: number) => {
+                    // console.log('id:' + id);                   
+                    const result = selectedSensorIds.some(
+                      (sid: number) => {
+                          return id === sid ;
+                      }
+                     );
+                    // console.log('result:' + result);
+                    return result;
+                }
+               );
+            }
+            if ( !isModified ) {
+              this.msgSrv.success(this.grid.title + '������������������');
+              ret.close();
+              return ;
+            }
+            this.versionService.versionSensorConfig(deviceVersionId, selectedIds).subscribe(
+               ( res: any) => {
+                  if (res.code === 1) {
+                    ret.close();
+                    this.msgSrv.success(this.grid.title + '���������������');
+                  }
+               }
+            );
+          });
+        }
+     );
 
-  reset(ls: any[]) {
-    for (const item of ls) item.value = false;
-    this.load(true);
-  }
-
+    }
 }
diff --git a/src/app/routes/routes.module.ts b/src/app/routes/routes.module.ts
index ea7da38..53906ae 100644
--- a/src/app/routes/routes.module.ts
+++ b/src/app/routes/routes.module.ts
@@ -4,14 +4,24 @@
 import { RouterModule } from '@angular/router';
 import { SharedModule } from '@shared/shared.module';
 import { environment } from '../../environments/environment';
-
 import { routes } from './routes';
 import { DashboardV1Component } from './dashboard/v1/v1.component';
 import { DashboardAnalysisComponent } from './dashboard/analysis/analysis.component';
 import { DashboardMonitorComponent } from './dashboard/monitor/monitor.component';
 import { DashboardWorkplaceComponent } from './dashboard/workplace/workplace.component';
 import { CoreModule } from '@core/core.module';
+// region: zorro modules
+// Statics
+import 'rxjs/add/observable/throw';
 
+// Operators
+import 'rxjs/add/operator/catch';
+import 'rxjs/add/operator/debounceTime';
+import 'rxjs/add/operator/distinctUntilChanged';
+import 'rxjs/add/operator/map';
+import 'rxjs/add/operator/switchMap';
+import 'rxjs/add/operator/toPromise';
+import 'rxjs/add/operator/filter';
 @NgModule({
     imports: [
         SharedModule,
diff --git a/src/app/routes/sensors/basic-info/basic-info.component.html b/src/app/routes/sensors/basic-info/basic-info.component.html
index f7a2791..fd431c6 100644
--- a/src/app/routes/sensors/basic-info/basic-info.component.html
+++ b/src/app/routes/sensors/basic-info/basic-info.component.html
@@ -1,3 +1,66 @@
-<p>
-  sensor basic-info works!
-</p>
+<pro-header [title]="grid.title"></pro-header>
+<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="grid.selectedIndexs.length > 0"> &nbsp;
+                <button nz-button [nzSize]="'large'" (click)="deleteSelected()">������������</button>
+                </ng-container>
+                <nz-input [ngStyle]="{'width': '280px','float':'right'}" [(ngModel)]="queryMap.value" name=""  [nzPlaceHolder]="queryMap.text"
+                (keyup)="queryTextChanged($event)" (change)="queryTextChanged($event)" ></nz-input>
+        </div>
+    	<div class="mb-md">
+                <nz-alert *ngIf="grid.selectedIndexs.length > 0" [nzType]="'info'" [nzShowIcon]="true"> 
+                    <span alert-body>
+                         ���������<strong class="text-primary">{{grid.selectedIndexs.length}}</strong>���
+                    </span> 
+                </nz-alert>
+    </div>
+    <nz-table #nzTable
+              [nzAjaxData]="grid.data"              
+              [nzTotal]="grid.total"
+              [(nzPageIndex)]="grid.pageIndex"
+              [(nzPageSize)]="grid.pageSize"
+              [nzLoading]="grid.loading"
+              [nzShowTotal]="true"
+              (nzPageIndexChange)="load()">
+              <thead nz-thead>
+                  <tr>
+                    <th nz-th [nzCheckbox]="true">
+                        <label nz-checkbox [(ngModel)]="grid.allChecked" [nzIndeterminate]="grid.indeterminate" (ngModelChange)="grid.checkAll($event)"></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">
+                    <td nz-td [nzCheckbox]="true">
+                       <label nz-checkbox [(ngModel)]="row.checked" (ngModelChange)="grid.refreshStatus($event)"></label>
+                    </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-td>
+                            <a (click)="addOrModify(row)">������</a>
+                            <span nz-table-divider></span>
+                              <nz-popconfirm [nzTitle]="'������������������'+grid.title+'���?'" [nzOkText]="'Yes'" [nzCancelText]="'No'" (nzOnConfirm)="delete(row.id)" >
+                                <a nz-popconfirm>������</a>
+                              </nz-popconfirm>
+                     </td>
+                </tr>
+              </tbody>
+              </nz-table>
+  </nz-card>
+  
+
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 434f272..e53d4f6 100644
--- a/src/app/routes/sensors/basic-info/basic-info.component.ts
+++ b/src/app/routes/sensors/basic-info/basic-info.component.ts
@@ -1,4 +1,14 @@
+import { NzModalService, NzMessageService } from 'ng-zorro-antd';
+import { PageBean } from '@business/entity/grid';
+import {  Sensor } from '@business/entity/data';
+import { ModalHelper } from '@delon/theme';
+import { SensorsService } from '@business/services/http/sensors.service';
+import { Column, Grid } from '@business/entity/grid';
 import { Component, OnInit } from '@angular/core';
+import { Subject } from 'rxjs/Subject';
+import { SensorEditComponent } from './sensor-edit/sensor-edit.component';
+
+
 
 @Component({
   selector: 'app-basic-info',
@@ -7,9 +17,159 @@
 })
 export class BasicInfoComponent implements OnInit {
 
-  constructor() { }
+
+  grid: Grid<Sensor> = new Grid(null);
+  queryMap = { text: '���������������', value: ''};
+  queryTextStream: Subject<string> = new Subject<string>();
+    private initPage() {
+    const sensor: Sensor =  {
+      name: {
+        text: '������',
+        width: '200px'  
+      },
+      key: {
+        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 = 10;
+  }
+  constructor(
+    private sensorsService: SensorsService,
+    
+    private confirmServ: NzModalService,
+    public msgSrv: NzMessageService,
+    private modalHelper: ModalHelper,
+  ) {}
 
   ngOnInit() {
+    this.initPage();
+    this.queryTextStream
+    .debounceTime(500)
+    .distinctUntilChanged()
+    .subscribe(queryText => {
+        this.load();
+    });
+  }
+  queryTextChanged($event) {
+      this.queryTextStream.next(this.queryMap.value);
+  }
+  load(reload: boolean = false) {   
+    if (reload) {
+      this.grid.pageIndex = 1 ;
+    }
+    // ������������������ExpressionChangedAfterItHasBeenCheckedError
+    setTimeout(() => {
+      this.grid.loading = true;
+     }, 1);
+    this.sensorsService.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);
+            }
+       }
+    );
+  }
+
+// rowData���null���������������
+  addOrModify(d) {
+    const data = {};
+    if ( d != null) {
+      Object.assign(data, d);
+    }
+    this.modalHelper.static(SensorEditComponent, { data }).subscribe( 
+      ( ret: { data: any, close: Function} ) => {
+      // ������������
+      if (ret.data['index'] != null ) {
+          const index: number = ret.data['index'] ;
+          const origData = this.grid.getData()[index];
+          const isModified =  Object.keys(origData).some(
+            (key: string) => {
+                return ret.data[key] !== origData[key];    
+            } 
+          );
+          // ������������
+          if (!isModified) { 
+            ret.close();
+            this.msgSrv.success(this.grid.title + '���������������������');
+            return;
+          }
+      }
+      this.sensorsService.save(ret.data).subscribe(
+         ( res: any) => {
+            if (res.code === 1) {
+              this.load();
+              ret.close();
+              this.msgSrv.success(this.grid.title + '���������������');
+            }
+         }
+      );
+    });
+  }
+
+  delete(...id: number[]) {
+    this.sensorsService.delete( ...id ).subscribe(
+      ( res: any) => {
+         if (res.code === 1) {
+           this.load();
+           this.msgSrv.success(this.grid.title + '���������������');
+         }
+      }
+   );
+  }
+
+   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 );
+       }
+    });
+  }
+  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();
   }
 
 }
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
new file mode 100644
index 0000000..0147609
--- /dev/null
+++ b/src/app/routes/sensors/basic-info/sensor-edit/sensor-edit.component.html
@@ -0,0 +1,64 @@
+<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]="10" nzHasFeedback>
+      <nz-input formControlName="name" 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 nz-form-item-required>������</label>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="5" nzHasFeedback>
+      <nz-input formControlName="key" maxlength="20" [nzPlaceHolder]="'������'">
+      </nz-input>
+    </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="unit" 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]="5" nzHasFeedback>
+        <nz-input-number [ngStyle]="{'width': '100%' }" formControlName="lower" >
+          </nz-input-number>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="2" nzHasFeedback></div>
+    <div nz-form-label nz-col [nzSm]="4" [nzXs]="24">
+      <label>������</label>
+    </div>
+    <div nz-form-control nz-col [nzSpan]="5" nzHasFeedback>
+          <nz-input-number [ngStyle]="{'width': '100%' }" formControlName="upper" >
+          </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]="16" nzHasFeedback>
+      <nz-input formControlName="description" maxlength="100"></nz-input>
+    </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/sensors/basic-info/sensor-edit/sensor-edit.component.ts b/src/app/routes/sensors/basic-info/sensor-edit/sensor-edit.component.ts
new file mode 100644
index 0000000..4d06e27
--- /dev/null
+++ b/src/app/routes/sensors/basic-info/sensor-edit/sensor-edit.component.ts
@@ -0,0 +1,64 @@
+import { NzModalSubject } from 'ng-zorro-antd';
+import { Sensor } from '@business/entity/data';
+import { Component, OnInit } from '@angular/core';
+import { FormGroup, FormBuilder, Validators } from '@angular/forms';
+import { SensorsService } from '@business/services/http/sensors.service';
+
+@Component({
+  selector: 'app-sensor-edit',
+  templateUrl: './sensor-edit.component.html',
+  styles: []
+})
+export class SensorEditComponent implements OnInit {
+  data: Sensor;
+  isSaving = false;
+  validateForm: FormGroup;
+  constructor(    
+    private subject: NzModalSubject,
+    private formBuilder: FormBuilder,
+    private organizationService: SensorsService
+    ) { }
+
+  ngOnInit() {
+     const data = this.data;
+     const validates: Sensor  = {
+          name: [data.name, [Validators.required] ],
+          key: [data.key, [Validators.required] ],
+          lower: [data.lower ],
+          upper: [data.upper ],
+          unit: [data.unit ],
+          description: [data.description ]
+     };
+     this.validateForm = this.formBuilder.group(
+         validates
+     );
+  }
+  close() {
+       this.subject.destroy();
+  }
+  save($event, value, valid) {
+      $event.preventDefault();
+      if (valid) {
+        for (const i in this.validateForm.controls) {
+          this.validateForm.controls[ i ].disable();
+        } 
+        this.isSaving = true;
+        Object.keys(value).forEach( (key: string) => {
+              // '_'������������������������������
+              if (!key.startsWith('_') && value[key] != null) {
+                   this.data[key] = value[key];
+              }
+        } );
+        this.subject.next( this );
+      }else {
+        this.validate(); 
+      }
+  }
+  validate() {
+     for (const i in this.validateForm.controls) {
+       this.validateForm.controls[ i ].markAsDirty();
+     }
+  }
+  
+
+}
diff --git a/src/app/routes/sensors/sensors.module.ts b/src/app/routes/sensors/sensors.module.ts
index 73e08a1..440d5e9 100644
--- a/src/app/routes/sensors/sensors.module.ts
+++ b/src/app/routes/sensors/sensors.module.ts
@@ -1,7 +1,13 @@
+import { SensorsService } from '@business/services/http/sensors.service';
 import { NgModule } from '@angular/core';
 import { CommonModule } from '@angular/common';
 import { BasicInfoComponent } from './basic-info/basic-info.component';
 import {RouterModule, Routes} from '@angular/router';
+import { PipeModule } from '@business/pipe/pipe.module';
+import { SharedModule } from '@shared/shared.module';
+import { _HttpClient } from '@delon/theme/services/http/http.client';
+import { FormBuilder } from '@angular/forms';
+import { SensorEditComponent } from './basic-info/sensor-edit/sensor-edit.component';
 
 const routes: Routes = [
   {
@@ -11,12 +17,20 @@
     ]
   }
 ];
-
+const COMPONENTS_NOROUNT = [SensorEditComponent];
 @NgModule({
   imports: [
+    // ������������������������������������
+    PipeModule,
     CommonModule,
+    SharedModule,
     RouterModule.forChild(routes)
   ],
-  declarations: [BasicInfoComponent]
+  declarations: [    
+    BasicInfoComponent,
+    SensorEditComponent
+  ],
+  providers: [SensorsService, _HttpClient, FormBuilder],
+  entryComponents: COMPONENTS_NOROUNT
 })
 export class SensorsModule { }
diff --git a/src/app/routes/systems/account/account.component.ts b/src/app/routes/systems/account/account.component.ts
index 69ff1db..74a47ba 100644
--- a/src/app/routes/systems/account/account.component.ts
+++ b/src/app/routes/systems/account/account.component.ts
@@ -3,7 +3,7 @@
 import {ModalHelper} from '@delon/theme';
 import {HttpClient} from '@angular/common/http';
 import {environment} from '../../../../environments/environment';
-import {DateService} from '../../../core/services/date.service';
+import {DateService} from '@business/services/util/date.service';
 import {AccountEditComponent} from './account-edit/account-edit.component';
 @Component({
   selector: 'app-account',
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
new file mode 100644
index 0000000..a4c3222
--- /dev/null
+++ b/src/app/routes/systems/organization/organization-config/organization-config.component.html
@@ -0,0 +1,67 @@
+<form>
+    <p>111111111111111111111111111<br/>
+      222222222222222222222222222<br/>
+      333333333333333333333333333<br/>
+   </p>
+   <p>111111111111111111111111111<br/>
+       222222222222222222222222222<br/>
+       333333333333333333333333333<br/>
+    </p>
+    <p>111111111111111111111111111<br/>
+      222222222222222222222222222<br/>
+      333333333333333333333333333<br/>
+   </p>
+   <p>111111111111111111111111111<br/>
+       222222222222222222222222222<br/>
+       333333333333333333333333333<br/>
+    </p>
+    <p>111111111111111111111111111<br/>
+      222222222222222222222222222<br/>
+      333333333333333333333333333<br/>
+   </p>
+   <p>111111111111111111111111111<br/>
+       222222222222222222222222222<br/>
+       333333333333333333333333333<br/>
+    </p>
+    <p>111111111111111111111111111<br/>
+      222222222222222222222222222<br/>
+      333333333333333333333333333<br/>
+   </p>
+   <p>111111111111111111111111111<br/>
+       222222222222222222222222222<br/>
+       333333333333333333333333333<br/>
+    </p>
+    <p>111111111111111111111111111<br/>
+      222222222222222222222222222<br/>
+      333333333333333333333333333<br/>
+   </p>
+   <p>111111111111111111111111111<br/>
+       222222222222222222222222222<br/>
+       333333333333333333333333333<br/>
+    </p>
+    <p>111111111111111111111111111<br/>
+      222222222222222222222222222<br/>
+      333333333333333333333333333<br/>
+   </p>
+   <p>111111111111111111111111111<br/>
+       222222222222222222222222222<br/>
+       333333333333333333333333333<br/>
+    </p>
+    <p>111111111111111111111111111<br/>
+      222222222222222222222222222<br/>
+      333333333333333333333333333<br/>
+   </p>
+   <p>111111111111111111111111111<br/>
+       222222222222222222222222222<br/>
+       333333333333333333333333333<br/>
+    </p>
+   <footer-toolbar errorCollect>
+        <button nz-button type="button" (click)="backToList()">������</button>
+        <button nz-button [nzType]="'primary'" [nzLoading]="isSaving">
+          <span>
+            ������
+            <span *ngIf="isSaving">���</span>
+          </span>
+        </button>
+    </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
new file mode 100644
index 0000000..f9fdffa
--- /dev/null
+++ b/src/app/routes/systems/organization/organization-config/organization-config.component.ts
@@ -0,0 +1,24 @@
+import { Organization } from '@business/entity/data';
+import { Component, OnInit } from '@angular/core';
+import { OrganizationService } from '@business/services/http/organization.service';
+
+@Component({
+  selector: 'app-organization-config',
+  templateUrl: './organization-config.component.html',
+  styles: []
+})
+export class OrganizationConfigComponent implements OnInit {
+  organization: Organization;
+  constructor(
+    private organizationService: OrganizationService
+  ) { 
+      console.log(this.organizationService.data);
+  }
+
+  ngOnInit() {
+  }
+  backToList() {
+    this.organizationService.handle = 'list';
+    this.organizationService.title = '������������';
+  }
+}
diff --git a/src/app/routes/systems/organization/organization-edit/organization-edit.component.html b/src/app/routes/systems/organization/organization-edit/organization-edit.component.html
index 7830d63..b945e8e 100644
--- a/src/app/routes/systems/organization/organization-edit/organization-edit.component.html
+++ b/src/app/routes/systems/organization/organization-edit/organization-edit.component.html
@@ -14,7 +14,7 @@
       <label>������</label>
     </div>
     <div nz-form-control nz-col [nzSpan]="4" nzHasFeedback>
-      <nz-select style="width: 120px;" formControlName="rank" [nzPlaceHolder]="'������ ������'">
+      <nz-select style="width:100%;" formControlName="rank" [nzPlaceHolder]="'������ ������'">
         <nz-option *ngFor="let option of rankOptions" [nzLabel]="option.label" [nzValue]="option.value" [nzDisabled]="option.disabled">
         </nz-option>
       </nz-select>
@@ -58,15 +58,16 @@
     <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-datepicker nzSize="large"  style="width: 90%;" formControlName="createTime" nzShowTime  [nzPlaceHolder]="'������������'"
+    <div nz-form-control nz-col [nzSpan]="6" 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-control nz-col [nzSpan]="1" nzHasFeedback></div>
     <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-datepicker nzSize="large"  style="width: 90%;" formControlName="expireTime" nzShowTime  [nzPlaceHolder]="'������������'"
+      <nz-datepicker nzSize="large"  style="width:100%;" formControlName="expireTime" nzShowTime  [nzPlaceHolder]="'������������'"
       [nzFormat]="'YYYY-MM-DD HH:mm:ss'" ></nz-datepicker>
     </div>
   </div>
diff --git a/src/app/routes/systems/organization/organization-edit/organization-edit.component.ts b/src/app/routes/systems/organization/organization-edit/organization-edit.component.ts
index 03a2dd4..24427f4 100644
--- a/src/app/routes/systems/organization/organization-edit/organization-edit.component.ts
+++ b/src/app/routes/systems/organization/organization-edit/organization-edit.component.ts
@@ -1,5 +1,5 @@
-import { Organization } from './../organization.component';
-import { AreacodeService } from './../../../../core/services/areacode.service';
+import { Organization } from '@business/entity/data';
+import { AreacodeService } from '@business/services/http/areacode.service';
 import { Component, OnInit } from '@angular/core';
 import { NzMessageService, NzModalSubject } from 'ng-zorro-antd';
 import { FormGroup, FormBuilder, FormControl, Validators } from '@angular/forms';
diff --git a/src/app/routes/systems/organization/organization-list/organization-list.component.html b/src/app/routes/systems/organization/organization-list/organization-list.component.html
new file mode 100644
index 0000000..ead90fe
--- /dev/null
+++ b/src/app/routes/systems/organization/organization-list/organization-list.component.html
@@ -0,0 +1,66 @@
+<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="grid.selectedIndexs.length > 0"> &nbsp;
+                <button nz-button [nzSize]="'large'" (click)="deleteSelected()">������������</button>
+                </ng-container>
+                <nz-input [ngStyle]="{'width': '280px','float':'right'}" [(ngModel)]="queryMap.value" name=""  [nzPlaceHolder]="queryMap.text"
+                (keyup)="queryTextChanged($event)" (change)="queryTextChanged($event)" ></nz-input>
+        </div>
+    	<div class="mb-md">
+                <nz-alert *ngIf="grid.selectedIndexs.length > 0" [nzType]="'info'" [nzShowIcon]="true"> 
+                    <span alert-body>
+                         ���������<strong class="text-primary">{{grid.selectedIndexs.length}}</strong>���
+                    </span> 
+                </nz-alert>
+    </div>
+    <nz-table #nzTable
+              [nzAjaxData]="grid.data"              
+              [nzTotal]="grid.total"
+              [(nzPageIndex)]="grid.pageIndex"
+              [(nzPageSize)]="grid.pageSize"
+              [nzLoading]="grid.loading"
+              [nzShowTotal]="true"
+              (nzPageIndexChange)="load()">
+              <thead nz-thead>
+                  <tr>
+                    <th nz-th [nzCheckbox]="true">
+                        <label nz-checkbox [(ngModel)]="grid.allChecked" [nzIndeterminate]="grid.indeterminate" (ngModelChange)="grid.checkAll($event)"></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">
+                    <td nz-td [nzCheckbox]="true">
+                       <label nz-checkbox [(ngModel)]="row.checked" (ngModelChange)="grid.refreshStatus($event)"></label>
+                    </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-td>
+                            <a (click)="config(row)">������</a>
+                            <span nz-table-divider></span>
+                            <a (click)="addOrModify(row)">������</a>
+                            <span nz-table-divider></span>
+                              <nz-popconfirm [nzTitle]="'������������������'+grid.title+'���?'" [nzOkText]="'Yes'" [nzCancelText]="'No'" (nzOnConfirm)="delete(row.id)" >
+                                <a nz-popconfirm>������</a>
+                              </nz-popconfirm>
+                     </td>
+                </tr>
+              </tbody>
+              </nz-table>
+  </nz-card>
+  
diff --git a/src/app/routes/systems/organization/organization-list/organization-list.component.ts b/src/app/routes/systems/organization/organization-list/organization-list.component.ts
new file mode 100644
index 0000000..24e80c5
--- /dev/null
+++ b/src/app/routes/systems/organization/organization-list/organization-list.component.ts
@@ -0,0 +1,212 @@
+import { Router } from '@angular/router';
+import { ModalHelper } from '@delon/theme';
+import { NzModalService, NzMessageService } from 'ng-zorro-antd';
+import { OrganizationService } from '@business/services/http/organization.service';
+import { Grid, Column, PageBean } from '@business/entity/grid';
+import { Organization } from '@business/entity/data';
+import { Component, OnInit } from '@angular/core';
+import { Subject } from 'rxjs/Subject';
+import { Types } from '@business/enum/types.enum';
+import { OrganizationEditComponent } from 'app/routes/systems/organization/organization-edit/organization-edit.component';
+
+@Component({
+  selector: 'app-organization-list',
+  templateUrl: './organization-list.component.html',
+  styles: []
+})
+export class OrganizationListComponent implements OnInit {
+  private organization: Organization;
+  grid: Grid<Organization> = new Grid(null);
+  queryMap = { text: '���������������', value: ''};
+  queryTextStream: Subject<string> = new Subject<string>();
+    private initPage() {
+    this.organization =  {
+      name: {
+        text: '������',
+        width: '120px'  
+      },
+      rank: {
+        text: '������',
+        width: '80px',
+        format: (value: any, col: Column, row: any) => {
+          const item = [
+            { value: 0, label: '������' },
+            { value: 1, label: '������������' },
+            { value: 2, label: '���������' },
+            { value: 3, label: '������������' },
+            { value: 4, label: '���������' },
+            { value: 5, label: '���������' }
+          ].filter( (rankItem: {value: number, label: string }) => {
+            return rankItem.value === value;
+          });
+          return item != null && item.length === 1 ? item[0].label : '';
+        }
+      },
+      telephone: {
+        text: '������',
+        width: '120px'
+      },
+      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;
+              }
+              
+        }
+      },
+      createTime: {
+        text: '������������',
+        width: '100px',
+        type: {
+         name: Types.Date,
+         format: 'YYYY-MM-DD HH:mm:ss'
+        },
+         isSort: true
+      },
+      expireTime: {
+        text: '������������',
+        width: '100px',
+        type: {
+         name: Types.Date,
+         format: 'YYYY-MM-DD HH:mm:ss'
+        },
+         isSort: true  
+      }
+    };
+    this.grid.title = '������';
+    this.grid.setColumns(this.organization);
+    this.grid.pageSize = 10;
+  }
+  constructor(
+    private organizationService: OrganizationService,
+    
+    private confirmServ: NzModalService,
+    public msgSrv: NzMessageService,
+    private modalHelper: ModalHelper,
+    private router: Router,
+  ) {}
+
+  ngOnInit() {
+    this.initPage();
+    this.queryTextStream
+    .debounceTime(500)
+    .distinctUntilChanged()
+    .subscribe(queryText => {
+        this.load();
+    });
+  }
+  queryTextChanged($event) {
+      this.queryTextStream.next(this.queryMap.value);
+  }
+  load(reload: boolean = false) {   
+    if (reload) {
+      this.grid.pageIndex = 1 ;
+    }
+    // ������������������ExpressionChangedAfterItHasBeenCheckedError
+    setTimeout(() => {
+      this.grid.loading = true;
+     }, 1);
+    this.organizationService.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);
+            }
+       }
+    );
+  }
+
+// rowData���null���������������
+  addOrModify(d) {
+    const data = {};
+    if ( d != null) {
+      Object.assign(data, d);
+    }
+    const cols = this.organization;
+    this.modalHelper.static(OrganizationEditComponent, { cols , data }).subscribe( 
+      ( ret: { data: any, close: Function} ) => {
+      // ������������
+      if (ret.data['index'] != null ) {
+          const index: number = ret.data['index'] ;
+          const origData = this.grid.getData()[index];
+          const isModified =  Object.keys(origData).some(
+            (key: string) => {
+                return ret.data[key] !== origData[key];    
+            } 
+          );
+          // ������������
+          if (!isModified) { 
+            ret.close();
+            this.msgSrv.success('���������������������������');
+            return;
+          }
+      }
+      this.organizationService.save(ret.data).subscribe(
+         ( res: any) => {
+            if (res.code === 1) {
+              this.load();
+              ret.close();
+              this.msgSrv.success('���������������������');
+            }
+         }
+      );
+    });
+  }
+
+  delete(...id: number[]) {
+    this.organizationService.delete( ...id ).subscribe(
+      ( res: any) => {
+         if (res.code === 1) {
+           this.load();
+           this.msgSrv.success('���������������������������');
+         }
+      }
+   );
+  }
+
+   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 );
+       }
+    });
+  }
+  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();
+  }
+  config(row) {
+      this.organizationService.handle = 'config' ;
+      this.organizationService.data = row;
+      this.organizationService.title = '������������';
+  }
+}
diff --git a/src/app/routes/systems/organization/organization.component.html b/src/app/routes/systems/organization/organization.component.html
index ed0b257..bee33d6 100644
--- a/src/app/routes/systems/organization/organization.component.html
+++ b/src/app/routes/systems/organization/organization.component.html
@@ -1,65 +1,8 @@
-<pro-header [title]="grid.title"></pro-header>
-<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="grid.selectedIndexs.length > 0"> &nbsp;
-                <button nz-button [nzSize]="'large'" (click)="deleteSelected()">������������</button>
-                </ng-container>
-                <nz-input [ngStyle]="{'width': '280px','float':'right'}" [(ngModel)]="queryMap.value" name=""  [nzPlaceHolder]="queryMap.text"
-                (keyup)="queryTextChanged($event)" (change)="queryTextChanged($event)" ></nz-input>
-        </div>
-    	<div class="mb-md">
-                <nz-alert *ngIf="grid.selectedIndexs.length > 0" [nzType]="'info'" [nzShowIcon]="true"> 
-                    <span alert-body>
-                         ���������<strong class="text-primary">{{grid.selectedIndexs.length}}</strong>���
-                    </span> 
-                </nz-alert>
-    </div>
-    <nz-table #nzTable
-              [nzAjaxData]="grid.data"              
-              [nzTotal]="grid.total"
-              [(nzPageIndex)]="grid.pageIndex"
-              [(nzPageSize)]="grid.pageSize"
-              [nzLoading]="grid.loading"
-              [nzShowTotal]="true"
-              (nzPageIndexChange)="load()">
-              <thead nz-thead>
-                  <tr>
-                    <th nz-th [nzCheckbox]="true">
-                        <label nz-checkbox [(ngModel)]="grid.allChecked" [nzIndeterminate]="grid.indeterminate" (ngModelChange)="grid.checkAll($event)"></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">
-                    <td nz-td [nzCheckbox]="true">
-                       <label nz-checkbox [(ngModel)]="row.checked" (ngModelChange)="grid.refreshStatus($event)"></label>
-                    </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-td>
-                            <a (click)="addOrModify(row)">������</a>
-                            <span nz-table-divider></span>
-                              <nz-popconfirm [nzTitle]="'���������������������������?'" [nzOkText]="'Yes'" [nzCancelText]="'No'" (nzOnConfirm)="delete(row.id)" >
-                                <a nz-popconfirm>������</a>
-                              </nz-popconfirm>
-                     </td>
-                </tr>
-              </tbody>
-              </nz-table>
-  </nz-card>
+<pro-header [title]="organizationService.title"></pro-header>
+<nz-card [nzBordered]="false" [nzNoHovering]="true">
+        <ng-template #body>
+            <app-organization-list *ngIf="organizationService.handle=='list'"></app-organization-list>
+            <app-organization-config *ngIf="organizationService.handle=='config'"></app-organization-config>
+        </ng-template>
+</nz-card>
   
diff --git a/src/app/routes/systems/organization/organization.component.ts b/src/app/routes/systems/organization/organization.component.ts
index 5aa3a9a..d417498 100644
--- a/src/app/routes/systems/organization/organization.component.ts
+++ b/src/app/routes/systems/organization/organization.component.ts
@@ -1,36 +1,7 @@
-import { DataType, AreaNames } from './../../../core/entity/grid';
-import { Version, ValueTransformer } from '@angular/compiler/src/util';
-import { Subject } from 'rxjs/Subject';
-import { ToolsService } from '@core/services/tools.service';
+import { OrganizationService } from '@business/services/http/organization.service';
 import { Component, OnInit } from '@angular/core';
-import { NzMessageService, NzModalService } from 'ng-zorro-antd';
-import { ModalHelper } from '@delon/theme';
-import { HttpClient } from '@angular/common/http';
-import { environment } from '../../../../environments/environment';
-import { DateService } from '@core/services/date.service';
-import { VersionService } from 'app/routes/devices/version/version.service';
-import { Types } from '@core/enum/types.enum';
-import { Column, Grid, PageBean } from '@core/entity/grid';
-import { filter } from 'rxjs/operators/filter';
-import { OrganizationEditComponent } from './organization-edit/organization-edit.component';
-import { OrganizationService } from 'app/routes/systems/organization/organization.service';
 
-export interface Organization {
-  address?: Column|any;
-  areaCode?: Column|any;
-  cityCode?: Column|any;
-  createTime?: Column|any;
-  description?: Column|any;
-  email?: Column|any;
-  expireTime?: Column|any;
-  id?: Column|any;
-  isDelete?: Column|any;
-  name?: Column|any;
-  provinceCode?: Column|any;
-  rank?: Column|any;
-  telephone?: Column|any;
-  areaNames?: AreaNames|any ;
-}
+
 
 @Component({
   selector: 'app-organization',
@@ -38,198 +9,10 @@
   styles: []
 })
 export class OrganizationComponent implements OnInit {
-
-  private organization: Organization;
-  grid: Grid<Organization> = new Grid(null);
-  queryMap = { text: '���������������', value: ''};
-  queryTextStream: Subject<string> = new Subject<string>();
-    private initPage() {
-    this.organization =  {
-      name: {
-        text: '������',
-        width: '120px'  
-      },
-      rank: {
-        text: '������',
-        width: '80px',
-        format: (value: any, col: Column, row: any) => {
-          const item = [
-            { value: 0, label: '������' },
-            { value: 1, label: '������������' },
-            { value: 2, label: '���������' },
-            { value: 3, label: '������������' },
-            { value: 4, label: '���������' },
-            { value: 5, label: '���������' }
-          ].filter( (rankItem: {value: number, label: string }) => {
-            return rankItem.value === value;
-          });
-          return item != null && item.length === 1 ? item[0].label : '';
-        }
-      },
-      telephone: {
-        text: '������',
-        width: '180px'
-      },
-      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;
-              }
-              
-        }
-      },
-      createTime: {
-        text: '������������',
-        width: '100px',
-        type: {
-         name: Types.Date,
-         format: 'YYYY-MM-DD HH:mm:ss'
-        },
-         isSort: true
-      },
-      expireTime: {
-        text: '������������',
-        width: '100px',
-        type: {
-         name: Types.Date,
-         format: 'YYYY-MM-DD HH:mm:ss'
-        },
-         isSort: true  
-      }
-    };
-    this.grid.title = '������������';
-    this.grid.setColumns(this.organization);
-    this.grid.pageSize = 10;
+  ngOnInit(): void {
+  
   }
   constructor(
-    private organizationService: OrganizationService,
-    
-    private confirmServ: NzModalService,
-    public msgSrv: NzMessageService,
-    private modalHelper: ModalHelper,
+    private organizationService: OrganizationService
   ) {}
-
-  ngOnInit() {
-    this.initPage();
-    this.queryTextStream
-    .debounceTime(500)
-    .distinctUntilChanged()
-    .subscribe(queryText => {
-        this.load();
-    });
-  }
-  queryTextChanged($event) {
-      this.queryTextStream.next(this.queryMap.value);
-  }
-  load(reload: boolean = false) {   
-    if (reload) {
-      this.grid.pageIndex = 1 ;
-    }
-    // ������������������ExpressionChangedAfterItHasBeenCheckedError
-    setTimeout(() => {
-      this.grid.loading = true;
-     }, 1);
-    this.organizationService.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);
-            }
-       }
-    );
-  }
-
-// rowData���null���������������
-  addOrModify(d) {
-    const data = {};
-    if ( d != null) {
-      Object.assign(data, d);
-    }
-    const cols = this.organization;
-    this.modalHelper.static(OrganizationEditComponent, { cols , data }).subscribe( 
-      ( ret: { data: any, close: Function} ) => {
-      // ������������
-      if (ret.data['index'] != null ) {
-          const index: number = ret.data['index'] ;
-          const origData = this.grid.getData()[index];
-          const isModified =  Object.keys(origData).some(
-            (key: string) => {
-                return ret.data[key] !== origData[key];    
-            } 
-          );
-          // ������������
-          if (!isModified) { 
-            ret.close();
-            this.msgSrv.success('���������������������������');
-            return;
-          }
-      }
-      this.organizationService.save(ret.data).subscribe(
-         ( res: any) => {
-            if (res.code === 1) {
-              this.load();
-              ret.close();
-              this.msgSrv.success('���������������������');
-            }
-         }
-      );
-    });
-  }
-
-  delete(...id: number[]) {
-    this.organizationService.delete( ...id ).subscribe(
-      ( res: any) => {
-         if (res.code === 1) {
-           this.load();
-           this.msgSrv.success('���������������������������');
-         }
-      }
-   );
-  }
-
-   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 );
-       }
-    });
-  }
-  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();
-  }
-
-  reset(ls: any[]) {
-    for (const item of ls) item.value = false;
-    this.load(true);
-  }
 }
diff --git a/src/app/routes/systems/systems.module.ts b/src/app/routes/systems/systems.module.ts
index 7c14ab3..7404c54 100644
--- a/src/app/routes/systems/systems.module.ts
+++ b/src/app/routes/systems/systems.module.ts
@@ -5,15 +5,16 @@
 import { CommonModule } from '@angular/common';
 import { RouterModule, Routes } from '@angular/router';
 import { SharedModule } from '@shared/shared.module';
-
 import { AccountComponent } from './account/account.component';
 import { AccountEditComponent } from './account/account-edit/account-edit.component';
 import { OrganizationComponent } from './organization/organization.component';
-import { PipeModule } from '@core/pipe/pipe.module';
+import { PipeModule } from '@business/pipe/pipe.module';
 import { OrganizationEditComponent } from './organization/organization-edit/organization-edit.component';
-import { ToolsService } from '@core/services/tools.service';
-import { OrganizationService } from 'app/routes/systems/organization/organization.service';
-import { AreacodeService } from '@core/services/areacode.service';
+import { ToolsService } from '@business/services/util/tools.service';
+import { OrganizationService } from '@business/services/http/organization.service';
+import { AreacodeService } from '@business/services/http/areacode.service';
+import { OrganizationConfigComponent } from './organization/organization-config/organization-config.component';
+import { OrganizationListComponent } from './organization/organization-list/organization-list.component';
 
 const routes: Routes = [
   {
@@ -39,7 +40,9 @@
     ...COMPONENTS_NOROUNT,
     AccountComponent,
     AccountEditComponent,
-    OrganizationComponent       
+    OrganizationComponent,
+    OrganizationConfigComponent,
+    OrganizationListComponent
   ],
   providers: [ToolsService, OrganizationService, _HttpClient, FormBuilder, AreacodeService],
   entryComponents: COMPONENTS_NOROUNT
diff --git a/src/app/routes/users/alarm-user/alarm-user.component.ts b/src/app/routes/users/alarm-user/alarm-user.component.ts
index 1c0996f..a447e3c 100644
--- a/src/app/routes/users/alarm-user/alarm-user.component.ts
+++ b/src/app/routes/users/alarm-user/alarm-user.component.ts
@@ -3,7 +3,7 @@
 import {ModalHelper} from '@delon/theme';
 import {HttpClient} from '@angular/common/http';
 import {environment} from '../../../../environments/environment';
-import {DateService} from '../../../core/services/date.service';
+import {DateService} from '@business/services/util/date.service';
 import {AlarmUserEditComponent} from './alarm-user-edit/alarm-user-edit.component';
 
 @Component({
diff --git a/src/app/routes/users/installer/edit/edit.component.ts b/src/app/routes/users/installer/edit/edit.component.ts
index 6509fe4..f02cabf 100644
--- a/src/app/routes/users/installer/edit/edit.component.ts
+++ b/src/app/routes/users/installer/edit/edit.component.ts
@@ -2,8 +2,8 @@
 import {Component, OnInit} from '@angular/core';
 import {ModalHelper} from '@delon/theme';
 import {HttpClient} from '@angular/common/http';
-import {environment} from '../../../../../environments/environment';
-import {DateService} from '../../../../core/services/date.service';
+import {environment} from 'environments/environment';
+import {DateService} from '@business/services/util/date.service';
 import {FormGroup, FormBuilder, FormControl, Validators} from '@angular/forms';
 
 @Component({
diff --git a/src/app/routes/users/installer/installer.component.ts b/src/app/routes/users/installer/installer.component.ts
index f59a364..94a17cb 100644
--- a/src/app/routes/users/installer/installer.component.ts
+++ b/src/app/routes/users/installer/installer.component.ts
@@ -4,7 +4,7 @@
 import {HttpClient} from '@angular/common/http';
 import {UserInstallerEditComponent} from './edit/edit.component';
 import {environment} from '../../../../environments/environment';
-import {DateService} from '../../../core/services/date.service';
+import {DateService} from '@business/services/util/date.service';
 
 @Component({
   selector: 'app-installer',
diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts
index 7bf1fa4..f2d4422 100644
--- a/src/app/shared/shared.module.ts
+++ b/src/app/shared/shared.module.ts
@@ -16,19 +16,6 @@
 import { TranslateModule } from '@ngx-translate/core';
 import { I18NService } from '@core/i18n/i18n.service';
 
-// region: zorro modules
-// Statics
-import 'rxjs/add/observable/throw';
-
-// Operators
-import 'rxjs/add/operator/catch';
-import 'rxjs/add/operator/debounceTime';
-import 'rxjs/add/operator/distinctUntilChanged';
-import 'rxjs/add/operator/map';
-import 'rxjs/add/operator/switchMap';
-import 'rxjs/add/operator/toPromise';
-import 'rxjs/add/operator/filter';
-
 import {
     // LoggerModule,
     // NzLocaleModule,
diff --git a/src/tsconfig.app.json b/src/tsconfig.app.json
index 29f6da9..de2e6ef 100644
--- a/src/tsconfig.app.json
+++ b/src/tsconfig.app.json
@@ -9,7 +9,9 @@
       "@shared": [ "app/shared" ],
       "@shared/*": [ "app/shared/*" ],
       "@core": [ "app/core/" ],
-      "@core/*": [ "app/core/*" ]
+      "@core/*": [ "app/core/*" ],
+      "@business": [ "app/business/" ],
+      "@business/*": [ "app/business/*" ]
     }
   },
   "exclude": [
diff --git a/src/tsconfig.spec.json b/src/tsconfig.spec.json
index f460cf7..34d8bf6 100644
--- a/src/tsconfig.spec.json
+++ b/src/tsconfig.spec.json
@@ -13,7 +13,9 @@
       "@shared": [ "app/shared" ],
       "@shared/*": [ "app/shared/*" ],
       "@core": [ "app/core/" ],
-      "@core/*": [ "app/core/*" ]
+      "@core/*": [ "app/core/*" ],
+      "@business": [ "app/business/" ],
+      "@business/*": [ "app/business/*" ]
     }
   },
   "files": [
diff --git a/tsconfig.json b/tsconfig.json
index 55ffe6b..448f1bd 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -22,7 +22,9 @@
         "@shared": [ "app/shared" ],
         "@shared/*": [ "app/shared/*" ],
         "@core": [ "app/core/" ],
-        "@core/*": [ "app/core/*" ]
+        "@core/*": [ "app/core/*" ],
+        "@business": [ "app/business/" ],
+        "@business/*": [ "app/business/*" ]
     }
   }
 }

--
Gitblit v1.8.0