
IT技术的发展允许控制巨大的数据流。 企业有很多IT解决方案:CRM,ERP,BPM,会计系统,或者至少是Excel和Word。 公司也不同。 一些公司由许多分支机构组成。 让我们命名为“金字塔”。 金字塔存在用于IT系统堆的数据同步问题。 各分支机构的软件供应商和版本差异很大。 此外,管理公司会不断修改报告要求,从而导致分支机构遭受挫败攻击。 这是一个有关我偶然遇到的项目的故事,该项目需要系统化和自动化。 低预算和紧迫的期限限制了大多数现有工业解决方案的使用,但为创造力开辟了空间。
通用格式
客户公司设置了一个任务,从所有分支机构收集报告数据。 让我解释一下挑战的规模-有数十种系统,包括这两种系统:自制系统和SAP等怪兽。
一份报告可能包含以下人员的数据:会计师,修理工,公关经理,EMERCOM和气象学家。
在项目开始之前,大部分数据已作为Word / Excel附件通过电子邮件发送给总公司。 向前看,它就像是手动完成的日落:数据是由经过专门研究的人员手动处理的,并放入了两个系统中。 最后,有数十份报告构成了管理决策的基础。
使用的文件格式-xlsx / docx提示了方法的选择。 甚至旧版软件也支持将数据上传到这些格式。 至少复制粘贴可以成为分支机构的最后选择。
因此,我们自以为是的计划是:
- 描述每个报告的结构和时间表。
- 向分支机构提供报告规定。 分支机构应使用现有软件通过电子邮件发送报告。 如果没有软件,请像以前一样手动发送报告。
- 开发系统,该系统:
- 从电子邮件收件箱中提取正确的文档;
- 从文档中提取数据;
- 将提取的数据写入DB,并惩罚违反法规的人。

实作
非发展问题
事实证明,在需求收集阶段,没有报告结构的描述。 没事 报告结构存储在一些员工的脑海中,并作为民间故事进行口头传递。 通过一些努力解决了该问题,但真正的挑战始于稍后的数据交换阶段。
第一期
Beta版本发布后的几天里,我们发现了文档结构和文档模型之间的差距。 数据质量不佳:报告数量不一致,列混淆或命名不正确。 这些问题主要发生在收集和手动发送数据的分支机构中。
解决方案-实施三步验证:
- 为分支机构提供具有由Excel工具修复的结构的xlsx示例。 这些样本中只有可用的单元格是数据输入。 一些单元格需要其他验证:类型,总和的收敛性等。
- 提取时进行数据验证。 例如,比较Word段落中的当前日期和日期,对Excel文档进行数据算术验证(如果xlsx工具无法设置)。
- 提取后进行深度数据分析。 例如,与上一期间相比,关键指标可检测到重大偏差。
第二期
系统地违反了数据传输时间表或无良的破坏企图:“我们从不向任何人发送任何数据,这就是您的本事……”,“我发送了所有信息! 准时! 可能是因为延迟问题导致您没有得到它。”
反馈成为解决方案。 如果计划发生违规,该软件会自动通知分支机构的负责人。
一段时间后,反馈模块连接到数据质量检查模块和最终报告生成模块。 这样分支立即接收到自己数据的摘要以及与“邻居分支”的比较。 因此,对于分支机构来说,为什么要谴责它是显而易见的。
开发模块
报告模板配置工具,它描述:
- 识别报告的属性;
- 传输规则;
- 数据提取算法;
- 其他属性,例如验证和存储数据的代码路径。
一种电子邮件应用程序,可将附件移动到隔离的存储区(沙盒)并存储与信件相关的信息;
附件解析器,用于标识报告并提取数据。

配置工具
从历史上看,带有报告的信件会发送到公用电子邮件地址,以及许多其他重要或不重要的信件。 因此,我们需要使用属性来识别报告附件的类型。 电子邮件正文中某些文档名称或文本的使用对于发送者来说是不可靠和不舒服的。 这就是为什么我们决定仅由内容确定报告标识的原因。
头脑风暴产生了许多属性,可根据内容识别报告类型:单元格文本颜色,字体等。 但是最正确的方法是在某个单元格(“槽”)或Excel的单元格数组中存在子字符串。 对于Word,我们使用段落或标题。
我们为“广告位”添加了简单的比较逻辑:“相等”,“不相等”,“更多”,“更少”,等等。 Excel报告示例:在A2-E4范围内,单元格文本应等于“每日设备负荷报告”。

我们以类似的方式为数据的开头和结尾配置了搜索区域。
以下是数据结尾的搜索条件示例:“一行2空行”。

其他一些设置:允许的发件人列表,文档类型(Excel / Word),数据导出路径。
输出是描述报告的JSON结构(模板)。
电子邮件申请
此应用程序是电子邮件收件箱阅读器,可将所有附件放入沙箱,保存电子邮件属性,将附件设置为解析队列。
我们面临2个安全问题:
- 如果报表中的分支名称被(或没有)意外地替换为另一个分支名称怎么办?
- 如果入侵者发送报告怎么办?
通过检查分支发送者的电子邮件地址和报告正文中指定的分支名称,可以解决第一个问题。
使用
SPF解决了第二个问题。
附件解析器
几乎所有的Word和Excel解析库仅支持某些版本/扩展名。 这就是为什么我们决定使用“ Libre Office”转换将文件转换为单一格式的原因。 例如输入:odt,doc,docx(2007、2010、2013)...转换为docx(2016)。
转换后:
- 我们根据基本属性(例如Word或Excel,发件人属于允许列表)过滤出一系列报告模板;
- 使用其余模板威胁报告;
- 如果报告与模板匹配-提取数据并将其传输到存储库。
履历表
我们做到了!
经过两个月的艰苦努力,总公司开始定期接收所有分支机构的报告数据。
数据质量和完整性比以前更好。 已实现的软件释放了人力资源,这些人力资源可在年底前偿还项目成本。
对于我们自己,我们了解到集成过程并不总是很痛苦,并且已经确定了成功的主要方面:
- 我们没有进入分支机构的内部系统;
- 我们确定并批准了统一的报告结构和转让时间表;
- 我们通过内置验证为每种报告类型制作了输出样本;
- 我们使用了最常见的数据传递方式-电子邮件。
最后,这种方法有两个主要缺点:
- 数据传输速度慢;
- 数据包的大小不应大于平均电子邮件附件的大小。