物业公司上系统前必须问的 5 个问题:第 4 个我用 3 段脚本量了一遍 我做了什么我把物业上系统前该问的 5 个问题各写了一段能跑的脚本去验导出的数据能不能在空库里重建、断网那半小时的记录能不能查出来、改一次收费规则要动几行、收一笔物业费一线要敲几个字段。第 4 个的量法最笨也最有效——让收费员当面收一笔钱计时。台账是本机造的 600 户 × 12 期假数据规则和耗时是真的。想自己验的先要一个在线演示环境把真实台账导进去跑一遍。背景为什么系统买了常常不用行业里常见的情形老板看演示觉得挺好签一年三个月后收费员还是抱着 Excel。原因通常不是功能不够而是买之前问的都是有没有这个功能没人问我的人愿不愿意用“我的数据能不能带走”。第 4 个决定这套系统能活多久。一、数据能不能带走导出来不等于能重建别问能不能导出 Excel要问导出的文件能不能在一个空库里把欠费台账重新算出来。判据三件事某户某期欠多少、某笔收款冲抵哪一期、应收实收合计对不对。台账应收 7,200 条共 108,617,808 分流水 6,635 条共 100,122,594 分欠费合计 8,495,214 分。两种导出# A只导每户欠费合计owe_rowscur.execute( SELECT b.room_id, SUM(b.amount_due) - COALESCE((SELECT SUM(p.amount) FROM pay_record p WHERE p.room_id b.room_id), 0) FROM fee_bill b GROUP BY b.room_id).fetchall()# B导两张明细表bill_rowscur.execute(SELECT room_id,period,amount_due,due_date FROM fee_bill).fetchall()pay_rowscur.execute(SELECT room_id,amount,paid_at FROM pay_record).fetchall()导进空库再问那三个问题| 导出方式 | 规模 | 合计 | 某期欠多少 | 冲抵哪期 | 答对 || A 欠费合计 | 335 行 / 2 列 | 能8,495,214 分 | 不能 | 不能 | 1/3 || B 应收流水明细 | 7,2006,635 行 | 能8,495,214 分 | 能16,796 分 | 能11 条流水可追 | 3/3 |非显然结论在这A 的合计一分不差看起来导出成功了。可拿它换系统你只得到一本谁欠多少的名单账期维度全丢——住户说我 3 月交过了你查不出来。二、硬件断了那半小时的记录谁补门禁、道闸、智能水电表靠网络往软件里写记录断网时设备自己存着恢复后补传。要问的是软件怎么知道补齐了没有。按条数对账基本没用。1,000 条记录删掉 6 条模拟离线丢失软件侧收到 994 条差 0.6%月度统计里根本看不出来。按序号连续性扫一遍6 条立刻定位SELECTseq1ASgap_start,next-1ASgap_endFROM(SELECTseq,LEAD(seq)OVER(PARTITIONBYdevORDERBYseq)ASnextFROMrec)WHEREnextISNOTNULLANDnextseq1;实测 1,000 条 2.56 毫秒、10 万条 269 毫秒扫出 3 段缺口137-138、402、655-657与我删掉的 6 条完全对应。有个坑要提前问设备重启后序号会不会从 1 重新计。我在数据后追加了重启后重发的 1~50 号同一条语句报出 53 段缺口50 段是误报。连续性检查必须按设备 时间窗分组只按序号的话每次重启都要有人核一遍假警报。三、改一次收费规则要动几行单价、空置房折扣、阶梯水电、车位费、违约金一年至少改一次。要问改一次动不动代码、要不要另付钱、等多久。阶梯水费我写了两版写死在分支里的这版在 180 和 300 之间插一档 260要改 6 行4 个分支里 3 个重写defwater_fee(used):ifused180:yuanused*3.20elifused300:yuan180*3.20(used-180)*4.10else:yuan180*3.20120*4.10(used-300)*6.50returnint(yuan*100)改成配置驱动规则进 JSON计算函数 14 行一行不动deffee_by_conf(used,conf):yuan_all,last0.0,0fortinconf[tiers]:seg(usedift[upto]isNoneelsemin(used,t[upto]))-lastifseg0:yuan_allseg*t[price]ift[upto]isNoneorusedt[upto]:breaklastt[upto]returnint(yuan_all*100)两版在 100/180/250/300/400 吨五档上算出的钱逐档一致300 吨改价前 106,800 分改价后 111,600 分。但量出来才发现的坑是取整口径同样 300 吨整体取整 106,800 分按段取整 106,799 分差 1 分400 吨同样差 1 分。600 户攒一年台账和财务永远差几十块且查不出差在哪。rounding 必须写进配置和对账脚本用同一套。配置还要带生效账期否则改一个数字历史账单会被新价重算。实测物业费 89.5 ㎡ × 1.8 元/㎡/月 × 12 个月 193,319 分空置房 7 折 135,323 分。四、一线会不会用让收费员当面收一笔钱看演示的是老板用系统的是收费员。演示里点两下出收据是因为数据都备好了真实场景里收费员面前站着住户要在十几秒内找房号、确认欠几期、收钱、打收据。表单 9 个字段实测只有 2 个必须手输本次实收、收款方式其余 7 个可带出。但带出不等于快# 手工派3 次查询cur.execute(SELECT id,building,unit,door,area FROM room WHERE id?,(rid,)).fetchone()cur.execute(SELECT COUNT(*) FROM fee_bill WHERE room_id?,(rid,)).fetchone()cur.execute(SELECT MAX(id) FROM pay_record).fetchone()# 带出派一次聚合7 个字段一次带出cur.execute(SELECT r.building||r.unit||r.door, COUNT(b.id), SUM(b.amount_due)-COALESCE(SUM(p.amount),0) FROM room r LEFT JOIN fee_bill b ON b.room_idr.id LEFT JOIN pay_record p ON p.room_idr.id WHERE r.id? GROUP BY r.id,(rid,)).fetchone()实测各跑 300 次取最快一轮均值手工 3 次查询 0.463 毫秒带出 1 次查询 3.593 毫秒——带出反而慢 7.8 倍因为这条聚合要把该户 12 期应收和全部流水一起算7200 行的表每次都扫。补两个索引后降到 0.084 毫秒再把每户欠费预结算成 600 行的表335 户有欠费读 1 行 0.0455 毫秒。这一问的正确问法别问能不能带出问带出要多久、带不出来的字段有几个。判据可以带去现场——让收费员用真实台账连收 10 笔并计时平均一笔超过 1 分钟这套系统三个月内必被丢在一边。还有一处必须现场验房号输错了会怎样。# 没有外键约束的库房号敲成 99999不存在照样写进去con_nofk.execute(INSERT INTO pay(room_id, amount) VALUES (99999, 12000))# → 插入成功脏数据 1 条数据库不报错# 有外键约束的库# sqlite3.IntegrityError: FOREIGN KEY constraint failed钱记到不存在的房号上不报错不警告月底对账才发现。流水表通常只增不改收错一户的善后是补 1 条负向冲抵 1 条正确入账共 2 条记录原记录还得留着删了就和财务对不上。五、上线之后谁维护、钱怎么算要问的项常见的坑部署包和数据在谁手上只给账号不给部署包等于每年续费绑架说私有化实际库在厂商云上升级收不收费、多久一次首年便宜第二年升级另报价硬件谁维护、响应多久软件商推设备商设备商推软件商接口文档与对接费每加一个品牌收一次对接费价格上的公开参照2026 年保定本地集成商公开报价单里门禁 2000~5000 元/套、停车场道闸 5000~15000 元/套、安装 500~3000 元、软件费 0~2000 元/年公开报价区间非我方报价。软件在这条链里占比很小大头是硬件和施工。买之前把软件能锁住哪些硬件问清楚智能水电表能否直接入库、充电桩分成怎么算、摄像头算法要不要单独买授权。结果与数据四个能用脚本量一个只能现场看人操作。全部来自本机真实运行Python 3.14.7 SQLite问题实测数据能不能带走只导合计 1/3导明细 3/3离线记录谁补条数差 0.6% 看不出连续性扫出 3 段缺口1000 条 2.56 ms改规则动几行6 行代码 vs 6 行 JSON取整口径差 1 分一线会不会用9 字段手输 2 个带出 3.593 ms→索引 0.084 ms→预结算 0.0455 ms后期谁维护软件占硬件链小头重点问维护与对接费第 4 个最容易被跳过也只有它必须现场看人操作。系统买给谁用决定了它能活多久。