src/app/business/business.module.ts
New file @@ -0,0 +1,20 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; // 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: [ CommonModule ] }) export class BusinessModule { } src/app/business/entity/data.ts
@@ -61,3 +61,12 @@ areaNames?: AreaNames|any ; organization?: Organization; } // 报警配置 export interface AlarmConfig { createTime?: number; id?: number; organizationId?: number; updateTime?: number; value?: object; } src/app/business/entity/grid.ts
@@ -111,3 +111,8 @@ return arr; } } export interface ResultBean<T>{ code?: number; data?: T; message?: string; } src/app/business/enum/types.enum.ts
@@ -1,3 +1,8 @@ export enum Types { Date, Json } export enum AlarmStyle { //微信,邮件,短信,语音 weixin='weixin',email='email',sms='sms',voice='voice' } src/app/business/services/http/alarm-config.service.ts
New file @@ -0,0 +1,19 @@ import { _HttpClient } from '@delon/theme'; import { Injectable } from '@angular/core'; import { environment } from '@env/environment'; import { Observable } from 'rxjs/Observable'; import { ResultBean } from '@business/entity/grid'; import { AlarmConfig } from '@business/entity/data'; @Injectable() export class AlarmConfigService { private urls = { getByOid: environment.SERVER_BASH_URL + 'alarm-config/get-by-oid' }; constructor( private http: _HttpClient) { } public getByOid(oid:number):Observable<ResultBean<AlarmConfig>>{ return this.http.get(this.urls.getByOid,{organizationId:oid}); } } src/app/business/services/http/areacode.service.ts
@@ -1,10 +1,5 @@ import { Injectable } from '@angular/core'; import { _HttpClient } from '@delon/theme/services/http/http.client'; // Statics import 'rxjs/add/observable/throw'; // Operators import 'rxjs/add/operator/catch'; import 'rxjs/add/operator/map'; import { Observable } from 'rxjs/Observable'; import { environment } from 'environments/environment'; src/app/business/services/http/organization.service.ts
@@ -1,4 +1,4 @@ import { Organization } from '@business/entity/data'; import { Organization, AlarmConfig } from '@business/entity/data'; import { ExampleService } from '@business/services/util/example.service'; import { _HttpClient } from '@delon/theme'; import { environment } from 'environments/environment'; @@ -6,13 +6,13 @@ import { Injectable } from '@angular/core'; import { equal } from 'assert'; import { Observable } from 'rxjs/Observable'; import { PageBean } from '@business/entity/grid'; import { PageBean, ResultBean } from '@business/entity/grid'; @Injectable() export class OrganizationService { handle: 'list'|'config' = 'list'; config: {pageBean: PageBean,resultBean: ResultBean<AlarmConfig>}; data: Organization; title: '组织列表'|'组织配置' = '组织列表'; private urls = { src/app/routes/devices/version/version-sensor-config/version-sensor-config.component.html
@@ -2,7 +2,7 @@ <div class="modal-title">配置传感器</div> </div> <nz-table #nzTable [nzDataSource]="grid.data" [nzPageSize]="8" [nzLoading]="grid.loading" [nzShowTotal]="true" > [nzLoading]="grid.loading" [nzShowTotal]="true"> <thead nz-thead> <tr> <th nz-th [nzCheckbox]="true"> src/app/routes/routes.module.ts
@@ -29,7 +29,7 @@ DashboardV1Component, DashboardAnalysisComponent, DashboardMonitorComponent, DashboardWorkplaceComponent, DashboardWorkplaceComponent ], providers: [ _HttpClient, src/app/routes/systems/organization/organization-config/organization-config.component.html
@@ -1,67 +1,131 @@ <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> <form nz-form [formGroup]="validateForm" (ngSubmit)="save($event,validateForm.value,validateForm.valid)" [nzLayout]="'vertical'" #f="ngForm"> <nz-card [nzBordered]="false" nzTitle="报警阀值(注意,只有部分选项有 反向三级 数值,没有可不填)"> <nz-table #nzTable [nzDataSource]="grid.data" [nzPageSize]="10" [nzLoading]="grid.loading" [nzShowTotal]="true"> <thead nz-thead> <tr> <th nz-th [nzCheckbox]="true"> <label nz-checkbox formControlName="_allChecked" [nzIndeterminate]="indeterminate" (ngModelChange)="checkAll($event)"></label> </th> <th nz-th> 传感器名称 </th> <th nz-th> 一级 </th> <th nz-th> 二级 </th> <th nz-th> 三级 </th> <th nz-th> 反向一级 </th> <th nz-th> 反向二级 </th> <th nz-th> 反向三级 </th> </tr> </thead> <tbody nz-tbody> <tr nz-tbody-tr *ngFor="let row of nzTable.data"> <td nz-td [nzCheckbox]="true"> <label nz-checkbox formControlName="{{row.key}}_enable"></label> </td> <td> <span> {{ row.name }} </span> </td> <td> <div nz-form-item> <div nz-form-control nzHasFeedback> <nz-input formControlName="{{row.key}}_level_increment_1" maxlength="20" nzDisabled="{{ !f.value[row.key+'_enable'] }}"></nz-input> </div> </div> </td> <td> <div nz-form-item> <div nz-form-control nzHasFeedback> <nz-input formControlName="{{row.key}}_level_increment_2" maxlength="20" nzDisabled="{{ !f.value[row.key+'_enable'] }}" validateGreater></nz-input> </div> </div> </td> <td> <div nz-form-item> <div nz-form-control nzHasFeedback> <nz-input formControlName="{{row.key}}_level_increment_3" maxlength="20" nzDisabled="{{ !f.value[row.key+'_enable'] }}"></nz-input> </div> </div> </td> <td> <div nz-form-item> <div nz-form-control nzHasFeedback> <nz-input formControlName="{{row.key}}_level_degression_1" maxlength="20" nzDisabled="{{ !f.value[row.key+'_enable'] }}"></nz-input> </div> </div> </td> <td> <div nz-form-item> <div nz-form-control nzHasFeedback> <nz-input formControlName="{{row.key}}_level_degression_2" maxlength="20" nzDisabled="{{ !f.value[row.key+'_enable'] }}"></nz-input> </div> </div> </td> <td> <div nz-form-item> <div nz-form-control nzHasFeedback> <nz-input formControlName="{{row.key}}_level_degression_3" maxlength="20" nzDisabled="{{ !f.value[row.key+'_enable'] }}"></nz-input> </div> </div> </td> </tr> </tbody> </nz-table> </nz-card> <div [ngStyle]="{'background-color':'#f5f7fa','width':'110%','left':'-5%','height':'20px','position':'relative'}"></div> <nz-card [nzBordered]="false" nzTitle="报警方式"> <label nz-checkbox formControlName="mode_enable"> <span>启用报警</span> </label> <div [ngStyle]="{'margin-left': '20%'}"> <br/> <br/> <br/> <div *ngFor="let i of [1,2,3]" nz-form-item nz-row class="mb-sm"> <div nz-form-label nz-col [nzSm]="3" [nzXs]="24"> <span [ngSwitch]="i"> <label *ngSwitchCase="1">一级报警方式:</label> <label *ngSwitchCase="2">二级报警方式:</label> <label *ngSwitchCase="3">三级报警方式:</label> </span> </div> <div nz-form-control nz-col [nzSpan]="12" nzHasFeedback> <nz-select formControlName="mode_level{{i}}" [nzMode]="'multiple'" [nzPlaceHolder]="'选择 报警方式'" [nzNotFoundContent]="'无法找到'" nzDisabled="{{ !f.value['mode_enable'] }}"> <nz-option *ngFor="let option of alarmModes" [nzLabel]="option.label" [nzValue]="option.value" [nzDisabled]="option.disabled"> </nz-option> </nz-select> </div> <br/> <br/> <br/> </div> </div> </nz-card> <footer-toolbar ng-content = '错误提示' errorCollect> <label>组织名称:</label> <span [ngStyle]="{'font-size': '16px','font-weight': 'bold','margin-right':'30px'}">{{ organization.name }}</span> <button nz-button type="button" (click)="backToList()">返回</button> <button nz-button [nzType]="'primary'" [nzLoading]="isSaving"> <span> 保存 <span *ngIf="isSaving">中</span> </span> <span> 保存 <span *ngIf="isSaving">中</span> </span> </button> </footer-toolbar> </form> src/app/routes/systems/organization/organization-config/organization-config.component.ts
@@ -1,24 +1,161 @@ import { filter } from 'rxjs/operators'; import { HttpClient } from '@angular/common/http'; import { FormGroup, FormBuilder, FormControl, Validators } from '@angular/forms'; import { SensorsService } from '@business/services/http/sensors.service'; import { Grid, PageBean } from '@business/entity/grid'; import { Organization } from '@business/entity/data'; import { Component, OnInit } from '@angular/core'; import { Component, OnInit, OnDestroy } from '@angular/core'; import { OrganizationService } from '@business/services/http/organization.service'; import { _HttpClient } from '@delon/theme'; import { AlarmConfigService } from '@business/services/http/alarm-config.service'; import { AlarmStyle } from '@business/enum/types.enum'; @Component({ selector: 'app-organization-config', templateUrl: './organization-config.component.html', styles: [] styles: [], providers: [AlarmConfigService] }) export class OrganizationConfigComponent implements OnInit { organization: Organization; export class OrganizationConfigComponent implements OnInit, OnDestroy { ngOnDestroy(): void { this.backToList(); } private organization:Organization; grid: Grid<object> = new Grid<object>(null); validateForm: FormGroup; constructor( private organizationService: OrganizationService ) { console.log(this.organizationService.data); private organizationService: OrganizationService, private sensorsService: SensorsService, private alarmConfigService:AlarmConfigService, private formBuilder: FormBuilder, private http: _HttpClient ) { this.organization = this.organizationService.data; } ngOnInit() { this.load(); } load(reload: boolean = false) { if (reload) { this.grid.pageIndex = 1 ; } // TODO // 延时加载避免ExpressionChangedAfterItHasBeenCheckedError // setTimeout(() => { // this.grid.loading = true; // }, 1); let pageBean = this.organizationService.config.pageBean;// let resultBean = this.organizationService.config.resultBean; resultBean = resultBean == null?{} : resultBean; if (pageBean != null && pageBean.data != null) { this.grid.initData(pageBean); this.grid.refreshStatus(); setTimeout(() => { this.grid.loading = false; }, 1); let validates = {}; let data = resultBean.data == null ?{}:resultBean.data; const value = data['value'] == null ? {} : data['value']; let alarmLevels = value['alarmLevels']; alarmLevels = alarmLevels==null ? {} : alarmLevels; // 三级警报 const level_num = 3; this.grid.data.forEach( (sensor: object) => { const sensorLevel = alarmLevels[sensor['key']] == null ?{}:alarmLevels[sensor['key']]; const enable_key = sensor['key'] + '_enable'; const enable_value = sensorLevel['enable'] == null ? false : sensorLevel['enable'] == 1; validates[enable_key] = enable_value; const increments:number[] = sensorLevel['increment']; const degression:number[] = sensorLevel['degression']; for(let i=0;i<level_num;i++){ const increment_key = sensor['key']+'_level_increment_'+(i+1); if( increments == null || increments.length == 0 ){ validates[increment_key] = [null,[Validators.pattern('^\\d+(\\.\\d+)?$')]]; }else{ const increment_value = increments.length>i ? increments[i]:null ; validates[increment_key] = [increment_value,[Validators.pattern('^\\d+(\\.\\d+)?$')]]; } const degression_key = sensor['key']+'_level_degression_'+(i+1); if( degression == null || degression.length == 0 ){ validates[degression_key] = [null,[Validators.pattern('^\\d+(\\.\\d+)?$')]]; }else{ const degression_value = degression.length>i ? degression[i]:null ; validates[degression_key] = [degression_value,[Validators.pattern('^\\d+(\\.\\d+)?$')]]; } } } ); validates['_allChecked'] = [this.grid.allChecked]; //报警方式加载 let alarmMode = value['alarmMode']; alarmMode = alarmMode==null ? {}: alarmMode; this.alarmModes.push( {label:'邮件',value:AlarmStyle.email, disabled: false}, {label:'短信',value:AlarmStyle.sms, disabled: false}, {label:'语音',value:AlarmStyle.voice, disabled: false}, {label:'微信',value:AlarmStyle.weixin, disabled: false} ); validates['mode_enable'] = [alarmMode['enable']]; for(let i = 0; i<level_num; i++){ const n = i+1; validates['mode_level'+n] = [AlarmStyle[alarmMode['level'+n]]]; } this.validateForm = this.formBuilder.group(validates); this.grid.loading = false; this.enableKeys = Object.keys(this.validateForm.value).filter( (key: string) => { return key.endsWith('_enable'); } ); this.enableKeys.forEach( (key: string) => { this.validateForm.controls[key].valueChanges.subscribe( (value: any) => { if(this._allCheckTriggers <= 0){ this.refreshIndeterminate(); } else { this._allCheckTriggers--; } } ); } ); this.refreshIndeterminate(); } } alarmModes: {label:string,value:AlarmStyle,disabled: boolean} [] = []; backToList() { this.organizationService.handle = 'list'; this.organizationService.title = '组织列表'; } enableKeys: string []; indeterminate: boolean; checkAll(param){ this._allCheckTriggers = 0; this.enableKeys.forEach( (key: string) => { this._allCheckTriggers++; this.validateForm.controls[key].setValue(param); } ); this.refreshIndeterminate(); } private _allCheckTriggers: number = 0; refreshIndeterminate(){ const allChecked = this.enableKeys.every(key => this.validateForm.controls[key].value); const allUnChecked = this.enableKeys.every(key => !this.validateForm.controls[key].value); this.indeterminate = (!allChecked) && (!allUnChecked); } save($event, value, valid) { $event.preventDefault(); if (valid) { } } } src/app/routes/systems/organization/organization-list/organization-list.component.ts
@@ -1,3 +1,5 @@ import { AlarmConfigService } from '@business/services/http/alarm-config.service'; import { SensorsService } from '@business/services/http/sensors.service'; import { Router } from '@angular/router'; import { ModalHelper } from '@delon/theme'; import { NzModalService, NzMessageService } from 'ng-zorro-antd'; @@ -8,11 +10,13 @@ import { Subject } from 'rxjs/Subject'; import { Types } from '@business/enum/types.enum'; import { OrganizationEditComponent } from 'app/routes/systems/organization/organization-edit/organization-edit.component'; import { zip } from 'rxjs/observable/zip'; @Component({ selector: 'app-organization-list', templateUrl: './organization-list.component.html', styles: [] styles: [], providers: [AlarmConfigService] }) export class OrganizationListComponent implements OnInit { private organization: Organization; @@ -89,6 +93,8 @@ public msgSrv: NzMessageService, private modalHelper: ModalHelper, private router: Router, private sensorsService:SensorsService, private alarmConfigService:AlarmConfigService, ) {} ngOnInit() { @@ -205,8 +211,20 @@ this.load(); } config(row) { // 延时加载避免ExpressionChangedAfterItHasBeenCheckedError setTimeout(() => { this.grid.loading = true; }, 1); zip( this.sensorsService.getPagingList({pageIndex:0,pageSize:0}, null), this.alarmConfigService.getByOid( row.id ) ).subscribe(([pageBean, resultBean]) => { console.log(pageBean); this.grid.loading = false; this.organizationService.handle = 'config' ; this.organizationService.data = row; this.organizationService.config = {pageBean,resultBean}; this.organizationService.title = '组织配置'; }); } } src/app/routes/systems/organization/organization.component.html
@@ -1,4 +1,6 @@ <pro-header [title]="organizationService.title"></pro-header> <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> src/app/routes/systems/systems.module.ts
@@ -1,3 +1,4 @@ import { EqualValidator } from '@business/validators/equal-validator.directive'; import { FormBuilder } from '@angular/forms'; import { _HttpClient } from '@delon/theme'; import { Component, OnInit } from '@angular/core'; @@ -15,6 +16,8 @@ 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'; import { SensorsService } from '@business/services/http/sensors.service'; import { BusinessModule } from '@business/business.module'; const routes: Routes = [ { @@ -34,7 +37,8 @@ PipeModule, CommonModule, SharedModule, RouterModule.forChild(routes) RouterModule.forChild(routes), BusinessModule ], declarations: [ ...COMPONENTS_NOROUNT, @@ -44,7 +48,7 @@ OrganizationConfigComponent, OrganizationListComponent ], providers: [ToolsService, OrganizationService, _HttpClient, FormBuilder, AreacodeService], providers: [ToolsService, SensorsService,OrganizationService, _HttpClient, FormBuilder, AreacodeService], entryComponents: COMPONENTS_NOROUNT }) export class SystemsModule { }