1. 场景
前景
微信端(经销商):发布工单后进入视频语音沟通页面,等待15s后工程师未接单,退出沟通页面。
后台工单管理(工程师):首次接单后,经销商不在线,就触发自动呼出功能,去打电话通知经销商进入沟通。
想要实现业务
当后台页面工程师接起工单时,需要系统每隔3分钟循环呼出电话(调用阿里云的语音通知服务)
2. 初步计划
代码:
this.timer = null; //全局设置了一个定时器,在经销商进入通话后,需要清除定时器,终止电话循环呼出
this.timer = setInterval(function(){
// 呼出电话逻辑
}, 3 * 60 * 1000);
错误点:
因为是异步动作,当多个人去接单时,会有同时请求该接口的情况,全局设置定时器会出现变量污染,细想是不可行的,很危险。
3. 最终解决
-
增加一个phoneNotify(电话通知任务表),在触发以上情况的时候,就在表中添加一条呼出任务
try { const { items: allUserData } = await account.list(handler), callUserInfo = _.find(allUserData, user => user._id === callUserId); let userPhone = ''; if (isPhone(callUserInfo.id)) { userPhone = callUserInfo.id; } else if (isPhone(callUserInfo.phone)) { userPhone = callUserInfo.phone; } if (!userPhone) { throw new error.parameter.ParamError('该用户没有有效手机号,系统无法主动呼出去通知,请主动打电话通知。'); } // 如果有该表单的呼出任务,就不重复呼出 await isAlreadyHaveNotifyRecord(handler, orderId); // 第一步、没人沟通先打一次, 之后是每隔3分钟打一次 log.debug('第一次系统自动呼出'); await exports.callUserPhone(userPhone, callUserInfo.name); // 第二步、之后还要通知的话先加入phoneNotify, 让定时任务去打电话 const data = { name