集成手机平台待办数据失败问题跟踪和处理

Mongodb、Oracle、SQLServer

场景:

公司的集成手机平台后台的核心数据库采用的Mongodb读写分离架构,所有异构系统平台(财务、ERP、计划 ......)(对应的数据库ORACLE、SQLServer、Mysql......)流程待办会实时推送到Mongodb库里,实现所有系统手机端移动审批。

问题:

各个系统供应商对接集成手机平台系统水平参差不齐,经常出现个别系统待办未推到集成手机平台或待办转已办失败的问题;

解决方案:

各个系统供应商优化接口周期长,在优化完成之前,需要有手动处理机制,即出现待办未推送或待办转已办失败问题,可以及时知道并及时手动处理。

一:待办出现问题时,第一时间向相关系统管理员发送预警邮件,及时手动干预,避免问题升级;

二:监控大屏实时展示失败的待办信息;

三:当失败的待办数量很庞大,批量修复并定期集中处理历史失败的待办;

一:待办出现问题时,第一时间向相关系统管理员发送预警邮件,及时手动干预,避免问题升级;

由于待办出现问题时会在相应系统数据库里生成一条日志记录,可以通过触发器实现邮件预警,以SQLServer数据库为例:

二:监控大屏实时展示失败的待办信息

通过Grafana监控平台,可以添加SQLServer等数据源,实时展现失败待办信息;

三:当失败的待办数量很庞大,批量修复或定期处理历史失败的待办

可以通过集成手机平台数据库(Mongodb)的待办表和各个系统数据库(ORACLE、SQLServer、Mysql)待办表做对比:

1 集成手机平台数据库(Mongodb)的待办数据多于各个系统数据库待办数据,表示待办转已办失败,需要手动删除多余的待办信息;

2 集成手机平台数据库(Mongodb)的待办数据少于各个系统数据库待办数据,表示待办推送失败,需要手动重推;

那么如何批量查出所有系统待办转已办失败的数据呢?

(1)导出集成手机平台数据库(Mongodb)的待办数据到execl

Mongodb所在服务器操作系统为Centos7.5,可以在自己电脑上安装一个Mongodb客户端,使用mongoexport工具导出数据;

导出语句:

D:\MongoDB\Server\3.4\bin>

mongoexport.exe --csv --host 192.100.100.100:27017 /d testdb /c TEST_TdUndo /f "_id,userName,account,createTime,content" /q "{"delete": false}" /o C:\Users\Administrator\Desktop\allcjc_Undo1219a.csv

默认情况下打开CSV文件中文是乱码的:

通过如下方式解决乱码问题:

---打开方式(记事本)---格式---字体---中文GB2312---保存----csv方式打开---调整格式---另存为execl格式文件

(2)导出各个系统数据库(ORACLE、SQLServer、Mysql)的待办数据到execl

例如 系统1:

select Name,Account, IniDate,contentfrom undoerp

where UnDoStatus='待办'

and CreateDate>='2019-11-0108:00:00.000'

and CreateDate<='2019-12-0123:59:00.000';

(3)对比数据

---1 集成手机平台数据库(Mongodb)的待办数据多于各个系统数据库待办数据,表示待办转已办失败,需要手动删除;

---2 集成手机平台数据库(Mongodb)的待办数据少于各个系统数据库待办数据,表示待办推送失败,需要手动重推;

数据对比有两种方式:

1:通过execl函数对比各个系统数据,找出待办转已办失败的数据和待办未推的数据;

但是实际情况可能会比较复杂,比如各系统时间格式不一致、推送待办有延时、标题不一致等问题,通过execl很难对比数据,可以通过SQL语句实现数据对比;

2:将所有系统对应的Mongodb、Oracle、SQLServer、Mysql待办数据导出到execl中,在将所有系统execl数据通过plsql全部导入到oracle数据库中,通过sql对比找出想要的数据,例如Mongodb数据表左连接各系统Oracle、SQLServer、Mysql数据表,匹配不上的数据,既是待办转已办失败的数据。Oracle、SQLServer、Mysql数据表左连接Mongodb数据表,匹配不上的数据,既是未推待办的数据。

(1)oracle先创建多张表,并通过plsql导入各个系统数据;

例如:

create table undocjc(id varchar2(500),userName varchar2(500),account varchar2(100), updateTime varchar2(100),content nvarchar2(2000));

select * from undocjcfor update;

create table undoerp(userName varchar2(500),account varchar2(100), updateTime varchar2(100),content nvarchar2(2000),isstart varchar2(100));

select * from undoerpfor update;

……

(2)通过sql进行数据对比

select distinct a.id,a.username cjc用户名,

a.account cjc登录名,

a.updatetime cjc到达时间,

a.content enanar标题,

b.username erp用户名,

b.account erp登录名,

b.updatetime erp到达时间,

b.content erp标题

from undocjca

left JOIN undoerp b

on a.account = b.account

and a.content like '%' || b.content || '%'

where a.content = ‘xxx系统’

order by erp登录名;

右侧没有匹配上的数据,既是待办转已办失败的数据;

逻辑删除有问题的待办:

即通过主键ID唯一定位到有问题的待办,将delete字段值由false改成true;

单条语句如下:

db.T_ChenUndo.update({"_id":ObjectId("5dd3xxxxx"),"account":"cjc","delete":false},{$set:{delete:true}},{multi:true});

根据ID等信息,批量生成删除错误待办的脚本,即可批量修复待办转已办失败问题;

欢迎关注我的微信公众号"IT小Chen",共同学习,共同成长!!!