高校信息化建设进行到一定程度之后,会遇到一个绕不开的话题:系统集成。宿管系统和校园网WiFi网络计费系统是两个高校里都会有的独立系统,但它们之间存在天然的数据关联:宿管系统知道学生住在哪个宿舍、什么时候退宿、什么时候入住;计费系统知道学生的网络账号、在线时间、流量消耗。两个系统联动,可以解决很多靠单一系统解决不了的问题。
为什么要做这个对接
先说清楚对接的驱动力,不然容易把对接做成一个"做了也没什么用"的面子工程。
第一个驱动力是账号生命周期管理。学生入住宿舍的时候,宿管系统会创建一条入住记录,对应的网络账号应该同步激活;学生退宿(包括毕业离校、转专业换宿舍、休学等情况)的时候,网络账号应该同步暂停或注销。如果两个系统各管各的,就会出现一个经典问题:某个学生已经退宿半年了,他的网络账号还在跑着,或者更糟糕的情况——他把账号密码给留在宿舍的室友用,而管理员根本不知道这个账号已经是"无主账号"了。
第二个驱动力是宿舍维度的网络管控。学校可能有这样的需求:某栋宿舍楼正在施工,临时关闭网络;某个宿舍因为违纪行为被暂停网络权限;开学前两周新生宿舍启用,需要批量开通网络。这些需求如果要靠信息科手动操作,效率低且容易出错。如果宿管系统能直接触发网络计费系统的相关操作,管理就会顺畅很多。
第三个驱动力是费用分摊和统计。部分高校的宿舍网络是计费的(不是所有高校都免费),费用可能挂在宿费账单里。宿管系统出账单的时候需要从网络计费系统拿流量数据,否则账单里的网络费用是凭空填的,根本对不上。
对接方案的几种路子
技术上的对接方案大概有三种,选哪种取决于两个系统各自的开放程度和学校的IT能力。
第一种是数据库直连。把宿管系统的数据库和网络计费系统的数据库都开一个只读账号,写一个中间同步脚本,定期轮询宿管系统的入住/退宿变动,然后调用网络计费系统的管理接口来做账号操作。这种方案实施最简单,不需要两个系统厂商配合,学校IT团队自己就能做。缺点是耦合度高,哪个系统升级了都可能导致脚本失效;实时性差,定期轮询有延迟。
第二种是API对接。宿管系统和网络计费系统各自暴露REST API,通过标准接口做数据交换。这种方案扩展性好,两个系统可以独立升级,只要接口不变就不影响集成。缺点是需要两个厂商都支持,而且要有人维护接口文档和版本兼容性。
第三种是通过统一身份平台(IdP)间接对接。学校的统一身份认证平台(比如用了OpenLDAP或者微软AD)同时管理宿管系统和网络计费系统的用户数据,两个系统都从IdP里拉用户状态,不直接互相对接。这种方案是最干净的架构,但前提是学校已经建立了统一身份平台,且两个系统都支持对接IdP。很多学校没有这个基础设施,所以这种方案在实际项目里比较少见。
实务中的坑
说几个实际项目里遇到过的问题。
第一个问题是字段不对齐。宿管系统里标识学生的是"宿舍ID+床位号",网络计费系统里标识学生的是"学号"。两者之间的映射关系存在哪里?如果是宿管系统存的,网络计费系统能查到吗?如果是网络计费系统存的,宿管系统更新宿舍分配的时候能同步过去吗?这个问题听起来简单,但在实际项目里经常卡住对接进度,因为两个系统的主键设计思路完全不同。
第二个问题是中间态的处理。学生退宿不是一个瞬间发生的事情,可能是"今天办了退宿手续,后天搬走"。在这两天里,网络账号应该保持正常还是提前关闭?如果计费系统在收到退宿消息的第一时间就关账号,学生会在最后两天无法上网,产生投诉。如果等到搬走才关,宿管系统怎么知道学生什么时候真的搬走了?这类边界场景要在需求调研阶段就跟学校确认清楚,写进规则文档,不能留到对接联调的时候再讨论。
第三个问题是数据一致性校验。两个系统对接之后,不能假设数据永远是同步的。网络可能中断、脚本可能出错、某次升级可能引入了Bug。要定期做数据比对:宿管系统里在住的学生数量,跟网络计费系统里有效账号数量,两个数字应该大致吻合。如果差异超过5%,就要触发告警,手动核查。没有这套校验机制,数据漂移会在某个时间点突然爆发成一个大问题。
项目推进的节奏建议
宿管系统对接这类集成项目,我的经验是不要试图在主项目里做。把它拆成一个独立的集成模块,在网络计费系统和宿管系统都稳定运行之后,再启动集成项目。原因很简单:两个系统各自上线的时候都会有磨合期,如果在磨合期里还要同时调试集成,出了问题很难分清楚是哪个系统的锅,排查效率极低。
集成项目启动前,要把"需要对接的字段和接口"整理成一份需求文档,让两个系统的厂商都确认,再开始开发。这份文档要明确:谁是数据源、谁是消费方、每个接口的调用频率和超时处理、出错时的重试机制。这些细节不写清楚,联调的时候双方工程师会因为理解不一致反复返工。
上线之后的运维也要想清楚:如果集成脚本出了问题,谁负责排查?是信息科的人,还是某个系统厂商的人?这个责任边界要在合同里写清楚,不然出了故障三方互相推诿,学生那边已经叫了好几个小时"WiFi断了",这边还在讨论"这是谁的锅"。