From cfe0b79fbea0fb1d7a5a796e71ada7d3b7812046 Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期一, 15 十二月 2025 22:31:33 +0800
Subject: [PATCH] feat: 企业微信发送微信小程序cetd

---
 ruoyi-ui/src/views/system/mileageStats/index.vue |  172 ++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 156 insertions(+), 16 deletions(-)

diff --git a/ruoyi-ui/src/views/system/mileageStats/index.vue b/ruoyi-ui/src/views/system/mileageStats/index.vue
index 8a6738c..0cbe724 100644
--- a/ruoyi-ui/src/views/system/mileageStats/index.vue
+++ b/ruoyi-ui/src/views/system/mileageStats/index.vue
@@ -131,9 +131,7 @@
           </el-tag>
         </template>
       </el-table-column>
-      <el-table-column label="GPS鐐规暟" align="center" prop="gpsPointCount" width="90" />
-      <el-table-column label="浠诲姟鏁�" align="center" prop="taskCount" width="80" />
-      <el-table-column label="鍒嗘鏁�" align="center" prop="segmentCount" width="80" />
+      
       <el-table-column label="缁熻鏃堕棿" align="center" prop="createTime" width="160">
         <template slot-scope="scope">
           <span>{{ parseTime(scope.row.createTime) }}</span>
@@ -170,8 +168,30 @@
     <!-- 鎵嬪姩缁熻瀵硅瘽妗� -->
     <el-dialog title="鎵嬪姩閲岀▼缁熻" :visible.sync="calculateOpen" width="500px" append-to-body>
       <el-form ref="calculateForm" :model="calculateForm" :rules="calculateRules" label-width="100px">
-        <el-form-item label="杞﹁締ID" prop="vehicleId">
-          <el-input v-model="calculateForm.vehicleId" placeholder="璇疯緭鍏ヨ溅杈咺D" type="number" />
+        <el-form-item label="杞︾墝鍙�" prop="vehicleId">
+          <el-select
+            v-model="calculateForm.vehicleId"
+            placeholder="璇疯緭鍏ヨ溅鐗屽彿鎼滅储"
+            filterable
+            remote
+            :remote-method="searchVehicles"
+            :loading="vehicleSearchLoading"
+            clearable
+            style="width: 100%"
+            @change="handleVehicleChange"
+          >
+            <el-option
+              v-for="vehicle in vehicleOptions"
+              :key="vehicle.vehicleId"
+              :label="vehicle.vehicleNo"
+              :value="vehicle.vehicleId"
+            >
+              <span style="float: left">{{ vehicle.vehicleNo }}</span>
+              <span style="float: right; color: #8492a6; font-size: 13px" v-if="vehicle.deptName">
+                {{ vehicle.deptName }}
+              </span>
+            </el-option>
+          </el-select>
         </el-form-item>
         <el-form-item label="缁熻鏃ユ湡" prop="statDate">
           <el-date-picker
@@ -216,7 +236,7 @@
     </el-dialog>
 
     <!-- 璇︽儏瀵硅瘽妗� -->
-    <el-dialog title="閲岀▼缁熻璇︽儏" :visible.sync="detailOpen" width="600px" append-to-body>
+    <el-dialog title="閲岀▼缁熻璇︽儏" :visible.sync="detailOpen" width="900px" append-to-body>
       <el-descriptions :column="2" border>
         <el-descriptions-item label="杞︾墝鍙�">{{ detailData.vehicleNo }}</el-descriptions-item>
         <el-descriptions-item label="褰掑睘鍒嗗叕鍙�">{{ detailData.deptName || '-' }}</el-descriptions-item>
@@ -237,18 +257,58 @@
             {{ formatRatio(detailData.taskRatio) }}
           </el-tag>
         </el-descriptions-item>
-        <el-descriptions-item label="GPS鐐规暟">{{ detailData.gpsPointCount }}</el-descriptions-item>
-        <el-descriptions-item label="浠诲姟鏁�">{{ detailData.taskCount }}</el-descriptions-item>
-        <el-descriptions-item label="鍒嗘鏁�">{{ detailData.segmentCount }}</el-descriptions-item>
-        <el-descriptions-item label="鏁版嵁鏉ユ簮">
-          <el-tag :type="detailData.dataSource === 'segment' ? 'success' : 'info'" size="small">
-            {{ detailData.dataSource === 'segment' ? '浠庡垎娈垫眹鎬�' : '鐩存帴璁$畻' }}
-          </el-tag>
-        </el-descriptions-item>
         <el-descriptions-item label="缁熻鏃堕棿" :span="2">
           {{ parseTime(detailData.createTime) }}
         </el-descriptions-item>
       </el-descriptions>
+      
+      <!-- 鍒嗘鏄庣粏琛ㄦ牸 -->
+      <div v-if="segmentList.length > 0" style="margin-top: 20px;">
+        <el-divider content-position="left">
+          <i class="el-icon-tickets"></i> 閲岀▼鍒嗘鏄庣粏
+        </el-divider>
+        
+        <el-table 
+          :data="segmentList" 
+          size="small"
+          :max-height="400"
+          stripe
+          border
+          v-loading="segmentLoading"
+        >
+          <el-table-column type="index" label="搴忓彿" width="50" align="center" />
+          <el-table-column label="寮�濮嬫椂闂�" prop="segmentStartTime" width="160" align="center">
+            <template slot-scope="scope">
+              {{ parseTime(scope.row.segmentStartTime, '{y}-{m}-{d} {h}:{i}:{s}') }}
+            </template>
+          </el-table-column>
+          <el-table-column label="缁撴潫鏃堕棿" prop="segmentEndTime" width="160" align="center">
+            <template slot-scope="scope">
+              {{ parseTime(scope.row.segmentEndTime, '{y}-{m}-{d} {h}:{i}:{s}') }}
+            </template>
+          </el-table-column>
+          <el-table-column label="閲岀▼(km)" prop="segmentDistance" width="100" align="center">
+            <template slot-scope="scope">
+              <span class="mileage-value">{{ (scope.row.segmentDistance || 0).toFixed(2) }}</span>
+            </template>
+          </el-table-column>
+        
+          <el-table-column label="鍏宠仈浠诲姟" prop="taskCode" align="center" min-width="120">
+            <template slot-scope="scope">
+              <el-tag v-if="scope.row.taskCode" size="small" type="success">{{ scope.row.taskCode }}</el-tag>
+              <span v-else style="color: #909399;">鏃犱换鍔�</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="璁$畻鏂瑰紡" prop="calculateMethod" align="center" width="100">
+            <template slot-scope="scope">
+              <el-tag size="small" :type="scope.row.calculateMethod === 'haversine' ? 'primary' : 'info'">
+                {{ scope.row.calculateMethod === 'haversine' ? '鐞冮潰璺濈' : '鐩寸嚎璺濈' }}
+              </el-tag>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+      
       <div slot="footer" class="dialog-footer">
         <el-button @click="detailOpen = false">鍏� 闂�</el-button>
       </div>
@@ -257,8 +317,9 @@
 </template>
 
 <script>
-import { listMileageStats, getMileageStats, delMileageStats, calculateMileageStats, batchCalculateMileageStats } from "@/api/system/mileageStats";
+import { listMileageStats, getMileageStats, delMileageStats, calculateMileageStats, batchCalculateMileageStats, getSegmentsByDateRange } from "@/api/system/mileageStats";
 import { listDept } from "@/api/system/dept";
+import { listVehicle } from "@/api/system/vehicle";
 
 export default {
   name: "MileageStats",
@@ -292,10 +353,18 @@
       detailOpen: false,
       // 璇︽儏鏁版嵁
       detailData: {},
+      // 鍒嗘鏄庣粏鍒楄〃
+      segmentList: [],
+      // 鍒嗘鏄庣粏鍔犺浇鐘舵��
+      segmentLoading: false,
       // 鎵嬪姩缁熻鍔犺浇鐘舵��
       calculateLoading: false,
       // 鎵归噺缁熻鍔犺浇鐘舵��
       batchCalculateLoading: false,
+      // 杞﹁締鎼滅储鍔犺浇鐘舵��
+      vehicleSearchLoading: false,
+      // 杞﹁締閫夐」鍒楄〃
+      vehicleOptions: [],
       // 鏌ヨ鍙傛暟
       queryParams: {
         pageNum: 1,
@@ -317,7 +386,7 @@
       // 鎵嬪姩缁熻琛ㄥ崟鏍¢獙
       calculateRules: {
         vehicleId: [
-          { required: true, message: "杞﹁締ID涓嶈兘涓虹┖", trigger: "blur" }
+          { required: true, message: "璇烽�夋嫨杞﹁締", trigger: "change" }
         ],
         statDate: [
           { required: true, message: "缁熻鏃ユ湡涓嶈兘涓虹┖", trigger: "change" }
@@ -371,7 +440,43 @@
     /** 鎵嬪姩缁熻鎸夐挳鎿嶄綔 */
     handleCalculate() {
       this.reset();
+      this.vehicleOptions = [];
       this.calculateOpen = true;
+      // 鎵撳紑瀵硅瘽妗嗘椂鍔犺浇涓�浜涜溅杈嗘暟鎹�
+      this.searchVehicles('');
+    },
+    /** 鎼滅储杞﹁締 */
+    searchVehicles(query) {
+      if (query !== '') {
+        this.vehicleSearchLoading = true;
+        listVehicle({
+          vehicleNo: query,
+          pageNum: 1,
+          pageSize: 50
+        }).then(response => {
+          this.vehicleOptions = response.rows || [];
+          this.vehicleSearchLoading = false;
+        }).catch(() => {
+          this.vehicleSearchLoading = false;
+        });
+      } else {
+        // 濡傛灉鏌ヨ涓虹┖锛屽姞杞藉墠50鏉¤溅杈嗘暟鎹�
+        this.vehicleSearchLoading = true;
+        listVehicle({
+          pageNum: 1,
+          pageSize: 50
+        }).then(response => {
+          this.vehicleOptions = response.rows || [];
+          this.vehicleSearchLoading = false;
+        }).catch(() => {
+          this.vehicleSearchLoading = false;
+        });
+      }
+    },
+    /** 杞﹁締閫夋嫨鍙樺寲 */
+    handleVehicleChange(value) {
+      // 鍙互鍦ㄨ繖閲屾坊鍔犻澶栫殑澶勭悊閫昏緫
+      console.log('閫夋嫨鐨勮溅杈咺D:', value);
     },
     /** 鎵归噺缁熻鎸夐挳鎿嶄綔 */
     handleBatchCalculate() {
@@ -417,9 +522,44 @@
     /** 鏌ョ湅璇︽儏鎸夐挳鎿嶄綔 */
     handleView(row) {
       const statsId = row.statsId;
+      
+      // 閲嶇疆鍒嗘鏄庣粏
+      this.segmentList = [];
+      
+      // 鍔犺浇缁熻璇︽儏
       getMileageStats(statsId).then(response => {
         this.detailData = response.data;
         this.detailOpen = true;
+        
+        // 濡傛灉鏈夎溅杈咺D鍜岀粺璁℃棩鏈燂紝鍔犺浇鍒嗘鏄庣粏
+        if (this.detailData.vehicleId && this.detailData.statDate) {
+          this.loadSegmentDetails(this.detailData.vehicleId, this.detailData.statDate);
+        }
+      });
+    },
+    
+    /** 鍔犺浇鍒嗘鏄庣粏 */
+    loadSegmentDetails(vehicleId, statDate) {
+      this.segmentLoading = true;
+      
+      // 鏍煎紡鍖栨棩鏈燂細缁熻鏃ユ湡鐨勫紑濮嬪拰缁撴潫鏃堕棿
+      const startDate = this.parseTime(statDate, '{y}-{m}-{d}');
+      const endDate = this.parseTime(statDate, '{y}-{m}-{d}');
+      
+      // 鏌ヨ璇ユ棩鏈熺殑鍒嗘閲岀▼鏄庣粏
+      getSegmentsByDateRange(vehicleId, startDate, endDate).then(response => {
+        if (response.code === 200 && response.data) {
+          this.segmentList = response.data;
+          console.log('鍒嗘鏄庣粏鏁版嵁锛�', this.segmentList);
+        } else {
+          this.segmentList = [];
+        }
+      }).catch(error => {
+        console.error('鍔犺浇鍒嗘鏄庣粏澶辫触', error);
+        this.segmentList = [];
+        this.$modal.msgWarning('鍔犺浇鍒嗘鏄庣粏澶辫触锛屼絾涓嶅奖鍝嶇粺璁℃暟鎹煡鐪�');
+      }).finally(() => {
+        this.segmentLoading = false;
       });
     },
     /** 鍒犻櫎鎸夐挳鎿嶄綔 */

--
Gitblit v1.9.1