From 73e0b3791990bd60c06c2c0388aae9f9faf538a6 Mon Sep 17 00:00:00 2001
From: zxl <763096477@qq.com>
Date: 星期三, 25 三月 2026 09:16:50 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/show-demo' into show_demo

---
 src/views/dataAnalysis/components/DataReGasStation.vue |  300 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 297 insertions(+), 3 deletions(-)

diff --git a/src/views/dataAnalysis/components/DataReGasStation.vue b/src/views/dataAnalysis/components/DataReGasStation.vue
index bb3ed28..a76e57c 100644
--- a/src/views/dataAnalysis/components/DataReGasStation.vue
+++ b/src/views/dataAnalysis/components/DataReGasStation.vue
@@ -1,5 +1,5 @@
 <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">
@@ -12,7 +12,7 @@
       </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"
@@ -31,6 +31,8 @@
           :chartData="trendAnalysisData"
           style="width: 100%"
           :showpercent="trendAnalysisChartShowPercent"
+          :enablePointClick="true"
+          @chart-click="handleTrendChartClick"
         ></DataReLineChart>
       </div>
       <div id="trendAnalysisChartID"></div>
@@ -122,6 +124,41 @@
         </div>
       </div>
     </div>
+    <div class="oil-freq-compare-ct">
+      <div class="block-title">娲诲姩鍓嶅悗杞﹁締鍔犳补棰戞</div>
+      <div class="oil-freq-compare-operator">
+        <span>娲诲姩鍓嶆椂娈�</span>
+        <a-range-picker
+          style="width: 360px; margin: 0 12px"
+          :value="beforeTimeRange"
+          format="YYYY-MM-DD HH:mm:ss"
+          valueFormat="YYYY-MM-DD HH:mm:ss"
+          :show-time="{ defaultValue: [moment('00:00:00', 'HH:mm:ss'), moment('23:59:59', 'HH:mm:ss')] }"
+          @change="beforeTimeChange"
+        />
+        <span>娲诲姩鍚庢椂娈�</span>
+        <a-range-picker
+          style="width: 360px; margin: 0 12px"
+          :value="afterTimeRange"
+          format="YYYY-MM-DD HH:mm:ss"
+          valueFormat="YYYY-MM-DD HH:mm:ss"
+          :show-time="{ defaultValue: [moment('00:00:00', 'HH:mm:ss'), moment('23:59:59', 'HH:mm:ss')] }"
+          @change="afterTimeChange"
+        />
+        <a-button type="primary" @click="getOilFreqCompareData"> 缁熻棰戞 </a-button>
+      </div>
+      <a-table
+        class="oil-freq-compare-table"
+        rowKey="licenseNum"
+        size="middle"
+        :columns="oilFreqCompareColumns"
+        :dataSource="oilFreqCompareData"
+        :loading="oilFreqCompareLoading"
+        :scroll="{ y: 420 }"
+        :pagination="{ pageSize: 10, showSizeChanger: true, pageSizeOptions: ['10', '20', '50'] }"
+      >
+      </a-table>
+    </div>
     <div>
       <div class="block-title">杞﹀瀷鍒嗘瀽</div>
       <div style="display: flex">
@@ -175,6 +212,33 @@
       :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>
 
@@ -183,6 +247,7 @@
 import DataReLineChart from './DataReLineChart'
 import DataRePieChart from './DataRePieChart'
 import { getAction, postAction } from '@tievd/cube-block/lib/api/manage'
+import moment from 'moment'
 export default {
   name: 'DataReMechanism',
   components: {
@@ -228,10 +293,131 @@
       trendAnalysisUnit: 'DAYS', //瓒嬪娍鍒嗘瀽閫夋嫨鏃堕棿
       trendAnalysisData: {}, //瓒嬪娍鍒嗘瀽鏁版嵁
       trendAnalysisChart: null, //瓒嬪娍鍒嗘瀽鍥捐〃
+      trendDetailVisible: false,
+      trendDetailTitle: '瓒嬪娍鍒嗘瀽鏄庣粏',
+      trendDetailLoading: false,
+      trendDetailData: [],
+      trendDetailColumns: [],
+      beforeStartTime: '',
+      beforeEndTime: '',
+      afterStartTime: '',
+      afterEndTime: '',
+      beforeTimeRange: [],
+      afterTimeRange: [],
+      oilFreqCompareLoading: false,
+      oilFreqCompareData: [],
+      oilFreqCompareColumns: [
+        {
+          title: '杞︾墝鍙�',
+          align: 'center',
+          dataIndex: 'licenseNum',
+        },
+        {
+          title: '娲诲姩鍓嶅姞娌规鏁�',
+          align: 'center',
+          dataIndex: 'beforeOilCount',
+        },
+        {
+          title: '娲诲姩鍚庡姞娌规鏁�',
+          align: 'center',
+          dataIndex: 'afterOilCount',
+        },
+        {
+          title: '鍙樺寲鍊�',
+          align: 'center',
+          dataIndex: 'diffOilCount',
+        },
+        {
+          title: '鍙樺寲鐜�',
+          align: 'center',
+          dataIndex: 'diffRate',
+          customRender: function (t) {
+            if (t === null || t === undefined) {
+              return '--'
+            }
+            return t + '%'
+          },
+        },
+      ],
     }
   },
 
   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' },
+        ]
+      }
+      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', {
@@ -340,15 +526,70 @@
         this.contrastObj = res.result
       })
     },
+    beforeTimeChange(e, t) {
+      this.beforeTimeRange = t
+      this.beforeStartTime = t && t.length ? t[0] : ''
+      this.beforeEndTime = t && t.length ? t[1] : ''
+    },
+    afterTimeChange(e, t) {
+      this.afterTimeRange = t
+      this.afterStartTime = t && t.length ? t[0] : ''
+      this.afterEndTime = t && t.length ? t[1] : ''
+    },
+    setOilFreqDefaultRangeByActivity(activity) {
+      if (!activity || !activity.startTime || !activity.endTime) {
+        return
+      }
+      this.afterStartTime = activity.startTime
+      this.afterEndTime = activity.endTime
+      this.afterTimeRange = [this.afterStartTime, this.afterEndTime]
+      let startMoment = moment(activity.startTime)
+      let endMoment = moment(activity.endTime)
+      let spanSeconds = endMoment.diff(startMoment, 'seconds')
+      if (spanSeconds <= 0) {
+        return
+      }
+      this.beforeEndTime = startMoment.format('YYYY-MM-DD HH:mm:ss')
+      this.beforeStartTime = startMoment.clone().subtract(spanSeconds, 'seconds').format('YYYY-MM-DD HH:mm:ss')
+      this.beforeTimeRange = [this.beforeStartTime, this.beforeEndTime]
+    },
+    getOilFreqCompareData() {
+      if (!this.beforeStartTime || !this.beforeEndTime || !this.afterStartTime || !this.afterEndTime) {
+        this.oilFreqCompareData = []
+        return
+      }
+      this.oilFreqCompareLoading = true
+      postAction('/jyz/dataTable/statisOilFreqCompare', {
+        orgCode: this.selectTreeObj.orgCode,
+        beforeStartTime: this.beforeStartTime,
+        beforeEndTime: this.beforeEndTime,
+        afterStartTime: this.afterStartTime,
+        afterEndTime: this.afterEndTime,
+      })
+        .then((res) => {
+          this.oilFreqCompareData = res.result || []
+        })
+        .finally(() => {
+          this.oilFreqCompareLoading = false
+        })
+    },
     activeTimeChange(e) {
       console.log(e)
       if (e) {
         let item = this.activeOptions.find((el) => el.id == e)
         this.startTime = item.startTime
         this.endTime = item.endTime
+        this.setOilFreqDefaultRangeByActivity(item)
       } else {
         this.startTime = ''
         this.endTime = ''
+        this.beforeStartTime = ''
+        this.beforeEndTime = ''
+        this.afterStartTime = ''
+        this.afterEndTime = ''
+        this.beforeTimeRange = []
+        this.afterTimeRange = []
+        this.oilFreqCompareData = []
       }
     },
     activeChange() {},
@@ -390,6 +631,7 @@
       this.getVehicleStationPieData()
       this.getFuelingStationPieData()
       this.getTrendAnalysis()
+      this.getOilFreqCompareData()
     },
     initData() {
       this.getCustomerData()
@@ -430,7 +672,7 @@
 <style scoped lang="less">
 @import '~@assets/less/common.less';
 /deep/ .ant-table-content {
-  height: 500px;
+  height: auto;
   .ant-table-placeholder {
     background: none;
     border: none;
@@ -440,7 +682,29 @@
   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 {
@@ -448,6 +712,8 @@
     font-size: 16px;
   }
   .fueling-overview-ct {
+    position: relative;
+    z-index: 2;
     // margin: 0 12px;
     .fueling-overview-block {
       display: flex;
@@ -463,5 +729,33 @@
       }
     }
   }
+  .oil-freq-compare-ct {
+    position: relative;
+    z-index: 2;
+    margin: 8px 12px 24px 12px;
+    .oil-freq-compare-operator {
+      display: flex;
+      align-items: center;
+      flex-wrap: wrap;
+      gap: 8px 0;
+      margin: 12px 0;
+    }
+    .oil-freq-compare-table {
+      /deep/ .ant-table-body {
+        min-height: 240px;
+      }
+      /deep/ .ant-table-pagination.ant-pagination {
+        margin: 12px 0 4px 0;
+      }
+    }
+  }
+}
+</style>
+<style lang="less">
+.trend-detail-modal-wrap {
+  z-index: 5000 !important;
+}
+.trend-detail-modal-wrap + .ant-modal-mask {
+  z-index: 4999 !important;
 }
 </style>

--
Gitblit v1.8.0