import { HttpClient } from '@angular/common/http'; import { Component, OnInit, ViewContainerRef, ElementRef } from '@angular/core'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import * as echarts from 'echarts'; import { NzModalService } from 'ng-zorro-antd/modal'; import { GetOutOfLineDetailsComponent } from '../today-warning/get-out-of-line-details/get-out-of-line-details.component'; import * as moment from 'moment'; import { fromEvent } from 'rxjs'; import { debounceTime } from 'rxjs/operators'; import { Router } from '@angular/router'; import { OilUnloadingProcessComponent } from '../oil-unloading-process/oil-unloading-process.component'; import { TreeService } from 'src/app/service/tree.service'; @Component({ selector: 'app-oil-unloading-process-list', templateUrl: './oil-unloading-process-list.component.html', styleUrls: ['./oil-unloading-process-list.component.scss'] }) export class OilUnloadingProcessListComponent implements OnInit { validateForm!: FormGroup; constructor(private toTree: TreeService, private http: HttpClient, private fb: FormBuilder, private router: Router, private modal: NzModalService, private viewContainerRef: ViewContainerRef, private element: ElementRef) { } myChart: any //左侧饼图 mybarChart: any //柱状图 getThirtyDays() { //获取当前日期 let myDate = new Date(); var nowY = myDate.getFullYear(); var nowM = myDate.getMonth() + 1; var nowD = myDate.getDate(); var enddateStr = nowY + "-" + (nowM < 10 ? "0" + nowM : nowM) + "-" + (nowD < 10 ? "0" + nowD : nowD);//当前日期 var enddate = new Date(enddateStr); //获取三十天前日期 var lw = new Date(new Date().getTime() - 1000 * 60 * 60 * 24 * 30);//最后一个数字30可改,30天的意思 var lastY = lw.getFullYear(); var lastM = lw.getMonth() + 1; var lastD = lw.getDate(); var startdateStr = lastY + "-" + (lastM < 10 ? "0" + lastM : lastM) + "-" + (lastD < 10 ? "0" + lastD : lastD);//三十天之前日期 var startDate = new Date(startdateStr); const dateList = [] while (true) { startDate.setDate(startDate.getDate() + 1) if (startDate.getTime() <= enddate.getTime()) { if (startDate.getDate() < 10) { // startDate.getFullYear() 获取年,此处没加上年份 dateList.push((startDate.getMonth() + 1) + '.0' + startDate.getDate()) } else { dateList.push((startDate.getMonth() + 1) + '.' + startDate.getDate()) } } else { break } } return dateList; } isEcharts: boolean = true isEchartsShow() { this.isEcharts = !this.isEcharts } startdate enddate isOrShow: boolean isMisinformation: boolean = false//误报按钮的显隐 ngOnInit(): void { let loginUserInfo if (sessionStorage.getItem('isGasStation') == 'true') { loginUserInfo = JSON.parse(sessionStorage.getItem('userdataOfgasstation')) } else { loginUserInfo = JSON.parse(sessionStorage.getItem('userdata')) } if (loginUserInfo.roles.find((item) => { return item.name == 'ViolationPositiveCensorer' })) { this.isMisinformation = true } else { this.isMisinformation = false } //当前日期 let myDate: any = new Date(); let nowY = myDate.getFullYear(); let nowM = myDate.getMonth() + 1; let nowD = myDate.getDate(); this.enddate = nowY + "-" + (nowM < 10 ? "0" + nowM : nowM) + "-" + (nowD < 10 ? "0" + nowD : nowD);//当前日期 //获取三十天前日期 let lw = new Date(myDate - 1000 * 60 * 60 * 24 * 30);//最后一个数字30可改,30天的意思 let lastY = lw.getFullYear(); let lastM = lw.getMonth() + 1; let lastD = lw.getDate(); this.startdate = lastY + "-" + (lastM < 10 ? "0" + lastM : lastM) + "-" + (lastD < 10 ? "0" + lastD : lastD);//三十天之前日期 this.validateForm = this.fb.group({ state: [null], organization: [null], datePicker: [[this.startdate, this.enddate]] }); // 饼图 this.myChart = echarts.init(document.getElementById('piechart')); //柱状折线图 this.mybarChart = echarts.init(document.getElementById('barchart')); this.tableSpin = true this.getAllOrganization() this.getAggregations() if (this.router.url.indexOf('petrolStation') != -1) { this.isOrShow = false } else { this.isOrShow = true } } //刷新饼图图表数据 num echartsData: any //一级饼图 oilchartpieOption = { color: ['#FF4B65', '#36A2FF'], tooltip: { trigger: 'item'//触发类型 }, legend: { bottom: '12%', left: 'center', itemGap: 40, itemWidth: 8, itemHeight: 8, formatter: (name) => { let data = this.oilchartpieOptionPieData1 let value for (var i = 0, l = data.length; i < l; i++) { if (data[i].name == name) { value = data[i].value; } } return '{a|' + name + '}' + '{b|' + value + '}'; }, textStyle: { color: '#fff', rich: { a: { width: 80 } } } }, series: [ { type: 'pie', radius: ['50%', '60%'], bottom: '10%', avoidLabelOverlap: false,//防止标签重叠策略 label: {//每一个标签外网延伸的引导说明 show: false, position: 'outside' }, data: [], tooltip: {//鼠标移入提示 position: 'right', padding: [14, 19], backgroundColor: 'rgba(28, 129, 218, 0.4)', textStyle: { color: '#fff', fontSize: 12 } } } ] }; oilchartpieOptionPieData1: any //一级柱状图 oilchartbarOption = { xAxis: { type: 'category', data: [], axisLine: { show: false, lineStyle: { color: '#91CCFF' } }, axisTick: {//刻度线 show: false }, inverse: true }, yAxis: { type: 'value', nameTextStyle: { color: '#C4E2FC' }, splitLine: {//分割线 lineStyle: { color: ['#0f4374'], width: 2 } }, axisTick: {//刻度线 show: false }, axisLine: {//轴线 show: false, lineStyle: { color: '#C4E2FC' } } }, tooltip: { // trigger: 'axis' }, series: [ { name: '卸油事件', data: [], type: 'bar', itemStyle: { color: { type: 'linear', x: 0, y: 0, x2: 0, y2: 1, colorStops: [{ offset: 0, color: '#23F0FF' // 0% 处的颜色 }, { offset: 1, color: 'rgba(35, 153, 255, 0.1)' // 100% 处的颜色 }], global: false // 缺省为 false } }, barWidth: '25%' }, { name: '卸油预警', data: [], type: 'line', symbol: 'circle', symbolSize: 8, label: { show: true }, itemStyle: { color: '#fff', shadowColor: '#fff', shadowBlur: 10 }, lineStyle: { color: '#FFCC8A', width: 1 } } ], legend: { selectedMode: false, // 是否允许点击 data: ['卸油事件','卸油预警'], textStyle: { color: '#fff' }, right: 28, top: 18, itemWidth: 8, itemHeight: 8, }, grid: { left: '42px', right: '30px', bottom: '38px', top: '80px' } }; //二级饼图 oilchartpieOption2 = { color: ['#36A2FF', '#FFBD4B', '#46DFFF'], tooltip: { trigger: 'item'//触发类型 }, legend: { bottom: '8%', left: 'center', itemGap: 10, itemWidth: 8, itemHeight: 8, formatter: (name) => { let data = this.oilchartpieOptionPieData2 let value for (var i = 0, l = data.length; i < l; i++) { if (data[i].name == name) { value = data[i].value; } } return '{a|' + name + '}' + '{b|' + value + '}'; }, textStyle: { color: '#fff', rich: { a: { width: 60 } } } }, series: [ { type: 'pie', radius: ['50%', '60%'], bottom: '10%', avoidLabelOverlap: false,//防止标签重叠策略 label: {//每二个标签外网延伸的引导说明 show: false, position: 'outside' }, data: [], tooltip: {//鼠标移入提示 position: 'right', padding: [14, 19], backgroundColor: 'rgba(28, 129, 218, 0.4)', textStyle: { color: '#fff', fontSize: 12 } } } ] }; oilchartpieOptionPieData2: any //二级柱状图 oilchartbarOption2 = { tooltip: { // trigger: 'axis' }, xAxis: { type: 'category', data: [], axisLine: { show: false, lineStyle: { color: '#91CCFF' } }, axisTick: {//刻度线 show: false }, inverse: true }, yAxis: { type: 'value', nameTextStyle: { color: '#C4E2FC' }, splitLine: {//分割线 lineStyle: { color: ['#0f4374'], width: 2 } }, axisTick: {//刻度线 show: false }, axisLine: {//轴线 show: false, lineStyle: { color: '#C4E2FC' } } }, legend: { selectedMode: false, // 是否允许点击 data: ['事前准备', '事中操作', '全程监测'], textStyle: { color: '#fff' }, right: 18, top: 18, itemWidth: 8, itemHeight: 8, }, series: [ { name: '', data: [], type: 'bar', itemStyle: { color: { type: 'linear', x: 0, y: 0, x2: 0, y2: 1, colorStops: [{ offset: 0, color: 'rgba(54, 162, 255, 1)' // 0% 处的颜色 }, { offset: 1, color: 'rgba(54, 162, 255, 0.1)' // 100% 处的颜色 }], global: false // 缺省为 false } }, barWidth: '25%' }, { name: '', data: [], type: 'bar', itemStyle: { color: { type: 'linear', x: 0, y: 0, x2: 0, y2: 1, colorStops: [{ offset: 0, color: 'rgba(255, 189, 75, 1)' // 0% 处的颜色 }, { offset: 1, color: 'rgba(255, 189, 75, 0.1)' // 100% 处的颜色 }], global: false // 缺省为 false } }, barWidth: '25%' }, { name: '', data: [], type: 'bar', itemStyle: { color: { type: 'linear', x: 0, y: 0, x2: 0, y2: 1, colorStops: [{ offset: 0, color: 'rgba(70, 223, 255, 1)' // 0% 处的颜色 }, { offset: 1, color: 'rgba(70, 223, 255, 0.1)' // 100% 处的颜色 }], global: false // 缺省为 false } }, barWidth: '25%' } ], grid: { left: '42px', right: '30px', bottom: '38px', top: '80px' } }; isgoback: boolean = false refreshEchartsData1(data) { this.num = data.totalCount //饼图 this.oilchartpieOptionPieData1 = [ { name: '预警事件', value: data.notCorrectCount }, { name: '正常操作', value: data.correctCount }, ] this.oilchartpieOption.series[0].data = this.oilchartpieOptionPieData1 this.myChart.setOption(this.oilchartpieOption); this.myChart.off('legendselectchanged') this.myChart.off('click') this.myChart.on('legendselectchanged', (params) => { this.myChart.setOption({ legend: { selected: { [params.name]: true } } }) if (params.name == '预警事件') { this.isgoback = true this.refreshEchartsData2(this.echartsData) this.validateForm.patchValue({ state: '0' }); this.list = [] this.SkipCount = '0' this.getViolateRecordList() } }); this.myChart.on('click', (params) => { if (params.name == '预警事件') { this.isgoback = true this.refreshEchartsData2(this.echartsData) this.validateForm.patchValue({ state: '0' }); this.list = [] this.SkipCount = '0' this.getViolateRecordList() } }); //柱状图 let monthArr = [] let valuedata = [] let valuedata2 = [] data.list.forEach(element => { monthArr.push(moment(element.key).format('MM.DD')) valuedata.push(element.totalCount) let item = Number(element.proccessBeforeCount + element.proccessingCount) valuedata2.push(item) }); // console.log('卸油预警',valuedata2) this.oilchartbarOption.xAxis.data = monthArr this.oilchartbarOption.series[0].data = valuedata this.oilchartbarOption.series[1].data = valuedata2 this.mybarChart.setOption(this.oilchartbarOption); } refreshEchartsData2(data) { this.num = Number(data.proccessBeforeCount + data.proccessingCount + data.allProccessCount) //饼图 this.oilchartpieOptionPieData2 = [ { name: '事前准备', value: data.proccessBeforeCount }, { name: '事中操作', value: data.proccessingCount }, { name: '全程检测', value: data.allProccessCount } ] this.oilchartpieOption2.series[0].data = this.oilchartpieOptionPieData2 this.myChart.setOption(this.oilchartpieOption2); //柱状图 let monthArr = [] let valuedataBefore = [] let valuedataIng = [] let valuedataAll = [] data.list.forEach(element => { monthArr.push(moment(element.key).format('MM.DD')) valuedataBefore.push(element.proccessBeforeCount) valuedataIng.push(element.proccessingCount) valuedataAll.push(element.allProccessCount) }); this.oilchartbarOption2.xAxis.data = monthArr this.oilchartbarOption2.series[0].name = '事前准备' this.oilchartbarOption2.series[0].data = valuedataBefore this.oilchartbarOption2.series[1].name = '事中操作' this.oilchartbarOption2.series[1].data = valuedataIng this.oilchartbarOption2.series[2].name = '全程监测' this.oilchartbarOption2.series[2].data = valuedataAll this.mybarChart.setOption(this.oilchartbarOption2); } goback() { this.isgoback = false this.myChart.clear(); this.mybarChart.clear(); this.refreshEchartsData1(this.echartsData) this.validateForm.patchValue({ state: null }); this.list = [] this.SkipCount = '0' this.getViolateRecordList() } stateChange($event) { if (!$event) { this.list = [] this.SkipCount = '0' this.getViolateRecordList() } } defaultOrId: string //获取所有组织机构 nodes: any = [] getAllOrganization() { let OrganizationUnitId = sessionStorage.getItem('isGasStation') == 'true' ? JSON.parse(sessionStorage.getItem('userdataOfgasstation')).organization.id : JSON.parse(sessionStorage.getItem('userdata')).organization.id let params = { OrganizationUnitId: OrganizationUnitId, IsContainsChildren: "true" } this.http.get('/api/services/app/Organization/GetAll', { params: params }).subscribe((data: any) => { data.result.items.forEach(element => { if (element.id == OrganizationUnitId) { element.parentId = null } element.key = element.id element.title = element.displayName }); this.nodes = [...this.toTree.toTree(data.result.items)] this.defaultOrId = JSON.parse(sessionStorage.getItem('userdata')).organization.id this.validateForm.value.organization = JSON.parse(sessionStorage.getItem('userdata')).organization.id this.validateForm.patchValue({ datePicker: [this.startdate, this.enddate] }); this.list = [] this.SkipCount = '0' this.getViolateRecordList() }) } //获取统计信息 chartsSpin: boolean = false getAggregations() { this.chartsSpin = true let organizationUnitId if (this.router.url.indexOf('petrolStation') != -1) { organizationUnitId = JSON.parse(sessionStorage.getItem('userdataOfgasstation')).organization.id } else { organizationUnitId = JSON.parse(sessionStorage.getItem('userdata')).organization.id } let params: any = { OrganizationUnitId: organizationUnitId, IsContainsChildren: 'true' } this.http.get('/api/services/app/OilUnloadingProcess/GetAllCountByDays', { params: params }).subscribe((data: any) => { console.log('统计信息', data) this.chartsSpin = false this.echartsData = data.result this.refreshEchartsData1(this.echartsData) // this.refreshBarLineData(this.echartsData) }) } //获得卸油记录列表 SkipCount: string = '0' MaxResultCount: string = '50' list: any = [] totalCount: string tableSpin: boolean = false getViolateRecordList() { this.tableSpin = true let organizationUnitId if (this.router.url.indexOf('petrolStation') != -1) { organizationUnitId = JSON.parse(sessionStorage.getItem('userdataOfgasstation')).organization.id } else { organizationUnitId = this.validateForm.value.organization } let IsCorrect = null if (this.validateForm.value.state) { this.validateForm.value.state == '0' ? IsCorrect = 'false' : IsCorrect = 'true' } let params = { IsCorrect: IsCorrect, StartTime: moment(this.validateForm.value.datePicker[0]).format('yyyy-MM-DD'), EndTime: moment(this.validateForm.value.datePicker[1]).format('yyyy-MM-DD'), IsContainsChildren: 'true', OrganizationUnitId: organizationUnitId, SkipCount: this.SkipCount, MaxResultCount: this.MaxResultCount } this.http.get('/api/services/app/OilUnloadingProcess/GetAll', { params: params }).subscribe((data: any) => { this.tableSpin = false this.list = this.list.concat(data.result.items); this.list = [...this.list] this.totalCount = data.result.totalCount console.log('获取卸油流程列表', data.result.items) }) } submitForm(): void { for (const i in this.validateForm.controls) { this.validateForm.controls[i].markAsDirty(); this.validateForm.controls[i].updateValueAndValidity(); } this.list = [] this.SkipCount = '0' this.getViolateRecordList() } resetForm(e: MouseEvent): void { e.preventDefault(); this.validateForm.reset(); for (const key in this.validateForm.controls) { this.validateForm.controls[key].markAsPristine(); this.validateForm.controls[key].updateValueAndValidity(); } console.log(JSON.parse(sessionStorage.getItem('userdata')).organization.id) // this.validateForm.value.organization = JSON.parse(sessionStorage.getItem('userdata')).organization.id this.validateForm.patchValue({ organization: JSON.parse(sessionStorage.getItem('userdata')).organization.id, datePicker: [this.startdate, this.enddate] }); this.list = [] this.SkipCount = '0' this.getViolateRecordList() } ngAfterViewInit(): void { fromEvent(this.element.nativeElement.querySelector(`#tbody`) as HTMLCanvasElement, 'scroll').pipe(debounceTime(100)).subscribe((event: any) => { //监听 DOM 滚动事件 if (event.target.scrollHeight - (event.target.scrollTop + event.target.clientHeight) <= 10) { if (this.totalCount > this.list.length) { console.log('需要加载数据了', event) this.SkipCount = String(Number(this.SkipCount) + 50) this.getViolateRecordList() } } }); } look(item) { // console.log(item) let arr = [] let arr1 = item.oilUnloadingNodes.find((item) => { return item.nodeName == '车辆进场' }); let arr2 = item.oilUnloadingNodes.find((item) => { return item.nodeName == '设置卸油隔离区' }); let arr3 = item.oilUnloadingNodes.find((item) => { return item.nodeName == '卸油连接静电接地' }); let arr4 = item.oilUnloadingNodes.find((item) => { return item.nodeName == '卸油设置消防器材' }); let arr5 = item.oilUnloadingNodes.find((item) => { return item.nodeName == '连接卸油管' }); let arr6 = item.oilUnloadingNodes.find((item) => { return item.nodeName == '卸油中无人监卸' }); let arr7 = item.oilUnloadingNodes.find((item) => { return item.nodeName == '拆除卸油管' }); let arr8 = item.oilUnloadingNodes.find((item) => { return item.nodeName == '车辆离场' || item.nodeName == '车辆离厂' || item.nodeName == '车辆出厂' }); // console.log(1, arr1) // console.log(2, arr2) // console.log(3, arr3) // console.log(4, arr4) // console.log(5, arr5) // console.log(6, arr6) // console.log(7, arr7) // console.log(8, arr8) arr = [arr1, arr2, arr3, arr4, arr5, arr6, arr7, arr8] console.log('卸油流程', arr) const modal = this.modal.create({ nzContent: OilUnloadingProcessComponent, nzViewContainerRef: this.viewContainerRef, nzWidth: 1000, nzBodyStyle: { 'border': '1px solid #6d9cc7', 'border-radius': '0px', 'padding': '0px', 'box-shadow': '0 0 8px 0 #fff', 'background': '#000D21', }, nzComponentParams: { data: arr }, nzFooter: null, nzOnOk: async () => { } }); const instance = modal.getContentComponent(); } gorecordList() { if (this.router.url.indexOf('petrolStation') != -1) { this.router.navigate(['/records/petrolStation']) } else { this.router.navigate(['/records']) } } goWarningList() { if (this.router.url.indexOf('petrolStation') != -1) { this.router.navigate(['/records/petrolStation/warningstatisticslist']) } else { this.router.navigate(['/records/warningstatisticslist']) } } goMisinformationList() { if (this.router.url.indexOf('petrolStation') != -1) { this.router.navigate(['records/petrolStation/misinformationList']) } else { this.router.navigate(['records/misinformationList']) } } }