فهرست منبع

车辆、车辆记录、黑白名单等一些问题修改

xu 3 ماه پیش
والد
کامیت
470f251888

+ 1 - 1
server/config.yaml

@@ -125,7 +125,7 @@ mysql:
     config: charset=utf8mb4&parseTime=True&loc=Local
     db-name: lc_garage
     username: root
-    password: 123456
+    password: root
     path: 127.0.0.1
     engine: ""
     log-mode: error

+ 1 - 1
server/dao/shortlist.go

@@ -18,7 +18,7 @@ func (Shortlist) TableName() string {
 }
 
 func QueryShortlistList(limit, offset int, listType, plateNumber, rfidTag string) (list []Shortlist, total int64, err error) {
-	db := global.GVA_DB.Model(&Shortlist{}).Preload("Vehicle") // 预加载车辆信息
+	db := global.GVA_DB.Model(&Shortlist{}).Preload("Vehicle").Preload("Vehicle.VehicleType") // 预加载车辆信息
 
 	// 1. 按名单类型筛选:black / white
 	if listType != "" {

+ 11 - 11
server/dao/vehicle_record.go

@@ -7,17 +7,17 @@ import (
 
 type VehicleRecord struct {
 	global.GVA_MODEL
-	PlateNumber    string    `gorm:"size:20;" json:"plate_number"`                   // 车牌号
-	RFIDTag        string    `gorm:"size:20;column:rfid_tag" json:"rfid_tag"`        // 标签
-	EntryTime      time.Time `json:"entry_time" gorm:"default:null"`                 // 入场时间
-	ExitTime       time.Time `json:"exit_time" gorm:"default:null"`                  // 出场时间
-	StayTime       int64     `json:"stay_time"`                                      // 停留时间(分钟)
-	Fee            float64   `json:"fee"`                                            // 费用
-	PaymentStatus  string    `gorm:"size:20;default:'unpaid'" json:"payment_status"` // 支付状态
-	EntryImage     string    `gorm:"size:255" json:"entry_image"`                    // 入场图片
-	ExitImage      string    `gorm:"size:255" json:"exit_image"`                     // 出场图片
-	ParkingLotID   uint      `json:"parking_lot_id"`                                 // 停车场ID
-	ParkingSpaceID uint      `json:"parking_space_id"`                               // 停车位ID
+	PlateNumber    string     `gorm:"size:20;" json:"plate_number"`                   // 车牌号
+	RFIDTag        string     `gorm:"size:20;column:rfid_tag" json:"rfid_tag"`        // 标签
+	EntryTime      time.Time  `json:"entry_time" gorm:"default:null"`                 // 入场时间
+	ExitTime       *time.Time `json:"exit_time" gorm:"default:null"`                  // 出场时间
+	StayTime       int64      `json:"stay_time"`                                      // 停留时间(分钟)
+	Fee            float64    `json:"fee"`                                            // 费用
+	PaymentStatus  string     `gorm:"size:20;default:'unpaid'" json:"payment_status"` // 支付状态
+	EntryImage     string     `gorm:"size:255" json:"entry_image"`                    // 入场图片
+	ExitImage      string     `gorm:"size:255" json:"exit_image"`                     // 出场图片
+	ParkingLotID   uint       `json:"parking_lot_id"`                                 // 停车场ID
+	ParkingSpaceID uint       `json:"parking_space_id"`                               // 停车位ID
 }
 
 func (VehicleRecord) TableName() string {

+ 32 - 33
server/service/vehicle/vehicle.go

@@ -213,47 +213,48 @@ func (s *VehicleService) VehicleEntry(req request.VehicleEntry) (request.Vehicle
 
 // VehicleExit 车辆出场
 func (s *VehicleService) VehicleExit(req request.VehicleExit) (request.VehicleExitResponse, error) {
-	// 检查是否有未出场的记录
+	// 1. 查询未出场记录
 	var record dao.VehicleRecord
-	result := global.GVA_DB.Where("(plate_number = ? OR rfid_tag = ?) AND exit_time IS NULL", req.PlateNumber, req.RFIDTag).First(&record)
-	if result.RowsAffected == 0 {
-		return request.VehicleExitResponse{}, errors.New("车辆未入场")
+	if err := global.GVA_DB.Where("(plate_number = ? OR rfid_tag = ?) AND exit_time IS NULL", req.PlateNumber, req.RFIDTag).First(&record).Error; err != nil {
+		return request.VehicleExitResponse{}, errors.New("车辆未入场或已出场")
 	}
 
-	// 获取车辆信息
+	// 2. 获取车辆信息
 	vehicle, err := s.GetVehicleByPlateNumber(req.PlateNumber, req.RFIDTag)
 	if err != nil {
 		return request.VehicleExitResponse{}, err
 	}
 
-	// 计算费用
+	// 3. 计算停留时长 & 费用
 	exitTime := time.Now()
-	stayTime := int64(exitTime.Sub(record.EntryTime).Minutes()) // 转换为分钟
-	fee := s.calculateFee(vehicle, stayTime)
+	stayTime := int64(exitTime.Sub(record.EntryTime).Minutes())
+	if stayTime < 0 {
+		stayTime = 0
+	}
+	fee := s.calculateFee(&vehicle, stayTime)
 
-	// 更新出场记录
-	record.ExitTime = exitTime
+	// 4. 更新出场记录
+	record.ExitTime = &exitTime
 	record.StayTime = stayTime
 	record.Fee = fee
 	record.ExitImage = req.ExitImage
-	record.PaymentStatus = "paid" // 假设出场时已支付
+	record.PaymentStatus = "paid"
 
-	err = global.GVA_DB.Save(&record).Error
-	if err != nil {
+	if err := global.GVA_DB.Save(&record).Error; err != nil {
 		return request.VehicleExitResponse{}, err
 	}
 
-	// 更新车辆信息
+	// 5. 更新车辆统计信息
 	vehicle.LastExitTime = &exitTime
 	vehicle.TotalStayTime += stayTime
 	vehicle.TotalFee += fee
 	global.GVA_DB.Save(&vehicle)
 
-	response := request.VehicleExitResponse{
-		Success: true,
-		Message: "车辆出场成功",
-	}
-	response.Data.PlateNumber = req.PlateNumber
+	// 6. 完全匹配你的匿名结构体返回(正确写法)
+	var response request.VehicleExitResponse
+	response.Success = true
+	response.Message = "车辆出场成功"
+	response.Data.PlateNumber = record.PlateNumber
 	response.Data.EntryTime = record.EntryTime.Unix()
 	response.Data.ExitTime = exitTime.Unix()
 	response.Data.StayTime = stayTime
@@ -264,31 +265,29 @@ func (s *VehicleService) VehicleExit(req request.VehicleExit) (request.VehicleEx
 }
 
 // calculateFee 计算停车费用
-func (s *VehicleService) calculateFee(vehicle dao.Vehicle, stayTime int64) float64 {
-	// 获取收费配置
+func (s *VehicleService) calculateFee(vehicle *dao.Vehicle, stayTime int64) float64 {
+	// 1. 根据车辆类型ID获取收费配置(唯一)
 	var feeConfig dao.FeeConfig
-	result := global.GVA_DB.Where("vehicle_type_id = ?", vehicle.VehicleTypeID).First(&feeConfig)
-	if result.RowsAffected == 0 {
-		// 使用默认收费标准
-		return float64(stayTime) * 0.1 // 默认0.1元/分钟
+	if err := global.GVA_DB.Where("vehicle_type_id = ?", vehicle.VehicleTypeID).First(&feeConfig).Error; err != nil {
+		// 无配置 → 默认计费
+		return float64(stayTime) * 0.1
 	}
 
-	// 检查是否是VIP且免费
+	// 2. 判断VIP有效性
 	isVIP := false
 	if vehicle.OwnerId != nil {
 		var owner dao.Owner
-		ownerResult := global.GVA_DB.First(&owner, *vehicle.OwnerId)
-		if ownerResult.RowsAffected > 0 {
-			// 检查是否是VIP且未过期
+		if err := global.GVA_DB.First(&owner, *vehicle.OwnerId).Error; err == nil {
 			isVIP = owner.IsVip && time.Now().Before(owner.VipExpireTime)
 		}
 	}
 
+	// 3. VIP 免费
 	if isVIP && feeConfig.IsVIPFree {
 		return 0
 	}
 
-	//  计算费用
+	// 4. 基础费用计算
 	fee := feeConfig.StartFee
 	if stayTime > int64(feeConfig.StartTime) {
 		extraTime := stayTime - int64(feeConfig.StartTime)
@@ -299,12 +298,12 @@ func (s *VehicleService) calculateFee(vehicle dao.Vehicle, stayTime int64) float
 		fee += float64(extraUnits) * feeConfig.UnitFee
 	}
 
-	// 检查每日最高费用
-	if fee > feeConfig.DailyMaxFee {
+	// 5. 每日封顶
+	if feeConfig.DailyMaxFee > 0 && fee > feeConfig.DailyMaxFee {
 		fee = feeConfig.DailyMaxFee
 	}
 
-	// 应用VIP折扣
+	// 6. VIP 折扣
 	if isVIP {
 		fee *= feeConfig.VIPDiscount
 	}

+ 23 - 23
web/src/api/pricing.js

@@ -1,43 +1,43 @@
 import service from '@/utils/request'
 // 创建收费配置
 export const addPricing = (data) => {
-    return service({
-        url: '/vehicle/fee-config/create',
-        method: 'post',
-        data
-    })
+  return service({
+    url: '/vehicle/fee-config/create',
+    method: 'post',
+    data
+  })
 }
 
 // 更新收费配置
 export const editPricing = (data) => {
-    return service({
-        url: '/vehicle/fee-config/update',
-        method: 'put',
-        data
-    })
+  return service({
+    url: '/vehicle/fee-config/update',
+    method: 'put',
+    data
+  })
 }
 
 // 根据ID获取收费配置
 export const pricingId = (id) => {
-    return service({
-        url: '/vehicle/fee-config/get?id=' + id,
-        method: 'get'
-    })
+  return service({
+    url: '/vehicle/fee-config/get?id=' + id,
+    method: 'get'
+  })
 }
 
 // 获取收费配置列表
 export const obtainPricingList = (params) => {
-    return service({
-        url: '/vehicle/fee-config/list',
-        method: 'get',
-        params
-    })
+  return service({
+    url: '/vehicle/fee-config/list',
+    method: 'get',
+    params
+  })
 }
 
 // 删除收费配置
 export const removePricing = (id) => {
-    return service({
-        url: '/vehicle/fee-config/delete?id=' + id,
-        method: 'delete',
-    })
+  return service({
+    url: '/vehicle/fee-config/delete?id=' + id,
+    method: 'delete',
+  })
 }

+ 252 - 140
web/src/view/parking/pricing.vue

@@ -1,245 +1,357 @@
 <template>
   <div>
     <el-form inline>
-      <el-form-item>
-        <el-input placeholder="请输入车辆类型" v-model="getPricingData.vehicle_type" />
+      <el-form-item label="车辆类型">
+        <el-select
+          v-model="getPricingData.vehicle_type_id"
+          placeholder="全部"
+          clearable
+          style="width: 180px"
+        >
+          <el-option
+            v-for="item in vehicleTypeList"
+            :key="item.ID"
+            :label="item.name"
+            :value="item.ID"
+          />
+        </el-select>
       </el-form-item>
       <el-form-item>
-        <el-button type="primary" icon="Search" @click="getPricingList">搜索</el-button>
+        <el-button
+          type="primary"
+          icon="Search"
+          @click="getPricingList"
+        >搜索</el-button>
       </el-form-item>
       <el-form-item>
-        <el-button type="primary" icon="Plus" @click="openPricing('新增收费配置','')">新增</el-button>
+        <el-button
+          type="primary"
+          icon="Plus"
+          @click="openPricing('新增收费配置','')"
+        >新增</el-button>
       </el-form-item>
     </el-form>
-    <el-table :data="pricingList" height="605">
-      <el-table-column label="车辆类型" align="center" width="180" prop="vehicle_type"></el-table-column>
-      <el-table-column label="初始费用" align="center" width="180" prop="start_fee"></el-table-column>
-      <el-table-column label="单位费用" align="center" width="180" prop="unit_fee"></el-table-column>
-      <el-table-column label="是否为VIP" align="center" width="180">
+
+    <el-table
+      :data="pricingList"
+      height="605"
+    >
+      <el-table-column
+        label="车辆类型"
+        align="center"
+        width="180"
+        prop="vehicle_type.name"
+      />
+      <el-table-column
+        label="初始费用"
+        align="center"
+        width="180"
+        prop="start_fee"
+      />
+      <el-table-column
+        label="单位费用"
+        align="center"
+        width="180"
+        prop="unit_fee"
+      />
+      <el-table-column
+        label="是否为VIP免费"
+        align="center"
+        width="180"
+      >
         <template #default="scope">
-          <el-button :type="scope.row.is_vip_free ? 'success' : 'danger'" plain>
-            {{scope.row.is_vip_free ? '已成为vip' : '未成为vip'}}
+          <el-button
+            :type="scope.row.is_vip_free ? 'success' : 'danger'"
+            plain
+          >
+            {{ scope.row.is_vip_free ? 'VIP免费' : 'VIP不免费' }}
           </el-button>
         </template>
       </el-table-column>
-      <el-table-column label="每日最大费用" align="center" width="180" prop="daily_max_fee"></el-table-column>
-      <el-table-column label="vip折扣" align="center" width="180" prop="vip_discount"></el-table-column>
-      <el-table-column label="操作" align="center">
+      <el-table-column
+        label="每日最大费用"
+        align="center"
+        width="180"
+        prop="daily_max_fee"
+      />
+      <el-table-column
+        label="vip折扣"
+        align="center"
+        width="180"
+        prop="vip_discount"
+      />
+      <el-table-column
+        label="操作"
+        align="center"
+      >
         <template #default="scope">
-          <el-tooltip :content="scope.row.description" placement="top" effect="light">
-            <el-button text type="primary" icon="MessageBox">备注</el-button>
+          <el-tooltip
+            :content="scope.row.description"
+            placement="top"
+            effect="light"
+          >
+            <el-button
+              text
+              type="primary"
+              icon="MessageBox"
+            >备注</el-button>
           </el-tooltip>
-          <el-button @click="openPricing('编辑收费配置', scope.row)" icon="edit" text type="primary">编辑</el-button>
-          <el-button @click="deletePricing(scope.row)" icon="delete" text type="primary">删除</el-button>
+          <el-button
+            icon="edit"
+            text
+            type="primary"
+            @click="openPricing('编辑收费配置', scope.row)"
+          >编辑</el-button>
+          <el-button
+            icon="delete"
+            text
+            type="primary"
+            @click="deletePricing(scope.row)"
+          >删除</el-button>
         </template>
       </el-table-column>
     </el-table>
+
     <div style="width: 100%;display: flex;justify-content: end">
       <el-pagination
-          :current-page="getPricingData.page"
-          :page-size="getPricingData.page_size"
-          :page-sizes="[10, 30, 50, 100]"
-          :total="pricingTotal"
-          layout="total, sizes, prev, pager, next, jumper"
-          @current-change="handleCurrentChange"
-          @size-change="handleSizeChange"
-          style="padding-right: 10px"
+        :current-page="getPricingData.page"
+        :page-size="getPricingData.page_size"
+        :page-sizes="[10, 30, 50, 100]"
+        :total="pricingTotal"
+        layout="total, sizes, prev, pager, next, jumper"
+        style="padding-right: 10px"
+        @current-change="handleCurrentChange"
+        @size-change="handleSizeChange"
       />
     </div>
-    <el-dialog v-model="pricingShow" :title="pricingTitle" width="650">
-      <el-form label-width="120" size="large">
+
+    <el-dialog
+      v-model="pricingShow"
+      :title="pricingTitle"
+      width="650"
+    >
+      <el-form
+        label-width="120"
+        size="large"
+      >
         <el-form-item label="车辆类型:">
-          <el-select v-model="pricingData.vehicle_type">
-            <el-option label="月租车" value="月租车"></el-option>
-            <el-option label="临时车" value="临时车"></el-option>
+          <el-select
+            v-model="pricingData.vehicle_type_id"
+            placeholder="请选择车辆类型"
+          >
+            <el-option
+              v-for="item in vehicleTypeList"
+              :key="item.ID"
+              :label="item.name"
+              :value="item.ID"
+            />
           </el-select>
         </el-form-item>
-        <el-form-item label="开始时间:">
+        <el-form-item label="免费时长(分钟):">
           <el-input
-              v-model="pricingData.start_time"
-              @input="pricingData.start_time = pricingData.start_time.replace(/[^\d]/g, '')"
+            v-model.number="pricingData.start_time"
+            type="number"
           />
         </el-form-item>
-        <el-form-item label="起始费用:">
-          <el-input v-model="pricingData.start_fee" type="number"/>
+        <el-form-item label="起步费用:">
+          <el-input
+            v-model.number="pricingData.start_fee"
+            type="number"
+          />
         </el-form-item>
-        <el-form-item label="单位费用:">
-          <el-input v-model="pricingData.unit_fee" type="number"/>
+        <el-form-item label="单位时间(分钟):">
+          <el-input
+            v-model.number="pricingData.unit_time"
+            type="number"
+          />
         </el-form-item>
-        <el-form-item label="单位时间:">
+        <el-form-item label="单位费用:">
           <el-input
-              v-model="pricingData.unit_time"
-              @input="pricingData.start_time = pricingData.start_time.replace(/[^\d]/g, '')"
+            v-model.number="pricingData.unit_fee"
+            type="number"
           />
         </el-form-item>
         <el-form-item label="每日最大费用:">
-          <el-input v-model="pricingData.daily_max_fee" type="number"/>
+          <el-input
+            v-model.number="pricingData.daily_max_fee"
+            type="number"
+          />
         </el-form-item>
-        <el-form-item label="是否为vip免费:">
-          <el-radio-group v-model="pricingData.is_vip_free" size="large" fill="#409eff">
-            <el-radio-button label="否" :value="false" />
-            <el-radio-button label="是" :value="true" />
+        <el-form-item label="是否vip免费:">
+          <el-radio-group v-model="pricingData.is_vip_free">
+            <el-radio-button :label="false">否</el-radio-button>
+            <el-radio-button :label="true">是</el-radio-button>
           </el-radio-group>
         </el-form-item>
         <el-form-item label="vip折扣:">
-          <el-input v-model="pricingData.vip_discount" type="number"/>
+          <el-input
+            v-model.number="pricingData.vip_discount"
+            type="number"
+          />
         </el-form-item>
         <el-form-item label="描述:">
-          <el-input v-model="pricingData.description"></el-input>
+          <el-input
+            v-model="pricingData.description"
+            type="textarea"
+            rows="3"
+          />
         </el-form-item>
       </el-form>
       <template #footer>
-        <el-button @click="pricingShow = false" size="large">取消</el-button>
-        <el-button @click="pricingOperation" type="primary" size="large">确认</el-button>
+        <el-button
+          size="large"
+          @click="pricingShow = false"
+        >取消</el-button>
+        <el-button
+          type="primary"
+          size="large"
+          @click="pricingOperation"
+        >确认</el-button>
       </template>
     </el-dialog>
-
   </div>
 </template>
 
 <script setup>
 import { obtainPricingList, addPricing, editPricing, removePricing } from '@/api/pricing'
+import { getAllVehicleTypes } from '@/api/vehicle'
 import { onMounted, reactive, ref } from 'vue'
 import { ElMessage, ElMessageBox } from 'element-plus'
-const pricingList = reactive([1])
+
+const pricingList = ref([])
 const pricingShow = ref(false)
 const pricingTitle = ref('')
+const vehicleTypeList = ref([])
+const pricingTotal = ref(0)
+
+// 查询条件
+const getPricingData = reactive({
+  vehicle_type_id: '',
+  page: 1,
+  page_size: 10
+})
+
+// 表单数据
 const pricingData = reactive({
   id: 0,
-  vehicle_type: '',
+  vehicle_type_id: '',
   start_time: 0,
   start_fee: 0,
   unit_time: 0,
   unit_fee: 0,
   daily_max_fee: 0,
   is_vip_free: false,
-  vip_discount: 0,
+  vip_discount: 1.0,
   description: ''
 })
-const pricingTotal = ref(0)
-
-const getPricingData = reactive({
-  vehicle_type: '',
-  page: 1,
-  page_size: 10
-})
 
-const handleCurrentChange = (val) => {
-  getPricingData.page = val
-  getPricingList()
+// 获取车辆类型下拉
+const loadVehicleTypes = async() => {
+  const res = await getAllVehicleTypes()
+  if (res.code === 0) {
+    vehicleTypeList.value = res.data
+  }
 }
 
-const handleSizeChange = (val) => {
-  getPricingData.page_size = val
-  getPricingList()
-}
+// 获取收费配置列表
 const getPricingList = () => {
   obtainPricingList(getPricingData).then(res => {
     if (res.code === 0) {
-      console.log('收费数据', res.data)
-      pricingList.length = 0
-      pricingList.push(...res.data.list)
+      pricingList.value = res.data.list
       pricingTotal.value = res.data.total
     }
   })
 }
 
+// 删除
 const deletePricing = (data) => {
-  ElMessageBox.confirm(
-      '确定要删除该收费配置吗?',
-      '提示',
-      {
-        confirmButtonText: '确认',
-        cancelButtonText: '取消',
-        type: 'warning',
+  ElMessageBox.confirm('确定删除?', '提示', { type: 'warning' }).then(() => {
+    removePricing(data.ID).then(res => {
+      if (res.code === 0) {
+        ElMessage.success('删除成功')
+        getPricingList()
       }
-  )
-      .then(() => {
-        removePricing(data.ID).then(res => {
-          if (res.code === 0) {
-            ElMessage({
-              type: 'success',
-              message: '删除成功',
-            })
-            getPricingList()
-          } else {
-            ElMessage({
-              type: 'error',
-              message: '删除失败',
-            })
-          }
-        })
-      })
-      .catch(() => {
-        ElMessage({
-          type: 'info',
-          message: '取消删除',
-        })
-      })
+    })
+  })
 }
 
-const openPricing = (head, data) => {
+// 打开新增/编辑
+const openPricing = (title, data) => {
   pricingShow.value = true
-  pricingTitle.value = head
-  if (head === '新增车费配置') {
-    pricingData.vehicle_type = ''
-    pricingData.start_time = 0
-    pricingData.start_fee = 0
-    pricingData.unit_time = 0
-    pricingData.unit_fee = 0
-    pricingData.daily_max_fee = 0
-    pricingData.vip_discount = 0
-    pricingData.is_vip_free = false
-    pricingData.description = ''
+  pricingTitle.value = title
+  if (title === '新增收费配置') {
+    Object.assign(pricingData, {
+      id: 0,
+      vehicle_type_id: '',
+      start_time: 0,
+      start_fee: 0,
+      unit_time: 0,
+      unit_fee: 0,
+      daily_max_fee: 0,
+      is_vip_free: false,
+      vip_discount: 1.0,
+      description: ''
+    })
   } else {
-    pricingData.id = data.ID
-    pricingData.vehicle_type = data.vehicle_type
-    pricingData.start_time = data.start_time
-    pricingData.start_fee = data.start_fee
-    pricingData.unit_time = data.unit_time
-    pricingData.unit_fee = data.unit_fee
-    pricingData.daily_max_fee = data.daily_max_fee
-    pricingData.vip_discount = data.vip_discount
-    pricingData.is_vip_free = data.is_vip_free
-    pricingData.description = data.description
+    Object.assign(pricingData, data)
   }
 }
 
-const pricingOperation = async () => {
-  pricingData.start_time = Number(pricingData.start_time)
-  pricingData.start_fee = Number(pricingData.start_fee)
-  pricingData.unit_time = Number(pricingData.unit_time)
-  pricingData.unit_fee = Number(pricingData.unit_fee)
-  pricingData.daily_max_fee = Number(pricingData.daily_max_fee)
-  pricingData.vip_discount = Number(pricingData.vip_discount)
+// 提交
+const pricingOperation = async() => {
+  if (!pricingData.vehicle_type_id) {
+    ElMessage.warning('请选择车辆类型')
+    return
+  }
+
+  // 关键:提交前强制转数字
+  const params = {
+    id: pricingData.id,
+    vehicle_type_id: pricingData.vehicle_type_id,
+    start_time: Number(pricingData.start_time),
+    start_fee: Number(pricingData.start_fee),
+    unit_time: Number(pricingData.unit_time),
+    unit_fee: Number(pricingData.unit_fee),
+    daily_max_fee: Number(pricingData.daily_max_fee),
+    is_vip_free: pricingData.is_vip_free,
+    vip_discount: Number(pricingData.vip_discount),
+    description: pricingData.description
+  }
+
   if (pricingTitle.value === '新增收费配置') {
-    await addPricing(pricingData).then(res => {
-      console.log(res)
+    await addPricing(params).then(res => {
       if (res.code === 0) {
-        ElMessage.success('添加成功')
+        ElMessage.success('新增成功')
         pricingShow.value = false
         getPricingList()
-      } else {
-        ElMessage.error('添加失败')
       }
     })
   } else {
-    await editPricing(pricingData).then(res => {
+    await editPricing(params).then(res => {
       if (res.code === 0) {
-        ElMessage.success('更新成功')
+        ElMessage.success('修改成功')
         pricingShow.value = false
         getPricingList()
-      } else {
-        ElMessage.error('更新失败')
       }
     })
   }
 }
+
+const handleCurrentChange = (val) => {
+  getPricingData.page = val
+  getPricingList()
+}
+
+const handleSizeChange = (val) => {
+  getPricingData.page_size = val
+  getPricingList()
+}
+
 onMounted(() => {
+  loadVehicleTypes()
   getPricingList()
 })
 </script>
 
 <style scoped lang="scss">
-
 </style>

+ 1 - 1
web/src/view/parking/roster.vue

@@ -89,7 +89,7 @@
       <el-table-column
         label="车辆类型"
         align="center"
-        prop="vehicle.vehicle_type"
+        prop="vehicle.vehicle_type.name"
       />
       <el-table-column
         label="到期时间"