10 files renamed
1 files deleted
11 files added
27 files modified
| | |
| | | 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'; |
| | |
| | | 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'; |
| | |
| | | |
| | | import { registerLocaleData } from '@angular/common'; |
| | | import localeZhHans from '@angular/common/locales/zh-Hans'; |
| | | |
| | | registerLocaleData(localeZhHans); |
| | | |
| | | // AoT requires an exported function for factories |
New file |
| | |
| | | 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; |
| | | } |
File was renamed from src/app/core/entity/grid.ts |
| | |
| | | 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; |
File was renamed from src/app/core/pipe/pipe.module.ts |
| | |
| | | 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: [ |
File was renamed from src/app/core/pipe/tyep-handle.pipe.ts |
| | |
| | | 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'; |
| | | |
| | | |
| | | |
File was renamed from src/app/core/services/areacode.service.ts |
| | |
| | | import { environment } from './../../../environments/environment.prod'; |
| | | import { Injectable } from '@angular/core'; |
| | | import { _HttpClient } from '@delon/theme/services/http/http.client'; |
| | | // Statics |
| | |
| | | import 'rxjs/add/operator/catch'; |
| | | import 'rxjs/add/operator/map'; |
| | | import { Observable } from 'rxjs/Observable'; |
| | | import { environment } from 'environments/environment'; |
| | | |
| | | @Injectable() |
| | | export class AreacodeService { |
File was renamed from src/app/routes/devices/monitor-point/monitor-point.service.ts |
| | |
| | | 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 { |
File was renamed from src/app/routes/systems/organization/organization.service.ts |
| | |
| | | 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', |
| | |
| | | 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> { |
New file |
| | |
| | | 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); |
| | | } |
| | | |
| | | } |
File was renamed from src/app/routes/devices/version/version.service.ts |
| | |
| | | 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() |
| | |
| | | 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> { |
| | |
| | | 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); |
| | | } |
| | | } |
New file |
| | |
| | | |
| | | 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; |
| | | } |
| | | } |
| | |
| | | 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'; |
| | |
| | | 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 = [ |
| | | { |
| | |
| | | MonitorPointComponent, |
| | | ...COMPONENTS_NOROUNT |
| | | ], |
| | | providers: [ToolsService, VersionService, MonitorPointService, _HttpClient, FormBuilder], |
| | | providers: [OrganizationService, VersionService, |
| | | SensorsService, AreacodeService, MonitorPointService, |
| | | _HttpClient, FormBuilder], |
| | | entryComponents: COMPONENTS_NOROUNT |
| | | }) |
| | | export class DevicesModule { } |
| | |
| | | <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> |
| | |
| | | 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', |
| | |
| | | }) |
| | | 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); |
| | | } |
| | | } |
| | | } |
| | | ); |
| | | } |
| | | } |
| | |
| | | <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> |
| | |
| | | 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', |
| | |
| | | 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( |
| | |
| | | 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]; |
| | |
| | | // 未作修改 |
| | | if (!isModified) { |
| | | ret.close(); |
| | | this.msgSrv.success('组织未作任何修改!'); |
| | | this.msgSrv.success(this.grid.title + '未作任何修改!'); |
| | | return; |
| | | } |
| | | } |
| | |
| | | if (res.code === 1) { |
| | | this.load(); |
| | | ret.close(); |
| | | this.msgSrv.success('组织保存成功!'); |
| | | this.msgSrv.success(this.grid.title + '保存成功!'); |
| | | } |
| | | } |
| | | ); |
| | |
| | | ( res: any) => { |
| | | if (res.code === 1) { |
| | | this.load(); |
| | | this.msgSrv.success('设备型号删除成功!'); |
| | | this.msgSrv.success(this.grid.title + '删除成功!'); |
| | | } |
| | | } |
| | | ); |
| | |
| | | } |
| | | this.load(); |
| | | } |
| | | |
| | | reset(ls: any[]) { |
| | | for (const item of ls) item.value = false; |
| | | this.load(true); |
| | | } |
| | | |
| | | } |
| | |
| | | </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> |
| | |
| | | <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> |
| | |
| | | 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', |
| | |
| | | ) { } |
| | | |
| | | 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] ], |
New file |
| | |
| | | <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> |
New file |
| | |
| | | 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(); |
| | | } |
| | | } |
| | |
| | | <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> |
| | |
| | | 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', |
| | |
| | | if (res.code === 1) { |
| | | this.load(); |
| | | ret.close(); |
| | | this.msgSrv.success('设备型号保存成功!'); |
| | | this.msgSrv.success(this.grid.title + '保存成功!'); |
| | | } |
| | | } |
| | | ); |
| | |
| | | ( res: any) => { |
| | | if (res.code === 1) { |
| | | this.load(); |
| | | this.msgSrv.success('设备型号删除成功!'); |
| | | this.msgSrv.success(this.grid.title + '删除成功!'); |
| | | } |
| | | } |
| | | ); |
| | |
| | | } |
| | | this.load(); |
| | | } |
| | | |
| | | reset(ls: any[]) { |
| | | for (const item of ls) item.value = false; |
| | | this.load(true); |
| | | 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 + '配置成功!'); |
| | | } |
| | | } |
| | | ); |
| | | }); |
| | | } |
| | | ); |
| | | |
| | | } |
| | | } |
| | |
| | | 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, |
| | |
| | | <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"> |
| | | <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> |
| | | |
| | | |
| | |
| | | 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', |
| | |
| | | }) |
| | | 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(); |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | <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> |
New file |
| | |
| | | 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(); |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
| | |
| | | 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 = [ |
| | | { |
| | |
| | | ] |
| | | } |
| | | ]; |
| | | |
| | | 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 { } |
| | |
| | | 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', |
New file |
| | |
| | | <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> |
New file |
| | |
| | | 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 = '组织列表'; |
| | | } |
| | | } |
| | |
| | | <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> |
| | |
| | | <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> |
| | |
| | | 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'; |
New file |
| | |
| | | <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"> |
| | | <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> |
| | | |
New file |
| | |
| | | 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 = '组织配置'; |
| | | } |
| | | } |
| | |
| | | <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"> |
| | | <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> |
| | | <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> |
| | | |
| | |
| | | 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', |
| | |
| | | styles: [] |
| | | }) |
| | | export class OrganizationComponent implements OnInit { |
| | | ngOnInit(): void { |
| | | |
| | | 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; |
| | | } |
| | | 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); |
| | | } |
| | | } |
| | |
| | | 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 = [ |
| | | { |
| | |
| | | ...COMPONENTS_NOROUNT, |
| | | AccountComponent, |
| | | AccountEditComponent, |
| | | OrganizationComponent |
| | | OrganizationComponent, |
| | | OrganizationConfigComponent, |
| | | OrganizationListComponent |
| | | ], |
| | | providers: [ToolsService, OrganizationService, _HttpClient, FormBuilder, AreacodeService], |
| | | entryComponents: COMPONENTS_NOROUNT |
| | |
| | | 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({ |
| | |
| | | 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({ |
| | |
| | | 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', |
| | |
| | | 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, |
| | |
| | | "@shared": [ "app/shared" ], |
| | | "@shared/*": [ "app/shared/*" ], |
| | | "@core": [ "app/core/" ], |
| | | "@core/*": [ "app/core/*" ] |
| | | "@core/*": [ "app/core/*" ], |
| | | "@business": [ "app/business/" ], |
| | | "@business/*": [ "app/business/*" ] |
| | | } |
| | | }, |
| | | "exclude": [ |
| | |
| | | "@shared": [ "app/shared" ], |
| | | "@shared/*": [ "app/shared/*" ], |
| | | "@core": [ "app/core/" ], |
| | | "@core/*": [ "app/core/*" ] |
| | | "@core/*": [ "app/core/*" ], |
| | | "@business": [ "app/business/" ], |
| | | "@business/*": [ "app/business/*" ] |
| | | } |
| | | }, |
| | | "files": [ |
| | |
| | | "@shared": [ "app/shared" ], |
| | | "@shared/*": [ "app/shared/*" ], |
| | | "@core": [ "app/core/" ], |
| | | "@core/*": [ "app/core/*" ] |
| | | "@core/*": [ "app/core/*" ], |
| | | "@business": [ "app/business/" ], |
| | | "@business/*": [ "app/business/*" ] |
| | | } |
| | | } |
| | | } |