简介捷顺停车场管理系统使用说明文档面向停车场管理员、操作员及系统维护人员涵盖从软件启动登录到车辆出入管理、收费查询、数据上传等全流程操作指引是一份可直接对照上手的系统操作手册。文档为PDF格式共1个文件压缩包约1.98MB便于下载后随时查阅或打印使用。系统功能覆盖全面包括IC卡发行与检测、ID卡发行、操作员权限设置、停车场资料录入、视频监控配置、出入管理、读写器设置、下载卡号、脱机运行配置、收费查询、场内车辆查询及车辆收费报表等20余个功能模块并详细说明了管理员与操作员两种角色的职责分工与操作流程。文档还收录了卡片挂失、恢复、补卡等异常处理办法配合系统设置与数据库清理等维护类操作说明帮助使用者快速掌握停车场系统的日常管理与应急维护。已有435人学习。1. 捷顺停车场管理系统.pdf 在管什么先回答一个停车场的真实问题停车场岗亭的电脑桌面上经常会摆着一份《捷顺停车场管理系统.pdf》。很多人的第一反应是把它当说明书收起来真到了出口车主问“为什么我进来的时候没抬杆”时才想起翻它。这份 PDF 的核心价值不是教你怎么点鼠标而是交代一个系统边界车牌识别相机负责看道闸控制器负责放行收费端负责算钱后台数据库负责记账。这套系统要稳定跑起来需要网络、布线和参数配合不是装个软件就能交差。这篇笔记按我接过同类项目的顺序把它从部署拓扑、收费规则到现场排故完整讲一遍。适合两类人接手停车场运营的物业技术人员和第一次做停车场集成的实施工程师。2. 从 PDF 到跑起来捷顺停车场管理系统的最小部署拓扑与初始化2.1 先读懂文档里的系统拓扑相机、道闸、控制器和收费端各管一摊PDF 里最前面往往是一张拓扑图但我一般先看设备清单而不是盯着拓扑图看半天。常见设备类型很固定入口识别相机、出口识别相机、道闸、地感线圈、LED 显示屏、收费岗亭客户端、管理服务器。它们组成一个星型局域网核心交换机是中心。相机通过网线或光纤回传抓拍图片道闸由控制箱里的道闸控制器驱动控制器同时接收地感信号、防砸雷达信号和收费端的开闸指令。故障时要先分清是“没拍到”还是“没开闸”方向搞错会白折腾很久。设备承担职责常见连接方式识别相机抓拍车牌并输出识别结果网线/光纤到交换机POE 或独立供电道闸执行抬杆/落杆道闸控制器常开/常闭继电器信号地感线圈检测车辆是否到达/通过双绞线接入车辆检测器收费岗亭端计费、开闸、记录流水PC 客户端连接数据库服务器管理服务器存流水、月卡、收费规则机房部署数据库与后台服务接线细节往往决定排查效率。地感线圈的线必须双绞不能和电源线走同一根管否则工频干扰会造成道闸反复触发落杆。相机也建议单独供电不要和道闸电机共用开关电源电机启动瞬间电压跌落会导致相机重启表现为“偶发漏拍”。这类问题在 PDF 里通常只有一句话现场踩过坑才会记得。2.2 最小可运行环境一台服务器、一台岗亭机、一张网卡先跑通流程我一般建议客户先搭最小环境而不是一开始就把所有车道设备接满。最小环境包括一台服务器装数据库和管理端一台岗亭机装收费客户端一台入口相机和一台出口相机再留一个手动抬杆按钮备用。把这个流程跑通再逐步补硬件这样出问题好定位。部署前先分配 IP。常见内网规划服务器 192.168.10.10岗亭机 192.168.10.11入口相机 192.168.10.20出口相机 192.168.10.21道闸控制器 192.168.10.30子网掩码统一 255.255.255.0。IP 不要用 DHCP相机重启后 IP 变了管理端里设备会掉线。# 检查相机网段是否通到服务器假设入口相机 IP 为 192.168.10.20 ping -c 4 192.168.10.20 # 如果 ping 通进一步确认相机 Web 管理端口是否开放 curl -s -m 3 http://192.168.10.20:80/status | head -c 200这段命令的逻辑很简单ping 看物理链路和 IP 配置curl 看相机有没有 HTTP 服务在监听。多数车牌识别相机会内置一个 Web 管理页如果 curl 不通重点查控制箱里的光电转换器和网线是否松动。端口没问题但页面打不开就要检查访问相机时用的用户名密码以及相机是否限制了管理网段。服务器端要注意防火墙但不要图省事直接全部关闭。常见做法是只对业务端口放行把相机所在网段和管理员网段隔离服务器只允许访问相机的 80/554 端口。554 是 RTSP 视频流端口少了它回放和实时预览都会失败。2.3 数据库初始化先建四张核心表再谈界面捷顺这类系统的后端离不开一组数据表。我接手时习惯先从数据库确认表结构而不是先点界面看按钮。四张核心表是设备表 device、过车记录 vehicle_record、月卡表 member_card、收费规则表 charge_rule。把这几张表建好并加上索引后续功能才有地方落。CREATE TABLE device ( id INT PRIMARY KEY AUTO_INCREMENT, device_type TINYINT NOT NULL COMMENT 1-相机 2-道闸 3-控制器 4-显示屏, dev_ip VARCHAR(32) NOT NULL, location VARCHAR(64) NOT NULL COMMENT 如东门入口一车道, enabled TINYINT DEFAULT 1, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE vehicle_record ( id BIGINT PRIMARY KEY AUTO_INCREMENT, plate_no VARCHAR(16) NOT NULL COMMENT 车牌字符串, plate_color TINYINT DEFAULT 0 COMMENT 0-蓝 1-绿 2-黄 3-白, device_id INT NOT NULL, entry_time DATETIME NOT NULL, exit_time DATETIME NULL, order_no VARCHAR(64) NOT NULL COMMENT 唯一订单号, status TINYINT DEFAULT 0 COMMENT 0-在场 1-已离场 2-已支付 ); CREATE TABLE member_card ( id INT PRIMARY KEY AUTO_INCREMENT, plate_no VARCHAR(16) NOT NULL, card_no VARCHAR(32) NOT NULL, expire_time DATETIME NOT NULL, enabled TINYINT DEFAULT 1 ); CREATE TABLE charge_rule ( id INT PRIMARY KEY AUTO_INCREMENT, rule_name VARCHAR(32) NOT NULL, free_minutes INT DEFAULT 30 COMMENT 免费分钟数, hourly_fee DECIMAL(6,2) DEFAULT 2.00, day_cap DECIMAL(6,2) DEFAULT 20.00 COMMENT 24小时封顶金额 );这里的关键点是vehicle_record 里的 order_no 是后续支付和开闸的唯一凭证不能复用monthly 车牌过期后要能转临时车所以 member_card 里不要直接存“永久有效”。车牌字符串建议统一存大写新能源车牌要完整保留末尾的 D/F 字母不要因为看着像校验位就截断。建完表还要加索引。实际现场最频繁的查询是“某车牌当前是否在场”和“按时间范围查流水”ALTER TABLE vehicle_record ADD INDEX idx_entry_time (entry_time); ALTER TABLE vehicle_record ADD INDEX idx_plate_status (plate_no, status);不加索引运行三个月后报表查询会明显卡顿高峰时段甚至拖垮整个管理端。这两条索引不是锦上添花是必需品。2.4 设备注册与参数下发让相机和道闸知道自己在哪条车道设备表建好后要把真实 IP 填进去。我一般会在管理端把相机和道闸绑定到同一车道或者直接改配置表。这一步最容易犯的错是“入口相机绑到了出口车道”结果出口识别永远用入口画面逻辑全乱。{ lane: L01, entry_camera: {device_id: 1, ip: 192.168.10.20}, exit_camera: {device_id: 2, ip: 192.168.10.21}, barrier: {device_id: 3, ip: 192.168.10.30, open_timeout_ms: 3000}, free_minutes: 30 }这段配置的含义是车道 L01 的入口用 device_id 1 的相机出口用 device_id 2 的相机道闸是 device_id 3。open_timeout_ms 是开闸指令的超时时间设 3000 毫秒。如果现场道闸是旧型号电机反应慢建议改成 5000 毫秒否则控制端会以为指令超时连续发两次开闸闸杆抖动。参数下发后必须看状态。常见问题是设备表里 IP 填了但离线。我的排查顺序固定ping 通则查端口端口通则查账号密码密码对则看视频编码类型。不少相机默认输出 H.265而老管理端只认 H.264现象是“设备在线但不出图”。这问题不看日志基本猜不到。3. 收费规则和支付对接把 PDF 里的计费逻辑翻译成可执行参数3.1 临时车、月卡车和免费车计费模型先统一别在界面里写死价格计费模型的坑不在算法复杂而在“起始时间基准”。我见过两种思路一种按自然日分段一种按连续 24 小时周期。捷顺这类系统一般两种都支持但默认配置和现场需求经常对不上。最常见临时车计费是入场免费 30 分钟超过后按小时向上取整每小时 2 元24 小时内封顶 20 元。月卡车不生成临时订单到期后自动转临时车。免费车是内部车辆或特殊车牌。不要在收费端把价格写死要把参数放在数据库的 charge_rule 表里。前端每次算费重新读规则否则现场搞夜间半价活动时改代码是最慢的方案。import math def calc_temporary_fee(entry_time, exit_time, rule): minutes max(0, int((exit_time - entry_time).total_seconds() // 60)) if minutes int(rule[free_minutes]): return 0.0 billable_minutes minutes - int(rule[free_minutes]) hours math.ceil(billable_minutes / 60) fee hours * float(rule[hourly_fee]) # 封顶按连续 24 小时判断不用自然日 if minutes 24 * 60: fee min(fee, float(rule[day_cap])) return fee这个函数的参数说明entry_time 是入场时间exit_time 是出场时间rule 是数据库里那行收费规则。free_minutes 是免费分钟数hourly_fee 是单价day_cap 是 24 小时封顶。ceil 向上取整很关键停 31 分钟就按 1 小时收这是行业默认规则。封顶判断用 minutes 而不是 hours是因为刚过 24 小时 1 分钟时hours 已经变成 25如果按 25 乘单价就会超过封顶产生“停一天比停两天还贵”的乌龙。3.2 月卡车和免费车白名单不要只查一张表月卡车判断不是简单查 member_card 有没有车牌。现场场景很多一辆月卡车进场时月卡有效出场时正好过期要不要收费常见做法是入场时判断有效就放行出场时只校验“该车是否已入场”不再重复校验有效期。这样避免车主在停车场里多待几分钟就被收钱体验能好不少。免费车白名单我建议单独建表不要放在 member_card 里加一个 type 字段。原因是财务报表要把免费车和月卡车分开统计混在一张表里后期对账很难受。SELECT card_no, expire_time FROM member_card WHERE plate_no 京A12345 AND enabled 1 AND expire_time NOW();这段 SQL 是查月卡有效性。注意条件里用 NOW()让数据库统一取时间不要用应用服务器本地时间。现场数据库服务器和收费客户端时间不同步会造成月卡边界一小时误差。很多“月卡刚过期但车主说昨天才续费”的纠纷根因就是收费端电脑时间快了。月卡车到期后不要直接拒绝抬杆而是把它当临时车走一遍计费流程并保留月卡历史标记。这样对账时能查出“哪些月卡转临时”财务也清楚。3.3 电子支付对接金额校验、幂等和回调返回一个都不能少电子支付链路是收费端生成订单客户端展示二维码用户扫码付款支付平台回调后台后台确认金额后开闸。最怕的不是支付平台挂而是回调重复或金额不一致。回调重复会导致同一订单开两次闸金额不一致会导致用户多付或少付。app.post(/api/pay/callback) def pay_callback(): data request.get_json() order_no data.get(order_no) paid_fee int(data.get(paid_fee)) order get_order(order_no) if order is None: return order_not_found, 404 # 金额以数据库订单为准不以回调为准 if order[pay_amount] ! paid_fee: return amount_mismatch, 400 # 已支付直接返回成功保证幂等 if order[status] PAID: return ok, 200 mark_paid(order_no, paid_fee) open_barrier(order[lane_id]) return ok, 200这段回调处理里有两道关卡金额比较和状态幂等。先比较金额再判断状态顺序不能反。如果先标支付再开闸开闸失败后还能补开如果先开闸再标支付回调重复时可能开两次闸。常见误用是在回调里重新计算收费金额正确做法是使用订单创建时保存的 pay_amount。回调收到后要尽快返回“ok”支付平台见不到成功文本会按间隔重试。日志里必须记录原始报文排查“用户说扣了钱但没抬杆”时先看回调日志里有没有这笔订单再看时间戳和金额。客户端扫码后不要立刻关闭二维码页面要等支付回调确认。更稳妥的做法是一张二维码绑定一个 order_no超时后作废重新生成。3.4 跨天订单和夜间计费把“一天”的定义说清楚停车场最常见的投诉是“停了一夜出场收了两个封顶”。原因往往是系统按自然日分段晚上 8 点进第二天早上 8 点出跨了两个自然日每天各收一个封顶。这样收费在规则上没错但很容易让车主觉得被坑。很多停车场把夜间计费当作运营策略而不是技术问题。如果按连续 24 小时周期直接用 3.1 的函数就行完全不用处理跨天。如果现场合同要求按自然日分段就得按 0 点切分。from datetime import timedelta def calc_by_natural_day(entry_time, exit_time, rule): total_fee 0.0 cur entry_time while cur exit_time: day_start cur.replace(hour0, minute0, second0, microsecond0) day_end day_start timedelta(days1) seg_end min(day_end, exit_time) total_fee calc_temporary_fee(cur, seg_end, rule) cur seg_end return total_fee这个循环的边界条件是关键每个自然日切一段最后不足一天的时间段也按一天的规则算。如果现场白天和夜间单价不同还需要在 calc_temporary_fee 里再拆时段。我一般会建议产品上用连续 24 小时周期参数简单对账也简单计算逻辑一目了然。跨天还有一个坑对账时 SQL 按 DATE(exit_time) 分组同一笔订单会被分到离场当天而不是入场当天。财务对不平往往就是分组键用错。正确做法是用 order_no 关联订单归属日期再汇总。4. 联调与验收捷顺停车场系统上线前必须过的四道关4.1 车牌识别率验证用视频回放和标注集代替压车识别率不能靠“我看拍得挺准”来验收。我一般会在项目里建一个小型测试视频集白天强光、晚上无光、雨天、逆光、车牌脏污、新能源绿牌、挂车黄牌。把这批视频按顺序灌入识别服务统计识别结果和人工标注是否完全一致。# total_cases 是人工标注的车牌集合 # recognized 是识别服务输出的结果字典 total len(total_cases) right 0 for plate, label in total_cases.items(): if plate label: right 1 print(f精确全对率: {right/total:.2%})这里的统计必须用完全相等不能用字符相似率因为停车费是按整牌结算的。识别准确率低于 98% 不能上线而且白天和夜间要分开统计。很多厂商资料里写的是“整牌正确率”现场实际往往低几个点验收不能只看厂商报告。录像回放的具体做法常见的是让相机 SDK 支持 RTSP 推流回放把视频文件直接喂给识别服务如果相机不支持就把相机架在出口外侧对着真实车流拍一段再拆帧验证。耗时但结果真实。测试时除了看车牌号还要统计“误触发”。有些相机对行人或三轮车也会抓拍生成脏流水导致场内出现“幽灵车辆”占车位。所以验收指标应该包含正识别率和误触发率两项。4.2 道闸联动顺序确认车辆位置再决定开闸还是落杆道闸控制时序是现场最容易出人身安全事故的地方。规范做法是车辆压到入口地感相机抓拍识别结果上传收费端判断是否放行发送开闸指令道闸抬杆车辆通过出口地感地感信号复位道闸延时落杆。中间任何一步丢了都会卡壳。步骤信号来源动作1入口地感线圈触发抓拍2相机输出车牌和置信度3收费端判断白名单/月卡/临时车4收费端发送开闸指令到道闸控制器5道闸控制器抬杆保持开启6出口地感线圈检测到车辆通过给出脉冲7道闸控制器延时落杆常见错误是把防砸雷达接到道闸控制器的“地感输入”口导致雷达一直触发时道闸认为有车压线永不落杆。防砸雷达要接专用的防砸输入端口地感线圈接车辆检测器两者不能混接。还要确认控制器干接点是常开还是常闭多数道闸开闸信号是脉冲不是持续电平。验收时从收费端收到识别结果到道闸开始抬杆目标值小于 1 秒。现场可以看日志时间戳验证。如果大于 2 秒就要查网络延迟和服务端处理队列。开闸超时参数不要默认设成最大否则车辆已经开走道闸才抬容易砸到下一辆车。4.3 报表和对账交接班金额差一分钱也要查停车场管理方最关心的是报表。交接班时系统里“当班应收”和“实收”应该一致。真实情况是总差几块钱原因是免费车不计费、月卡不缴费、手动抬杆没记录。我一般建议在收费端把所有抬杆事件都生成一个 action_log包括手动抬杆。SELECT DATE(paid_time) AS pay_date, shift_no, COUNT(*) AS order_cnt, SUM(pay_amount) AS total_amount FROM payment_record WHERE status PAID GROUP BY DATE(paid_time), shift_no;这段 SQL 是按班次统计支付金额。注意 group by 里是 shift_no它来自交接班表不是从支付时间反推。当班组长按 shift_no 统计财务按自然日统计两边微差来自跨班订单。解决方案是报表提供“订单归属班次”和“支付发生班次”两个维度分别展示。和支付平台对账要定时跑。常见差异是用户支付成功但回调没写库或后台标记已支付但没开闸。对账时以支付平台账单为基准把本地缺失的流水标成“异常补单”并自动生成开闸补偿记录。不要用 Excel 手工对账数据量一上来就会漏。4.4 人工抬杆和特殊放行不能绕过流水现场总有忘带手机的车主或者收费员手动抬杆。手动抬杆本身不可怕可怕的是不录流水月底盘点时发现账对不上。我建议在收费端把“手动抬杆”做成必填原因选项免费放行、设备故障、月卡补刷、无牌车协商放行。没有原因的抬杆在报表里高亮。INSERT INTO action_log(lane_id, action_type, reason, operator, create_time) VALUES (L01, MANUAL_OPEN, 设备故障, operator_01, NOW());action_type 固定为 MANUAL_OPEN不要写进 vehicle_record否则会污染车辆在停状态。operator 是交接班表里的账号用公共账号等于没记录。这套台账对“系统为什么自动抬杆”也有帮助不少道闸会因继电器粘连或软件误判自己抬杆有日志才能回放现场信号。5. 捷顺停车场系统落地避坑从识别失败到重复扣费的 5 个现场问题5.1 新能源车牌总被识别成蓝牌字符集没开全现象是绿牌车入场时收费端显示成蓝牌新能源优惠用不了或者完全没有识别结果。原因不在算法不行而是识别相机默认的车牌类型清单里只勾选了蓝牌。新能源车牌的第二个字符 D/F 是校验位如果字符集不全系统会把整个车牌当非法字符丢弃。解决方法是到相机的识别配置里把“新能源车牌”类型打开同时更新算法库。这一步必须在设备调试时做不要等项目验收再补否则临时车计费会乱套。另外新能源车牌存在数据库中时要保留末尾 D/F中途截断会导致月卡匹配不上。5.2 无牌车进场后无法缴费临时会话没落库现象是无牌车在出口扫码输入车牌查不到订单。原因很直接入口相机对无牌车生成的是一个临时会话只存在相机内部没写进 vehicle_record 表。收费端查数据库时自然找不到记录。解决方法是无牌车进场时生成一个合成车牌号例如“无牌_202406011030_L01”规则是前缀加入场时间加车道号。收费时按这个编号查流水。这个合成车牌号要足够稳定不能每次生成随机串否则出场时没法关联。还要注意这类记录在报表里单独标识别混进正常车牌统计。5.3 道闸不落杆继电器和地感信号打架现象是道闸抬杆后一直保持车辆已经离开也不落杆。原因经常是现场施工把防砸雷达输出接到了地感输入口道闸控制器一直认为有车压线自然不落杆。解决方法是把防砸雷达接到专用防砸输入端口同时确认干接点的逻辑是常开还是常闭。改完接线后必须重新做一次完整过车测试包括车辆停在道闸下方时防砸生效、车辆通过后延时落杆。千万别跳过这一步道闸砸到人是重大事故。5.4 重复扣费支付回调超时后的客户端重试现象是车主扫码后 App 提示支付失败但银行扣款短信已经发来车没出去重新扫码又生成一笔订单。原因是支付平台回调因为网络延迟没及时到达收费端客户端超时后发起第二次支付。解决方法是后端按 order_no 做幂等同一订单重复回调直接返回成功同时按“车牌入场时间”加唯一约束防止同一次停车生成两个订单。两条规则一起上能挡住绝大多数重复扣费。另外要给支付订单设置有效期比如 15 分钟超过作废。5.5 高峰期数据库连接池被占满过车事件直接怼库现象是早晚高峰期收费端转圈过车记录写不进去道闸开闸响应变慢。原因是相机每识别一辆车就发一条写库请求高峰时并发超过数据库连接池上限。解决方法是让过车事件先进本地队列再批量写入数据库。可以用 Redis 做缓冲也可以写本地文件。# 过车事件先进队列消费者批量落库 RPUSH lane:events {plate:京A12345,time:2024-06-01T08:00:00}这里的关键是削峰。队列消费者要根据数据库压力调整批量大小一次写 50 条还是 100 条要在现场压测后定。还要给队列加监控队列长度持续增长说明消费端出了问题。高峰期掉线这种事多半不是网络问题而是这种最基础的并发保护没做。6. 进阶让捷顺停车场系统更省心的三个调优方向6.1 双相机冗余识别结果按置信度投票只装一台入口相机遇到脏污车牌或逆光真会抓瞎。常见做法是同车道装两台相机一台低角度广角拍整体一台高角度长焦拍车牌。结果融合时以高置信度为准。result_a recognize(frame_wide) result_b recognize(frame_tele) if result_a.confidence 0.9: plate result_a.plate elif result_b.confidence 0.9: plate result_b.plate else: plate longest_common_prefix(result_a.plate, result_b.plate)longest_common_prefix 对单字符识别错的情况有效如果两台相机都错就不要再硬融合直接转人工处理。双相机方案对月卡车的识别提升最明显能少很多“月卡车进不来”的投诉。6.2 断网续传本地缓存要能扛住一小时的波动现场断网不是灾难灾难是断网后过车记录丢了。收费端我习惯的做法是过车事件先写本地 SQLite联网后再按全局唯一 ID 补传。补传服务要记录批次防止重复入库。# 本地缓存目录示例一台车道一个目录按时间滚动 mkdir -p /data/parking_cache/lane_L01恢复联网后先传缓存再传实时避免实时数据把网络占满。业务上以“相机抓拍时间设备 ID”作为唯一键补传和实时写入撞了也能去重。这个机制在停车场这种网络不稳定的环境里比什么都管用。6.3 报表自定义把“异常流水”单列出来默认报表只显示正常收费数据真正值得关注的是三类手动抬杆、无牌车、过期月卡。用一条 SQL 每天跑一遍看趋势比看绝对数有用。SELECT DATE(entry_time) AS day, SUM(CASE WHEN status MANUAL THEN 1 ELSE 0 END) AS manual_cnt, SUM(CASE WHEN plate_no LIKE 无牌% THEN 1 ELSE 0 END) AS no_plate_cnt, SUM(CASE WHEN member_expired 1 THEN 1 ELSE 0 END) AS expired_member_cnt FROM vehicle_record GROUP BY DATE(entry_time);如果手动抬杆数一周内翻倍可能是道闸设备开始出问题过期月卡变多可能是续费流程卡住了。我现在每接一个停车场项目第一件事都是确认车牌字符集和系统时间基准这两样定了后面一大半的坑都能提前避开。希望帮到你。本文还有配套的精品资源点击获取