车牌号黑名单校验功能实现说明
功能概述
在用户进行车辆预约时,系统会自动校验输入的车牌号是否在黑名单中。如果车牌号在黑名单中,系统将拒绝预约并返回相应的错误信息。
实现位置
文件路径: src/main/java/com/parkingmanage/controller/AppointmentController.java
核心功能
1. 黑名单校验流程
在 insertAppointment
方法中,添加了车牌号黑名单校验作为第一步验证:
// 🚫 第一步:车牌号黑名单校验
String plateNumber = appointment.getPlatenumber();
if (plateNumber != null && !plateNumber.trim().isEmpty()) {try {logger.info("🚫 开始车牌号黑名单校验: {}", plateNumber);boolean isBlacklisted = checkBlacklistStatus(plateNumber, appointment.getCommunity());if (isBlacklisted) {logger.warn("🚫 车牌号 {} 在黑名单中,拒绝预约", plateNumber);return R.failed("该车牌号已被列入黑名单,无法进行预约");}logger.info("✅ 车牌号 {} 黑名单校验通过", plateNumber);} catch (Exception e) {logger.error("🚫 黑名单校验异常: {}", e.getMessage(), e);return R.failed("黑名单校验失败,请稍后重试");}
}
2. 黑名单查询方法
实现了 checkBlacklistStatus
方法来调用外部黑名单查询接口:
private boolean checkBlacklistStatus(String plateNumber, String community) {try {// 根据社区名称获取停车场编码String parkCode = getParkCodeByCommunity(community);// 构建请求参数,参考月票查询的方式HashMap<String, Object> params = new HashMap<>();params.put("parkCodeList", Arrays.asList(parkCode));params.put("pageNum", 1);params.put("pageSize", 1000);params.put("carCode", plateNumber);// 调用黑名单查询接口JSONObject response = aikeConfig.downHandler(AIKEConfig.AK_URL, AIKEConfig.AK_KEY, AIKEConfig.AK_SECRET, "getParkBlackList", params);// 解析响应结果并判断是否在黑名单中// 检查 resultCode=0 和 status=1 表示成功// 从 data.recordList 中查找匹配的车牌号return false; // 不在黑名单中} catch (Exception e) {logger.error("🚫 黑名单校验异常: {}", e.getMessage(), e);return false; // 异常情况下允许预约}
}
3. 停车场编码映射
实现了 getParkCodeByCommunity
方法来根据社区名称获取对应的停车场编码:
private String getParkCodeByCommunity(String community) {if ("万象上东".equals(community)) {return "2KST9MNP";} else if ("四季上东".equals(community)) {return "2KUG6XLU";} else {return "2KUG6XLU"; // 默认使用四季上东的编码}
}
技术实现细节
1. 依赖注入
添加了必要的依赖注入:
@Resource
private AIKEConfig aikeConfig;
2. 导入声明
添加了必要的导入:
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.parkingmanage.common.config.AIKEConfig;
3. 接口调用
参考了现有的月票查询接口调用方式,使用 aikeConfig.downHandler
方法调用外部API。
错误处理
- 黑名单车牌: 返回 "该车牌号已被列入黑名单,无法进行预约"
- 接口异常: 返回 "黑名单校验失败,请稍后重试"
- 异常处理: 在异常情况下,为了不影响正常业务,选择允许预约但记录异常日志
日志记录
实现了详细的日志记录:
- 🚫 开始黑名单校验
- ✅ 黑名单校验通过
- 🚫 发现黑名单车牌
- 🚫 黑名单校验异常
测试建议
- 正常车牌: 测试不在黑名单中的车牌号,应该能正常预约
- 黑名单车牌: 测试在黑名单中的车牌号,应该被拒绝预约
- 空车牌号: 测试空车牌号或null值的处理
- 接口异常: 测试外部接口不可用时的处理
相关接口
- 黑名单查询接口:
BlackListController.getParkBlack
- 外部API:
getParkBlackList
命令
- 停车场编码:
- 万象上东:
2KST9MNP
- 万象上东:
- 四季上东:
2KUG6XLU
- 四季上东:
响应数据结构
黑名单查询接口的响应结构如下:
{"data": {"total": 1,"recordList": [{"owner": "A1-b-0320","reason": "欠费","specialCarTypeConfigName": "您已欠费请及时缴费","specialCarTypeConfigId": 1526,"carCode": "黑AL1X07","remark1": "","blacklistForeverFlag": 1,"remark2": ""}],"count": 1,"currCount": 1},"resultCode": 0,"message": "业务成功","status": 1
}
响应字段说明
resultCode
: 业务结果码,0表示成功
status
: 状态码,1表示成功
message
: 响应消息
data.recordList
: 黑名单记录列表
data.recordList[].carCode
: 车牌号
data.recordList[].reason
: 加入黑名单的原因
注意事项
- 黑名单校验是预约流程的第一步,确保在其他验证之前执行
- 异常情况下选择允许预约,避免因接口问题影响正常业务
- 详细的日志记录便于问题排查和监控
- 参考了现有的月票查询实现,保持代码风格一致性
- 响应解析使用
resultCode
和status
字段判断成功状态
- 直接从
data.recordList
中获取黑名单记录,无需二级嵌套