123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372 |
- <template>
- <div class="dashboard">
- <ComHead :tabs-index="3" />
- <div class="dashboard-content">
- <div class="dashboard-content-top flex">
- <div class="dashboard-content-top-left">
- <div class="dashboard-content-top-left-item">
- <div class="dashboard-content-top-left-item-top">
- <div class="dashboard-content-top-left-item-top-title">
- 小时峰值分布
- </div>
- <div class="dashboard-content-top-left-item-top-time" @click="showDatePicker(showTimeMsg.HourlyPeak)">
- <el-icon color="#ffffff" size="18">
- <Calendar />
- </el-icon>
- <el-icon color="#ffffff">
- <CaretBottom />
- </el-icon>
- </div>
- </div>
- <div class="dashboard-content-top-left-item-bottom">
- <Echarts id="ww1" :option="hourlyPeakObj" />
- </div>
- </div>
- <div class="dashboard-content-top-left-item">
- <div class="dashboard-content-top-left-item-top">
- <div class="dashboard-content-top-left-item-top-title">
- 运单趋势分析
- </div>
- <div class="dashboard-content-top-left-item-top-time" @click="showDatePicker(showTimeMsg.WaybillTrend)">
- <el-icon color="#ffffff" size="18">
- <Calendar />
- </el-icon>
- <el-icon color="#ffffff">
- <CaretBottom />
- </el-icon>
- </div>
- </div>
- <div class="dashboard-content-top-left-item-bottom">
- <Echarts id="ww12" :option="waybillTrendObj" />
- </div>
- </div>
- </div>
- <!-- 地图 -->
- <div class="dashboard-content-top-center">
- <div class="dashboard-content-top-center-top"></div>
- <div class="dashboard-content-top-center-bottom">
- <div class="dashboard-content-top-center-bottom-box1">
- <div class="dashboard-content-top-center-bottom-box1-title">
- 航班数:{{ flightNums }}
- </div>
- </div>
- <div class="dashboard-content-top-center-bottom-box2">
- <div class="dashboard-content-top-center-bottom-box2-title">
- 运单数:{{ stockNums }}
- </div>
- </div>
- <EchartsMap id="ww2" />
- </div>
- </div>
- <div class="dashboard-content-top-right">
- <div class="dashboard-content-top-right-item">
- <div class="dashboard-content-top-right-item-top">
- <div class="dashboard-content-top-right-item-top-title">
- 航班预警报警分析
- </div>
- <div class="dashboard-content-top-right-item-top-time" @click="showDatePicker()">
- <el-icon color="#ffffff" size="18">
- <Calendar />
- </el-icon>
- <el-icon color="#ffffff">
- <CaretBottom />
- </el-icon>
- </div>
- </div>
- <div class="dashboard-content-top-right-item-bottom">
- <Echarts id="ww3" :option="airlineAbnormalBaggage.option" />
- </div>
- </div>
- <div class="dashboard-content-top-right-item">
- <div class="dashboard-content-top-right-item-top">
- <div class="dashboard-content-top-right-item-top-title">
- 航司运量统计
- </div>
- <div class="dashboard-content-top-right-item-top-time" @click="showDatePicker(showTimeMsg.AirlineTraffic)">
- <el-icon color="#ffffff" size="18">
- <Calendar />
- </el-icon>
- <el-icon color="#ffffff">
- <CaretBottom />
- </el-icon>
- </div>
- </div>
- <div class="dashboard-content-top-left-item-bottom">
- <Echarts id="ww33" :option="airlineTrafficObj" />
- </div>
- </div>
- </div>
- </div>
- <div class="dashboard-content-bottom flex">
- <div class="dashboard-content-bottom-left">
- <div class="dashboard-content-bottom-left-top">
- <div class="dashboard-content-bottom-left-top-title">
- 节点峰值分布
- </div>
- <div class="dashboard-content-bottom-left-top-time" @click="showDatePicker(showTimeMsg.NodePeak)">
- <el-icon color="#ffffff" size="18">
- <Calendar />
- </el-icon>
- <el-icon color="#ffffff">
- <CaretBottom />
- </el-icon>
- </div>
- </div>
- <div class="dashboard-content-bottom-left-bottom">
- <Echarts id="ww4" :option="nodePeakObj" />
- </div>
- </div>
- <div class="dashboard-content-bottom-center">
- <div class="dashboard-content-bottom-center-top">
- <div class="dashboard-content-bottom-center-top-title">
- 节点效率分析
- </div>
- <div class="dashboard-content-bottom-center-top-time" @click="showDatePicker()">
- <el-icon color="#ffffff" size="18">
- <Calendar />
- </el-icon>
- <el-icon color="#ffffff">
- <CaretBottom />
- </el-icon>
- </div>
- </div>
- <div class="dashboard-content-bottom-center-bottom">
- <Echarts id="ww5" :option="nodeEfficiency.option" />
- </div>
- </div>
- <div class="dashboard-content-bottom-right">
- <div class="dashboard-content-bottom-right-top">
- <div class="dashboard-content-bottom-center-top-title">
- 航班动态统计
- </div>
- </div>
- <div class="dashboard-content-bottom-right-bottom">
- <Echarts id="ww6" :option="airStutas.option" />
- </div>
- </div>
- </div>
- </div>
- <Dialog :flag="flag" @resetForm="resetForm" @submitForm="submitForm">
- <el-form :model="form" label-width="120px">
- <el-form-item label="开始日期">
- <el-date-picker :disabled-date="disabledStartDate" v-model="form.startDate" type="date" placeholder="请选择开始日期" size="default" format="YYYY-MM-DD" value-format="YYYY-MM-DD" />
- </el-form-item>
- <el-form-item label="结束日期">
- <el-date-picker :disabled-date="disabledEndDate" v-model="form.endDate" type="date" placeholder="请选择结束日期" size="default" format="YYYY-MM-DD" value-format="YYYY-MM-DD" />
- </el-form-item>
- </el-form>
- </Dialog>
- </div>
- </template>
- <script setup lang="ts">
- import { ref, onMounted } from "vue";
- import Echarts from "@/components/Echarts/commonChartsBar.vue";
- import EchartsMap from "@/components/Echarts/commonChartsChinaMap.vue";
- import ComHead from "./components/comHead.vue";
- import { Calendar, CaretBottom } from "@element-plus/icons-vue";
- import Dialog from "@/components/dialog/index.vue";
- import { usePublic, showTimeMsg } from "./hooks/usePublic";
- import { parseTime } from "@/utils/validate";
- import * as _ from "lodash";
- const {
- optionLeft,
- airlineAbnormalBaggage,
- airCompaneBaggage,
- airStutas,
- nodeEfficiency,
- hourPeak,
- getPublicData,
- } = usePublic();
- const timePickerName = ref<number>(0);
- const flag = ref<boolean>(false);
- const hourlyPeakObj = ref<any>({});
- const waybillTrendObj = ref<any>({});
- const nodePeakObj = ref<any>({});
- const airlineTrafficObj = ref<any>({});
- const flightNums = ref<number>(0);
- const stockNums = ref<number>(0);
- const form = ref({
- startDate: parseTime(Date.now(), "{y}-{m}-{d}"),
- endDate: parseTime(Date.now(), "{y}-{m}-{d}"),
- });
- const disabledStartDate = (time: Date) => {
- const timer: any = form.value.endDate;
- const data = new Date(timer);
- return time.getTime() > data.getTime();
- };
- const disabledEndDate = (time: Date) => {
- const timer: any = form.value.startDate;
- let data = new Date(timer);
- return data.getTime() > time.getTime();
- };
- const resetForm = () => {
- flag.value = false;
- };
- const submitForm = () => {
- flag.value = false;
- switch (timePickerName.value) {
- case showTimeMsg.HourlyPeak:
- hourlyPeakFunc();
- break;
- case showTimeMsg.WaybillTrend:
- waybillTrendFunc();
- break;
- case showTimeMsg.NodePeak:
- nodePeakFunc();
- break;
- case showTimeMsg.AirlineTraffic:
- airlineTrafficFunc();
- break;
- default:
- break;
- }
- };
- const showDatePicker = (id?) => {
- flag.value = true;
- timePickerName.value = id;
- };
- const sortClass = (sortData) => {
- const groupBy = (array, f) => {
- let groups = {};
- array.forEach((o) => {
- let group = JSON.stringify(f(o));
- groups[group] = groups[group] || [];
- groups[group].push(o);
- });
- return Object.keys(groups).map((group) => {
- return groups[group];
- });
- };
- const sorted = groupBy(sortData, (item) => {
- return item.jobName;
- });
- return sorted;
- };
- const pubFunc = (listValues, target) => {
- const newObj = _.cloneDeep(target);
- const [jobTimes, stockNums, weights] = [<any>[], <any>[], <any>[]];
- listValues.forEach((item) => {
- jobTimes.push(item.jobTime);
- stockNums.push(item.stockNum);
- weights.push(item.weight);
- });
- newObj.xAxis.data = jobTimes;
- newObj.series[0].data = stockNums;
- newObj.series[1].data = weights;
- return newObj;
- };
- //获取小时峰值分布
- const hourlyPeakFunc = async () => {
- const listValues = (await getPublicData(DATACONTENT_ID.jscGjHourlyPeakId, [
- form.value.startDate,
- form.value.endDate,
- ])) as any;
- hourlyPeakObj.value = pubFunc(listValues, optionLeft);
- };
- //运单趋势分析
- const waybillTrendFunc = async () => {
- const listValues = (await getPublicData(DATACONTENT_ID.jscGjWaybillTrendId, [
- form.value.startDate,
- form.value.endDate,
- ])) as any;
- waybillTrendObj.value = pubFunc(listValues, optionLeft);
- };
- //节点峰值
- const nodePeakFunc = async () => {
- const listValues = (await getPublicData(DATACONTENT_ID.jscGjNodePeakId, [
- form.value.startDate,
- form.value.endDate,
- ])) as any;
- const newObj = _.cloneDeep(hourPeak.option);
- const arr = sortClass(listValues);
- const [title, series, singleAxis] = [<any>[], <any>[], <any>[]];
- arr.forEach((item, index) => {
- const msg: any = [];
- const datas: any = [];
- item.map((p, i) => {
- msg.push(p.stockNum);
- datas.push(i + 1);
- });
- title.push({
- top: ((index + 0.5) * 100) / 4 - 3 + "%",
- text: item[0].jobName,
- textStyle: {
- fontSize: 12,
- fontWeight: "normal",
- color: "#698dc3",
- },
- });
- series.push({
- singleAxisIndex: index,
- coordinateSystem: "singleAxis",
- type: "scatter",
- data: msg,
- });
- singleAxis.push({
- type: "category",
- data: datas,
- top: ((index + 0.5) * 100) / 4 - 3 + "%",
- height: 100 / 4 - 5 + "%",
- left: "12%",
- right: "1%",
- axisTick: {
- show: false,
- },
- splitLine: {
- show: false,
- },
- });
- });
- newObj.series = series;
- newObj.singleAxis = singleAxis;
- newObj.title = title;
- nodePeakObj.value = newObj;
- };
- //航班数&运单数
- const numbersFunc = async () => {
- const listValues = (await getPublicData(
- DATACONTENT_ID.jscGjNumbersId,
- []
- )) as any;
- const { flightNum, stockNum } = listValues[0];
- flightNums.value = flightNum;
- stockNums.value = stockNum;
- };
- //航司运量
- const airlineTrafficFunc = async () => {
- const listValues = (await getPublicData(
- DATACONTENT_ID.jscGjAirlineTrafficId,
- [form.value.startDate, form.value.endDate]
- )) as any;
- listValues.forEach((item) => {
- item.jobTime = item["IACACode"];
- });
- airlineTrafficObj.value = pubFunc(
- listValues,
- airCompaneBaggage.option.baseOption
- );
- };
- onMounted(() => {
- hourlyPeakFunc();
- waybillTrendFunc();
- nodePeakFunc();
- numbersFunc();
- airlineTrafficFunc();
- });
- </script>
- <style lang="scss" scoped>
- @import "./css/index.scss";
- </style>
|