FDE实施纪实 第三期 · 数据打通实战
上一期一条数据从 SaaS 到 NAS 的旅程 – 零人工搬运,数据自己走进系统。的结尾,我写了数据文件进去了。
其实那仅仅是个开始,后面还有几个坑。
从画链路图到数据真正入库,中间又干了了三四天——挂载没通、权限没对、字段没认,一层比一层深。原以为三天能把坑填完,第四天又被补了一刀。
这一期说说工地实况:
目标只有一句:把自动链路修到和手动链路一样可信
维保主数据(项目、井道、电梯、日志、工单)有两个来源:运营手动上传 Excel,一直很稳;秒悟按天导出 CSV,落进飞牛共享目录,系统定时扫、自动导。
问题全出在第二条:要么目录扫不到,要么扫到了读不出,要么读出来了字段对不上、入库即污染。
所以这次的目标不是"再加个功能",而是一句话:把自动链路修到和手动链路一样可信。 手动上传敢上生产,是因为运营会看、会核对;自动链路没人盯着,就必须把每一步做成"敢没人盯着"的样子。

Day 1:文件根本传不过去(挂载层)
第一天卡在最底层:秒悟导出的文件,在飞牛共享目录里根本看不到。两个原因,都是老问题。
其一,挂载路径没定义。
后端的自动导入目录配置,在测试副本里压根没定义,回落成空字符串。调度器每天准时跑、日志一片正常,扫的却是一个空路径——扫了个寂寞。补上定义、显式指向挂载目录之后,调度器才真正开始干活。
其二,"共享"和"挂载"是两回事。
在飞牛界面上看到共享文件夹里有文件,不等于容器里看得到。应用跑在容器里,必须确认宿主机的共享卷真的挂进了容器内的指定目录。这一步不通,后面全是白干。
经验与教训:管道没通,先别怪应用层。先进容器 ls 一下,确认文件真的在,再谈导入逻辑。
Day 2:文件在了,系统读不到(调度与权限层)
第二天文件能看到、能读了,系统还是没反应。也分两处。
第一处,补漏窗口太窄。
第一版调度只认"今天+昨天"两个日期,用固定日期判定。单看够用,跑到生产环境才知道:网络抖两天,前天失败的批次就永久漏账,而日志里干干净净。于是调度器演进成全扫描——不再指定日期,每次把所有日期文件夹扫一遍;再配三套幂等标记(已触发过、今天已处理、昨天已处理),追漏能力拉满,重复跑结果不变。

上一期那张图里的"今天+昨天",是第一版能用的形态;现实教会我们的是,能用和敢没人盯着,是两码事。
第二处,中文和空格路径。
共享目录里偶尔夹着中文文件名、带空格的路径,某些语言环境下程序直接报错。统一用 UTF-8,路径进系统前先做一遍清洗,才稳。
经验与教训:定时任务的"幂等"不是锦上添花,是救命稻草。全扫描加去重标记,比"指定日期跑一次"靠谱得多。
Day 3:读到了,但数据不对(字段桥接层)
第三天最磨人。文件读了、表也建了,落库的数据要么缺字段、要么生命周期对不上。
这一天的活,本质是给源表字段和本地模型做针线活,一共六处。
第一处,省、市补接。
源数据里明明有省、市的政区字段,旧模型没接,导进去全空。补上字段,再补导入映射。
第二处,区县名称归一。
源里有时叫 district_name、有时叫 district,做一层归一映射;取不到就留空,不硬刷默认值——空得明白,比假得整齐好。
第三处,注册码拆分。
源里一个"注册码"字段,本地拆成"注册号"和"特种设备代码"两个。一个变两个,映射规则写错就是隐性污染,逐条对过源数据才敢定。
第四处,日志挂不上电梯。
日志表按电梯 ID 关联,ID 缺失或在本库查无此梯的,直接跳过并告警——宁可少挂一条,不让一条野数据混进时间线。
第五处,生命周期续接。
导入事件本身也记账:一口井道的"建档→导入→变更"要是一条连续的时间线,不能每次导入都另起一页。
第六处,存量数据回填。
新桥接规则定好后,把存量历史数据按同一套规则回刷一遍——新旧两套口径,比没有口径更可怕。

经验与教训:导入不是"能写进去"就行,是"写进去的还是不是同一份真相"。
Day 4:维保静默变成了"其他"(补刀层)
第三天以为生命周期桥接通了,第四天被打脸:飞牛侧看到的"维保 日常",在网页端显示成了"其他 · maintenance"——类型丢了,日常/异常的细节也丢了。

根因一行代码就能说清:导入日志时的事件映射,只认 installation 一种源类型映射成"安装",maintenance、repair、retrofit、accept 全部回落成 other。备注字段也只写了标题,起止时间和"日常/异常"细节整个丢掉。落到时间线表里,前端查不到这个类型,统一显示成"其他"。
这次把桥接枚举补全,映射表、事件类型表、前端渲染三处同步改:
映射表全枚举覆盖。
维保、维修、改造、验收,每种源类型都有明确的去处,不再有"默认其他"这个垃圾桶。
备注拼回细节。
起止时间、日常/异常说明,一起写回备注列——时间线上的每一站,点开来得有完整信息。
前端三处同步。
类型名映射、生命周期映射、渲染逻辑,一处不漏,保证新数据正确显示。
存量数据不回刷。
已经错标成"其他"的两条历史记录维持现状,修复随飞牛应用包重打包发布——新导入的数据即正确显示,旧的不追溯。工程上这是划算的:为了两条记录全量回刷,风险大于收益。
经验与教训:桥接不是"有个映射表"就行,是"每个源枚举值都有去处"。只覆盖一种类型的映射表,等于默认把所有未知事件静默标成"其他"——这是最隐蔽的数据污染,它不报错、不丢行,只是真相悄悄变形。
打通之后,页面上多了三样东西
链路稳了,前端「数据导入」页也升级了:

KPI 合并两源。
最近导入、导入行数、拒绝行、对账差异,手动上传和自动读取一起算,不再两个口径。
来源打标签。
每条导入记录明示"手动上传"还是"自动读取",混为一谈的历史结束了。
执行时间列。
每次调度或手动触发的运行记录、状态、失败文件与原因,逐条可查——自动链路没人盯着,留痕就是给人兜底用的。
底层还是那 5 个 CSV:项目、井道、电梯、日志、工单,一天一个文件夹。任一文件损坏,当天整批回滚并记失败日志;空文件跳过、不计失败。这是自动链路"敢上生产"的底线。
三天踩坑清单
|
1 |
共享目录看不到文件 |
自动导入目录未定义,回落空串 |
显式读配置,为空时回落默认挂载路径 |
|
2 |
界面有文件、容器没有 |
"共享"不等于"挂载" |
确认宿主卷挂进容器指定目录 |
|
3 |
调度漏账 |
只扫今天+昨天,补漏窗口太窄 |
全扫描 + 三套幂等标记 |
|
4 |
中文/空格路径报错 |
语言环境与未清洗路径 |
统一 UTF-8 + 路径清洗 |
|
5 |
省/市字段丢 |
模型未接字段 |
补字段 + 导入映射 |
|
6 |
注册码对不上 |
源单字段、本地双字段 |
拆分桥接,逐条对源 |
|
7 |
日志挂不到电梯 |
电梯 ID 缺失或无效 |
跳过并告警,不污染 |
|
8 |
存量数据不一致 |
旧批次未回刷 |
按新桥接规则回填 |
|
9 |
导入的维保显示成"其他" |
枚举只映射一种,其余回落默认值 |
映射表全枚举覆盖 + 事件类型表补齐 + 前端三处同步 |
|
10 |
备注丢日常/异常细节 |
备注只写标题,丢了说明和时间 |
备注拼回细节 + 起止时间 |
学费交完,说说剩下了什么
三天加一天,说长不长,说短不短。挂载、调度、字段、枚举,每一层单独看都是小问题,叠起来就是能把人熬秃的连环坑。
现在它通了:
秒悟的数据安静地落进飞牛,飞牛的目录被安静地扫进库,库里的数据安静地长成一条连续的时间线。运营在页面上点开"自动读取"标签,能看到每一次定时任务跑得干干净净——维保是维保,维修是维修,不再是含糊的"其他"。
核心观点:
链路设计画的是"该长成的样子",工地记录的是"真正长成的样子"——挂载层先确认文件真的在、调度层用全扫描加幂等标记把补漏窗口打开、字段层用六处桥接保证"写进去的还是同一份真相";而桥接的底线是每个源枚举值都有去处,最隐蔽的污染不报错、不丢行,只是真相悄悄变形。
你们公司的自动链路,卡在哪一层?评论区聊聊。
合集目录
第一期:30块钱,搭起一套 1760 台电梯运营系统
第二期:一条数据从 SaaS 到 NAS 的旅程 – 零人工搬运,数据自己走进系统。
第三期:就是本期
#数据管道 #自动化 #踩坑记录 #电梯维保 #飞牛NAS
#EMMCS #字段映射 #FDE实施纪实 #数字化转型
网硕互联帮助中心







评论前必须登录!
注册