package services import ( "context" "errors" "eta_gn/eta_task/models" "eta_gn/eta_task/utils" "fmt" "github.com/beego/beego/v2/task" "strconv" "strings" "time" ) var EdbTaskNameMap map[string]map[string]bool var EdbTaskNameChannel chan string var EdbTaskStopChannel chan string var EdbTaskRunNum int func AddEdbTask(cont context.Context) (err error) { failList := make([]string, 0) defer func() { if len(failList) > 0 { fmt.Println("提醒失败:") for _, v := range failList { fmt.Println(v) } } }() list, err := models.GetEdbInfoByFrequencyNotDay() if err != nil { fmt.Println("查询获取频度非日度 且 提醒时间不为空 的指标数据失败,Err:", err.Error()) } if EdbTaskNameMap == nil { EdbTaskNameMap = make(map[string]map[string]bool) } tmpEdbTaskNameMap := make(map[string]bool) todayStr := time.Now().Format(utils.FormatDate) nowWeekFirstDay := utils.GetNowWeekMonday() nowWeekLastDay := utils.GetNowWeekLastDay() nowMonthFirstDay := utils.GetNowMonthFirstDay() nowMonthLastDay := utils.GetNowMonthLastDay() nowQuarterFirstDay := utils.GetNowQuarterFirstDay() nowQuarterLastDay := utils.GetNowQuarterLastDay() nowHalfYearFirstDay := utils.GetNowHalfYearFirstDay() nowHalfYearLastDay := utils.GetNowHalfYearLastDay() nowYearFirstDay := utils.GetNowYearFirstDay() nowYearLastDay := utils.GetNowYearLastDay() debugNoticeUserId := 0 //测试环境,需要发送消息的用户 for _, edb := range list { if edb.UserId <= 0 { continue //没有配置user_id的话,那么不需要提醒 } tmpEdb := edb //指标信息 isNotice := false //是否需要提醒 noticeTime := "12:00:00" //提醒时间 var dataDtTime time.Time edbData, tmpErr := models.GetLastEdbdataInfo(tmpEdb.TradeCode) if tmpErr != nil { if tmpErr.Error() != utils.ErrNoRow() { failList = append(failList, fmt.Sprint(tmpEdb.TradeCode, "失败,Err:", tmpErr.Error())) continue } } if edbData != nil { tmpDataDtTime, _ := time.ParseInLocation(utils.FormatDate, edbData.Dt, time.Now().Location()) dataDtTime = tmpDataDtTime } switch tmpEdb.Frequency { case "周度": modifyDate := nowWeekLastDay //下次更新日期 if tmpEdb.NoticeTime != "" { addDay := 7 noticeArr := strings.Split(tmpEdb.NoticeTime, " ") if len(noticeArr) >= 2 { noticeTime = noticeArr[1] } noticeWeek := noticeArr[0] switch noticeWeek { case "周一": addDay = 1 case "周二": addDay = 2 case "周三": addDay = 3 case "周四": addDay = 4 case "周五": addDay = 5 case "周六": addDay = 6 case "周日": addDay = 7 } modifyDate = modifyDate.AddDate(0, 0, addDay-7) } if todayStr == modifyDate.Format(utils.FormatDate) && !nowWeekFirstDay.Before(dataDtTime) { isNotice = true } case "月度": addDay := 0 modifyDate := nowMonthLastDay //下次更新日期 if tmpEdb.NoticeTime != "" { strArr := strings.Split(tmpEdb.NoticeTime, "日") if len(strArr) >= 2 { noticeTime = strArr[1] } tmpAddDay, tmpErr := strconv.Atoi(strArr[0]) if tmpErr != nil { continue } addDay = tmpAddDay - 1 modifyDate = nowMonthFirstDay.AddDate(0, 0, addDay) } if todayStr == modifyDate.Format(utils.FormatDate) && !nowMonthFirstDay.Before(dataDtTime) { isNotice = true } case "季度": if tmpEdb.NoticeTime != "" { noticeArr := strings.Split(tmpEdb.NoticeTime, " ") if len(noticeArr) >= 2 { noticeTime = noticeArr[1] } } if todayStr == nowQuarterLastDay.Format(utils.FormatDate) && !nowQuarterFirstDay.Before(dataDtTime) { isNotice = true } case "半年度": if tmpEdb.NoticeTime != "" { noticeArr := strings.Split(tmpEdb.NoticeTime, " ") if len(noticeArr) >= 2 { noticeTime = noticeArr[1] } } if todayStr == nowHalfYearLastDay.Format(utils.FormatDate) && !nowHalfYearFirstDay.Before(dataDtTime) { isNotice = true } case "年度": if tmpEdb.NoticeTime != "" { noticeArr := strings.Split(tmpEdb.NoticeTime, " ") if len(noticeArr) >= 2 { noticeTime = noticeArr[1] } } if todayStr == nowYearLastDay.Format(utils.FormatDate) && !nowYearFirstDay.Before(dataDtTime) { isNotice = true } } if isNotice { taskName := "edb_task_" + todayStr + ":" + fmt.Sprint(tmpEdb.TradeCode) tmpTaskFunc := func(ctx context.Context) (funcErr error) { defer func() { EdbTaskNameChannel <- taskName }() funcIsNotice := false edbData, tmpErr := models.GetLastEdbdataInfo(tmpEdb.TradeCode) if tmpErr != nil { if tmpErr.Error() != utils.ErrNoRow() { funcErr = tmpErr return } } if utils.RunMode == "debug" && debugNoticeUserId > 0 { tmpEdb.UserId = debugNoticeUserId //测试环境的话,发送邮箱给嘉豪 } var funcDataDtTime time.Time if edbData != nil { tmpDataDtTime, _ := time.ParseInLocation(utils.FormatDate, edbData.Dt, time.Now().Location()) funcDataDtTime = tmpDataDtTime } notifyFrequency := "每日" switch tmpEdb.Frequency { case "周度": notifyFrequency = "每周" modifyDate := nowWeekLastDay //下次更新日期 if tmpEdb.NoticeTime != "" { addDay := 7 noticeArr := strings.Split(tmpEdb.NoticeTime, " ") if len(noticeArr) >= 2 { noticeTime = noticeArr[1] } noticeWeek := noticeArr[0] switch noticeWeek { case "周一": addDay = 1 case "周二": addDay = 2 case "周三": addDay = 3 case "周四": addDay = 4 case "周五": addDay = 5 case "周六": addDay = 6 case "周日": addDay = 7 } modifyDate = modifyDate.AddDate(0, 0, addDay-7) } if todayStr == modifyDate.Format(utils.FormatDate) && !nowWeekFirstDay.Before(funcDataDtTime) { funcIsNotice = true } case "月度": notifyFrequency = "每月" addDay := 0 modifyDate := nowMonthLastDay //下次更新日期 if tmpEdb.NoticeTime != "" { strArr := strings.Split(tmpEdb.NoticeTime, "日") if len(strArr) >= 2 { noticeTime = strArr[1] } tmpAddDay, tmpErr := strconv.Atoi(strArr[0]) if tmpErr != nil { funcErr = tmpErr } addDay = tmpAddDay - 1 modifyDate = nowMonthFirstDay.AddDate(0, 0, addDay) } if todayStr == modifyDate.Format(utils.FormatDate) && !nowMonthFirstDay.Before(funcDataDtTime) { funcIsNotice = true } case "季度": notifyFrequency = "每季度" if tmpEdb.NoticeTime != "" { noticeArr := strings.Split(tmpEdb.NoticeTime, " ") if len(noticeArr) >= 2 { noticeTime = noticeArr[1] } } if todayStr == nowQuarterLastDay.Format(utils.FormatDate) && !nowQuarterFirstDay.Before(funcDataDtTime) { funcIsNotice = true } case "半年度": notifyFrequency = "每半年度" if tmpEdb.NoticeTime != "" { noticeArr := strings.Split(tmpEdb.NoticeTime, " ") if len(noticeArr) >= 2 { noticeTime = noticeArr[1] } } if todayStr == nowHalfYearLastDay.Format(utils.FormatDate) && !nowHalfYearFirstDay.Before(funcDataDtTime) { funcIsNotice = true } case "年度": notifyFrequency = "每年" if tmpEdb.NoticeTime != "" { noticeArr := strings.Split(tmpEdb.NoticeTime, " ") if len(noticeArr) >= 2 { noticeTime = noticeArr[1] } } if todayStr == nowYearLastDay.Format(utils.FormatDate) && !nowYearFirstDay.Before(funcDataDtTime) { funcIsNotice = true } } if funcIsNotice { openIdList := make([]*models.OpenIdList, 0) admin, err := models.GetAdminByAdminId(tmpEdb.UserId) if err != nil { if err.Error() == utils.ErrNoRow() { funcErr = errors.New("openId 列表为空" + strconv.Itoa(tmpEdb.UserId)) return } else { return err } } if admin == nil { funcErr = errors.New("openId 列表为空" + strconv.Itoa(tmpEdb.UserId)) return } if admin.OpenId == "" { funcErr = errors.New("openId 列表为空" + strconv.Itoa(tmpEdb.UserId)) return } openIdTemp := new(models.OpenIdList) openIdTemp.OpenId = admin.OpenId openIdList = append(openIdList, openIdTemp) first := "数据录入提醒" keyword1 := tmpEdb.SecName + "该更新了" keyword2 := notifyFrequency + " " + tmpEdb.NoticeTime remark := tmpEdb.SecName + "该更新了" err = SendWxMsgWithFrequency(first, keyword1, keyword2, remark, openIdList) if err != nil { return err } { sendRecord := new(models.EdbinfoSendMsgRecord) sendRecord.UserId = tmpEdb.UserId sendRecord.TradeCode = tmpEdb.TradeCode sendRecord.CreateTime = time.Now() err = models.AddEdbinfoSendMsgRecord(sendRecord) if err != nil { return err } } } return } spec := `` if noticeTime != "" { noticeArr := strings.Split(noticeTime, ":") if len(noticeArr) == 3 { spec = fmt.Sprintf(` %s %s %s * * * `, noticeArr[2], noticeArr[1], noticeArr[0]) tmpTask := task.NewTask(taskName, spec, tmpTaskFunc) task.AddTask(taskName, tmpTask) tmpEdbTaskNameMap[taskName] = true } } } } EdbTaskNameMap[todayStr] = tmpEdbTaskNameMap go deleteTask() if EdbTaskRunNum > 0 { EdbTaskStopChannel <- time.Now().AddDate(0, 0, -1).Format(utils.FormatDate) } EdbTaskRunNum++ return } func deleteTask() { for { select { case taskName := <-EdbTaskNameChannel: task.DeleteTask(taskName) delete(EdbTaskNameMap, taskName) case dayStr := <-EdbTaskStopChannel: //收到停止信号,先清除掉那一天的定时任务, for taskName := range EdbTaskNameMap[dayStr] { task.DeleteTask(taskName) delete(EdbTaskNameMap, taskName) } break } } }