fengxiang
2018-07-13 ef5b73ea0b7aed593312f728638d84b5358458ae
Merge branch 'master' of http://blit.7drlb.com:8888/r/screen_demo2
3 files added
9 files modified
882 ■■■■ changed files
src/app/routes/environment/management/management.component.html 30 ●●●●● patch | view | raw | blame | history
src/app/routes/environment/management/management.component.less 389 ●●●●● patch | view | raw | blame | history
src/app/routes/environment/management/management.component.ts 48 ●●●●● patch | view | raw | blame | history
src/app/routes/reports/query/query.component.html 143 ●●●● patch | view | raw | blame | history
src/app/routes/reports/reports.module.ts 5 ●●●● patch | view | raw | blame | history
src/app/routes/routes-routing.module.ts 5 ●●●● patch | view | raw | blame | history
src/app/routes/routes.module.ts 4 ●●● patch | view | raw | blame | history
src/app/routes/statistics/analysis/analysis.component.html 70 ●●●● patch | view | raw | blame | history
src/app/routes/statistics/analysis/analysis.component.ts 41 ●●●●● patch | view | raw | blame | history
src/app/routes/statistics/calendar/calendar.component.html 108 ●●●●● patch | view | raw | blame | history
src/app/routes/statistics/calendar/calendar.component.ts 25 ●●●●● patch | view | raw | blame | history
src/assets/app-data.json 14 ●●●● patch | view | raw | blame | history
src/app/routes/environment/management/management.component.html
New file
@@ -0,0 +1,30 @@
<div nz-row [nzGutter]="24" class="pt-lg">
    <div nz-col nzXs="24" nzSm="12" nzMd="12" nzLg="8">
        <chart-card [title]="'API优良天数'" total="216天" contentHeight="46px">
            <mini-progress height="46" percent="60" target="60" strokeWidth="8" color="#13C2C2"></mini-progress>
        </chart-card>
    </div>
    <div nz-col nzXs="24" nzSm="12" nzMd="12" nzLg="8">
        <chart-card [title]="'PM2.5优良天数'" total="158天" contentHeight="46px">
            <mini-progress height="46" percent="50" target="50" strokeWidth="8" color="#108ee9"></mini-progress>
        </chart-card>
    </div>
    <div nz-col nzXs="24" nzSm="12" nzMd="12" nzLg="8">
        <chart-card [title]="'PM10优良天数'" total="112天" contentHeight="46px">
            <mini-progress height="46" percent="40" target="40" strokeWidth="8" color="#00a854"></mini-progress>
        </chart-card>
    </div>
</div>
<div nz-row [nzGutter]="24">
    <div nz-col nzXs="24" nzSm="24" nzMd="24" nzLg="24">
        <nz-card [nzTitle]="nzTitle" [nzBordered]="false">
            <ng-template #nzTitle>
                同期对比
                <small class="text-sm font-weight-normal"></small>
            </ng-template>
            <timeline [data]="offlineChartData" [height]="239" [padding]="[0, 0, 0, 0]" [titleMap]="{ y1: '本月数据', y2: '上月同期' }"></timeline>
        </nz-card>
    </div>
</div>
src/app/routes/environment/management/management.component.less
New file
@@ -0,0 +1,389 @@
@import '~@delon/theme/styles/antd/themes/default.less';
@import '~@delon/abc/utils/utils.less';
:host ::ng-deep {
    .page-header {
        display: flex;
        .avatar {
            flex: 0 1 72px;
            margin-bottom: 8px;
            .ant-avatar {
                border-radius: 72px;
                display: block;
                width: 72px;
                height: 72px;
            }
        }
        .desc {
            position: relative;
            top: 4px;
            margin-left: 24px;
            flex: 1 1 auto;
            color: @text-color-secondary;
            line-height: 22px;
            .desc-title {
                font-size: 20px;
                line-height: 28px;
                font-weight: 500;
                color: @heading-color;
                margin-bottom: 12px;
            }
        }
    }
    .page-extra {
        .clearfix();
        float: right;
        & > div {
            padding: 0 32px;
            position: relative;
            float: left;
            & > p:first-child {
                color: @text-color-secondary;
                font-size: @font-size-base;
                line-height: 22px;
                margin-bottom: 4px;
            }
            & > p {
                color: @heading-color;
                font-size: 30px;
                line-height: 38px;
                margin: 0;
                & > span {
                    color: @text-color-secondary;
                    font-size: 20px;
                }
            }
            &:after {
                background-color: @border-color-split;
                position: absolute;
                top: 8px;
                right: 0;
                width: 1px;
                height: 40px;
                content: "";
            }
        }
        & > div:last-child {
            padding-right: 0;
            &:after {
                display: none;
            }
        }
    }
    .project-list {
        .ant-card-meta-description {
            color: @text-color-secondary;
            height: 44px;
            line-height: 22px;
            overflow: hidden;
        }
        .card-title {
            font-size: 0;
            a {
                color: @heading-color;
                margin-left: 12px;
                line-height: 24px;
                height: 24px;
                display: inline-block;
                vertical-align: top;
                font-size: @font-size-base;
                &:hover {
                    color: @primary-color;
                }
            }
        }
        .project-grid {
            width: 33.33%;
        }
        .project-item {
            display: flex;
            margin-top: 8px;
            overflow: hidden;
            font-size: 12px;
            height: 20px;
            line-height: 20px;
            .textOverflow();
            a {
                color: @text-color-secondary;
                display: inline-block;
                flex: 1 1 0;
                .textOverflow();
                &:hover {
                    color: @primary-color;
                }
            }
            .datetime {
                color: @disabled-color;
                flex: 0 0 auto;
                float: right;
            }
        }
    }
    .activities {
        padding: 0 24px 8px;
        .username {
            color: @text-color;
        }
        .event {
            font-weight: normal;
        }
    }
    .members {
        a {
          display: block;
          margin: 12px 0;
          line-height: 24px;
          height: 24px;
          .textOverflow();
          .member {
            font-size: @font-size-base;
            color: @text-color;
            line-height: 24px;
            max-width: 100px;
            vertical-align: top;
            margin-left: 12px;
            transition: all .3s;
            display: inline-block;
            .textOverflow();
          }
          &:hover {
            span {
              color: @primary-color;
            }
          }
        }
    }
    .datetime {
        color: @disabled-color;
    }
    .links {
        padding: 20px 0 8px 24px;
        font-size: 0;
        > a {
            color: rgba(0, 0, 0, 0.65);
            display: inline-block;
            font-size: 14px;
            margin-bottom: 13px;
            width: 25%;
        }
    }
    @media screen and (max-width: @screen-xl) and (min-width: @screen-lg) {
        .active-card {
            margin-bottom: 24px;
        }
        .members {
            margin-bottom: 0;
        }
        .page-extra {
            margin-left: -44px;
            & > div {
                padding: 0 16px;
            }
        }
    }
    @media screen and (max-width: @screen-lg) {
        .active-card {
            margin-bottom: 24px;
        }
        .members {
            margin-bottom: 0;
        }
        .page-extra {
            float: none;
            margin-right: 0;
            & > div {
                padding: 0 16px;
                text-align: left;
                &:after {
                    display: none;
                }
            }
        }
    }
    @media screen and (max-width: @screen-md) {
        .page-extra {
            margin-left: -16px;
        }
    }
    @media screen and (max-width: @screen-sm) {
        .page-header {
            display: block;
            .desc {
                margin-left: 0;
            }
        }
        .page-extra {
            & > div {
                float: none;
            }
        }
    }
    @media screen and (max-width: @screen-xs) {
        .project-list {
            .project-grid {
                width: 100%;
            }
        }
    }
    .icon-group {
        transition: color 0.32s;
        color: @text-color-secondary;
        cursor: pointer;
        margin-left: 16px;
        &:hover {
            color: @text-color;
        }
    }
    .rank-list {
        padding: 0px 32px 32px 72px;
        ul {
            margin-top: 25px;
        }
        li {
            zoom: 1;
            margin-top: 16px;
            display: flex;
            justify-content: space-between;
            .icon {
                background-color: #f5f5f5;
                border-radius: 20px;
                display: inline-block;
                font-size: 12px;
                font-weight: 600;
                margin-right: 24px;
                height: 20px;
                line-height: 20px;
                width: 20px;
                text-align: center;
            }
            .active {
                background-color: #314659;
                color: #fff;
            }
        }
    }
    .sales-extra {
        display: inline-block;
        margin-right: 24px;
        a {
            margin-left: 24px;
        }
    }
    .sales-card {
        .bar {
            padding: 0px 0px 32px 32px;
        }
        .rank {
            padding: 0 32px 32px 72px;
        }
        .ant-tabs-tab {
            padding-top: 16px;
            padding-bottom: 14px;
            line-height: 24px;
        }
        .ant-tabs-extra-content {
            padding-right: 24px;
            line-height: 55px;
        }
        .ant-card-head {
            position: relative;
        }
    }
    .sales-card-extra {
        height: 68px;
    }
    .sales-type-radio {
        position: absolute;
        left: 24px;
        bottom: 15px;
    }
    .offline-card {
        .ant-tabs-ink-bar {
            bottom: auto;
        }
        .ant-tabs-bar {
            border-bottom: none;
        }
        .ant-tabs-nav-container-scrolling {
            padding-left: 40px;
            padding-right: 40px;
        }
        .ant-tabs-tab-prev-icon:before {
            position: relative;
            left: 6px;
        }
        .ant-tabs-tab-next-icon:before {
            position: relative;
            right: 6px;
        }
    }
    .trend-text {
        margin-left: 8px;
        color: @heading-color;
    }
    @media screen and (max-width: @screen-lg) {
        .sales-extra {
            display: none;
        }
        .rank-list {
            li {
                span:first-child {
                    margin-right: 8px;
                }
            }
        }
    }
    @media screen and (max-width: @screen-md) {
        .rank-title {
            margin-top: 16px;
        }
        .sales-card .bar {
            padding: 16px;
        }
    }
    @media screen and (max-width: @screen-sm) {
        .sales-extra-wrap {
            display: none;
        }
        .sales-card {
            .ant-tabs-content {
                padding-top: 30px;
            }
        }
    }
    .ant-table-pagination {
        margin-bottom: 0;
    }
}
src/app/routes/environment/management/management.component.ts
New file
@@ -0,0 +1,48 @@
import { Component, OnInit, OnDestroy } from '@angular/core';
import { NzMessageService } from 'ng-zorro-antd';
import { _HttpClient } from '@delon/theme';
import { HttpClient } from '@angular/common/http';
import * as moment from 'moment';
import { DeviceService } from '@business/services/http/device.service';
@Component({
    selector: 'environment-management',
    templateUrl: './management.component.html',
    styleUrls: ['./management.component.less'],
    providers: [DeviceService]
})
export class EnvironmentManagementComponent implements OnInit, OnDestroy {
    offlineChartData: any[] = [];
    constructor(
        private deviceService: DeviceService,
        private http: _HttpClient,
        public msg: NzMessageService,
        private http2: HttpClient) {
    }
    ngOnInit() {
        const searchData = [];
        for (let i = 0; i < 50; i += 1) {
            searchData.push({
                index: i + 1,
                point: `监测站点-${i}`,
                value: Math.floor(Math.random() * 100)
            });
        }
        const offlineChartData = [];
        for (let i = 0; i < 20; i += 1) {
            offlineChartData.push({
                x: new Date().getTime() + 1000 * 60 * 30 * i,
                y1: Math.floor(Math.random() * 100) + 10,
                y2: Math.floor(Math.random() * 100) + 10
            });
        }
        this.offlineChartData = offlineChartData;
    }
    ngOnDestroy(): void {
    }
}
src/app/routes/reports/query/query.component.html
@@ -116,76 +116,73 @@
        </a>
    </div>
</nz-card>
<nz-card>
    <div nz-row [nzGutter]="16">
        <div nz-col [nzMd]="24">
            <div style="width:100%; text-align:center;">
                <span style="font-size:18px; font-weight: bold;">{{ _tableTitleTemp }}</span>
            </div>
        </div>
    </div>
    <div nz-row [nzGutter]="16">
        <div nz-col [nzMd]="24">
            <nz-table #nzTable [nzScroll]="{ x:tableWidth,y:350 }" [nzDataSource]="grid.data" [nzIsPagination]="false" [nzLoading]="grid.loading">
                <ng-template #nzFixedHeader>
                    <thead nz-thead>
                        <tr>
                            <th nz-th [nzWidth]="'160px'" [ngStyle]="{'position': 'relative', 'text-align':'center', 'left':sensorNameScrollLeft+'px'}">
                                <span>监测项目</span>
                            </th>
                            <th nz-th [nzWidth]="'80px'" *ngFor="let col of grid.columns" [ngStyle]="{'width':col.width,'text-align':col['align'] === undefined?'left':col.align}">
                                <span>{{ col.text }}</span>
                            </th>
                        </tr>
                    </thead>
                </ng-template>
                <tbody nz-tbody>
                    <tr nz-tbody-tr style="cursor:pointer;" *ngFor="let row of nzTable.data,index as i" (click)="switchSensor(i)" (mouseover)="sensorTableFocus(i)"
                        (mouseout)="sensorTableBlur(i)" [ngClass]="{'table-tr-bgcolor-focus': i === sensorTableFocusIndex,'table-tr-bgcolor-blur': i !== sensorTableFocusIndex}">
                        <td nz-td class='sensor-name' [ngStyle]="{'background-color': '#FFF'}">
                            <span>
                                <span>{{ row.sensor.name+'('+row.sensor.unit+')' }}</span>&nbsp;
                                <i *ngIf="chartSelectedIndex==i" class="anticon anticon-line-chart"></i>
                            </span>
                        </td>
                        <td nz-td *ngFor="let col of grid.columns,index as n" [ngStyle]="{'width':col.width,'text-align':col['align'] === undefined?'left':col.align}">
                            <span [ngSwitch]="col.type">
                                <!-- 要使用管道,无法自动生成 -->
                                <span title="{{ row.data[n]|tyepHandle:col:row }}" style="width:100%; display:block; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;"
                                    *ngSwitchDefault> {{ row.data[n]|tyepHandle:col:row }} </span>
                                <!-- 要使用管道,无法自动生成 -->
                            </span>
                        </td>
                    </tr>
                </tbody>
            </nz-table>
            <!--
            <div *ngIf="grid.data.length>0" [ngClass]="{'table-scroll':true,'table-scroll-box-shadow': sensorNameScrollLeft>2 }" style="position: absolute; top:0;">
                <nz-table #nzTable [nzDataSource]="grid.data" [nzIsPagination]="false">
                    <thead nz-thead>
                        <tr>
                            <th nz-th [nzWidth]="'160px'" style="text-align:center; position:relative; display:block; z-index:9;">
                                <span>监测项目</span>
                            </th>
                        </tr>
                    </thead>
                    <tbody nz-tbody [ngStyle]="{'top':sensorNameScrollTop+'px'}" style="position: relative; z-index:7; display:block;">
                        <tr nz-tbody-tr style="cursor:pointer;" *ngFor="let row of nzTable.data,index as i" (mouseover)="sensorTableFocus(i)" (mouseout)="sensorTableBlur(i)"
                            [ngClass]="{'table-tr-bgcolor-focus': i === sensorTableFocusIndex,'table-tr-bgcolor-blur': i !== sensorTableFocusIndex}"
                            (click)="switchSensor(i)">
                            <td nz-td class='sensor-name' [ngStyle]="{'width':'160px','text-align': 'center'}">
                                <span>
                                    <span>{{ row.sensor.name+'('+row.sensor.unit+')' }}</span>&nbsp;
                                    <i *ngIf="chartSelectedIndex==i" class="anticon anticon-line-chart"></i>
                                </span>
                            </td>
                        </tr>
                    </tbody>
                </nz-table>
            </div>
            -->
        </div>
    </div>
</nz-card>
<!--<nz-card>-->
    <!--<div nz-row [nzGutter]="16">-->
        <!--<div nz-col [nzMd]="24">-->
            <!--<div style="width:100%; text-align:center;">-->
                <!--<span style="font-size:18px; font-weight: bold;">{{ _tableTitleTemp }}</span>-->
            <!--</div>-->
        <!--</div>-->
    <!--</div>-->
    <!--<div nz-row [nzGutter]="16">-->
        <!--<div nz-col [nzMd]="24">-->
            <!--<nz-table #nzTable [nzScroll]="{ x:tableWidth,y:350 }" [nzDataSource]="grid.data" [nzIsPagination]="false" [nzLoading]="grid.loading">-->
                <!--<ng-template #nzFixedHeader>-->
                    <!--<thead nz-thead>-->
                        <!--<tr>-->
                            <!--<th nz-th [nzWidth]="'160px'" [ngStyle]="{'position': 'relative', 'text-align':'center', 'left':sensorNameScrollLeft+'px'}">-->
                                <!--<span>监测项目</span>-->
                            <!--</th>-->
                            <!--<th nz-th [nzWidth]="'80px'" *ngFor="let col of grid.columns" [ngStyle]="{'width':col.width,'text-align':col['align'] === undefined?'left':col.align}">-->
                                <!--<span>{{ col.text }}</span>-->
                            <!--</th>-->
                        <!--</tr>-->
                    <!--</thead>-->
                <!--</ng-template>-->
                <!--<tbody nz-tbody>-->
                    <!--<tr nz-tbody-tr style="cursor:pointer;" *ngFor="let row of nzTable.data,index as i" (click)="switchSensor(i)" (mouseover)="sensorTableFocus(i)"-->
                        <!--(mouseout)="sensorTableBlur(i)" [ngClass]="{'table-tr-bgcolor-focus': i === sensorTableFocusIndex,'table-tr-bgcolor-blur': i !== sensorTableFocusIndex}">-->
                        <!--<td nz-td class='sensor-name' [ngStyle]="{'background-color': '#FFF'}">-->
                            <!--<span>-->
                                <!--<span>{{ row.sensor.name+'('+row.sensor.unit+')' }}</span>&nbsp;-->
                                <!--<i *ngIf="chartSelectedIndex==i" class="anticon anticon-line-chart"></i>-->
                            <!--</span>-->
                        <!--</td>-->
                        <!--<td nz-td *ngFor="let col of grid.columns,index as n" [ngStyle]="{'width':col.width,'text-align':col['align'] === undefined?'left':col.align}">-->
                            <!--<span [ngSwitch]="col.type">-->
                                <!--&lt;!&ndash; 要使用管道,无法自动生成 &ndash;&gt;-->
                                <!--<span title="{{ row.data[n]|tyepHandle:col:row }}" style="width:100%; display:block; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;"-->
                                    <!--*ngSwitchDefault> {{ row.data[n]|tyepHandle:col:row }} </span>-->
                                <!--&lt;!&ndash; 要使用管道,无法自动生成 &ndash;&gt;-->
                            <!--</span>-->
                        <!--</td>-->
                    <!--</tr>-->
                <!--</tbody>-->
            <!--</nz-table>-->
            <!---->
            <!--<div *ngIf="grid.data.length>0" [ngClass]="{'table-scroll':true,'table-scroll-box-shadow': sensorNameScrollLeft>2 }" style="position: absolute; top:0;">-->
                <!--<nz-table #nzTable [nzDataSource]="grid.data" [nzIsPagination]="false">-->
                    <!--<thead nz-thead>-->
                        <!--<tr>-->
                            <!--<th nz-th [nzWidth]="'160px'" style="text-align:center; position:relative; display:block; z-index:9;">-->
                                <!--<span>监测项目</span>-->
                            <!--</th>-->
                        <!--</tr>-->
                    <!--</thead>-->
                    <!--<tbody nz-tbody [ngStyle]="{'top':sensorNameScrollTop+'px'}" style="position: relative; z-index:7; display:block;">-->
                        <!--<tr nz-tbody-tr style="cursor:pointer;" *ngFor="let row of nzTable.data,index as i" (mouseover)="sensorTableFocus(i)" (mouseout)="sensorTableBlur(i)"-->
                            <!--[ngClass]="{'table-tr-bgcolor-focus': i === sensorTableFocusIndex,'table-tr-bgcolor-blur': i !== sensorTableFocusIndex}"-->
                            <!--(click)="switchSensor(i)">-->
                            <!--<td nz-td class='sensor-name' [ngStyle]="{'width':'160px','text-align': 'center'}">-->
                                <!--<span>-->
                                    <!--<span>{{ row.sensor.name+'('+row.sensor.unit+')' }}</span>&nbsp;-->
                                    <!--<i *ngIf="chartSelectedIndex==i" class="anticon anticon-line-chart"></i>-->
                                <!--</span>-->
                            <!--</td>-->
                        <!--</tr>-->
                    <!--</tbody>-->
                <!--</nz-table>-->
            <!--</div>-->
        <!--</div>-->
    <!--</div>-->
<!--</nz-card>-->
src/app/routes/reports/reports.module.ts
@@ -7,6 +7,7 @@
import { DemoComponent } from './demo/demo.component';
import { ExcelComponent } from './excel/excel.component';
import { QueryComponent } from './query/query.component';
import { Query2Component } from './query2/query2.component';
import { PipeModule } from '@business/pipe/pipe.module';
import { NzTreeModule } from 'ng-tree-antd';
import { NgxEchartsModule } from 'ngx-echarts';
@@ -26,6 +27,7 @@
      { path: 'demo', component: DemoComponent },
      { path: 'excel', component: ExcelComponent },
      { path: 'alarm', component: AlarmComponent },
        { path: 'query2', component: Query2Component },
    ]
  }
];
@@ -48,7 +50,8 @@
    DemoComponent,
    ExcelComponent,
    AlarmComponent,
    QueryComponent
    QueryComponent,
      Query2Component
  ],
  providers: [SensorsService, NzMessageService, AreacodeService,
     MonitorPointService, DeviceService, DateService],
src/app/routes/routes-routing.module.ts
@@ -18,6 +18,7 @@
import { MonitorpointComponent } from 'app/routes/statistics/monitorpoint/monitorpoint.component';
import { CalendarComponent } from 'app/routes/statistics/calendar/calendar.component';
import { AnalysisComponent } from 'app/routes/statistics/analysis/analysis.component';
import { EnvironmentManagementComponent } from 'app/routes/environment/management/management.component';
const routes: Routes = [
    {
@@ -45,7 +46,9 @@
            { path: 'statistics/monitorpoint', component: MonitorpointComponent },
            { path: 'statistics/calendar', component: CalendarComponent },
            { path: 'statistics/analysis', component: AnalysisComponent }
            { path: 'statistics/analysis', component: AnalysisComponent },
            { path: 'environment/management', component: EnvironmentManagementComponent }
        ]
    },    // passport
    {
src/app/routes/routes.module.ts
@@ -18,6 +18,7 @@
import { MonitorpointComponent } from './statistics/monitorpoint/monitorpoint.component';
import { CalendarComponent } from './statistics/calendar/calendar.component';
import { AnalysisComponent } from './statistics/analysis/analysis.component';
import { EnvironmentManagementComponent } from './environment/management/management.component';
// Statics
import 'rxjs/add/observable/throw';
@@ -46,7 +47,8 @@
        PollutionManagementComponent,
        MonitorpointComponent,
        CalendarComponent,
        AnalysisComponent
        AnalysisComponent,
        EnvironmentManagementComponent
    ],
    providers: [
        _HttpClient,
src/app/routes/statistics/analysis/analysis.component.html
@@ -1,45 +1,41 @@
<div nz-row [nzGutter]="24" class="pt-lg">
    <div nz-col nzXs="24" nzSm="12" nzMd="12" nzLg="8">
        <chart-card [title]="'API优良天数'" total="216天" contentHeight="46px">
            <mini-progress height="46" percent="60" target="60" strokeWidth="8" color="#13C2C2"></mini-progress>
        </chart-card>
    </div>
    <div nz-col nzXs="24" nzSm="12" nzMd="12" nzLg="8">
        <chart-card [title]="'PM2.5优良天数'" total="158天" contentHeight="46px">
            <mini-progress height="46" percent="50" target="50" strokeWidth="8" color="#108ee9"></mini-progress>
        </chart-card>
    </div>
    <div nz-col nzXs="24" nzSm="12" nzMd="12" nzLg="8">
        <chart-card [title]="'PM10优良天数'" total="112天" contentHeight="46px">
            <mini-progress height="46" percent="40" target="40" strokeWidth="8" color="#00a854"></mini-progress>
        </chart-card>
    </div>
</div>
<div nz-row [nzGutter]="24">
    <div nz-col nzXs="24" nzSm="24" nzMd="24" nzLg="24">
        <nz-card [nzLoading]="loading" [nzBordered]="false" nzTitle="警报类别占比" [nzBodyStyle]="{'padding.px': 24}" class="sales-card" style="min-height: 482px;">
            <ng-template #extra>
                <div class="sales-card-extra">
                    <div class="sales-type-radio">
                        <nz-radio-group [(ngModel)]="salesType" (ngModelChange)="changeSaleType()" [nzSize]="'large'">
                            <label nz-radio-button [nzValue]="'1'"><span>PM2.5</span></label>
                            <label nz-radio-button [nzValue]="'2'"><span>PM10</span></label>
                            <label nz-radio-button [nzValue]="'3'"><span>SO2</span></label>
                            <label nz-radio-button [nzValue]="'4'"><span>NO3</span></label>
                            <label nz-radio-button [nzValue]="'5'"><span>O3</span></label>
                            <label nz-radio-button [nzValue]="'6'"><span>CO</span></label>
                        </nz-radio-group>
                    </div>
                </div>
        <nz-card [nzTitle]="nzTitle1" [nzBordered]="false">
            <ng-template #nzTitle1>
                同期对比
                <span class="text-md font-weight-normal" style="color:red">PM2.5</span>
            </ng-template>
            <ng-template #body>
                <h4 class="margin:8px 0 32px 0;">站点排序结果</h4>
                <nz-table #keyTable [nzDataSource]="data.searchData" [nzPageSize]="5" nzSize="small">
                    <thead nz-thead>
                    <tr>
                        <th nz-th><span>序号</span></th>
                        <th nz-th><span>站点名称</span></th>
                        <th nz-th class="text-right">
                            <span>因子数值 mg/m3</span>
                            <nz-table-sort (nzValueChange)="sort('count',$event)"></nz-table-sort>
                        </th>
                    </tr>
                    </thead>
                    <tbody nz-tbody>
                    <tr nz-tbody-tr *ngFor="let i of keyTable.data">
                        <td nz-td>{{i.index}}</td>
                        <td nz-td><a (click)="msg.success(i.point)">{{i.point}}</a></td>
                        <td nz-td class="text-right">{{i.value}}</td>
                    </tr>
                    </tbody>
                </nz-table>
            </ng-template>
            <timeline [data]="offlineChartData1" [height]="239" [padding]="[0, 0, 0, 0]" [titleMap]="{ y1: '本月数据', y2: '上月同期' }"></timeline>
        </nz-card>
    </div>
</div>
<div nz-row [nzGutter]="24">
    <div nz-col nzXs="24" nzSm="24" nzMd="24" nzLg="24">
        <nz-card [nzTitle]="nzTitle2" [nzBordered]="false">
            <ng-template #nzTitle2>
                同期对比
                <span class="text-md font-weight-normal" style="color:red">PM10</span>
            </ng-template>
            <timeline [data]="offlineChartData2" [height]="239" [padding]="[0, 0, 0, 0]" [titleMap]="{ y1: '本月数据', y2: '上月同期' }"></timeline>
        </nz-card>
    </div>
</div>
src/app/routes/statistics/analysis/analysis.component.ts
@@ -13,7 +13,8 @@
})
export class AnalysisComponent implements OnInit, OnDestroy {
    data: any = {};
    offlineChartData1: any[] = [];
    offlineChartData2: any[] = [];
    constructor(
        private deviceService: DeviceService,
@@ -23,34 +24,24 @@
    }
    ngOnInit() {
        const searchData = [];
        for (let i = 0; i < 50; i += 1) {
            searchData.push({
                index: i + 1,
                point: `监测站点-${i}`,
                value: Math.floor(Math.random() * 100)
        const offlineChartData1 = [];
        const offlineChartData2 = [];
        for (let i = 0; i < 20; i += 1) {
            offlineChartData1.push({
                x: new Date().getTime() + 1000 * 60 * 30 * i,
                y1: Math.floor(Math.random() * 100) + 10,
                y2: Math.floor(Math.random() * 100) + 10
            });
            offlineChartData2.push({
                x: new Date().getTime() + 1000 * 60 * 30 * i,
                y1: Math.floor(Math.random() * 100) + 10,
                y2: Math.floor(Math.random() * 100) + 10
            });
        }
        this.data = {
            searchData: searchData
        };
        this.offlineChartData1 = offlineChartData1;
        this.offlineChartData2 = offlineChartData2;
    }
    ngOnDestroy(): void {
    }
    sort(sortName, sortValue) {
        this.data.searchData = [
            ...(<any[]>this.data.searchData).sort((a, b) => {
                if (a[sortName] > b[sortName]) {
                    return (sortValue === 'ascend') ? 1 : -1;
                } else if (a[sortName] < b[sortName]) {
                    return (sortValue === 'ascend') ? -1 : 1;
                } else {
                    return 0;
                }
            })
        ];
    }
}
src/app/routes/statistics/calendar/calendar.component.html
@@ -1,45 +1,75 @@
<div nz-row [nzGutter]="24">
    <div nz-col nzXs="24" nzSm="24" nzMd="24" nzLg="24">
        <nz-card [nzLoading]="loading" [nzBordered]="false" nzTitle="警报类别占比" [nzBodyStyle]="{'padding.px': 24}" class="sales-card" style="min-height: 482px;">
            <ng-template #extra>
                <div class="sales-card-extra">
                    <div class="sales-type-radio">
                        <nz-radio-group [(ngModel)]="salesType" (ngModelChange)="changeSaleType()" [nzSize]="'large'">
                            <label nz-radio-button [nzValue]="'1'"><span>PM2.5</span></label>
                            <label nz-radio-button [nzValue]="'2'"><span>PM10</span></label>
                            <label nz-radio-button [nzValue]="'3'"><span>SO2</span></label>
                            <label nz-radio-button [nzValue]="'4'"><span>NO3</span></label>
                            <label nz-radio-button [nzValue]="'5'"><span>O3</span></label>
                            <label nz-radio-button [nzValue]="'6'"><span>CO</span></label>
                        </nz-radio-group>
<div nz-row [nzGutter]="24" style="padding: 20px">
    <div nz-col nzXs="24" nzSm="12" nzMd="24" nzLg="9">
        <div nz-form-control nz-col [nzSm]="20">
            <nz-datepicker></nz-datepicker>
                    </div>
                </div>
            </ng-template>
            <ng-template #body>
                <h4 class="margin:8px 0 32px 0;">站点排序结果</h4>
                <nz-table #keyTable [nzDataSource]="data.searchData" [nzPageSize]="5" nzSize="small">
                    <thead nz-thead>
                    <tr>
                        <th nz-th><span>序号</span></th>
                        <th nz-th><span>站点名称</span></th>
                        <th nz-th class="text-right">
                            <span>因子数值 mg/m3</span>
                            <nz-table-sort (nzValueChange)="sort('count',$event)"></nz-table-sort>
                        </th>
                    </tr>
                    </thead>
                    <tbody nz-tbody>
                    <tr nz-tbody-tr *ngFor="let i of keyTable.data">
                        <td nz-td>{{i.index}}</td>
                        <td nz-td><a (click)="msg.success(i.point)">{{i.point}}</a></td>
                        <td nz-td class="text-right">{{i.value}}</td>
                    </tr>
                    </tbody>
                </nz-table>
            </ng-template>
        </nz-card>
    <div nz-col nzXs="24" nzSm="12" nzMd="24" nzLg="15">
        <div nz-col nzXs="24" nzSm="12" nzMd="6" class="mb-md">
            <div nz-row nzType="flex" nzAlign="middle" class="bg-primary rounded-md">
                <div nz-col nzSpan="24" class="p-md text-white" style="height: 90px;text-align: center;">
                    <div style="height: 40px;" class="h2 mt0">100</div>
                    <p class="text-nowrap mb0">AQI</p>
                </div>
            </div>
        </div>
        <div nz-col nzXs="24" nzSm="12" nzMd="6" class="mb-md">
            <div nz-row nzType="flex" nzAlign="middle" class="bg-success rounded-md">
                <div nz-col nzSpan="24" class="p-md text-white" style="height: 90px;text-align: center;">
                    <div style="height: 40px;" class="h2 mt0">30 ℃</div>
                    <p class="text-nowrap mb0">温度</p>
                </div>
            </div>
        </div>
        <div nz-col nzXs="24" nzSm="12" nzMd="6" class="mb-md">
            <div nz-row nzType="flex" nzAlign="middle" class="bg-orange rounded-md">
                <div nz-col nzSpan="24" class="p-md text-white" style="height: 90px;text-align: center;">
                    <div style="height: 40px;" class="h2 mt0">2.5</div>
                    <p class="text-nowrap mb0">风向</p>
                </div>
            </div>
        </div>
        <div nz-col nzXs="24" nzSm="12" nzMd="6" class="mb-md">
            <div nz-row nzType="flex" nzAlign="middle" class="bg-pink rounded-md">
                <div nz-col nzSpan="24" class="p-md text-white" style="height: 90px;text-align: center;">
                    <div style="height: 40px;" class="h2 mt0">78 mg/m³</div>
                    <p class="text-nowrap">PM2.5</p>
                </div>
            </div>
        </div>
        <div nz-col nzXs="24" nzSm="12" nzMd="6" class="mb-md">
            <div nz-row nzType="flex" nzAlign="middle" class="bg-primary rounded-md">
                <div nz-col nzSpan="24" class="p-md text-white" style="height: 90px;text-align: center;">
                    <div style="height: 40px;" class="h2 mt0">100</div>
                    <p class="text-nowrap mb0">AQI</p>
                </div>
            </div>
        </div>
        <div nz-col nzXs="24" nzSm="12" nzMd="6" class="mb-md">
            <div nz-row nzType="flex" nzAlign="middle" class="bg-success rounded-md">
                <div nz-col nzSpan="24" class="p-md text-white" style="height: 90px;text-align: center;">
                    <div style="height: 40px;" class="h2 mt0">30 ℃</div>
                    <p class="text-nowrap mb0">温度</p>
                </div>
            </div>
        </div>
        <div nz-col nzXs="24" nzSm="12" nzMd="6" class="mb-md">
            <div nz-row nzType="flex" nzAlign="middle" class="bg-orange rounded-md">
                <div nz-col nzSpan="24" class="p-md text-white" style="height: 90px;text-align: center;">
                    <div style="height: 40px;" class="h2 mt0">2.5</div>
                    <p class="text-nowrap mb0">风向</p>
                </div>
            </div>
        </div>
        <div nz-col nzXs="24" nzSm="12" nzMd="6" class="mb-md">
            <div nz-row nzType="flex" nzAlign="middle" class="bg-pink rounded-md">
                <div nz-col nzSpan="24" class="p-md text-white" style="height: 90px;text-align: center;">
                    <div style="height: 40px;" class="h2 mt0">78 mg/m³</div>
                    <p class="text-nowrap">PM2.5</p>
                </div>
            </div>
        </div>
    </div>
</div>
src/app/routes/statistics/calendar/calendar.component.ts
@@ -23,34 +23,9 @@
    }
    ngOnInit() {
        const searchData = [];
        for (let i = 0; i < 50; i += 1) {
            searchData.push({
                index: i + 1,
                point: `监测站点-${i}`,
                value: Math.floor(Math.random() * 100)
            });
        }
        this.data = {
            searchData: searchData
        };
    }
    ngOnDestroy(): void {
    }
    sort(sortName, sortValue) {
        this.data.searchData = [
            ...(<any[]>this.data.searchData).sort((a, b) => {
                if (a[sortName] > b[sortName]) {
                    return (sortValue === 'ascend') ? 1 : -1;
                } else if (a[sortName] < b[sortName]) {
                    return (sortValue === 'ascend') ? -1 : 1;
                } else {
                    return 0;
                }
            })
        ];
    }
}
src/assets/app-data.json
@@ -27,17 +27,7 @@
            {
              "text": "环境管理",
              "icon": "icon-directions",
              "children": [
                {
                  "text": "考核指标",
                  "link": "/"
                }
                ,
                {
                  "text": "分析",
                  "link": "/"
                }
              ]
              "link": "/environment/management"
            },
            {
              "text": "污染管控",
@@ -75,7 +65,7 @@
                        "link": "/statistics/calendar"
                }, {
                        "text": "站点数据分析",
                        "link": "/statistics/monitorpoint"
                        "link": "/reports/query2"
                }]
            },
            {