航班定位实现

This commit is contained in:
zhouyuejun
2019-02-14 14:45:40 +08:00
parent 33a685e4ce
commit 107494c097
18 changed files with 412 additions and 1573 deletions
@@ -5,7 +5,7 @@ import { HttpClientService } from '../../services/http-client.service';
import { BasicDataService } from '../../services/basic-data-service';
import { OperateSpinServiceService } from '../../services/operate-spin-service.service';
import { DynamicFlightOrder } from '../../utils/dynamic-flight-order';
import { FlightOrder } from '../../utils/flight-order';
import { FlightsDataHandle } from '../../utils/flights-data-handle';
import * as $ from 'jquery';
@@ -28,7 +28,7 @@ export class HistoricalDataComponent implements OnInit {
this.operateSpinServiceService.showSpin();
this.changeDetectorRef.detach();
}
public orderHandle = new DynamicFlightOrder();
public orderHandle = new FlightOrder();
public dataHandle = new FlightsDataHandle();
public tabClose: boolean = true;
+2 -38
View File
@@ -3,7 +3,7 @@
<div class="search-filter mb-3" #searchFilter>
<div class="first-condition row">
<div class="line-operator-left input-container mb-3 col-xlg-8 col-mlg-8 col-xl-8 col-lg-10">
<select [(ngModel)]="SEL_COL" class="mr-4 form-control" name="" id="">
<select [(ngModel)]="SEL_COL" class="mr-4 form-control" (ngModelChange)="resetPositionArray()" name="" id="">
<option value="">选择列名</option>
<option *ngFor="let airline_col of render_col_lists" [value]="airline_col.COL_CODE">{{airline_col.COL_CN}}</option>
</select>
@@ -15,7 +15,7 @@
<input type="radio" [(ngModel)]="FLT_POS" [value]="2" name="filter-position">
<span>查找定位</span>
</label>
<input class="form-control" [(ngModel)]="SEARCH" type="text" (keyup.enter)="inputEnter()">
<input class="form-control" [(ngModel)]="SEARCH" (ngModelChange)="resetPositionArray()" type="text" (keyup.enter)="inputEnter()">
</div>
<div class="line-operator-right mb-3 col-xlg-4 col-mlg-4 col-xl-4 col-lg-2">
<button type="button" class="btn btn-info mr-2" (click)="toggleFilter()">{{filterClose?'展开':'关闭'}}</button>
@@ -101,42 +101,6 @@
<option *ngFor="let anget of flightAgents" [value]="anget.oGId">{{anget.flightAgentName}}</option>
</select>
</div>
<!-- <div class="input-container mr-4">
<label for="">前时间段:&nbsp;&nbsp;</label>
<select [(ngModel)]="filterItems.Start_time" (ngModelChange)="selectChange('filter')" class="form-control">
<option value=""></option>
<option value="1">前1小时</option>
<option value="2">前2小时</option>
<option value="3">前3小时</option>
<option value="4">前4小时</option>
<option value="5">前5小时</option>
<option value="6">前6小时</option>
<option value="7">前7小时</option>
<option value="8">前8小时</option>
<option value="9">前9小时</option>
<option value="10">前10小时</option>
<option value="11">前11小时</option>
<option value="12">前12小时</option>
</select>
</div> -->
<!-- <div class="input-container mr-4">
<label for="">后时间段:&nbsp;&nbsp;</label>
<select [(ngModel)]="filterItems.End_time" (ngModelChange)="selectChange('filter')" class="form-control">
<option value=""></option>
<option value="1">后1小时</option>
<option value="2">后2小时</option>
<option value="3">后3小时</option>
<option value="4">后4小时</option>
<option value="5">后5小时</option>
<option value="6">后6小时</option>
<option value="7">后7小时</option>
<option value="8">后8小时</option>
<option value="9">后9小时</option>
<option value="10">后10小时</option>
<option value="11">后11小时</option>
<option value="12">后12小时</option>
</select>
</div> -->
</div>
<div [ngClass]="{'filterClose-c':filterClose,'filterClose-o':!filterClose}" class="third-condition row">
+141 -106
View File
@@ -1,7 +1,5 @@
import { Component, OnInit, ViewChild, Renderer2 } from '@angular/core';
import { NavigationEnd, Router } from '@angular/router';
import { WebWorkerService } from 'ngx-web-worker';
import { ToastService } from '../../components/toast/toast.service';
import { ToastConfig, ToastType } from '../../components/toast/toast-model';
@@ -10,28 +8,23 @@ import { BasicDataService } from '../../services/basic-data-service';
import { OperateSpinServiceService } from '../../services/operate-spin-service.service';
import { WebsocketService } from '../../services/websocket.service';
import { DynamicFlightOrder } from '../../utils/dynamic-flight-order';
import { FlightOrder } from '../../utils/flight-order';
import { FlightsDataHandle } from '../../utils/flights-data-handle';
import { CellColorHandle } from '../../utils/cell-color-handle';
import { AlertMessageHandle } from '../../utils/alert-message-handle';
import { Utils } from '../../utils/utils';
import dateFormatter from '../../utils/date-formatter';
import webWorkerHandle from '../../utils/web-worker-handle';
import { filter } from 'rxjs/operators';
import * as $ from 'jquery';
@Component({
selector: 'app-main',
templateUrl: './main.component.html',
styleUrls: ['./main.component.scss'],
providers: [WebWorkerService]
styleUrls: ['./main.component.scss']
})
export class MainComponent implements OnInit {
constructor(
private router: Router,
private renderer2: Renderer2,
private webWorkerService: WebWorkerService,
private basicDataService: BasicDataService,
private operateSpinServiceService: OperateSpinServiceService,
private httpCilent: HttpClientService,
@@ -64,10 +57,11 @@ export class MainComponent implements OnInit {
// }
// )
}
public orderHandle = new DynamicFlightOrder();
public orderHandle = new FlightOrder();
public dataHandle = new FlightsDataHandle();
public cellColorHandle = new CellColorHandle();
public alertMessageHandle = new AlertMessageHandle();
public utils = new Utils();
public tabClose: boolean = true;
@@ -268,10 +262,9 @@ export class MainComponent implements OnInit {
})
//计算可视区域高度,渲染数据
this.calcVisibleCount()
this.wait_render_data = combined_data;
this.selectedFilterData = combined_data;
this.render_data = this.wait_render_data.slice(this.start, this.end);
this.calcVisibleCount()
//默认选中第一条
if (this.render_data.length > 0) {
@@ -354,6 +347,8 @@ export class MainComponent implements OnInit {
*/
refresh() {
this.operateSpinServiceService.showSpin();
this.positionedArray = []; //定位数组为清空
this.positionArrayIndex = 0; //定位元素Index归零
this.canHandleDynamicMessage = false;
this.canHandleDynamicAlert = false;
this.SEARCH = ''; //手动输入条件
@@ -369,8 +364,6 @@ export class MainComponent implements OnInit {
FTSS: '', //运营状态
TRML: '', //航站楼
Abnormal_state: '', //异常状态
// Start_time: '9',
// End_time: '9',
FHAG: '', //机坪代理
MHAG: '', //维护代理
PHAG: '', //旅客代理
@@ -541,11 +534,11 @@ export class MainComponent implements OnInit {
if (this.FLT_POS === 1) {
this.LAST_SEL_COL = this.SEL_COL;
this.LASTSEARCH = this.SEARCH;
// this.selectChange('filter')
// this.selectChange('filter');
this.operateSpinServiceService.showSpin();
this.inputFilter(this.selectedFilterData);
} else {
this.inputPosition(this.render_data)
this.inputPosition(this.wait_render_data)
}
}
@@ -554,6 +547,8 @@ export class MainComponent implements OnInit {
*/
selectChange(type) {
if (type === 'filter') {
this.positionedArray = [];
this.positionArrayIndex = 0;
this.operateSpinServiceService.showSpin();
}
@@ -814,64 +809,150 @@ export class MainComponent implements OnInit {
positionArrayIndex: number = 0;
inputPosition(filterData) {
let transArray = []
let hasSearchData: boolean = false;
let hasPositionedEle: boolean = false;
if (this.SEL_COL) {
let sel_col = this.SEL_COL;
filterData.forEach(element => {
if (element['renderFlight'][sel_col]) {
if (element['renderFlight'][sel_col].toString().match(new RegExp(this.SEARCH, 'i'))) {
transArray.push(element);
for (let i = 0; i < filterData.length; i++) {
if (i === filterData.length - 1) {
this.positionedArray = [];
this.positionArrayIndex = 0;
}
let fliterElement = filterData[i];
if (fliterElement['renderFlight'][sel_col]) {
if (fliterElement['renderFlight'][sel_col].toString().match(new RegExp(this.SEARCH, 'i'))) {
let hasThisEle: boolean = false;
hasSearchData = true;
for (let k = 0; k < this.positionedArray.length; k++) {
let positionedElement = this.positionedArray[k];
let diffResult = this.utils.diff(positionedElement, fliterElement);
if (diffResult) {
hasThisEle = true;
break;
} else {
continue;
}
};
if (!hasThisEle) {
hasPositionedEle = true;
this.row_state = fliterElement;
this.positionArrayIndex = i;
this.positionedArray.push(fliterElement);
break;
}
} else {
continue;
}
} else {
if (!this.SEARCH) {
transArray.push(element);
let hasThisEle: boolean = false;
hasSearchData = true;
for (let k = 0; k < this.positionedArray.length; k++) {
let positionedElement = this.positionedArray[k];
let diffResult = this.utils.diff(positionedElement, fliterElement);
if (diffResult) {
hasThisEle = true;
break;
} else {
continue;
}
};
if (!hasThisEle) {
hasPositionedEle = true;
this.row_state = fliterElement;
this.positionArrayIndex = i;
this.positionedArray.push(fliterElement);
break;
}
} else {
continue;
}
}
});
}
} else {
filterData.forEach(element => {
let cols = this.col_lists;
for (let i = 0; i < cols.length; i++) {
if (element['renderFlight'][cols[i]['COL_CODE']]) {
if (element['renderFlight'][cols[i]['COL_CODE']].toString().match(new RegExp(this.SEARCH, 'i'))) {
transArray.push(element)
let cols = this.render_col_lists;
for (let i = 0; i < filterData.length; i++) {
if (i === filterData.length - 1) {
this.positionedArray = [];
this.positionArrayIndex = 0;
}
let positionIsOk: boolean = false;
let filterElement = filterData[i];
for (let j = 0; j < cols.length; j++) {
let elementCol = cols[j];
if (filterElement['renderFlight'][elementCol['COL_CODE']]) {
if (filterElement['renderFlight'][elementCol['COL_CODE']].toString().match(new RegExp(this.SEARCH, 'i'))) {
let hasThisEle: boolean = false;
hasSearchData = true;
for (let k = 0; k < this.positionedArray.length; k++) {
let positionedElement = this.positionedArray[k];
let diffResult = this.utils.diff(positionedElement, filterElement);
if (diffResult) {
hasThisEle = true;
break;
} else {
continue;
}
};
if (!hasThisEle) {
hasPositionedEle = true;
positionIsOk = true;
this.row_state = filterElement;
this.positionArrayIndex = i;
this.positionedArray.push(filterElement);
}
break;
} else {
continue;
}
} else {
if (this.SEARCH) {
continue;
} else {
transArray.push(element)
if (!this.SEARCH) {
let hasThisEle: boolean = false;
hasSearchData = true;
for (let k = 0; k < this.positionedArray.length; k++) {
let positionedElement = this.positionedArray[k];
let diffResult = this.utils.diff(positionedElement, filterElement);
if (diffResult) {
hasThisEle = true;
break;
} else {
continue;
}
};
if (!hasThisEle) {
hasPositionedEle = true;
positionIsOk = true;
this.row_state = filterElement;
this.positionArrayIndex = i;
this.positionedArray.push(filterElement);
}
break;
} else {
continue;
}
}
}
});
}
if (transArray.length > 0) {
if (transArray.toString() == this.positionedArray.toString()) {
this.positionArrayIndex++;
if (this.positionArrayIndex === this.positionedArray.length) {
this.positionArrayIndex = 0;
if (positionIsOk) {
break;
}
this.row_state = this.positionedArray[this.positionArrayIndex];
} else {
this.positionedArray = transArray;
this.positionArrayIndex = 0;
this.row_state = this.positionedArray[this.positionArrayIndex];
}
} else {
alert('没有搜索到相关数据');
}
let tr = $(".selected");
let objTr = tr[0];
if (objTr) {
$("#table-container").animate({ scrollTop: objTr.offsetTop - 42 }, "slow");
if (!hasSearchData) {
alert("没有搜索到相关数据");
}
if (hasPositionedEle) {
const scrollTop = this.positionArrayIndex * this.trItemHeight
this.tableBody.nativeElement.scrollTop = scrollTop;
}
}
/**
* 重置定位数组
*/
resetPositionArray() {
this.positionedArray = [];
this.positionArrayIndex = 0;
}
/**
@@ -1134,37 +1215,37 @@ export class MainComponent implements OnInit {
getStopoverNotes(flight) {
if (this.orderHandle.isLinked(flight)) {
if (flight['preFlight']['ACTT'] && flight['reaFlight']['ESTT']) {
if (new Date(dateFormatter(flight['reaFlight']['ESTT'])).getTime() - new Date(dateFormatter(flight['preFlight']['ACTT'])).getTime() > 3600000) {
if (new Date(this.utils.dateFormatter(flight['reaFlight']['ESTT'])).getTime() - new Date(this.utils.dateFormatter(flight['preFlight']['ACTT'])).getTime() > 3600000) {
return false;
} else {
return true;
}
} else if (flight['preFlight']['ACTT'] && flight['reaFlight']['SODT']) {
if (new Date(dateFormatter(flight['reaFlight']['SODT'])).getTime() - new Date(dateFormatter(flight['preFlight']['ACTT'])).getTime() > 3600000) {
if (new Date(this.utils.dateFormatter(flight['reaFlight']['SODT'])).getTime() - new Date(this.utils.dateFormatter(flight['preFlight']['ACTT'])).getTime() > 3600000) {
return false;
} else {
return true;
}
} else if (flight['preFlight']['ESTT'] && flight['reaFlight']['ESTT']) {
if (new Date(dateFormatter(flight['reaFlight']['ESTT'])).getTime() - new Date(dateFormatter(flight['preFlight']['ESTT'])).getTime() > 3600000) {
if (new Date(this.utils.dateFormatter(flight['reaFlight']['ESTT'])).getTime() - new Date(this.utils.dateFormatter(flight['preFlight']['ESTT'])).getTime() > 3600000) {
return false;
} else {
return true;
}
} else if (flight['preFlight']['ESTT'] && flight['reaFlight']['SODT']) {
if (new Date(dateFormatter(flight['reaFlight']['SODT'])).getTime() - new Date(dateFormatter(flight['preFlight']['ESTT'])).getTime() > 3600000) {
if (new Date(this.utils.dateFormatter(flight['reaFlight']['SODT'])).getTime() - new Date(this.utils.dateFormatter(flight['preFlight']['ESTT'])).getTime() > 3600000) {
return false;
} else {
return true;
}
} else if (flight['preFlight']['SODT'] && flight['reaFlight']['ESTT']) {
if (new Date(dateFormatter(flight['reaFlight']['ESTT'])).getTime() - new Date(dateFormatter(flight['preFlight']['SODT'])).getTime() > 3600000) {
if (new Date(this.utils.dateFormatter(flight['reaFlight']['ESTT'])).getTime() - new Date(this.utils.dateFormatter(flight['preFlight']['SODT'])).getTime() > 3600000) {
return false;
} else {
return true;
}
} else if (flight['preFlight']['SODT'] && flight['reaFlight']['SODT']) {
if (new Date(dateFormatter(flight['reaFlight']['SODT'])).getTime() - new Date(dateFormatter(flight['preFlight']['SODT'])).getTime() > 3600000) {
if (new Date(this.utils.dateFormatter(flight['reaFlight']['SODT'])).getTime() - new Date(this.utils.dateFormatter(flight['preFlight']['SODT'])).getTime() > 3600000) {
return false;
} else {
return true;
@@ -1200,50 +1281,4 @@ export class MainComponent implements OnInit {
}, 10)
}
}
}
// if (this.SEL_COL) {
// let sel_col = this.SEL_COL;
// for (let i = 0; i < filterData.length; i++) {
// let fliterElement = filterData[i];
// if (fliterElement['renderFlight'][sel_col]) {
// if (fliterElement['renderFlight'][sel_col].toString().match(new RegExp(this.SEARCH, 'i'))) {
// let positionedIsMarry = false;
// for (let k = 0; k < this.positionedArray.length; k++) {
// let positionedElement = this.positionedArray[k];
// if (positionedElement['preFlight'] && !positionedElement['reaFlight']) {
// if (fliterElement['preFlight'] && !fliterElement['reaFlight']) {
// if (positionedElement['preFlight']['FLID'] === fliterElement['preFlight']['FLID']) {
// positionedIsMarry = true;
// break;
// }
// }
// } else if (!positionedElement['preFlight'] && positionedElement['reaFlight']) {
// if (!fliterElement['preFlight'] && fliterElement['reaFlight']) {
// if (positionedElement['reaFlight']['FLID'] === fliterElement['reaFlight']['FLID']) {
// positionedIsMarry = true;
// break;
// }
// }
// } else {
// if (fliterElement['preFlight'] && fliterElement['reaFlight']) {
// if ((positionedElement['preFlight']['FLID'] === fliterElement['preFlight']['FLID']) && (positionedElement['reaFlight']['FLID'] === fliterElement['reaFlight']['FLID'])) {
// positionedIsMarry = true;
// break;
// }
// }
// }
// };
// if(!positionedIsMarry){
// this.row_state = fliterElement;
// this.positionedArray.push(fliterElement);
// break;
// }
// }
// }
// }
// }
}
@@ -1,6 +1,5 @@
import { Component, OnInit, Input } from '@angular/core';
import timeFormatter from '../../../utils/time-formatter';
import dateFormatter from '../../../utils/date-formatter';
import { Utils } from '../../../utils/utils';
@Component({
selector: 'app-related-tab',
@@ -8,6 +7,8 @@ import dateFormatter from '../../../utils/date-formatter';
styleUrls: ['./related-tab.component.scss']
})
export class RelatedTabComponent implements OnInit {
private utils = new Utils();
public lines;
public airports;
public predelay;
@@ -37,12 +38,12 @@ export class RelatedTabComponent implements OnInit {
if (this.lines.preFlight && !this.lines.reaFlight) {
this.airports = this.lines.renderFlight.ERUT.split(' - ');
for (let i = 0; i < this.airports.length; i++) {
this.airports[i] = { airport: this.airports[i], scdt: timeFormatter(this.lines.preFlight.ERUT[i].SCDT), scat: timeFormatter(this.lines.preFlight.ERUT[i].SCAT) }
this.airports[i] = { airport: this.airports[i], scdt: this.utils.timeFormatter(this.lines.preFlight.ERUT[i].SCDT), scat: this.utils.timeFormatter(this.lines.preFlight.ERUT[i].SCAT) }
}
} else if (!this.lines.preFlight && this.lines.reaFlight) {
this.airports = this.lines.renderFlight.ERUT.split(' - ');
for (let i = 0; i < this.airports.length; i++) {
this.airports[i] = { airport: this.airports[i], scdt: timeFormatter(this.lines.reaFlight.ERUT[i].SCDT), scat: timeFormatter(this.lines.reaFlight.ERUT[i].SCAT) }
this.airports[i] = { airport: this.airports[i], scdt: this.utils.timeFormatter(this.lines.reaFlight.ERUT[i].SCDT), scat: this.utils.timeFormatter(this.lines.reaFlight.ERUT[i].SCAT) }
}
} else {
this.lines.preFlight.ERUT[this.lines.preFlight.ERUT.length - 1]['SCDT'] = this.lines.reaFlight.ERUT[0]['SCDT'];
@@ -50,7 +51,7 @@ export class RelatedTabComponent implements OnInit {
let linkAirport = this.lines.preFlight.ERUT.concat(concatArray)
this.airports = this.lines.renderFlight.ERUT.split(' - ');
for (let i = 0; i < this.airports.length; i++) {
this.airports[i] = { airport: this.airports[i], scdt: timeFormatter(linkAirport[i].SCDT), scat: timeFormatter(linkAirport[i].SCAT) }
this.airports[i] = { airport: this.airports[i], scdt: this.utils.timeFormatter(linkAirport[i].SCDT), scat: this.utils.timeFormatter(linkAirport[i].SCAT) }
}
}
@@ -77,12 +78,12 @@ export class RelatedTabComponent implements OnInit {
if (fimsFlightstatusDefinition) {
this.predelay['TYPE'] = fimsFlightstatusDefinition.ddsc;
}
this.predelay['STRT'] = new Date(dateFormatter(this.predelay['STRT'])).getTime();
this.predelay['STRT'] = new Date(this.utils.dateFormatter(this.predelay['STRT'])).getTime();
this.predelay['DURA'] = parseInt(this.predelay['DURA'].substr(0, 2)) * 3600000 + parseInt(this.predelay['DURA'].substr(2, 3)) * 60000 + this.predelay['STRT']
}
if (cancleIndex > -1) {
let cancle = this.lines.preFlight['ABN'][cancleIndex].BODY;
this.precancle = new Date(dateFormatter(cancle)).getTime();
this.precancle = new Date(this.utils.dateFormatter(cancle)).getTime();
}
if (fdivIndex > -1) {
let fdiv = this.lines.preFlight['ABN'][fdivIndex].BODY;
@@ -125,12 +126,12 @@ export class RelatedTabComponent implements OnInit {
this.readelay['TYPE'] = fimsFlightstatusDefinition.ddsc;
}
this.readelay['STRT'] = new Date(dateFormatter(this.readelay['STRT'])).getTime();
this.readelay['STRT'] = new Date(this.utils.dateFormatter(this.readelay['STRT'])).getTime();
this.readelay['DURA'] = parseInt(this.readelay['DURA'].substr(0, 2)) * 3600000 + parseInt(this.readelay['DURA'].substr(2, 3)) * 60000 + this.readelay['STRT'];
}
if (cancleIndex > -1) {
let cancle = this.lines.reaFlight['ABN'][cancleIndex].BODY;
this.reacancle = new Date(dateFormatter(cancle)).getTime();
this.reacancle = new Date(this.utils.dateFormatter(cancle)).getTime();
}
if (fdivIndex > -1) {
let fdiv = this.lines.reaFlight['ABN'][fdivIndex].BODY;
@@ -1,5 +1,5 @@
import { Component, OnInit, Input } from '@angular/core';
import timeFormatter from '../../../utils/time-formatter';
import { Utils } from '../../../utils/utils'
@Component({
selector: 'app-related-tab',
@@ -7,6 +7,8 @@ import timeFormatter from '../../../utils/time-formatter';
styleUrls: ['./related-tab.component.scss']
})
export class RelatedTabComponent implements OnInit {
private utils = new Utils();
public lines;
public airports;
@Input() set flight(flight) {
@@ -14,24 +16,24 @@ export class RelatedTabComponent implements OnInit {
if (this.lines && !this.lines) {
this.airports = this.lines.split(' - ');
for (let i = 0; i < this.airports.length; i++) {
this.airports[i] = { airport: this.airports[i], scdt: timeFormatter(this.lines[i].departureTime), scat: timeFormatter(this.lines[i].arrivalTime) }
this.airports[i] = { airport: this.airports[i], scdt: this.utils.timeFormatter(this.lines[i].departureTime), scat: this.utils.timeFormatter(this.lines[i].arrivalTime) }
}
} else if (!this.lines && this.lines) {
this.airports = this.lines.split(' - ');
for (let i = 0; i < this.airports.length; i++) {
this.airports[i] = { airport: this.airports[i], scdt: timeFormatter(this.lines[i].departureTime), scat: timeFormatter(this.lines[i].arrivalTime) }
this.airports[i] = { airport: this.airports[i], scdt: this.utils.timeFormatter(this.lines[i].departureTime), scat: this.utils.timeFormatter(this.lines[i].arrivalTime) }
}
} else {
// this.lines[this.lines.length - 1] = this.lines[0];
// let concatArray = this.lines.arrivalTime.slice(1);
// let linkAirport = this.lines.arrivalTime.concat(concatArray)
if(this.lines.startAirport){
if (this.lines.startAirport) {
this.airports = this.lines.startAirport.split(' - ');
for (let i = 0; i < this.airports.length; i++) {
this.airports[i] = { airport: this.airports[i], scdt: timeFormatter(this.lines.departureTime), scat: timeFormatter(this.lines.arrivalTime) }
this.airports[i] = { airport: this.airports[i], scdt: this.utils.timeFormatter(this.lines.departureTime), scat: this.utils.timeFormatter(this.lines.arrivalTime) }
}
}
}
};