停车场车辆进出IT功能开发问题:离场价格与数据更新异常
停车场离场功能问题排查与修复
背景
已完成停车场车辆入场功能(数据库记录停车票、更新车位状态),离场功能需实现:更新车位状态、记录离场时间、计算停车费用,但目前存在两个问题:
- 停车费用始终为0
- 车辆离场后直接再次入场,数据库无法正确更新
测试代码
@Test public void testParkingACar(){ ParkingService parkingService = new ParkingService(inputReaderUtil, parkingSpotDAO, ticketDAO); parkingService.processIncomingVehicle(); //TODO: check that a ticket is actually saved in DB and Parking table is updated with availability Date inTime = new Date(System.currentTimeMillis() - ( 45 * 60 * 1000)); Ticket ticket = ticketDAO.getTicket("ABCDEF"); ticket.setInTime(inTime); Assert.assertNotNull(ticket.getInTime()); } @Test public void testParkingLotExit(){ testParkingACar(); ParkingService parkingService = new ParkingService(inputReaderUtil, parkingSpotDAO, ticketDAO); parkingService.processExitingVehicle(); // TODO: check that the fare generated and out time are populated correctly in // the database Ticket ticket = ticketDAO.getTicket("ABCDEF"); Assert.assertNotNull(ticket.getPrice()); Assert.assertNotNull(ticket.getOutTime()); assertEquals(0.75*Fare.CAR_RATE_PER_HOUR, ticket.getPrice()); }
问题分析与修复建议
1. 停车费用始终为0
可能原因
processExitingVehicle未实现费用计算逻辑,或计算后未将结果同步到数据库- 测试代码中修改
ticket.inTime后未更新到数据库,导致费用计算时使用的入场时间不正确 - 费率引用错误或时长计算逻辑错误
修复步骤
- 完善
processExitingVehicle的费用计算逻辑:- 从数据库获取对应ticket的真实入场时间
- 计算停车时长:
(outTime.getTime() - inTime.getTime()) / (60*60*1000)(转换为小时数) - 计算费用:
时长 * Fare.CAR_RATE_PER_HOUR - 将计算后的
price设置到ticket对象,调用ticketDAO.update(ticket)同步到数据库
- 修正测试代码:在
testParkingACar中设置ticket.inTime后,需调用ticketDAO.update(ticket)确保数据库中的入场时间被更新
2. 离场后再次入场数据库无法正确更新
可能原因
- 离场时未将对应车位的状态重置为可用(
available=true),导致入场时无法分配到该车位 - 离场时未标记ticket为已完成(如未设置
outTime或状态字段),再次入场时复用旧ticket数据 - 事务未正确提交,离场操作的修改未持久化到数据库
- 测试代码中重复创建
ParkingService实例,导致DAO上下文不一致
修复步骤
- 完善
processExitingVehicle的离场逻辑:- 根据ticket关联的车位ID,获取车位对象并将
available设为true,调用parkingSpotDAO.update(parkingSpot)更新数据库 - 设置ticket的
outTime为当前时间,可添加status字段标记为已离场,同步更新到数据库
- 根据ticket关联的车位ID,获取车位对象并将
- 入场功能
processIncomingVehicle需过滤出available=true的车位进行分配 - 确保离场、入场操作在事务中执行,操作完成后提交事务
- 优化测试代码:复用同一个
ParkingService和DAO实例,避免重复创建导致的数据不一致问题
内容的提问来源于stack exchange,提问作者Moutaz Abdelhadey
相关产品推荐
相关产品推荐

