diff --git a/src/common/conf/options.go b/src/common/conf/options.go index 456a5bf7e9a3b69c7566f955509a09c54188de54..a918b545f261629af219f23626e9b65b258eb11b 100644 --- a/src/common/conf/options.go +++ b/src/common/conf/options.go @@ -64,4 +64,5 @@ const ( FinalHeartBeatUnixKey = "FinalHeartBeatUnix" AutoExecHistory = "AutoExecHistory" TaskExecLog = "TaskExecLog" + WorkOrderPush = "WorkOrderPush" ) diff --git a/src/main.go b/src/main.go index c304ef6202b20a3853540f1ddedfcaaf7d4f26df..d75a2caf782faedb45f447447bd7bb0b620ed6d1 100644 --- a/src/main.go +++ b/src/main.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "gitlab.wodcloud.com/smart-operation/so-operation-api/src/service" "gitlab.wodcloud.com/smart-operation/so-operation-api/src/service/cron" "net/http" "os" @@ -46,7 +47,7 @@ func main() { //启动定时任务 cron.StartCron() - + service.PushWorkOrderMessage() // server start... conf.Logger.Error("server start err", zap.Error(newServer().ListenAndServe())) } diff --git a/src/service/cron/common.go b/src/service/cron/common.go index e7182074d96687bf6c8d9d4df255207b043965cb..d5acf394717d8f198e26f057bc059558d8fb85c9 100644 --- a/src/service/cron/common.go +++ b/src/service/cron/common.go @@ -9,5 +9,7 @@ func StartCron() { c := cron.New() defer c.Start() - c.AddFunc("0 0 0 * * *", service.CronStatusDetection) // 每天凌晨12状态检测 + c.AddFunc("0 0 0 * * *", service.CronStatusDetection) // 每天凌晨0点状态检测 + + c.AddFunc("0 0 0 * * *", service.CronWorkOrderIssuance) // 每天凌晨0点扫描当天需下发工单 } diff --git a/src/service/work_order.go b/src/service/work_order.go index f7e4e5ba4b649d78fdf2c294628eaf5ec1fc3691..dc2d60e2b946f75aebf26ae9b7865c42266d89e5 100644 --- a/src/service/work_order.go +++ b/src/service/work_order.go @@ -11,6 +11,7 @@ import ( "gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/vo/response" "gitlab.wodcloud.com/smart-operation/so-operation-api/src/common/client" "gitlab.wodcloud.com/smart-operation/so-operation-api/src/common/conf" + "gitlab.wodcloud.com/smart-operation/so-operation-api/src/pkg/beagle/jsontime" "gitlab.wodcloud.com/smart-operation/so-operation-api/src/pkg/beagle/resp" "go.uber.org/zap" "strings" @@ -359,27 +360,27 @@ func (w *WorkOrderManageSvc) PushWorkOrderManage(req request.PushWorkOrderReq) ( switch req.PushObj.PushMethod { case 1: //发送钉钉消息 - err = w.WorkOrderPushDingTalkMsg(workOrder.OrderName, workOrder.OrderLevel, phones) + err = WorkOrderPushDingTalkMsg(workOrder.OrderName, workOrder.OrderLevel, phones) if err != nil { session.Rollback() return } case 2: //发送短信 - err = w.WorkOrderPushNoteMsg(workOrder.OrderName, phones, workOrder.OrderLevel) + err = WorkOrderPushNoteMsg(workOrder.OrderName, phones, workOrder.OrderLevel) if err != nil { session.Rollback() return } case 3: //发送钉钉消息 - err = w.WorkOrderPushDingTalkMsg(workOrder.OrderName, workOrder.OrderLevel, phones) + err = WorkOrderPushDingTalkMsg(workOrder.OrderName, workOrder.OrderLevel, phones) if err != nil { session.Rollback() return } //发送短信 - err = w.WorkOrderPushNoteMsg(workOrder.OrderName, phones, workOrder.OrderLevel) + err = WorkOrderPushNoteMsg(workOrder.OrderName, phones, workOrder.OrderLevel) if err != nil { session.Rollback() return @@ -648,7 +649,7 @@ func (w *WorkOrderManageSvc) ListWorkOrderMe(req request.ListWorkOrderReq) (tota } // WorkOrderPushDingTalkMsg 推送钉钉消息 -func (w *WorkOrderManageSvc) WorkOrderPushDingTalkMsg(orderName string, orderLevel int, phones []string) (err error) { +func WorkOrderPushDingTalkMsg(orderName string, orderLevel int, phones []string) (err error) { d := ding.Webhook{ AccessToken: conf.Options.OrderDingTalkAccessToken, //"203fe1644b446bba0a34e6e622c523d39ee9916fdad94b9c64224449f659e20b", Secret: conf.Options.OrderDingTalkSecret, //"SECa73d8372e336451c9daf29a99f750ee1bdd170c1dab910eab9cd06d729a831b7", @@ -674,7 +675,7 @@ func (w *WorkOrderManageSvc) WorkOrderPushDingTalkMsg(orderName string, orderLev } // WorkOrderPushNoteMsg 推送工单短信消息 -func (w *WorkOrderManageSvc) WorkOrderPushNoteMsg(orderName string, phone []string, orderLevel int) (err error) { +func WorkOrderPushNoteMsg(orderName string, phone []string, orderLevel int) (err error) { smsClient, err := dysmsapi.NewClientWithAccessKey("cn-hangzhou", conf.Options.SmsAccessKeyId, conf.Options.SmsAccessSecret) if err != nil { conf.Logger.Error("dysmsapi client error", zap.Error(err)) @@ -713,3 +714,195 @@ func (w *WorkOrderManageSvc) WorkOrderPushNoteMsg(orderName string, phone []stri fmt.Printf("response is %#v\n", req) return } + +// CronWorkOrderIssuance 定时任务-每天凌晨0点检测当天需下发工单 +func CronWorkOrderIssuance() { + db, err := client.GetDbClient() + if err != nil { + fmt.Println("CronStatusDetection err:", err.Error()) + return + } + + //查询推送工单 + workOrderList := make([]entity.WorkOrder, 0) + finder := db.Table("work_order_manage").Where("timing_state = 1 AND (timing_type = 2 OR timing_type = 3)") + err = finder.Find(&workOrderList) + if err != nil { + fmt.Println("CronStatusDetection err:", err.Error()) + return + } + + week := map[time.Weekday]int{ + time.Monday: 1, + time.Tuesday: 2, + time.Wednesday: 3, + time.Thursday: 4, + time.Friday: 5, + time.Saturday: 6, + time.Sunday: 7, + } + + for _, v := range workOrderList { + if v.TimingType == 2 { + //按周 + var timingWeekly request.TimingWeekly + err = json.Unmarshal([]byte(v.TimingRule), &timingWeekly) + if err != nil { + fmt.Println("CronStatusDetection err:", err.Error()) + continue + } + days := week[time.Now().Weekday()] + for _, i := range timingWeekly.Week { + if i == days { + //写redis + err = PushRedisWorkOrder(timingWeekly.PointTime, v.PushObj, v.OrderName, v.OrderLevel) + if err != nil { + fmt.Println("CronStatusDetection redis set err:", err.Error()) + continue + } + break + } + } + } else if v.TimingType == 3 { + //自定义时间 + var timingCustom []request.TimingCustom + err = json.Unmarshal([]byte(v.TimingRule), &timingCustom) + if err != nil { + fmt.Println("CronStatusDetection json Unmarshal err:", err.Error()) + continue + } + for _, v1 := range timingCustom { + t := time.Now() + dateFrom, err1 := time.Parse(jsontime.LocalDateFormat, v1.DateFrom) + if err1 != nil { + fmt.Println("CronStatusDetection dateFrom parse err:", err1.Error()) + continue + } + dateTo, err1 := time.Parse(jsontime.LocalDateFormat, v1.DateTo) + if err1 != nil { + fmt.Println("CronStatusDetection dateTo parse err:", err1.Error()) + continue + } + if t.After(dateFrom) && t.Before(dateTo) { + //写redis + err = PushRedisWorkOrder(v1.PointTime, v.PushObj, v.OrderName, v.OrderLevel) + if err != nil { + fmt.Println("CronStatusDetection redis set err:", err.Error()) + continue + } + break + } + } + } + } + fmt.Println("CronPersonalCardDate success!") +} + +type CronRedisWorkOrder struct { + PointTime int64 `json:"point_Time"` // 时间点 + PushObj string `json:"push_obj"` //推送对象 + OrderName string `json:"order_name"` // 工单名称 + OrderLevel int `json:"order_level"` // 工单等级(1紧急任务 2重要任务 3一般任务) +} + +func PushRedisWorkOrder(pointTime, pushObj, orderName string, orderLevel int) (err error) { + redis, err := client.GetRedisClient() + if err != nil { + return + } + + timeUnix, err := time.Parse(jsontime.LocalTimeFormat, pointTime) + if err != nil { + return + } + cronRedisWorkOrder := CronRedisWorkOrder{ + PointTime: timeUnix.Unix(), + PushObj: pushObj, + OrderName: orderName, + OrderLevel: orderLevel, + } + workOrderObj, err := json.Marshal(cronRedisWorkOrder) + if err != nil { + return + } + //写redis + err = redis.LPush(conf.WorkOrderPush, fmt.Sprintf("%s", workOrderObj)) + if err != nil { + return + } + return +} + +// PushWorkOrderMessage 工单定时下发消息 +func PushWorkOrderMessage() { + go func() { + for { + redis, err := client.GetRedisClient() + if err != nil { + zap.L().Error(err.Error()) + continue + } + workOrderList, err := redis.LRange(conf.WorkOrderPush) + if err != nil { + zap.L().Error(err.Error()) + continue + } + for _, v := range workOrderList { + var cronRedisWorkOrder CronRedisWorkOrder + err = json.Unmarshal([]byte(v), &cronRedisWorkOrder) + if err != nil { + zap.L().Error(err.Error()) + continue + } + times, err1 := time.Parse(jsontime.LocalTimeFormat, time.Now().Format(jsontime.LocalTimeFormat)) + if err1 != nil { + zap.L().Error(err1.Error()) + return + } + if cronRedisWorkOrder.PointTime == times.Unix() { + var pushObj request.PushObj + err = json.Unmarshal([]byte(cronRedisWorkOrder.PushObj), &pushObj) + if err != nil { + zap.L().Error(err.Error()) + continue + } + var phones []string + for _, v1 := range pushObj.UserObj { + phones = append(phones, v1.Phone) + } + switch pushObj.PushMethod { + case 1: + //发送钉钉消息 + err = WorkOrderPushDingTalkMsg(cronRedisWorkOrder.OrderName, cronRedisWorkOrder.OrderLevel, phones) + if err != nil { + zap.L().Error(err.Error()) + } + case 2: + //发送短信 + err = WorkOrderPushNoteMsg(cronRedisWorkOrder.OrderName, phones, cronRedisWorkOrder.OrderLevel) + if err != nil { + zap.L().Error(err.Error()) + } + case 3: + //发送钉钉消息 + err = WorkOrderPushDingTalkMsg(cronRedisWorkOrder.OrderName, cronRedisWorkOrder.OrderLevel, phones) + if err != nil { + zap.L().Error(err.Error()) + } + //发送短信 + err = WorkOrderPushNoteMsg(cronRedisWorkOrder.OrderName, phones, cronRedisWorkOrder.OrderLevel) + if err != nil { + zap.L().Error(err.Error()) + } + + } + //删除redis + err = redis.LRem(conf.WorkOrderPush, v) + if err != nil { + zap.L().Error(err.Error()) + } + } + } + } + }() +}