Browse Source

fix:优化定时任务逻辑

zqbao 10 months ago
parent
commit
47f8ec235b
4 changed files with 152 additions and 187 deletions
  1. 3 0
      .gitignore
  2. 3 23
      controllers/sys_message_report.go
  3. 20 3
      models/sys_message_report.go
  4. 126 161
      scheduler/task.go

+ 3 - 0
.gitignore

@@ -4,3 +4,6 @@
 *.exe
 *.exe~
 go.sum
+scheduler/etalogs/
+scheduler/conf/
+*_test.go

+ 3 - 23
controllers/sys_message_report.go

@@ -1,13 +1,10 @@
 package controllers
 
 import (
-	"encoding/json"
 	"eta/eta_mini_crm/models"
-	"eta/eta_mini_crm/models/request"
 	"eta/eta_mini_crm/models/response"
 	"eta/eta_mini_crm/utils"
 	"fmt"
-	"time"
 
 	"github.com/rdlucklib/rdluck_tools/paging"
 )
@@ -27,30 +24,13 @@ func (this *SysMessageReportController) Read() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
-	var req request.SysMessageReadReq
-	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
-	if err != nil {
-		br.Msg = "参数解析异常!"
-		br.ErrMsg = "参数解析失败,Err:" + err.Error()
-		return
-	}
 
-	if len(req.SysMessageId) <= 0 {
-		br.Msg = "参数异常"
-		return
-	}
-
-	messages, err := models.GetSysMessageReportListById(req.SysMessageId)
+	err := models.UpdateReadSysMessageReportByUserId(this.SysUser.SysUserId)
 	if err != nil {
-		br.Msg = "查询消息出错"
-		br.ErrMsg = "查询消息出错,系统错误,Err:" + err.Error()
+		br.Msg = "更新消息状态失败"
+		br.ErrMsg = "更新消息状态失败,系统错误,Err:" + err.Error()
 		return
 	}
-	for _, msg := range messages {
-		msg.IsRead = true
-		msg.ModifyTime = time.Now()
-		msg.Update([]string{"is_read", "modify_time"})
-	}
 
 	br.Msg = "查看成功"
 	br.Success = true

+ 20 - 3
models/sys_message_report.go

@@ -24,6 +24,13 @@ func (s *SysMessageReport) Update(cols []string) (err error) {
 	return
 }
 
+func UpdateReadSysMessageReportByUserId(userId int) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE sys_message_report SET is_read=true WHERE user_id=?`
+	_, err = o.Raw(sql, userId).Exec()
+	return
+}
+
 func GetSysMessageReportCountBySysUserId(sysUserId int) (count int, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT COUNT(*) AS count FROM sys_message_report WHERE receive_sys_user_id=?`
@@ -38,7 +45,7 @@ func GetSysMessageReportBySysUserId(sysUserId, startSize, pageSize int) (item []
 	return
 }
 
-func InsertMultiSysMessageReport(sysMessageReportList []SysMessageReport) (err error) {
+func InsertMultiSysMessageReport(sysMessageReportList []*SysMessageReport) (err error) {
 	o := orm.NewOrm()
 	_, err = o.InsertMulti(500, sysMessageReportList)
 	return
@@ -59,9 +66,19 @@ func GetSysMessageReportCount(sysUserId, userId, messageType int) (count int, er
 	return
 }
 
-func GetSysMessageReportByCondition(condition string, pars []interface{}) (count int, err error) {
+func GetSysMessageReportByCondition(condition string, pars []interface{}) (items []*SysMessageReport, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT COUNT(*) AS count FROM sys_message_report WHERE user_id=? AND message_type=? `
+	sql := `SELECT * FROM sys_message_report WHERE 1=1`
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars...).QueryRows(&items)
+	return
+}
+
+func GetSysMessageReportCountByCondition(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT COUNT(*) AS count FROM sys_message_report `
 	if condition != "" {
 		sql += condition
 	}

+ 126 - 161
scheduler/task.go

@@ -13,25 +13,14 @@ import (
 func InitJob() {
 	fmt.Println("消息推送任务开启。。。")
 	// 每天凌晨1点检测, 发送消息
-	// tk1 := task.NewTask("CheckUserPermission", "0 0 1 * * *", CheckUserTime)
-	// task.AddTask("CheckUserPermission", tk1)
+	tk1 := task.NewTask("SendReminderMsg", "0 0 1 * * *", SendReminderMsg)
+	task.AddTask("发送消息提醒", tk1)
 	// 每天凌晨1点检测, 修改用户状态
 	tk2 := task.NewTask("ModifyUserStatus", "0 0 1 * * *", ModifyUser)
-	task.AddTask("ModifyUserStatus", tk2)
+	task.AddTask("定时修改用户状态", tk2)
 	task.StartTask()
-	defer task.StopTask()
 }
 
-// func CheckUserTime(ctx context.Context) (err error) {
-// 	defer func() {
-// 		if err != nil {
-// 			utils.ApiLog.Warn("userPermission 定时任务出错,Err: %s", err.Error())
-// 		}
-// 	}()
-// 	// err = CheckUserPermissionTime()
-// 	return
-// }
-
 func ModifyUser(ctx context.Context) (err error) {
 	defer func() {
 		if err != nil {
@@ -57,151 +46,127 @@ func ModifyUserStatus() (err error) {
 	return
 }
 
-// func CheckUserPermissionTime() (err error) {
-// 	var condition string
-// 	var pars7 []interface{}
-// 	var pars15 []interface{}
-// 	var pars30 []interface{}
-// 	var pars60 []interface{}
-
-// 	var userTotal int
-// 	pageSize := 500
-
-// 	curTime := time.Now()
-// 	time7 := time.Now().AddDate(0, 0, 7)
-// 	time15 := time.Now().AddDate(0, 0, 15)
-// 	time30 := time.Now().AddDate(0, 0, 30)
-// 	time60 := time.Now().AddDate(0, 0, 60)
-
-// 	condition7 := ` AND valid_end_time<? `
-// 	pars7 = append(pars7, time7)
-// 	condition15 := `valid_end_time>? AND valid_end_time<?`
-
-// 	models.GetUserCount(condition7, pars7)
-
-// 	// 批量查询到期的用户
-// 	messageMap := make(map[int]int)
-// 	userTotal, err = models.GetUserCount(condition, pars)
-// 	if err != nil {
-// 		utils.ApiLog.Warn("userPermission task err: %s", err.Error())
-// 	}
-// 	pageCount := paging.PageCount(userTotal, pageSize)
-// 	for i := 1; i <= pageCount; i++ {
-// 		startPage := utils.StartIndex(i, pageSize)
-// 		userList, err := models.GetUserList(condition, pars, startPage, pageSize)
-// 		if err != nil {
-// 			utils.ApiLog.Warn("userPermission task err: %s", err.Error())
-// 		}
-// 		for _, user := range userList {
-// 			if user.Status != 2 {
-// 				continue
-// 			}
-// 			if time60.After(user.ValidEndTime) {
-// 				messageMap[user.UserId] = 60
-// 			}
-// 			if time30.After(user.ValidEndTime) {
-// 				messageMap[user.UserId] = 30
-// 			}
-// 			if time15.After(user.ValidEndTime) {
-// 				messageMap[user.UserId] = 15
-// 			}
-// 			if time7.After(user.ValidEndTime) {
-// 				messageMap[user.UserId] = 7
-// 			}
-// 		}
-// 	}
-
-// 	// 把消息发送到系统用户中
-// 	sysUserIds, err := models.GetSysUserIdList()
-// 	if err != nil {
-// 		utils.ApiLog.Warn("userPermission task err: %s", err.Error())
-// 	}
-// 	layout := "【%s】到期%d天提醒,请及时跟进"
-// 	messageList := []models.SysMessageReport{}
-// 	for k, v := range messageMap {
-// 		count, err := models.GetSysMessageReportCount(k, v)
-// 		if err != nil {
-// 			continue
-// 		}
-// 		if count > 0 {
-// 			continue
-// 		}
-// 		user, err := models.GetUserById(k)
-// 		if err != nil {
-// 			continue
-// 		}
-// 		for _, sysUserId := range sysUserIds {
-// 			messageList = append(messageList, models.SysMessageReport{
-// 				UserId:           k,
-// 				ReceiveSysUserId: sysUserId,
-// 				MessageType:      v,
-// 				IsRead:           false,
-// 				CreateTime:       curTime,
-// 				ModifyTime:       curTime,
-// 				Content:          fmt.Sprintf(layout, user.RealName, v),
-// 			})
-// 		}
-// 		err = models.InsertMultiSysMessageReport(messageList)
-// 		if err != nil {
-// 			continue
-// 		}
-// 	}
-// 	return
-// }
-
-// func GetSendUser(condition string, pars []interface{}, messagetType int) (user []*models.UserView, err error) {
-// 	total, err := models.GetUserCount(condition, pars)
-// 	if err != nil {
-// 		utils.ApiLog.Warn("获取用户列表失败 task err: %s", err.Error())
-// 	}
-// 	if total == 0 {
-// 		return
-// 	}
-// 	// 获得待发送用户的列表
-// 	userList, err := models.GetUserList(condition, pars, 0, total)
-// 	if err != nil {
-// 		utils.ApiLog.Warn("获取用户列表失败 task err: %s", err.Error())
-// 		return
-// 	}
-
-// 	// 获得待发送系统用户的列表
-// 	sysUserIds, err := models.GetSysUserIdList()
-// 	if err != nil {
-// 		utils.ApiLog.Warn("userPermission task err: %s", err.Error())
-// 	}
-
-// 	messageList, err := models.GetSysMessageReportByCondition(condition, pars)
-
-// 	layout := "【%s】到期%d天提醒,请及时跟进"
-// 	messageList := []models.SysMessageReport{}
-// 	for _, v := range sysUserIds {
-// 		count, err := models.GetSysMessageReportCount(v, messagetType)
-// 		if err != nil {
-// 			continue
-// 		}
-// 		if count > 0 {
-// 			continue
-// 		}
-// 		user, err := models.GetUserById(v)
-// 		if err != nil {
-// 			continue
-// 		}
+func SendReminderMsg(ctx context.Context) (err error) {
+	defer func() {
+		if err := recover(); err != nil {
+			utils.ApiLog.Warn("发送提醒消息,定时任务出错,Err: %s", err)
+		}
+	}()
+	var userPars7 []interface{}
+	var userPars15 []interface{}
+	var userPars30 []interface{}
+	var userPars60 []interface{}
+	var msgPars7 []interface{}
+	var msgPars15 []interface{}
+	var msgPars30 []interface{}
+	var msgPars60 []interface{}
+
+	userTime7 := time.Now().AddDate(0, 0, 7)
+	userTime15 := time.Now().AddDate(0, 0, 15)
+	userTime30 := time.Now().AddDate(0, 0, 30)
+	userTime60 := time.Now().AddDate(0, 0, 60)
+	msgTime7 := time.Now().AddDate(0, 0, -7)
+	msgTime15 := time.Now().AddDate(0, 0, -15)
+	msgTime30 := time.Now().AddDate(0, 0, -30)
+	msgTime60 := time.Now().AddDate(0, 0, -60)
+
+	userCondition1 := ` AND valid_end_time<? `
+	userCondition2 := ` AND valid_end_time<? AND valid_end_time>? `
+	msgCondition := ` AND create_time>? `
+	userPars7 = append(userPars7, userTime7)
+	userPars15 = append(userPars15, userTime15, userTime7)
+	userPars30 = append(userPars30, userTime30, userTime15)
+	userPars60 = append(userPars60, userTime60, userTime30)
+	msgPars7 = append(msgPars7, msgTime7)
+	msgPars15 = append(msgPars15, msgTime15)
+	msgPars30 = append(msgPars30, msgTime30)
+	msgPars60 = append(msgPars60, msgTime60)
+
+	err = SendMsgToSysUser(userCondition1, msgCondition, userPars7, msgPars7, 7)
+	if err != nil {
+		utils.ApiLog.Warn("发送提醒消息,定时任务出错,Err: %s", err.Error())
+	}
+	err = SendMsgToSysUser(userCondition2, msgCondition, userPars15, msgPars15, 15)
+	if err != nil {
+		utils.ApiLog.Warn("发送提醒消息,定时任务出错,Err: %s", err.Error())
+	}
+	err = SendMsgToSysUser(userCondition2, msgCondition, userPars30, msgPars30, 30)
+	if err != nil {
+		utils.ApiLog.Warn("发送提醒消息,定时任务出错,Err: %s", err.Error())
+	}
+	err = SendMsgToSysUser(userCondition2, msgCondition, userPars60, msgPars60, 60)
+	if err != nil {
+		utils.ApiLog.Warn("发送提醒消息,定时任务出错,Err: %s", err.Error())
+	}
+	return
+}
 
-// 	}
-// 	for _, sysUserId := range sysUserIds {
-// 		messageList = append(messageList, models.SysMessageReport{
-// 			UserId:           k,
-// 			ReceiveSysUserId: sysUserId,
-// 			MessageType:      v,
-// 			IsRead:           false,
-// 			CreateTime:       curTime,
-// 			ModifyTime:       curTime,
-// 			Content:          fmt.Sprintf(layout, user.RealName, v),
-// 		})
-// 	}
-// 	err = models.InsertMultiSysMessageReport(messageList)
-// 	if err != nil {
-// 		continue
-// 	}
-// 	return
-// }
+func SendMsgToSysUser(userCondition, msgCondition string, userPars, msgPars []interface{}, messagetType int) (err error) {
+	total, err := models.GetUserCount(userCondition, userPars)
+	if err != nil {
+		utils.ApiLog.Warn("获取用户列表失败 task err: %s", err.Error())
+	}
+	if total == 0 {
+		return
+	}
+	// 获得待发送用户的列表
+	userList, err := models.GetUserList(userCondition, userPars, 0, total)
+	if err != nil {
+		return
+	}
+
+	// 获得待通知系统用户的列表
+	sysUserIds, err := models.GetSysUserIdList()
+	if err != nil {
+		return
+	}
+
+	messageList, err := models.GetSysMessageReportByCondition(msgCondition, msgPars)
+	if err != nil {
+		return
+	}
+	layout := "【%s】到期%d天提醒,请及时跟进"
+	messageMap := make(map[int]map[int]struct{})
+	for _, v := range messageList {
+		if mv, ok := messageMap[v.ReceiveSysUserId]; ok {
+			mv[v.UserId] = struct{}{}
+		} else {
+			messageMap[v.ReceiveSysUserId] = make(map[int]struct{})
+			messageMap[v.ReceiveSysUserId][v.UserId] = struct{}{}
+		}
+	}
+	sendMsg := make([]*models.SysMessageReport, 0)
+	for _, v := range sysUserIds {
+		if userMap, ok := messageMap[v]; ok {
+			for _, u := range userList {
+				if _, ok := userMap[u.UserId]; !ok {
+					sendMsg = append(sendMsg, &models.SysMessageReport{
+						UserId:           u.UserId,
+						ReceiveSysUserId: v,
+						MessageType:      messagetType,
+						IsRead:           false,
+						CreateTime:       time.Now(),
+						ModifyTime:       time.Now(),
+						Content:          fmt.Sprintf(layout, u.RealName, messagetType),
+					})
+				}
+			}
+		} else {
+			for _, u := range userList {
+				sendMsg = append(sendMsg, &models.SysMessageReport{
+					UserId:           u.UserId,
+					ReceiveSysUserId: v,
+					MessageType:      messagetType,
+					IsRead:           false,
+					CreateTime:       time.Now(),
+					ModifyTime:       time.Now(),
+					Content:          fmt.Sprintf(layout, u.RealName, messagetType),
+				})
+			}
+		}
+	}
+	if len(sendMsg) > 0 {
+		err = models.InsertMultiSysMessageReport(sendMsg)
+	}
+	return
+}