BOM接口抛转失败钉钉通知策略实战教程:MySQL异常日志到钉钉消息的端到端配置

这个策略解决什么问题

在一次实际项目中,我们遇到某制造企业的BOM主数据从ERP向MES抛转时偶发失败。失败记录零散落在MySQL接口日志表里,业务员过了一天才发现物料编码未审核导致BOM没下发,产线早已停料。这个「BOM接口抛转失败-钉钉通知」策略要解决的就是:把异常从"被动翻日志"变成"主动告警",按业务类型(41=同步、43=修改)分门别类,把责任人和解决方案一并推到钉钉群,让一线操作员在分钟内收到提示。

数据流向与字段映射

整体链路:MySQL接口日志表 → 轻易云查询组件 → 中间字段映射 → 钉钉群机器人Webhook。

源端(MySQL,WebAPI/POST查询)从接口请求日志表里筛出"未成功且10分钟内未恢复"或"业务类型为41/43"的记录。关键字段:

源字段 含义 中间层处理 目标字段(钉钉msgParam)
json_result 接口返回错误信息 截取首个Message与BillId拼接 ### 返回报错信息:{``{json_result}}
business_type 41/43业务码 case when转中文 ### 单据类型:{``{business_type}}
create_by / real_name 发起人/姓名 关联用户表取真实姓名 ### 操作者:{``{real_name}}
create_time 创建时间 原值透传 ### 操作时间:{``{create_time}}
userid 钉钉接收人 关联钉钉用户表,缺省回退到固定账号 userIds(数组)
Solution 解决方案文案 case when按业务类型给不同提示 ### 解决方案提示:{``{Solution}}

目标端调用钉钉 topapi/message/corpconversation/asyncsend_v2,msgKey 用 sampleMarkdown,msgParam 通过字符串拼接函数动态组装标题、正文与Markdown标记。

在轻易云上如何配置

在轻易云数据集成平台里,这条策略拆成"源+目标"两张元数据卡。源端声明为select型WebAPI,主SQL语句放进otherRequest.main_sql,主参数main_params做分页占位(:limit :offset),这样翻页逻辑直接交给轻易云内置的分页器,工程师不用写循环。

目标端声明topapi/message/corpconversation/asyncsend_v2,把机器人编码、userIds、msgKey写死在请求体里,msgParam用轻易云的_function CONCAT(...)函数做模板拼装。轻易云客户里常见的应对模式是把这种"动态Markdown模板"集中放在目标端的函数式字段里维护,避免散落在多个策略里------后续业务术语变更只改一处。

idCheck在源端关闭(按业务主键去重,不按接口日志自增id),目标端开启,保证同一条失败不会重复推送。

实施步骤

阶段一:全量触发。首次上线时手动跑一次,把历史积压的失败记录一次性推完,让业务方确认告警文案格式。

阶段二:增量起点 。把源端SQL里的create_time起点对齐到全量跑完的时间戳,后续只取新增或"10分钟仍未恢复"的记录。轻易云里通过metadata.number字段保存上次最大id实现增量游标,是典型的增量与全量双轨做法。

阶段三:调度频率 。源端crontab设为*/29 8-21 * * *,目标端*/30 8-21 * * *,错峰29/30分钟避免源未查完目标就发空消息。工作时间段覆盖8点到21点,与现场排产时间对齐,非工作时间靠数据库自身的告警兜底,避免夜间刷屏。

阶段四:联调验收。故意在ERP侧造一条编码未审核的BOM,观察钉钉是否在两分钟内收到Markdown消息,操作者姓名是否正确。

踩坑复盘

  1. 占位符语法别混用 。源SQL里:limit :offset是轻易云的动态语法,别图省事写?,不然分页器直接失效,第一页查全表把目标端冲垮。
  2. userid空值要兜底 。操作员若未绑定钉钉,user3.userid为NULL,CONCAT出来的JSON数组会带"null"字符串,钉钉接口返回非法参数。稳妥的做法是ifnull(user3.userid,''),再叠加一个固定值班账号作为兜底接收人,确保消息不丢。
  3. msgParam别用真换行 。Markdown里换行要用 \n(两个空格加\n),直接换行在钉钉Markdown渲染里会被吃掉,看起来挤成一团。
  4. idCheck别两端都关 。源端idCheck关、目标端idCheck开,是为了让"重复跑同一条历史失败"时只发一次;如果两端都关,重跑会把历史失败重发一遍,群里会被刷屏。
  5. 时区与now()别双重计算 。源端now()取的是数据库时区,目标端msgParam里不要再做时区转换,否则同一时间会出现两个时间戳,业务方对账时一头雾水。

适用场景与不适用场景

适用:ERP→MES/PLM的接口失败告警、单据抛转异常通知、需要按责任人精准投递的工作群消息。不适用:高频交易型通知(分钟级上百条会触发钉钉限流)、需要双向交互的场景(钉钉机器人群消息是单向推送,回复需另开会话)、含敏感凭证的明细传输(应走加密通道而非群机器人)。

相关推荐
又尔D.1 小时前
MySQL下载安装
数据库·mysql
夜雪一千1 小时前
MySQL 删除 JSON 类型的数据实战
mysql·adb·json
AIsoft_86891 小时前
医患交流内容如何做好记录?
android·iphone
蒸鱼Yuzheng2 小时前
Android Native 崩溃证据链:Tombstone、Build ID 与 Trace 如何联合归因
android·ndk·tombstone·调试符号·崩溃分析
事圆则缓2 小时前
Kotlin 变量与函数:把页面状态和行为写成清楚的契约
android·开发语言·kotlin
hunterandroid2 小时前
MVVM 迁移到 MVI:复杂页面状态如何收敛
android
iCxhust2 小时前
51单片机电力载波应用开发(九)51产品化
c语言·数据库·嵌入式硬件·mysql·51单片机·软件工程·c51
妖星2 小时前
Android 开机动画定制:从 bootanimation.zip 到源码编译
android
tryxr3 小时前
如何分析一个慢sql
数据库·sql·mysql·慢sql