Commit add99f25 authored by 陈子龙's avatar 陈子龙

Merge branch 'dev-czl' into dev

parents 42ba9e54 bff45d10
......@@ -64,4 +64,5 @@ const (
FinalHeartBeatUnixKey = "FinalHeartBeatUnix"
AutoExecHistory = "AutoExecHistory"
TaskExecLog = "TaskExecLog"
WorkOrderPush = "WorkOrderPush"
)
......@@ -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()))
}
......
......@@ -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点扫描当天需下发工单
}
......@@ -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())
}
}
}
}
}()
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment