| | |
| | | <template> |
| | | <div style="margin-right: 30px" class="data-reMechanism"> |
| | | <div style="margin-right: 30px" class="data-reMechanism" :class="{ 'trend-detail-open': trendDetailVisible }"> |
| | | <div style="display: flex; align-items: center"> |
| | | <div style="margin-right:12px;font-size:16px;font-weight:bold">趋势分析</div> |
| | | <a-radio-group v-model="trendAnalysisType" @change="trendAnalysisTypeChange"> |
| | |
| | | <a-radio-button :value="3"> 通过率 </a-radio-button> |
| | | <a-radio-button :value="4"> 客户 </a-radio-button> |
| | | <a-radio-button :value="5"> 流失率 </a-radio-button> |
| | | <a-radio-button :value="6"> 销售金额 </a-radio-button> |
| | | </a-radio-group> |
| | | </div> |
| | | <div> |
| | | <div style="display: flex; align-items: flex-end; flex-direction: column"> |
| | | <div class="trend-analysis-chart" :class="{ 'is-modal-open': trendDetailVisible }" style="display: flex; align-items: flex-end; flex-direction: column"> |
| | | <a-radio-group |
| | | style="margin: 20px 0" |
| | | size="small" |
| | |
| | | :chartData="trendAnalysisData" |
| | | style="width: 100%" |
| | | :showpercent="trendAnalysisChartShowPercent" |
| | | :enablePointClick="true" |
| | | @chart-click="handleTrendChartClick" |
| | | ></DataReLineChart> |
| | | </div> |
| | | <div id="trendAnalysisChartID"></div> |
| | |
| | | <a-range-picker style="width: 300px; margin: 0 12px" v-if="isContrast" @change="contrastTimeChange" /> |
| | | </div> |
| | | <div class="fueling-overview-block"> |
| | | <div class="fueling-overview-item"> |
| | | <div class="fueling-overview-item" id="traffic-flow-card"> |
| | | <div class="fueling-overview-name">车流量</div> |
| | | <div class="fueling-overview-num"> |
| | | <span style="margin-right: 24px">{{ statisTotalObj.carCount }}</span> |
| | |
| | | <span style="color: #16b777" v-if="isContrast">{{ contrastObj.appearCount }}</span> |
| | | </div> |
| | | </div> |
| | | <div class="fueling-overview-item"> |
| | | <div class="fueling-overview-item" id="oil-count-card"> |
| | | <div class="fueling-overview-name">加油数</div> |
| | | <div class="fueling-overview-num"> |
| | | <span style="margin-right: 24px">{{ statisTotalObj.oilCount }}</span> |
| | |
| | | <div class="fueling-overview-num"> |
| | | <span style="margin-right: 24px">{{ statisTotalObj.rebackRate }}%</span> |
| | | <span style="color: #16b777" v-if="isContrast">{{ contrastObj.rebackRate }}%</span> |
| | | </div> |
| | | </div> |
| | | <div class="fueling-overview-item"> |
| | | <div class="fueling-overview-name">销售金额(元)</div> |
| | | <div class="fueling-overview-num"> |
| | | <span style="margin-right: 24px">{{ statisTotalObj.totalAmount }}</span> |
| | | <span style="color: #16b777" v-if="isContrast">{{ contrastObj.totalAmount }}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div> |
| | | <div class="block-title">油品类型分析</div> |
| | | <div style="display: flex"> |
| | | <DataReLineChart |
| | | style="width: 70%" |
| | | domId="oilTypeLine" |
| | | ref="oilTypeLineRef" |
| | | :chartData="oilTypeLineData" |
| | | ></DataReLineChart> |
| | | <div style="width: 30%"> |
| | | <a-radio-group v-model="oilTypeSpecies" size="small" @change="oilTypeSpeciesChange"> |
| | | <a-radio-button :value="5"> 油品销量 </a-radio-button> |
| | | <a-radio-button :value="6"> 销售金额 </a-radio-button> |
| | | </a-radio-group> |
| | | <DataRePieChart |
| | | style="width: 100%" |
| | | domId="oilTypePie" |
| | | ref="oilTypePieRef" |
| | | :chartData="oilTypePieData" |
| | | ></DataRePieChart> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <TopTenCustomers |
| | | :customerData="customerObj" |
| | | :typeOneTotal="customerOneTotal" |
| | | :typeTwoTotal="customerTwoTotal" |
| | | ></TopTenCustomers> |
| | | <a-modal |
| | | centered |
| | | width="70%" |
| | | :footer="null" |
| | | v-model="trendDetailVisible" |
| | | :title="trendDetailTitle" |
| | | :zIndex="5000" |
| | | :getContainer="getModalContainer" |
| | | wrapClassName="trend-detail-modal-wrap" |
| | | @cancel="closeTrendDetail" |
| | | > |
| | | <a-table |
| | | size="middle" |
| | | bordered |
| | | :columns="trendDetailColumns" |
| | | :dataSource="trendDetailData" |
| | | :loading="trendDetailLoading" |
| | | :scroll="{ y: 420 }" |
| | | :pagination="{ pageSize: 10, showSizeChanger: true, pageSizeOptions: ['10', '20', '50'] }" |
| | | :rowKey=" |
| | | (record, index) => { |
| | | return record.id || record.licenseNum || record.captureTime || record.startTime || index |
| | | } |
| | | " |
| | | > |
| | | </a-table> |
| | | </a-modal> |
| | | </div> |
| | | </template> |
| | | |
| | |
| | | description: '数据报表(加油站)', |
| | | vehicleTypeSpecies: 1, |
| | | fuelingStationSpecies: 2, |
| | | oilTypeSpecies: 5, |
| | | searchWay: '1', |
| | | isContrast: false, |
| | | activeTime: '', |
| | |
| | | vehicleTypePieData: {}, //车型分析饼图数据 |
| | | fuelLevelLineData: {}, //加油位分析折线图数据 |
| | | fuelLevelPieData: {}, //加油位分析饼图数据 |
| | | oilTypeLineData: {}, //油品类型分析折线图数据 |
| | | oilTypePieData: {}, //油品类型分析饼图数据 |
| | | vehicleTypeLineData: {}, //车型分析折线图数据 |
| | | trendAnalysisType: 0, //趋势分析选择类型 |
| | | trendAnalysisUnit: 'DAYS', //趋势分析选择时间 |
| | | trendAnalysisData: {}, //趋势分析数据 |
| | | trendAnalysisChart: null, //趋势分析图表 |
| | | trendDetailVisible: false, |
| | | trendDetailTitle: '趋势分析明细', |
| | | trendDetailLoading: false, |
| | | trendDetailData: [], |
| | | trendDetailColumns: [], |
| | | beforeStartTime: '', |
| | | beforeEndTime: '', |
| | | afterStartTime: '', |
| | |
| | | |
| | | methods: { |
| | | moment, |
| | | getModalContainer() { |
| | | return document.body |
| | | }, |
| | | getTrendDetailColumnsByType() { |
| | | let commonIndexColumn = { |
| | | title: '序号', |
| | | dataIndex: '', |
| | | key: 'rowIndex', |
| | | width: 80, |
| | | align: 'center', |
| | | customRender: function (t, r, index) { |
| | | return parseInt(index) + 1 |
| | | }, |
| | | } |
| | | if (this.trendAnalysisType == 0) { |
| | | return [ |
| | | commonIndexColumn, |
| | | { title: '抓拍时间', align: 'center', dataIndex: 'captureTime' }, |
| | | { title: '车流量', align: 'center', dataIndex: 'carCount' }, |
| | | { title: '车型编码', align: 'center', dataIndex: 'modelCode' }, |
| | | { title: '设备编码', align: 'center', dataIndex: 'cameraCode' }, |
| | | ] |
| | | } |
| | | if (this.trendAnalysisType == 4 || this.trendAnalysisType == 5) { |
| | | return [ |
| | | commonIndexColumn, |
| | | { title: '更新时间', align: 'center', dataIndex: 'updateTimeSelf' }, |
| | | { title: '车牌号', align: 'center', dataIndex: 'licenseNum' }, |
| | | { title: '客户类型', align: 'center', dataIndex: 'clientName' }, |
| | | { title: '累计加油次数', align: 'center', dataIndex: 'oilCount' }, |
| | | { title: '累计油品销量', align: 'center', dataIndex: 'oilSum' }, |
| | | ] |
| | | } |
| | | if (this.trendAnalysisType == 6) { |
| | | return [ |
| | | commonIndexColumn, |
| | | { title: '进站时间', align: 'center', dataIndex: 'startTime' }, |
| | | { title: '车牌号', align: 'center', dataIndex: 'licenseNum' }, |
| | | { title: '行为类型', align: 'center', dataIndex: 'behaviorText' }, |
| | | { title: '加油位', align: 'center', dataIndex: 'oilPosition' }, |
| | | { title: '油品销量', align: 'center', dataIndex: 'oilVolume' }, |
| | | { title: '销售金额(元)', align: 'center', dataIndex: 'totalAmount' }, |
| | | { title: '通过率(分)', align: 'center', dataIndex: 'spandTime' }, |
| | | ] |
| | | } |
| | | return [ |
| | | commonIndexColumn, |
| | | { title: '进站时间', align: 'center', dataIndex: 'startTime' }, |
| | | { title: '车牌号', align: 'center', dataIndex: 'licenseNum' }, |
| | | { title: '行为类型', align: 'center', dataIndex: 'behaviorText' }, |
| | | { title: '加油位', align: 'center', dataIndex: 'oilPosition' }, |
| | | { title: '油品销量', align: 'center', dataIndex: 'oilVolume' }, |
| | | { title: '通过率(分)', align: 'center', dataIndex: 'spandTime' }, |
| | | ] |
| | | }, |
| | | handleTrendChartClick(params) { |
| | | if (!params || !params.name) { |
| | | return |
| | | } |
| | | if (this.$refs.trendAnalysisLineRef && this.$refs.trendAnalysisLineRef.hideTooltip) { |
| | | this.$refs.trendAnalysisLineRef.hideTooltip() |
| | | } |
| | | this.trendDetailVisible = true |
| | | this.trendDetailTitle = '趋势分析明细 - ' + params.name |
| | | this.trendDetailColumns = this.getTrendDetailColumnsByType() |
| | | this.trendDetailLoading = true |
| | | postAction('/jyz/dataTable/statTrendDetail', { |
| | | orgCode: this.selectTreeObj.orgCode, |
| | | startTime: this.startTime, |
| | | endTime: this.endTime, |
| | | trendType: this.trendAnalysisType, |
| | | timeUnit: this.trendAnalysisUnit, |
| | | statTime: params.name, |
| | | seriesName: params.seriesName, |
| | | }) |
| | | .then((res) => { |
| | | this.trendDetailData = res.result || [] |
| | | }) |
| | | .finally(() => { |
| | | this.trendDetailLoading = false |
| | | }) |
| | | }, |
| | | closeTrendDetail() { |
| | | this.trendDetailVisible = false |
| | | this.trendDetailData = [] |
| | | }, |
| | | //获取车型/加油位折线图数据 |
| | | getVehicleTypeLineData() { |
| | | postAction('/jyz/dataTable/statisMidTable', { |
| | |
| | | this.fuelingStationSpecies = e.target.value |
| | | this.getFuelingStationPieData() |
| | | }, |
| | | //获取油品类型饼图数据 |
| | | getOilTypePieData() { |
| | | postAction('/jyz/dataTable/statFan', { |
| | | orgCode: this.selectTreeObj.orgCode, |
| | | startTime: this.startTime, |
| | | endTime: this.endTime, |
| | | type: this.oilTypeSpecies, |
| | | }).then((res) => { |
| | | console.log(res) |
| | | this.oilTypePieData = res.result |
| | | this.$nextTick(() => { |
| | | this.$refs.oilTypePieRef.setChart() |
| | | }) |
| | | }) |
| | | }, |
| | | //获取油品类型柱状图数据 |
| | | getOilTypeLineData() { |
| | | const barType = this.oilTypeSpecies == 5 ? 3 : 4 |
| | | postAction('/jyz/dataTable/statBar', { |
| | | orgCode: this.selectTreeObj.orgCode, |
| | | startTime: this.startTime, |
| | | endTime: this.endTime, |
| | | type: barType, |
| | | }).then((res) => { |
| | | console.log(res) |
| | | this.oilTypeLineData = res.result |
| | | this.$nextTick(() => { |
| | | this.$refs.oilTypeLineRef.setChart() |
| | | }) |
| | | }) |
| | | }, |
| | | oilTypeSpeciesChange(e) { |
| | | this.oilTypeSpecies = e.target.value |
| | | this.getOilTypePieData() |
| | | this.getOilTypeLineData() |
| | | }, |
| | | //趋势分析类型切换 |
| | | trendAnalysisTypeChange(e) { |
| | | let val = e.target.value |
| | | if (val == 0 || val == 2 || val == 3 || val == 5) { |
| | | if (val == 0 || val == 2 || val == 3 || val == 5 || val == 6) { |
| | | this.trendAnalysisChartShowPercent = true |
| | | } else { |
| | | this.trendAnalysisChartShowPercent = false |
| | |
| | | this.getVehicleTypeLineData() |
| | | this.getVehicleStationPieData() |
| | | this.getFuelingStationPieData() |
| | | this.getOilTypePieData() |
| | | this.getOilTypeLineData() |
| | | this.getTrendAnalysis() |
| | | this.getOilFreqCompareData() |
| | | }, |
| | |
| | | this.getVehicleTypeLineData() |
| | | this.getVehicleStationPieData() |
| | | this.getFuelingStationPieData() |
| | | this.getOilTypePieData() |
| | | this.getOilTypeLineData() |
| | | this.getTrendAnalysis() |
| | | }, |
| | | }, |
| | | |
| | | created() { |
| | | this.initData() |
| | | }, |
| | | mounted() { |
| | | this.$nextTick(() => { |
| | | setTimeout(() => { |
| | | const scrollTarget = localStorage.getItem('scrollToTarget') |
| | | if (scrollTarget) { |
| | | const element = document.getElementById(scrollTarget) |
| | | if (element) { |
| | | element.scrollIntoView({ behavior: 'smooth', block: 'center' }) |
| | | localStorage.removeItem('scrollToTarget') |
| | | } |
| | | } |
| | | const trendType = localStorage.getItem('trendAnalysisType') |
| | | if (trendType) { |
| | | this.trendAnalysisType = parseInt(trendType) |
| | | localStorage.removeItem('trendAnalysisType') |
| | | this.getTrendAnalysis() |
| | | } |
| | | }, 500) |
| | | }) |
| | | }, |
| | | } |
| | | </script> |
| | |
| | | background: #fff; |
| | | } |
| | | .data-reMechanism { |
| | | position: relative; |
| | | isolation: isolate; |
| | | > div { |
| | | position: relative; |
| | | z-index: 2; |
| | | } |
| | | > div:nth-child(2) { |
| | | z-index: 1; |
| | | } |
| | | &.trend-detail-open { |
| | | pointer-events: none; |
| | | } |
| | | .trend-analysis-chart { |
| | | position: relative; |
| | | z-index: 1; |
| | | overflow: hidden; |
| | | } |
| | | .trend-analysis-chart.is-modal-open { |
| | | pointer-events: none; |
| | | } |
| | | .table-operator { |
| | | position: relative; |
| | | z-index: 2; |
| | | margin: 24px 0 0 0; |
| | | } |
| | | .block-title { |
| | |
| | | font-size: 16px; |
| | | } |
| | | .fueling-overview-ct { |
| | | position: relative; |
| | | z-index: 2; |
| | | // margin: 0 12px; |
| | | .fueling-overview-block { |
| | | display: flex; |
| | |
| | | } |
| | | } |
| | | .oil-freq-compare-ct { |
| | | position: relative; |
| | | z-index: 2; |
| | | margin: 8px 12px 24px 12px; |
| | | .oil-freq-compare-operator { |
| | | display: flex; |
| | |
| | | } |
| | | } |
| | | </style> |
| | | <style lang="less"> |
| | | .trend-detail-modal-wrap { |
| | | z-index: 5000 !important; |
| | | } |
| | | .trend-detail-modal-wrap + .ant-modal-mask { |
| | | z-index: 4999 !important; |
| | | } |
| | | </style> |