跳转至

第四十七章 · 一整夜

周五早上九点零三分,客诉系统进来一张工单。商户 M-B-2214,编号 CS-20270115-0038,申诉内容一行:十二月十九日结算金额与到账金额不符,差额一千二百二十七元。

SD-20261219-10447。他上周二夜里查出来的那条交易。商户比他先发现了。

工单详情里挂着客服的处理备注:「已按标准话术回复商户:结算金额按成交时汇率折算,差异或为汇率正常波动所致,建议商户自行核对当日汇率。转技术侧确认。」

汇率波动所致。这六个字,对了一半。汇率确实变了。但不是波动的问题——是快照缺失,系统拿三天前的旧汇率折的算,商户少收了一千二百二十七块。客服不知道。商户不知道。配兜底值的人已经离职两年多。

他把工单转进自己的队列,状态改成「处理中」,在记事本上写了一行:「商户先发现的。比周一早三天。」

商户在工单下面追了一句:「请告知具体按哪日汇率折算,我方财务需要向平台解释。」

他把这句读了三遍。商户的财务也在向他们的上面解释。这条链上每个人都在算自己的账,只有系统不出声。


十点二十,刘铮过来,把椅子拉过去半个。

「客诉抄送我看到了。」刘铮说。「你打算怎么回。」

「等周日的数。」

「客服已经回过一版了。商户要是咬住不放,升级到万钧那儿,你拿什么说。」

「说快照缺了三天,走了旧汇率。窗口里不止他一笔。」

「多少笔。」

「周日凌晨回补。周日晚给你数。」

「万钧那句话,你记得吧。」

「一条还是一类。记得。」

刘铮把椅子推回去。「那我先把客诉压在处理中,第二版回复等你。还有个事——客服那版是模板自带的默认话术,不是谁写的。你别去查是谁回的。」

「我没打算查。」

「万钧不喜欢这种事变成追人。」

刘铮出去之后,陈稳把那版标准话术又读了一遍。语气温和,落款是客服一组。他把商户追问的那句抄在记事本上,抄完,在后面写:「客服没有错。她只有模板。」


下午,万征发来消息:「兜底值那个配置我提了个 MR。直接删掉,快照缺失就返回失败,错误码 FX_SNAPSHOT_UNAVAILABLE。留着这个东西,早晚再咬一口。」

四点半,他把周日要跑的校验脚本过了一遍。回补完成自动触发,输出四列:交易号、折算汇率、应折汇率、偏差。跑之前,他把范围从 JPY/CNY 扩到了全部币种——快照缺失是同步任务的事,同步任务一挂,所有币种一起挂。

四点五十,他做了一件以前不做的事。

他给赵岩发了消息:「下季度我想扫一遍所有服务的静默兜底配置。需要只读权限和近一年的变更日志,能帮我开个工单吗。」

发完,他把手机扣在桌上。以前这句话他会在心里过三遍,然后存草稿。这次没有存。

赵岩的回复在五分钟后:「可以。把范围给我,机读格式最好。我周一提。」

他回了两个字:「收到。」然后才意识到,他等的这五分钟里,一个字的草稿都没有打。

五点二十,他又开了一个工单,指派给客服组的新人文文:「请协助整理客诉标准话术中所有『建议商户自行核对』『或为正常波动』类表述,按使用频率排序,周五前给。」备注栏他想了想,写:「不是追责。是这些话术替系统挡了问题,挡了多久,要算清楚。」

发送。这是他第一次往别人的队列里派活。工单状态变成「待接收」的时候,他关了页面。


七点,门铃响了。何晚带两个折叠纸箱上来。

「书房两格,厨房两个锅,卫生间的架子。」她把箱子撑开。「一个钟头。」

他帮着把书摞下来。摞到第二摞,书里滑出一张便利贴,写着七月二十六日,背面抄了一行 SQL,是他的字。她拿过去扫了一眼,放进废纸摞:「这个不要。」

厨房那边,她踮脚取锅。最上面那个取不下来,他伸手取了,递给她。锅放进箱子,垫了报纸。

她去阳台拿那只白瓷碟。碟底的水渍他周二擦过,干了。她说:「这个我拿走。配别的盆不好看,你不用留。」

收拾到鞋柜,她把纸箱口折好。「皮鞋留着穿。鞋楦记得拆,皮子塌了就不回弹了。」

她停了一下。

「新那双是给你买的。本来想春节——」

这句没说完。她把胶带撕开,封了箱。

「药还有多少。」

「三粒。」

「吃完这盒自己记得买。别断。」

「好。」

两个箱子搬到门口,她回来拿外套,把围巾绕上,又解下来搭在手臂上。一月了,今年不冷。

「票的事。」她说。「你要是决定退,提前一天跟我说。两张一起退,不用跑两趟。」

「好。」

「一月二十七号。」她拉开门。「到那天不退,就是去。」

门关上。楼道的声控灯亮了几秒,灭了。

他想说今天的鱼很好。他说的是:「路上慢点。」

门已经关了。这句话说给门听的。


周六上午他去了公司。整层楼空的,中央空调的声音比平时大。他把三个币种十二月十七日到十九日的成交明细预拉出来,放进同一张表:JPY/CNY 五十一笔,EUR/CNY 八十七笔,USD/CNY 一千二百一十四笔。USD 那一千多笔,按旧快照折算的最大偏差千分之二点一。EUR 里面有过线的,具体几笔,要等快照回来才准。

脚本挂上自动触发。他检查了两遍触发条件:回补任务状态一变完成,校验自动开跑,输出落盘到固定路径。

中午,他在楼下药店买了一盒胃药,同一个牌子。收银员问要不要袋子,他说不要。药盒放进抽屉,跟旧盒并排。旧盒还剩一粒。

下午他登进运维门户,把归档工单 DB-20261028-0047 的详情又开了一次。归档规则那栏写着:「超期未跟进(30 天)自动归档,无需人工审批。」附件里那份日志分析结论还在,第一页第三行是那个 IP:10.14.1.88。他把附件下载下来,存进一个叫「申请」的旧文件夹——文件夹跟着工位迁移搬过来的,一直没删。

记事本里那行「谁批的归档」,他在后面补了三个字:「没人批。」

再后面一行:「也没人拦。最后跟进停在十一月四日。再跟一次,就不会归档。」

他把笔帽扣上。跟一次,是他的事。他走了,就没有人跟了。

中午十二点十,他去楼下便利店买饭团,结账的时候在门口碰上蒋辉。蒋辉手里拎着两盒沙拉,看见他,把其中一盒举了举。

「一起坐会儿?」

「行。」

便利店门口的长凳。两个人隔着半米坐下。风把外卖传菜口的热气吹过来,又吹散。

「客诉那个事,我在群里看到你了。」蒋辉把沙拉盖子撕开。「万钧那边怎么样。」

「批了。一万二。」

「好事。」蒋辉吃了两口,停下来。「有个事,本来上周想说。你走了之后,结算那边二组的排班没人排得动了,我把值班表接过来排。第一版我看了三个人——张悦、林晓、新来的那个。排完我让王磊 review,他挑出来两处,一处是张悦周三不能值,她在读在职研究生,另一个是新人不能单独值周末。」

「你排错的那两处,以前是我一个人扛的。」

蒋辉的筷子停了一下。

「我知道。」他说。「我以前不知道的是,这个组的值班表以前是靠一张 Excel 和你记住的十几个例外在跑的。你走了,Excel 还在,例外散了。」他把沙拉盒合上。「所以我想把它做成规则,写进排班系统。三个人各自的不可值时段,报给系统,系统算。以后谁走都一样。」

「这个做法对。」

「做法一直是这个做法。」蒋辉说。「是我以前不愿意做。做了就没有例外了。没有例外,就没有人情可以给,也没有人情可以欠。」他看了一眼陈稳的饭团。「你欠我的人情,和你给我的例外,是同一个东西。我想了很久才想明白。」

陈稳把饭团吃完,把包装纸折成一个方块。

「周三评审,你来讲。」他说。「讲给组里的人听,不用讲给我。」

蒋辉笑了一下。「你看,你现在会派活了。」


周日。夜里十一点四十,他把旧盒的最后一粒药吃了。新盒没开。

书房,终端开着。回补任务状态 pending,前面排着一个报表任务。

十二点零五分,报表任务跑到一半。他把九家商户的补差通知写了两版。一版按客诉模板的口径,写「汇率折算差异」;一版按实话写,写「我方数据更新异常,使用了过期汇率」。实话那版存在桌面,没有放进工单。

凌晨一点半,他从橱柜里翻出去年团建发的挂耳咖啡,还剩四包。撕了一包。咖啡挂在杯沿上,水从滤袋边缘渗下去,纸壁鼓起来,颜色一层一层深下去。

两点零三分,报表任务完成。两点零七分,回补开始,进度条从零往上爬。

两点二十,对面那扇窗还是黑的。他没数今天是第几天。

三点整,环卫车在楼下过,刷子贴着路牙的声音从东往西走完一条街。

三点五十二分,回补完成。校验脚本自动接着跑。

四点零一分,输出落盘。他往下拉。

JPY/CNY:五十一笔,偏差超过千分之五的十七笔,补差合计八千九百一十二元。最大单笔一千二百二十七,M-B-2214。

EUR/CNY:八十七笔,六笔,三千七百七十四元。

USD/CNY:一千二百一十四笔,零笔。最大偏差千分之二点一。

合计:二十三笔,一万二千六百八十六元,涉及商户九家。

他把三个数抄在记事本上,后面写了一句:「一类。不是一条。」

五点十分,他把九家商户的补差明细导出来,按金额从大到小排。M-B-2214 在第一行,差一千二百二十七。第十行往后,全是千分之五以下不用补的。他合上电脑。窗外天还是灰的。他吃了两粒药,躺下。


周一。九点五十,万钧的办公室门开着。

「数出来了。」陈稳说。

「多少。」

「十二月十七到十九,汇率快照缺失,三个币种一千三百五十二笔成交全部按十六号的旧快照折算。偏差超过千分之五的,二十三笔。补差合计一万二千六百八十六元。涉及商户九家。」

「最大的。」

「一千二百二十七。日元兑人民币。商户已经发起客诉。」

「美元那边为什么没有。」

「三天里美元中间价最大波动千分之二点一,没过线。日元和欧元过了。」

「补差的钱谁出。」

「公司出。走资损补差流程,财务审批,需要您签。」

万钧在本子上记了个数。「客诉怎么回的。」

「客服按标准话术回过一版,说是汇率正常波动。我今天撤回来,按实际情况重写。」

「谁让回的。」

「模板默认。没人让。」

万钧抬起头。这是今天上午他第一次抬头。

「没人让,回出去了。」他说。「这种没人盯的事,你那边还有多少。」

陈稳没有立刻回答。准确答案他知道:不知道。一个兜底值藏了两年半,静默失败不告警的,他只查过汇率同步这一个服务。

「不知道。」他说。「我扫一遍。所有静默兜底、静默失败、静默重试,列个清单。」

「什么时候。」

「周五之前。」

「排进去。」万钧把本子合上,夹在腋下,到门口停了一下。「补差单今天提。商户那边一家一封,写清楚差多少、为什么差、什么时候到账。别用模板。」

「好。」

「还有。」万钧一只手扶着门框。「一万二不多。但这是客户告诉你的,不是你的系统告诉你的。哪个更贵,你自己算。」

门关上。走廊里他的脚步声到头,拐弯,没了。


十一点,补差审批单提交,编号 F-20270118-0113,金额一万二千六百八十六,附二十三笔明细和九家商户清单。财务系统的状态停在:待二级审批。

十一点四十,客诉回复重写。他没用模板:「经核查,十二月十七日至十九日期间我方汇率数据更新异常,您的结算使用了过期汇率,差额一千二百二十七元将在三个工作日内补发至您的结算账户。由此给您带来的不便,我们致歉。」桌面那版实话稿挪进了工单,模板那版删了。

下午三点,何晚的消息进来:「我妈把票钱转我了。她说你要是忙,下次再去。」

他看了两遍。她妈妈没有问他为什么没去,她也没有写。两个人都替他把那句话咽了。

他回:「帮我谢谢阿姨。告诉她是我的问题,不是家里的问题。」

发出去之后他盯着这句话。不是家里的问题。这句话他在心里翻译了很久才打出来——它的意思是,问题在他,他认了。

何晚隔了七分钟回:「她说知道了。」

再过一分钟:「她还说,你什么时候来都行。车票不用挑日子。」

没有下文了。他把手机翻过来,屏幕朝下。

四点,刘铮过来,把一张打印的补差明细放在他桌上,指了指第一行。

「万钧签了。财务那边我打过招呼,三个工作日能到账。」

「客诉我回了实话。」

「我看到。」刘铮把纸翻过来压好。「第二版话术他们还留着,你要是想用随时有。」

「不用了。」

刘铮拿起纸要走,又停下。「万钧下午跟我说了一句。他说你这个数是周日凌晨四点算出来的,不是周一早上九点五十。他记这种事。」

「巧合。脚本自动跑的。」

「你就让他记着吧。」

四点半,商户回:「收到。希望告知后续如何保证不再发生。」

他回:「本周内完成两项修复:数据更新失败时立即告警;失败期间暂停折算,不再使用过期数据。」

发送之后,他把这句话在屏幕上停了一会儿。两项修复,一项在 MR 里已经合了,另一项还没排期。他开了个任务,指派给自己,截止日期写在周四。

五点二十,他在走廊上碰见万征。万征抱着笔记本,停下来。

「MR 你还没 review。」万征说。「加了一句注释,失败的时候把缺失窗口的首尾时间写进日志,方便以后核算。」

「晚上看。」陈稳说。「回滚预案记得补——失败率超过千分之十的时候恢复兜底,兜底必须挂告警。」

「行。」

万征没有马上走。他把笔记本换了个胳膊夹。

「还有个事,查 git 历史的时候一起看到的。」他说。「汇率同步这个服务这两年有四次重构 MR,reviewer 一栏是空的。我顺手把手里四个服务的 MR 都拉了一遍——reviewer 空栏的,十一处。」

「空栏的 MR,后来出过事的有哪些。」

「我拉的时候就是这个顺序。」万征把笔记本翻开,递过来一页。「十一处里,三处对应的模块这两年出过 P1 以上。」

陈稳接过那一页。三行。第三行的服务名是汇率同步。

「这个表给我一份。」

「已经抄在你桌面了,文件名 mr_empty_reviewer.csv。」万征合上本子。「我不是想查谁。我就是发现,空着的那一栏,跟出事的位置重合得有点多。」

他走出去两步,又回头。

「对了,你刚才问我空栏 MR 出过事的有哪几个——你问的时候,我是不是应该先问你,你为什么这么问。」

「你要是想问,早就问了。」

万征笑了一下,抱着笔记本走了。

走廊尽头的窗户对着西侧的楼。那扇窗他从这个角度看不见。


晚上八点。到家。玄关的鞋架上只剩他一个人的鞋。纸箱开着,皮鞋在里面,鞋楦还插着。他把鞋楦抽出来,摆在鞋柜上。皮鞋的鞋尖朝外,皱褶深了两道,又深了一道。

厨房锅架上空着两个圈。他煮了面,吃了半碗,剩下的晾在灶台上。

九点四十,书房。记事本翻到新的一页。

「周五之前:静默兜底清单。 周四:超时阈值架构评审。 补差单:已签。到账周三前。」

三行写完,他把手机拿过来。对话框里,她最后一句话停在一月十三号:「药别忘了。」

他打了六个字:「今天的鱼很好。」

这一次他没有删。按了发送。

气泡停在对话框最下面,上面隔着她五天前那句「药别忘了」。

他把手机放在桌上,屏幕朝上。

水壶在厨房跳了闸。他起身去关火。回来的时候,屏幕自己暗了。

对话框停在那里。那六个字下面,什么都没有。


← 第四十六章 平静 · 目录 · 第四十八章 决定 →