Contents

楼栋床位与并发

本文讲解宿舍床位管理中的五级层级建模、性别隔离与一人一床等硬性校验、事务与数据库约束组成的多重防超卖机制,以及新生预分配和调宿退住流程的设计。

  • 床位采用校区到床位五级层级,每级独立编码、独立可统计
  • 性别隔离、一人一床、组织预分三条规则写死不可配置
  • 防超卖靠事务成环、落库前复核、数据库唯一约束三层
  • 新生预分配批次化,空宿舍优先策略可复核可解释
  • 换床与退住事务一致,旧床释放与新床占用同生同灭

明·如归 · 宿舍管理白皮书 | 第二篇 能力篇

前面的接入做错了可以重导,权限配错了可以改回来。床位不行。一张床分给两个人,早上七点到校的那一家站在宿舍门口,手里拿着系统给的确认页,而门里已经有人在收拾床铺——这一刻没有任何一句解释是有效的。床位是这套系统里第一个不允许出错的东西,也正因为它不许出错,后面所有"智能"才敢往上面接。

9.1 从栋到床:五级层级与三个负责人

系统描述一间宿舍的语言,比多数软件默认的细:校区 → 楼栋 → 楼层 → 房间 → 床位,五级,每一级都是独立的实体、独立的编码、独立的可统计对象。楼层这一级看着多余,老校区用过它的人都明白价值——查消防要按层报数,宿管按层分管,水电按层计量,跳过这级的系统,每次遇到都要用备注字段打补丁。

房间带着学校真正会用的属性:类型(双人间、四人间)、床位总数、性别限制、收费标准、户型图与全景外链。床位再往下细分出编号与状态——空闲、占用、预留、维修,状态迁移有规则,不许跳。

还有一处不起眼的设置:每栋有楼长,每层有层长,每间有宿舍长,三个位置都指向具体的人。这不是装饰——报到当天要找一个能拍板的人、夜里要找一个睡得浅的人,靠的就是这三层归属。

9.2 三条写死的规矩

宿舍业务里有无数规则,但有三条的性质不同于其余:它们是"错误数据"和"危险数据"的分界线,所以写死在程序里,不进入任何可配置项。

性别隔离。 男生挂进女生楼,在任何一个入口——手工分配、批量导入、调宿、换床——都被同一道校验拒绝,报错口径一致。这条如果可配置,总有一天会有一所学校的某个配置手滑,然后成为全国新闻。质量扫描里"性别不符"那条规则,就是假设真的手滑了,也能当天发现(第五章)。

一人一床。 一个学生在同一时间只能占一张床;导入、分配、换宿路径上,"这人还有没有别的床"先于一切判断。"一人多占"同样在兜底扫描之列——它多数不是恶意,是换床流程中断留下的半截子事务。

组织预分。 床位打了预分给某院系专业的标记,就只能分给该组织的学生。这条守的是学校切池子的权力:学院名额、专项计划、定向批次,都靠它兜住。

其余规则——混编打散还是集中、按班级还是按专业——全部可配。可配与不可配的分界,就是这套系统对"哪些事学校说了也不算"的诚实回答。

9.3 分床这件事,凭什么不出错

多人同时操作同一张床,是所有床位系统的死穴。这套系统的回答分三层,每一层单看都不神奇,叠起来才成立。

第一层,批量操作整体成环。 成批的分配、换宿、调整包在一个事务里执行——中途任何一步失败,整体回滚,绝不出现"一半人进了新楼、一半人挂在旧床"的中间态。换床这种两个人互相挪动的动作尤其危险,拆成两步就可能把两个人都变成无床可住,所以它在事务上被当成一个动作对待。

第二层,落库前逐条复核。 提交瞬间再查一次目标床位是否仍空闲、当事人是否仍有其他床、性别是否仍匹配——不信任打开页面时看到的状态,只信任写入前的状态。并发保护的正确姿态不是"锁住别人",是"不欺骗自己"。

第三层,也是最后那道,不在程序里。 数据模型本身对"同一床位的在住记录"有唯一性约束——前两层都失效的极端情况下,第二条写入会撞在规则上被拒,用户收到一句"该床位刚被其他同学选走,请刷新后重试"。不超卖这件事不依赖程序自觉,是数据不允许第二种结果出现。 依赖判断的防线会被绕过,依赖规则的不会。

9.4 新生的第一批床:从名单到钥匙

开学前最重的一仗是新生预分配,系统把它做成了批次化的流程而非一次性的脚本:建批次、圈定参与分配的房源池、导入或同步新生名单、设定混编与约束规则、执行分配、导出结果——每一步产物都落库可查,任何一步都可以停下重来,重来不产生双份数据。

自动分配的策略长期是朴素的空宿舍优先:先把整间空房填满,避免出现"四人间住三人、剩一张床谁也住不进"的碎床。它不聪明,但每学年可复核、可解释——家长问"为什么把我孩子分到这间",宿管答得出"那间还有三个空位",这比任何算法都耐用。

聪明的那部分是新加的一层:把"尽量打散""尽量同乡集中"这类政策表述编译成带权重的软约束规则,求解器先按空房优先给出基线方案,再做确定性的成对交换优化,每个方案附可量化评分(硬约束违反数、软约束满足率)。基线与优化并排放着,谁好多少,用分数说话。 边界也交代在前面:这一层目前只出预览不落库,人工确认后才走正式分配通道——机器可以建议,不能先斩后奏(第二十二章谈它何时能落库)。

9.5 换床与退住:最难堪的时刻怎么办

住进去之后的变动,比分配更考验系统,因为每次都带着情绪。

调宿与退住是两条审批链(申请、逐级审批、执行变更、记录归档),链路级数各校自配。系统守的是三条不变的东西:事务一致——旧床释放与新床占用同生同灭,换床失败时原床位保留不动,绝不让人因为一次没办成的调整变成没有床的人;床位可换不可凭空——互换、迁入空床各有校验,杜绝"换"着换着多出半张床;记录跟人——退住不删数据,住宿史完整保留,为的是那句"他在这里住过的四年"带得走、查得到(第二十八章)。

走读申请在这条链上最特殊:它意味着学校把安全责任的一部分交还给家庭,所以家长联系方式与确认环节是流程的硬组成,不能只凭学生自己点一下。

9.6 床位数据的独特价值

床位之上,攒着学校独有而学生查不到的一类事实:他和谁住。

学院、专业、班级、生源地落在同一个房间号上,"你们四个人里有两个勾了同一项爱好"这类话,学校手里本来就有依据可说。而分寸同样要写死:室友信息由本人主动查看才出现,不默认公开、不群发——同宿舍不等于互相同意公开家庭住址。

"报到前就知道室友是谁",是官方信息能够压过野生攻略的少数几个凭据之一。 攻略能告诉他楼新不新,只有学校能告诉他这件事。

9.7 收口

给学校的核对动作,一个学期只需要做一次:随机挑一栋楼,让系统当场回答三个问题——有没有任何一张床此刻挂着两个人;有没有任何一名已办离校手续的学生还占着床;把本学期全部换床记录连起来看,有没有人曾经连续两天无床可住。 三问都有干净答案,床位这块地基才算合格;地基之上,下一章谈的是这套系统每天夜里都在做的那件事——判断今天该不该考勤。