|
- import { Component, OnInit, ViewChild, inject } from '@angular/core';
- import { STColumn, STComponent } from '@delon/abc/st';
- import { SFSchema } from '@delon/form';
- import { CommonModule } from '@angular/common';
- import { ModalHelper, _HttpClient } from '@delon/theme';
- import { SHARED_IMPORTS } from '@shared';
- import { DataVCardComponent } from '../card/card.component';
- import * as echarts from 'echarts';
- import { AgGridAngular } from 'ag-grid-angular';
- import { DataVTitleComponent } from '../title/title.component';
- import { ColDef } from 'ag-grid-community'; // Column Definition Type Interface
- import { NzProgressModule } from 'ng-zorro-antd/progress';
- import { NzBadgeModule } from 'ng-zorro-antd/badge';
- import { Subscription, finalize } from 'rxjs';
- import { IMqttMessage, MqttService } from 'ngx-mqtt';
- import { ChartComponentComponent } from './chart-component/chart-component.component';
- import { NzListModule } from 'ng-zorro-antd/list';
- import { TitleService } from '@delon/theme';
-
- @Component({
- selector: 'app-data-v-s1',
- standalone: true,
- templateUrl: './s1.component.html',
- styleUrls: ['./s1.component.less'],
- imports: [
- CommonModule,
- NzBadgeModule,
- NzProgressModule,
- AgGridAngular,
- DataVCardComponent,
- DataVTitleComponent,
- NzListModule,
- ...SHARED_IMPORTS,
- ChartComponentComponent
- ]
- })
- export class DataVS1Component implements OnInit {
- private readonly http = inject(_HttpClient);
- private readonly modal = inject(ModalHelper);
- chartConfig = {
- //每行数
- rowNumber: 1,
- //check 表格
- optionsCheckList: [
- { label: '全水', options: {}, checked: true },
- { label: '热值', options: {}, checked: true },
- { label: '全硫', options: {}, checked: false },
- { label: '内水', options: {}, checked: false },
- { label: '灰分', options: {}, checked: false },
- { label: '挥发分', options: {}, checked: false }
- ],
- //底部
- optionBottomList: [{}],
- //左边表格option
- optionsList: [
- { label: '全水', options: {}, checked: true },
- { label: '热值', options: {}, checked: true }
- ],
- //左边table
- tableList: [
- {
- coldef: [
- { headerName: '时间', field: 'rwmc', unSortIcon: true, minWidth: undefined, flex: 1 },
- { headerName: '系统/设备', field: 'rwms', unSortIcon: true, minWidth: undefined, flex: 1 },
- { headerName: '操作描述', field: 'kssj', unSortIcon: true, minWidth: undefined, flex: 1 },
- { headerName: '操作人员', field: 'jhwcsj', unSortIcon: true, minWidth: undefined, flex: 1 }
- ],
- rowData: []
- },
- {
- coldef: [
- { headerName: '序号', field: 'rwmc', unSortIcon: true, minWidth: undefined, flex: 1 },
- { headerName: '时间', field: 'kssj', unSortIcon: true, minWidth: undefined, flex: 1 },
- { headerName: '任务描述', field: 'rwms', unSortIcon: true, minWidth: undefined, flex: 1 },
- { headerName: '等级', field: 'dqzt', unSortIcon: true, minWidth: undefined, flex: 1 }
- ],
- rowData: []
- }
- ]
- };
- handleCheckedItems(checkedItems: { label: string; checked: boolean }[]) {
- console.log('当前选中的项目:', checkedItems);
- }
- chart_options = {};
- chart_options0 = {};
- chart_options1 = {};
- chart_options2 = {};
- chart_options3 = {};
- chart_options4 = {};
- rowData: object[] = [];
- colDefs1: ColDef[] = [
- { headerName: '时间', field: 'rwmc', flex: 1 },
- { headerName: '系统/设备', field: 'rwms', flex: 1 },
- { headerName: '操作描述', field: 'kssj', flex: 1 },
- { headerName: '操作人员', field: 'jhwcsj', flex: 1 }
- ];
- colDefs2: ColDef[] = [
- { headerName: '序号', field: 'rwmc', flex: 1 },
- { headerName: '时间', field: 'kssj', flex: 2 },
- { headerName: '任务描述', field: 'rwms', flex: 1 },
- { headerName: '等级', field: 'dqzt', flex: 1.5 }
- ];
- private subscription: Subscription;
- constructor(private _mqttService: MqttService) {
- this.subscription = this._mqttService.observe('s1').subscribe((message: IMqttMessage) => {
- const messagePayload = JSON.parse(message.payload.toString());
- console.log('Received message as object: ', messagePayload.msg);
- this.chart_options0 = messagePayload.msg;
- });
- }
- ngOnInit(): void {
- /** 获取服务器配置 */
- this.getServerConfig();
- for (var i = 1; i < 30; i++) {
- this.rowData.push({
- rwmc: '任务' + i,
- rwms: '任务描述' + i,
- kssj: '2024-1-' + i + ' 13:38:' + i * 11,
- jhwcsj: '2024-1-' + i + ' 13:38:' + i * 10,
- sfcq: '否',
- dqzt: '正常',
- dqjd: '节点' + i,
- sjwcsj: '2024-1-' + i + ' 13:38:' + i * 27,
- bjmc: '报警5',
- bjms: '报警描述5',
- bjsj: '2024-1-' + i + ' 13:38:' + i * 12,
- gzyy: '-',
- clff: '-',
- tzsj: '2024-1-' + i + ' 13:38:' + i * 19,
- zycd: '一般',
- tzmc: '系统提示',
- tznr: '账户登录',
- fj: '-',
- cz: '操作'
- });
- }
- var errorData = [];
- var categoryData = [];
- var barData = [];
- var dataCount = 100;
- for (var i = 0; i < dataCount; i++) {
- var val = Math.random() * 1000;
- categoryData.push('category' + i);
- errorData.push([i, echarts.number.round(Math.max(0, val - Math.random() * 100)), echarts.number.round(val + Math.random() * 80)]);
- barData.push(echarts.number.round(val, 2));
- }
- this.chart_options = {
- backgroundColor: 'transparent',
- series: [
- {
- type: 'gauge',
- startAngle: 180,
- endAngle: 0,
- center: ['50%', '75%'],
- radius: '90%',
- min: 0,
- max: 1,
- splitNumber: 8,
- axisLine: {
- lineStyle: {
- width: 6,
- color: [
- [0.25, '#74FAFB'],
- [0.5, '#74FAFB'],
- [0.75, '#74FAFB'],
- [1, '#74FAFB']
- ]
- }
- },
- pointer: {
- icon: 'path://M12.8,0.7l12,40.1H0.7L12.8,0.7z',
- length: '12%',
- width: 20,
- offsetCenter: [0, '-60%'],
- itemStyle: {
- color: 'auto'
- }
- },
- axisTick: {
- length: 12,
- lineStyle: {
- color: 'auto',
- width: 2
- }
- },
- splitLine: {
- length: 20,
- lineStyle: {
- color: 'auto',
- width: 5
- }
- },
- axisLabel: {
- color: '#464646',
- fontSize: 20,
- distance: -60,
- rotate: 'tangential',
- formatter: function (value: any) {
- if (value === 0.875) {
- return '';
- } else if (value === 0.625) {
- return '';
- } else if (value === 0.375) {
- return '';
- } else if (value === 0.125) {
- return '';
- }
- return '';
- }
- },
- title: {
- offsetCenter: [0, '-10%'],
- fontSize: 20
- },
- detail: {
- fontSize: 30,
- offsetCenter: [0, '-5%'],
- valueAnimation: true,
- formatter: function (value: any) {
- return Math.round(value * 100) + '';
- },
- color: 'inherit'
- },
- data: [
- {
- value: 0.9,
- name: ''
- }
- ]
- }
- ]
- };
- this.chart_options0 = {
- backgroundColor: 'transparent',
- series: [
- {
- type: 'gauge',
- startAngle: 180,
- endAngle: 0,
- center: ['50%', '75%'],
- radius: '90%',
- min: 0,
- max: 1,
- splitNumber: 8,
- axisLine: {
- lineStyle: {
- width: 6,
- color: [
- [0.25, '#74FAFB'],
- [0.5, '#74FAFB'],
- [0.75, '#74FAFB'],
- [1, '#74FAFB']
- ]
- }
- },
- pointer: {
- icon: 'path://M12.8,0.7l12,40.1H0.7L12.8,0.7z',
- length: '12%',
- width: 20,
- offsetCenter: [0, '-60%'],
- itemStyle: {
- color: 'auto'
- }
- },
- axisTick: {
- length: 12,
- lineStyle: {
- color: 'auto',
- width: 2
- }
- },
- splitLine: {
- length: 20,
- lineStyle: {
- color: 'auto',
- width: 5
- }
- },
- axisLabel: {
- color: '#464646',
- fontSize: 20,
- distance: -60,
- rotate: 'tangential',
- formatter: function (value: any) {
- if (value === 0.875) {
- return '';
- } else if (value === 0.625) {
- return '';
- } else if (value === 0.375) {
- return '';
- } else if (value === 0.125) {
- return '';
- }
- return '';
- }
- },
- title: {
- offsetCenter: [0, '0%'],
- fontSize: 20
- },
- detail: {
- fontSize: 30,
- offsetCenter: [0, '-5%'],
- valueAnimation: true,
- formatter: function (value: any) {
- return Math.round(value * 100) + '';
- },
- color: 'inherit'
- },
- data: [
- {
- value: 0.97,
- name: ''
- }
- ]
- }
- ]
- };
- this.chart_options1 = {
- title: {
- textStyle: {
- color: '#ffffff'
- },
- text: '全水',
- subtext: '(kg/kg)'
- },
- legend: {
- data: ['测量值', '上限值', '下限值']
- },
- calculable: true,
- xAxis: [
- {
- axisLine: {
- lineStyle: {
- color: [
- [0.25, '#74FAFB'],
- [0.5, '#74FAFB'],
- [0.75, '#74FAFB'],
- [1, '#74FAFB']
- ]
- }
- },
- position: 'bottom',
- type: 'category',
- data: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']
- }
- ],
- yAxis: [
- {
- type: 'value'
- }
- ],
- series: [
- {
- name: '测量值',
- type: 'line',
- data: [100, 155, 139, 199, 220, 160, 120, 182.2, 150, 155, 160, 180],
- markPoint: {
- data: [
- { name: '最大值', value: 220, xAxis: 4, yAxis: 220 },
- { name: '最小值', value: 100, xAxis: 0, yAxis: 100 }
- ]
- },
- markLine: {
- data: [{ type: 'average', name: '平均值' }]
- }
- },
- {
- type: 'custom',
- name: 'error',
- itemStyle: {
- borderWidth: 1.5
- },
- renderItem: function (_params: any, api: any) {
- var xValue = api.value(0);
- var highPoint = api.coord([xValue, api.value(1)]);
- var lowPoint = api.coord([xValue, api.value(2)]);
- var halfWidth = api.size([1, 0])[0] * 0.1;
- var style = api.style({
- stroke: api.visual('color'),
- fill: undefined
- });
- return {
- type: 'group',
- children: [
- {
- type: 'line',
- transition: ['shape'],
- shape: {
- x1: highPoint[0] - halfWidth,
- y1: highPoint[1],
- x2: highPoint[0] + halfWidth,
- y2: highPoint[1]
- },
- style: style
- },
- {
- type: 'line',
- transition: ['shape'],
- shape: {
- x1: highPoint[0],
- y1: highPoint[1],
- x2: lowPoint[0],
- y2: lowPoint[1]
- },
- style: style
- },
- {
- type: 'line',
- transition: ['shape'],
- shape: {
- x1: lowPoint[0] - halfWidth,
- y1: lowPoint[1],
- x2: lowPoint[0] + halfWidth,
- y2: lowPoint[1]
- },
- style: style
- }
- ]
- };
- },
- encode: {
- x: 0,
- y: [1, 2]
- },
- data: errorData,
- z: 100
- }
- ]
- };
-
- this.chart_options2 = {
- title: {
- text: '热值',
- subtext: '(kg/kg)'
- },
- legend: {
- data: ['超差样数量', '不合格样数量']
- },
- xAxis: [
- {
- type: 'category',
- // prettier-ignore
- data: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']
- }
- ],
- yAxis: [
- {
- type: 'value'
- }
- ],
- series: [
- {
- name: '超差样数量',
- type: 'line',
- data: [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3],
- markPoint: {
- data: [
- { type: 'max', name: 'Max' },
- { type: 'min', name: 'Min' }
- ]
- }
- },
- {
- name: '不合格样数量',
- type: 'bar',
- data: [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3],
- markPoint: {
- data: [
- { name: 'Max', value: 182.2, xAxis: 7, yAxis: 183 },
- { name: 'Min', value: 2.3, xAxis: 11, yAxis: 3 }
- ]
- },
- markLine: {
- data: [{ type: 'average', name: 'Avg' }]
- }
- }
- ],
- grid: {
- left: '3%',
- right: '3%',
- bottom: '3%',
- containLabel: true
- },
-
- toolbox: {
- show: false,
- feature: {
- dataView: { show: true, readOnly: false },
- magicType: { show: true, type: ['line', 'bar'] },
- restore: { show: true },
- saveAsImage: { show: true }
- }
- },
- calculable: true
- };
- this.chart_options3 = {
- title: {
- text: '煤样超差率'
- },
-
- grid: {
- top: '10%',
- left: '3%',
- right: '4%',
- bottom: '3%',
- containLabel: true
- },
- xAxis: {
- type: 'category',
- data: ['超差样量', '总样量']
- },
- yAxis: {
- type: 'value'
- },
- series: [
- {
- data: [3, 16],
- label: {
- show: true,
- position: 'top',
- formatter: function (data: { value: string }) {
- return data.value;
- }
- },
- type: 'bar'
- }
- ]
- };
- this.chart_options4 = {
- title: {
- text: '煤样合格率',
- left: 'center'
- },
- grid: {
- top: '10%',
- left: '3%',
- right: '4%',
- bottom: '3%',
- containLabel: true
- },
- xAxis: {
- type: 'category',
- data: ['超差样量', '总样量']
- },
- yAxis: {
- type: 'value'
- },
- series: [
- {
- data: [15, 16],
- type: 'bar',
- label: {
- show: true,
- position: 'top',
- formatter: function (data: { value: string }) {
- return data.value;
- }
- }
- }
- ]
- };
- //this.chartConfig.optionsCheckList[0].options = this.chart_options1;
- this.chartConfig.optionsCheckList[1].options = this.chart_options2;
- this.chartConfig.optionsCheckList[2].options = this.chart_options3;
- this.chartConfig.optionsCheckList[3].options = this.chart_options4;
- this.chartConfig.optionBottomList[0] = this.chart_options3;
- this.chartConfig.optionBottomList[1] = this.chart_options4;
- }
- public unsafePublish(topic: string, message: string): void {
- this._mqttService.unsafePublish(topic, message, { qos: 1, retain: true });
- }
- ngOnDestroy(): void {
- this.subscription.unsubscribe();
- }
- /**
- * 服务器获取配置
- */
- getServerConfig() {
- this.http.get('http://localhost:5006/api/config/s1').subscribe(res => {
- this.chartConfig.optionsCheckList[0].options = res['data'];
- console.log(res);
- });
- }
- }
|