2545307760@qq.com 4 месяцев назад
Родитель
Сommit
bc4a7a0609

+ 1 - 1
server/dao/vehicle.go

@@ -16,7 +16,7 @@ type Vehicle struct {
 	Owner         *Owner    `gorm:"foreignKey:OwnerId" json:"owner"`
 	LastEntryTime time.Time `json:"last_entry_time" gorm:"default:null"` // 最近入场时间
 	LastExitTime  time.Time `json:"last_exit_time"  gorm:"default:null"` // 最近出场时间
-	TotalStayTime int64     `json:"total_stay_time"`                     // 总停留时间
+	TotalStayTime int64     `json:"total_stay_time" gorm:"default:null"` // 总停留时间
 	TotalFee      float64   `json:"total_fee"`                           // 总费用
 }
 

+ 11 - 8
server/service/vehicle/vehicle.go

@@ -2,6 +2,7 @@ package vehicle
 
 import (
 	"errors"
+	"fmt"
 	"server/dao"
 	"server/global"
 	"server/model/vehicle/request"
@@ -49,6 +50,7 @@ func (s *vehicleService) UpdateVehicle(req request.VehicleUpdate) error {
 	// 检查车牌号是否被其他车辆使用
 	var existingVehicle dao.Vehicle
 	result = global.GVA_DB.Where("plate_number = ? AND id != ?", req.PlateNumber, req.ID).First(&existingVehicle)
+	fmt.Println("result", result.RowsAffected)
 	if result.RowsAffected > 0 {
 		return errors.New("车牌号已被其他车辆使用")
 	}
@@ -60,14 +62,15 @@ func (s *vehicleService) UpdateVehicle(req request.VehicleUpdate) error {
 	} else {
 		ownerId = nil
 	}
-
-	vehicle.PlateNumber = req.PlateNumber
-	vehicle.VehicleType = req.VehicleType
-	vehicle.VehicleBrand = req.VehicleBrand
-	vehicle.VehicleColor = req.VehicleColor
-	vehicle.OwnerId = ownerId
-
-	return global.GVA_DB.Save(&vehicle).Error
+	err := global.GVA_DB.Model(&vehicle).Updates(map[string]interface{}{
+		"plate_number":  req.PlateNumber,
+		"vehicle_type":  req.VehicleType,
+		"vehicle_brand": req.VehicleBrand,
+		"vehicle_color": req.VehicleColor,
+		"owner_id":      ownerId,
+	}).Error
+
+	return err
 }
 
 // GetVehicleByID 根据ID获取车辆信息

+ 72 - 6
web/src/view/parking/carInfo.vue

@@ -1,11 +1,31 @@
 <template>
   <div>
     <el-form inline>
+      <el-form-item label="车牌号">
+        <el-input
+            placeholder="请输入车牌号"
+            v-model="infoSearchData.plate_number"
+            clearable
+            @clear="infoSearchData.plate_number = ''"/>
+      </el-form-item>
+      <el-form-item label="车主">
+        <el-select v-model="carOwnerName" @change="changeSearchCarOwner" clearable @clear="clearCarOwner">
+          <el-option
+              v-for="item in carOwnerList"
+              :key="item.ID"
+              :label="item.owner_name"
+              :value="item.owner_name"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button icon="Search" type="primary" @click="getCarInfoList">搜索</el-button>
+      </el-form-item>
       <el-form-item>
         <el-button icon="plus" type="primary" @click="openCarInfo('新增车辆信息', '')">新增</el-button>
       </el-form-item>
     </el-form>
-    <el-table :data="carInfoList">
+    <el-table :data="carInfoList" height="605">
       <el-table-column label="车主id" align="center" prop="owner_id">
       </el-table-column>
       <el-table-column label="车牌号" align="center" prop="plate_number">
@@ -23,6 +43,18 @@
         </template>
       </el-table-column>
     </el-table>
+    <div style="width: 100%;display: flex;justify-content: end">
+      <el-pagination
+          :current-page="infoSearchData.page"
+          :page-size="infoSearchData.page_size"
+          :page-sizes="[10, 30, 50, 100]"
+          :total="carInfoTotal"
+          layout="total, sizes, prev, pager, next, jumper"
+          @current-change="handleCurrentChange"
+          @size-change="handleSizeChange"
+          style="padding-right: 10px"
+      />
+    </div>
     <el-dialog v-model="carInfoShow" :title="carInfoTitle" width="500">
       <el-form label-width="90">
         <el-form-item label="车牌号:">
@@ -63,9 +95,10 @@
 
 <script setup>
 import { ref, reactive, onMounted } from "vue"
-import { addCarInfo, editCarInfo, obtainCarInfoList, removeCarInfo } from '@/api/carInfo'
+import { addCarInfo, editCarInfo, obtainCarInfoList, removeCarInfo, carInfoPhone } from '@/api/carInfo'
 import { obtainCarOwnerList } from '@/api/carOwner'
 import { ElMessage, ElMessageBox } from "element-plus";
+const carOwnerName = ref('')
 const carOwnerList = reactive([])
 const carInfoTitle = ref('')
 const carInfoShow = ref(false)
@@ -79,12 +112,21 @@ const carInfoData = reactive({
   rfid_tag: '17'
 })
 
+const infoSearchData = reactive({
+  plate_number: '',
+  vehicle_type: '',
+  owner_id: 0,
+  page: 1,
+  page_size: 10
+})
+
 const ownerName = ref('')
 const carInfoList = reactive([])
+
+const carInfoTotal = ref(0)
 const openCarInfo = (head,data) => {
   carInfoTitle.value = head
   carInfoShow.value = true
-  console.log('编辑信息', data)
   if (head === '编辑车辆信息') {
     carInfoData.id = data.ID
     carInfoData.owner_id = data.owner_id
@@ -108,6 +150,19 @@ const openCarInfo = (head,data) => {
     ownerName.value = ''
   }
 }
+const changeSearchCarOwner = (val) => {
+  carOwnerList.forEach(item => {
+    if (item.owner_name === val) {
+      infoSearchData.owner_id = item.ID
+    }
+  })
+  console.log(infoSearchData.owner_id)
+}
+
+const clearCarOwner = () => {
+  infoSearchData.owner_id = 0
+  ownerName.value = ''
+}
 
 const changeCarOwner = (val) => {
   carOwnerList.forEach(item => {
@@ -120,9 +175,7 @@ const changeCarOwner = (val) => {
 
 const carInfoOperation = () => {
   if (carInfoTitle.value === '新增车辆信息') {
-    console.log('新增信息', carInfoData)
     addCarInfo(carInfoData).then(res => {
-      console.log('结果', res)
       if (res.code === 0) {
         ElMessage.success('添加成功')
         carInfoShow.value = false
@@ -131,6 +184,7 @@ const carInfoOperation = () => {
     })
   } else {
     editCarInfo(carInfoData).then(res => {
+      console.log(res)
       if (res.code === 0) {
         ElMessage.success('更新成功')
         carInfoShow.value = false
@@ -175,10 +229,11 @@ const deleteCarInfo = (data) => {
 }
 
 const getCarInfoList = () => {
-  obtainCarInfoList().then(res => {
+  obtainCarInfoList(infoSearchData).then(res => {
     if (res.code === 0) {
       carInfoList.length = 0
       carInfoList.push(...res.data.list)
+      carInfoTotal.value = res.data.total
     }
   })
 }
@@ -191,6 +246,17 @@ const getCarOwnerList = () => {
     }
   })
 }
+
+const handleCurrentChange = (data) => {
+  infoSearchData.page = data
+  getCarInfoList()
+}
+
+const handleSizeChange = (data) => {
+  infoSearchData.page_size = data
+  getCarInfoList()
+}
+
 onMounted(() => {
   getCarInfoList()
   getCarOwnerList()

+ 54 - 13
web/src/view/parking/pricing.vue

@@ -16,13 +16,19 @@
       <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="车辆类型" align="center" width="180" prop="vehicle_type"></el-table-column>
+      <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>
+        </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">
         <template #default="scope">
           <el-button text type="primary" icon="MessageBox">备注</el-button>
-          <el-button @click="openPricing('编辑车主', scope.row)" icon="edit" text type="primary">编辑</el-button>
+          <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>
         </template>
       </el-table-column>
@@ -30,28 +36,40 @@
     <el-dialog v-model="pricingShow" :title="pricingTitle" width="650">
       <el-form label-width="120" size="large">
         <el-form-item label="车辆类型:">
-          <el-input v-model="pricingData.vehicle_type"/>
+          <el-select v-model="pricingData.vehicle_type">
+            <el-option label="月租车" value="月租车"></el-option>
+            <el-option label="临时车" value="临时车"></el-option>
+          </el-select>
         </el-form-item>
         <el-form-item label="开始时间:">
-          <el-input v-model="pricingData.start_time"/>
+          <el-input
+              v-model="pricingData.start_time"
+              @input="pricingData.start_time = pricingData.start_time.replace(/[^\d]/g, '')"
+          />
         </el-form-item>
         <el-form-item label="起始费用:">
-          <el-input v-model="pricingData.start_fee"/>
+          <el-input v-model="pricingData.start_fee" type="number"/>
         </el-form-item>
         <el-form-item label="单位费用:">
-          <el-input v-model="pricingData.unit_time"/>
+          <el-input v-model="pricingData.unit_fee" type="number"/>
+        </el-form-item>
+        <el-form-item label="单位时间:">
+          <el-input
+              v-model="pricingData.unit_time"
+              @input="pricingData.start_time = pricingData.start_time.replace(/[^\d]/g, '')"
+          />
         </el-form-item>
         <el-form-item label="每日最大费用:">
-          <el-input v-model="pricingData.daily_max_fee"/>
+          <el-input v-model="pricingData.daily_max_fee" type="number"/>
         </el-form-item>
-        <el-form-item label="是否vip费用:">
+        <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-radio-group>
         </el-form-item>
         <el-form-item label="vip折扣:">
-          <el-input v-model="pricingData.vip_discount"/>
+          <el-input v-model="pricingData.vip_discount" type="number"/>
         </el-form-item>
         <el-form-item label="描述:">
           <el-input v-model="pricingData.description"></el-input>
@@ -75,9 +93,9 @@ const pricingTitle = ref('')
 const pricingData = reactive({
   id: 0,
   vehicle_type: '',
-  start_time: '',
+  start_time: 0,
   start_fee: 0,
-  unit_time: '',
+  unit_time: 0,
   unit_fee: 0,
   daily_max_fee: 0,
   is_vip_free: false,
@@ -95,7 +113,7 @@ const getPricingList = () => {
 
 const deletePricing = (data) => {
   ElMessageBox.confirm(
-      '确定要删除该车主信息吗?',
+      '确定要删除该收费配置吗?',
       '提示',
       {
         confirmButtonText: '确认',
@@ -130,16 +148,39 @@ const deletePricing = (data) => {
 const openPricing = (head, data) => {
   pricingShow.value = true
   pricingTitle.value = head
-  if (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 = ''
   } else {
     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
   }
 }
 
 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)
   if (pricingTitle.value === '新增收费配置') {
     await addPricing(pricingData).then(res => {
+      console.log(res)
       if (res.code === 0) {
         ElMessage.success('添加成功')
         pricingShow.value = false