package task import ( "context" "fmt" "eta/eta_menu_sync/global" "eta/eta_menu_sync/models" "eta/eta_menu_sync/services" "eta/eta_menu_sync/services/alarm_msg" "eta/eta_menu_sync/utils" "strings" "time" ) func SendMsg() { //fmt.Println("start task") errMsgList := make([]string, 0) defer func() { if len(errMsgList) > 0 { fmt.Println("定时发送消息失败:") for _, errMsg := range errMsgList { fmt.Println(errMsg) } } }() wechatHelperObj := models.WechatHelper{} list, err := wechatHelperObj.GetAllHelper() if err != nil { fmt.Println("err:", err) return } wechatMsgPushRecordObj := models.WechatMsgPushRecord{} for _, helper := range list { //fmt.Println(helper) recordList, tmpErr := wechatMsgPushRecordObj.GetNoPushListByHelperIdV2(helper.WechatHelperId, helper.Num) if tmpErr != nil { errMsgList = append(errMsgList, fmt.Sprint(helper.WechatHelperName, "发送微信消息失败,获取未发送记录失败,Err:", tmpErr.Error())) continue } // 如果没有待推送数据,那么就退出当前循环,进入下一循环 if len(recordList) <= 0 { continue } { recordIdList := make([]int, 0) for _, record := range recordList { recordIdList = append(recordIdList, record.WechatMsgId) } tmpErr = wechatMsgPushRecordObj.MultiUpdateStatus(recordIdList) if tmpErr != nil { errMsgList = append(errMsgList, fmt.Sprint(helper.WechatHelperName, "发送微信消息失败,变更消息发送中状态失败,Err:", tmpErr.Error())) continue } } go PushWxMsgList(recordList, helper) } } // PushWxMsgList 处理发送消息列表 func PushWxMsgList(list []*models.WechatMsgPushRecordItem, helper *models.WechatHelper) { num := len(list) // 平均延迟时间 avgDelayTime := 60 / num // 最小延迟时间 minDelayTime := 5 if avgDelayTime < 2 { minDelayTime = 0 } else if avgDelayTime <= 6 { minDelayTime = 3 } //fmt.Println("minDelayTime:", minDelayTime) //fmt.Println("avgDelayTime:", avgDelayTime) for _, record := range list { // 发送消息 go PushWxMsg(record, helper) // 本次延迟时间 currDelayTime := utils.GetRandInt(minDelayTime, avgDelayTime) fmt.Println("下一条消息时间是 ", currDelayTime, " 秒后") time.Sleep(time.Duration(currDelayTime) * time.Second) } } // PushWxMsg 真正开始处理推送消息业务 func PushWxMsg(record *models.WechatMsgPushRecordItem, wxHelper *models.WechatHelper) { fmt.Println(time.Now().Format(utils.FormatDateTime), " :", record.WechatMsgId, "开始推送了") var errMsg, resultStr string defer func() { record.ModifyTime = time.Now() record.Status = 2 record.Remark = errMsg record.ServerResult = resultStr record.WechatHelperId = wxHelper.WechatHelperId if errMsg != `` { // 发送失败了 record.Status = -1 // TODO 发送邮件提醒? } else { record.Remark = `发送成功` } obj := models.WechatMsgPushRecord{} err := obj.UpdateV2(record.WechatMsgId, record.WechatHelperId, record.Status, record.Remark, record.ServerResult) if err != nil { fmt.Println("err:", err) } //record.Update([]string{"Status", "Remark", "ServerResult", "ModifyTime"}) }() var resp services.WxPushResp var err error switch record.MsgType { // 消息类型,1:h5链接;2:小程序,3:文字;4:图片 case 1: // h5链接 if record.Content == `` { errMsg = `发送数据内容为空` return } resp, resultStr, err = services.SendH5(wxHelper.ServerUrl, wxHelper.WechatId, record.WechatGroupWechatId, record.Title, record.Pic, record.Content, record.JumpUrl) case 2: // 小程序 //GetByJumpPath wechatListenMsgRecordObj := models.WechatListenMsgRecord{} listenMsg, tmpErr := wechatListenMsgRecordObj.GetByJumpPath(models.ListenWxAppType, record.JumpUrl) if tmpErr != nil { if tmpErr != utils.ErrNoRow { err = tmpErr } break } // 替换消息内容,将原来内容里面的 发送人微信标识 替换为 小助手微信标识 xml := strings.Replace(listenMsg.Msg, listenMsg.FinalFromWechatId, wxHelper.WechatId, -1) resp, resultStr, err = services.SendXml(wxHelper.ServerUrl, wxHelper.WechatId, record.WechatGroupWechatId, xml) case 3: // 文字 if record.Content == `` { errMsg = `发送数据内容为空` return } resp, resultStr, err = services.SendText(wxHelper.ServerUrl, wxHelper.WechatId, record.WechatGroupWechatId, record.Content) case 4: // 图片 resp, resultStr, err = services.SendPic(wxHelper.ServerUrl, wxHelper.WechatId, record.WechatGroupWechatId, record.Pic) default: errMsg = `错误的推送类型` return } if err != nil { errMsg = "发送消息给微信失败,ERR:" + err.Error() return } if resp.Code != 200 { errMsg = "发送消息给微信,服务返回失败信息,ERR:" + resp.Msg return } return } func ListenWechatOnline() { offlineHelperList := make([]*models.WechatHelper, 0) baseKey := `listen:wechat_helper:` defer func() { if len(offlineHelperList) > 0 { errMsgList := make([]string, 0) for _, helper := range offlineHelperList { result := global.Redis.SetNX(context.TODO(), fmt.Sprint(baseKey, helper.WechatId), 1, 30*time.Minute) if result.Val() { errMsgList = append(errMsgList, fmt.Sprint("机器人:", helper.WechatHelperName, ";所属服务器:", helper.ServerUrl)) } } if len(errMsgList) > 0 { email := `984198890@qq.com;317699326@qq.com;pdzhao@hzinsights.com` go alarm_msg.SendAlarmMsg(time.Now().Format(utils.FormatDateTime)+":微信小助手掉线检测:
"+strings.Join(errMsgList, "
"), 3, email) } } }() wechatHelperObj := models.WechatHelper{} list, err := wechatHelperObj.GetAllHelper() if err != nil { fmt.Println("err:", err) return } for _, helper := range list { resp, _, tmpErr := services.Listen(helper.ServerUrl, helper.WechatId) if tmpErr != nil { offlineHelperList = append(offlineHelperList, helper) continue } if resp.Code != 200 { offlineHelperList = append(offlineHelperList, helper) continue } } }