package service import ( "errors" "fmt" "github.com/aliyun/alibaba-cloud-sdk-go/services/dysmsapi" json "github.com/json-iterator/go" "github.com/robfig/cron/v3" "github.com/wanghuiyt/ding" "gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/entity" "gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/vo/request" "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/constant" "gitlab.wodcloud.com/smart-operation/so-operation-api/src/pkg/beagle/jsontime" "gitlab.wodcloud.com/smart-operation/so-operation-api/src/pkg/beagle/resp" "gitlab.wodcloud.com/smart-operation/so-operation-api/src/util" "go.uber.org/zap" "strings" "time" ) type WorkOrderManageSvc struct { User entity.SystemUserInfo } // AddWorkOrderManage 新增业务工单 func (w *WorkOrderManageSvc) AddWorkOrderManage(req request.AddWorkOrderReq) (err error) { var timingWeekly, timingCustom, pushObj []byte db, err := client.GetDbClient() if err != nil { err = resp.DbConnectError.WithError(err) return } // 校验 工单名称 是否重复 has, err := db.Table("work_order_manage").Where("order_name = ?", req.OrderName).Exist() if has { err = resp.DbDataCheckError.WithError(errors.New("工单名称重复")) return } if err != nil { err = resp.DbSelectError.WithError(err) return } pushObj, err = json.Marshal(req.PushObj) if err != nil { err = resp.FAIL.WithError(err) return } workOrder := entity.WorkOrder{ OrderName: req.OrderName, OrderLevel: req.OrderLevel, OrderDesc: req.OrderDesc, PushObj: fmt.Sprintf("%s", pushObj), TimingType: req.TimingType, CreateUser: w.User.SystemAccount, CreateTime: time.Now(), UpdateUser: w.User.SystemAccount, UpdateTime: time.Now(), } if req.TimingType == 2 { timingWeekly, err = json.Marshal(req.TimingWeekly) if err != nil { err = resp.FAIL.WithError(err) return } workOrder.TimingRule = fmt.Sprintf("%s", timingWeekly) } else if req.TimingType == 3 { timingCustom, err = json.Marshal(req.TimingCustom) if err != nil { err = resp.FAIL.WithError(err) return } workOrder.TimingRule = fmt.Sprintf("%s", timingCustom) } _, err = db.Table("work_order_manage").Insert(&workOrder) if err != nil { err = resp.DbInsertError.WithError(err) return } //是否立刻下发 if req.IsPush == 1 { push := request.PushWorkOrderReq{ Id: workOrder.Id, PushObj: req.PushObj, } w.PushWorkOrderManage(push) } return } // EditWorkOrderManage 编辑业务工单管理 func (w *WorkOrderManageSvc) EditWorkOrderManage(req request.EditWorkOrderReq) (err error) { var timingWeekly, timingCustom, pushObj []byte db, err := client.GetDbClient() if err != nil { err = resp.DbConnectError.WithError(err) return } pushObj, err = json.Marshal(req.PushObj) if err != nil { err = resp.FAIL.WithError(err) return } workOrder := entity.WorkOrder{ OrderLevel: req.OrderLevel, OrderDesc: req.OrderDesc, PushObj: fmt.Sprintf("%s", pushObj), TimingType: req.TimingType, UpdateUser: w.User.SystemAccount, UpdateTime: time.Now(), } if req.TimingType == 2 { timingWeekly, err = json.Marshal(req.TimingWeekly) if err != nil { err = resp.FAIL.WithError(err) return } workOrder.TimingRule = fmt.Sprintf("%s", timingWeekly) } else if req.TimingType == 3 { timingCustom, err = json.Marshal(req.TimingCustom) if err != nil { err = resp.FAIL.WithError(err) return } workOrder.TimingRule = fmt.Sprintf("%s", timingCustom) } _, err = db.Table("work_order_manage").Where("id = ?", req.Id). Cols("order_level,order_desc,order_cnt,push_obj,timing_type,timing_rule").Update(&workOrder) if err != nil { err = resp.DbUpdateError.WithError(err) return } //是否立刻下发 if req.IsPush == 1 { push := request.PushWorkOrderReq{ Id: req.Id, PushObj: req.PushObj, } w.PushWorkOrderManage(push) } return } // StateWorkOrderManage 编辑业务工单管理 func (w *WorkOrderManageSvc) StateWorkOrderManage(req request.StateWorkOrderReq) (err error) { db, err := client.GetDbClient() if err != nil { err = resp.DbConnectError.WithError(err) return } _, err = db.Table("work_order_manage").Where("id = ?", req.Id). Cols("timing_state").Update(&entity.WorkOrder{TimingState: req.TimingState}) if err != nil { err = resp.DbUpdateError.WithError(err) return } if req.TimingState == 1 { //创建定时任务 CronPushWorkOrder() } return } // DelWorkOrderManage 删除 func (w *WorkOrderManageSvc) DelWorkOrderManage(req request.DelWorkOrderReq) (err error) { db, err := client.GetDbClient() if err != nil { err = resp.DbConnectError.WithError(err) return } _, err = db.Table("work_order_manage").In("id", req.Id).Delete(&entity.WorkOrder{}) if err != nil { err = resp.DbDeleteError.WithError(err) return } return } // DetailsWorkOrderManage 详情 func (w *WorkOrderManageSvc) DetailsWorkOrderManage(id int) (workOrderRes response.WorkOrderRes, err error) { db, err := client.GetDbClient() if err != nil { err = resp.DbConnectError.WithError(err) return } //查询任务详情 var workOrder entity.WorkOrder finder := db.Table("work_order_manage").Where("id = ?", id) has, err := finder.Get(&workOrder) if err != nil { err = resp.DbSelectError.WithError(err) return } if !has { err = resp.DbSelectError.WithError(errors.New("查询为空")) return } err = json.Unmarshal([]byte(workOrder.PushObj), &workOrderRes.PushObj) if err != nil { err = resp.FAIL.WithError(err) return } if workOrder.TimingType == 2 { var timingWeekly request.TimingWeekly err = json.Unmarshal([]byte(workOrder.TimingRule), &timingWeekly) if err != nil { err = resp.FAIL.WithError(err) return } workOrderRes.TimingRule = timingWeekly } else if workOrder.TimingType == 3 { var timingCustom []request.TimingCustom err = json.Unmarshal([]byte(workOrder.TimingRule), &timingCustom) if err != nil { err = resp.FAIL.WithError(err) return } workOrderRes.TimingRule = timingCustom } workOrderRes.Id = workOrder.Id workOrderRes.OrderName = workOrder.OrderName workOrderRes.OrderLevel = workOrder.OrderLevel workOrderRes.OrderDesc = workOrder.OrderDesc workOrderRes.TimingState = workOrder.TimingState workOrderRes.TimingType = workOrder.TimingType workOrderRes.CreateUser = workOrder.CreateUser workOrderRes.CreateTime = workOrder.CreateTime workOrderRes.UpdateUser = workOrder.UpdateUser workOrderRes.UpdateUser = workOrder.UpdateUser workOrderRes.UpdateTime = workOrder.UpdateTime return } // ListWorkOrderManage 列表 func (w *WorkOrderManageSvc) ListWorkOrderManage(req request.ListWorkOrderManageReq) (total int64, workOrderListRes []response.WorkOrderListRes, err error) { db, err := client.GetDbClient() if err != nil { err = resp.DbConnectError.WithError(err) return } finder := db.Table("work_order_manage") if req.Search != "" { finder.Where(fmt.Sprintf("order_name LIKE '%s'", "%"+req.Search+"%")) } if req.OrderLevel != 0 { finder.Where("order_level = ?", req.OrderLevel) } if req.TimingType != 0 { finder.Where("timing_type = ?", req.TimingType) } if req.CreateDateFrom != "" { finder.Where("create_time >= ?", req.CreateDateFrom) } if req.CreateDateTo != "" { finder.Where("create_time <= ?", req.CreateDateTo) } finder.OrderBy("create_time desc") //查询任务 total, err = finder.Select("id,order_name,order_level,order_cnt,push_obj,timing_type,timing_state,create_user,create_time"). Limit(req.PageSize, (req.Page-1)*req.PageSize).FindAndCount(&workOrderListRes) if err != nil { err = resp.DbSelectError.WithError(err) return } for k, v := range workOrderListRes { var pushObj request.PushObj err = json.Unmarshal([]byte(v.PushObj), &pushObj) if err != nil { err = resp.FAIL.WithError(err) return } workOrderListRes[k].PushObj = pushObj.UserObj[0].UserName for i := 1; i < len(pushObj.UserObj); i++ { workOrderListRes[k].PushObj = workOrderListRes[k].PushObj + "、" + pushObj.UserObj[i].UserName } } return } // PushWorkOrderManage 手动下发 func (w *WorkOrderManageSvc) PushWorkOrderManage(req request.PushWorkOrderReq) (err error) { db, err := client.GetDbClient() if err != nil { err = resp.DbConnectError.WithError(err) return } session := db.NewSession() defer session.Close() session.Begin() var workOrder entity.WorkOrder _, err = session.Table("work_order_manage").Where("id = ?", req.Id).Get(&workOrder) if err != nil { err = resp.FAIL.WithError(err) return } pushObj, err := json.Marshal(req.PushObj) if err != nil { err = resp.FAIL.WithError(err) return } //新增 下发工单表 数据 workOrderIssuance := entity.WorkOrderIssuance{ OrderId: req.Id, PushObj: fmt.Sprintf("%s", pushObj), OrderState: 1, CreateUser: w.User.SystemAccount, CreateTime: time.Now(), } _, err = session.Table("work_order_issuance").Insert(&workOrderIssuance) if err != nil { err = resp.DbInsertError.WithError(err) session.Rollback() return } for _, v := range req.PushObj.UserObj { //新增 个人业务工单表 数据 workOrderMe := entity.WorkOrderMe{ OrderId: req.Id, OrderIssuanceId: workOrderIssuance.Id, SystemAccount: v.SystemAccount, OrderState: 1, } _, err = session.Table("work_order_me").Insert(&workOrderMe) if err != nil { err = resp.DbInsertError.WithError(err) session.Rollback() return } } //修改库表实例工单数 _, err = session.Table("work_order_manage").Where("id = ?", req.Id).Incr("order_cnt").Update(&entity.WorkOrder{}) if err != nil { err = resp.DbUpdateError.WithError(err) session.Rollback() return } var phones []string for _, v := range req.PushObj.UserObj { phones = append(phones, v.Phone) } switch req.PushObj.PushMethod { case 1: //发送钉钉消息 err = WorkOrderPushDingTalkMsg(workOrder.OrderName, workOrder.OrderLevel, phones) if err != nil { session.Rollback() return } case 2: //发送短信 err = WorkOrderPushNoteMsg(workOrder.OrderName, phones, workOrder.OrderLevel) if err != nil { session.Rollback() return } case 3: //发送钉钉消息 err = WorkOrderPushDingTalkMsg(workOrder.OrderName, workOrder.OrderLevel, phones) if err != nil { session.Rollback() return } //发送短信 err = WorkOrderPushNoteMsg(workOrder.OrderName, phones, workOrder.OrderLevel) if err != nil { session.Rollback() return } } session.Commit() return } // CloseWorkOrderIssuance 关闭工单 func (w *WorkOrderManageSvc) CloseWorkOrderIssuance(req request.CloseWorkOrderReq) (err error) { db, err := client.GetDbClient() if err != nil { err = resp.DbConnectError.WithError(err) return } session := db.NewSession() defer session.Close() session.Begin() //修改 下发工单表 数据 _, err = session.Table("work_order_issuance").Where("id = ?", req.Id).Cols("order_state,reason_closure"). Update(&entity.WorkOrderIssuance{ OrderState: 3, ReasonClosure: req.ReasonClosure, }) if err != nil { err = resp.DbInsertError.WithError(err) session.Rollback() return } //修改 个人业务工单表 数据 _, err = session.Table("work_order_me").Where("order_issuance_id = ?", req.Id).Cols("order_state"). Update(&entity.WorkOrderMe{ OrderState: 3, }) if err != nil { err = resp.DbInsertError.WithError(err) session.Rollback() return } session.Commit() return } // ListWorkOrderIssuance 业务工单下发列表 func (w *WorkOrderManageSvc) ListWorkOrderIssuance(req request.ListWorkOrderReq) (total int64, workOrderIssuanceListRes []response.WorkOrderIssuanceListRes, err error) { db, err := client.GetDbClient() if err != nil { err = resp.DbConnectError.WithError(err) return } finder := db.Table("work_order_issuance").Alias("woi"). Join("INNER", "work_order_manage wom", "woi.order_id = wom.id") if req.Search != "" { finder.Where(fmt.Sprintf("wom.order_name LIKE '%s'", "%"+req.Search+"%")) } if req.OrderLevel != 0 { finder.Where("wom.order_level = ?", req.OrderLevel) } if req.OrderState != 0 { finder.Where("woi.order_state = ?", req.OrderState) } if req.CreateDateFrom != "" { finder.Where("woi.create_time >= ?", req.CreateDateFrom) } if req.CreateDateTo != "" { finder.Where("woi.create_time <= ?", req.CreateDateTo) } if req.CompleteTimeFrom != "" { finder.Where("woi.complete_time >= ?", req.CompleteTimeFrom) } if req.CompleteTimeTo != "" { finder.Where("woi.complete_time <= ?", req.CompleteTimeTo) } if req.Id != 0 { finder.Where("wom.id = ?", req.Id) } finder.OrderBy("woi.create_time desc") //查询任务 total, err = finder.Select("woi.\"id\",woi.order_id,wom.order_name,wom.order_level,woi.order_state,woi.push_obj,woi.create_user,woi.create_time,woi.complete_time,"+ "(select count(1) from work_order_me wome where wome.order_issuance_id = woi.id and wome.order_state = woi.order_state) as state_cnt,"+ "(select count(1) from work_order_me wome where wome.order_issuance_id = woi.id) as all_cnt"). Limit(req.PageSize, (req.Page-1)*req.PageSize).FindAndCount(&workOrderIssuanceListRes) if err != nil { err = resp.DbSelectError.WithError(err) return } for k, v := range workOrderIssuanceListRes { var pushObj request.PushObj err = json.Unmarshal([]byte(v.PushObj), &pushObj) if err != nil { err = resp.FAIL.WithError(err) return } workOrderIssuanceListRes[k].PushObj = pushObj.UserObj[0].UserName for i := 1; i < len(pushObj.UserObj); i++ { workOrderIssuanceListRes[k].PushObj = workOrderIssuanceListRes[k].PushObj + "、" + pushObj.UserObj[i].UserName } } return } // DetailsWorkOrderIssuance 业务工单下发详情 func (w *WorkOrderManageSvc) DetailsWorkOrderIssuance(id int) (workOrderIssuanceRes response.WorkOrderIssuanceRes, err error) { db, err := client.GetDbClient() if err != nil { err = resp.DbConnectError.WithError(err) return } var workOrderIssuance response.WorkOrderIssuance finder := db.Table("work_order_issuance").Alias("woi"). Join("INNER", "work_order_manage wom", "woi.order_id = wom.ID").Where("woi.id = ?", id) has, err := finder.Select("woi.\"id\",woi.order_id,wom.order_name,wom.order_level,wom.order_desc,woi.order_state,woi.push_obj,woi.create_user,woi.create_time,woi.complete_time"). Get(&workOrderIssuance) if err != nil { err = resp.DbSelectError.WithError(err) return } if !has { return } //var workOrderMe entity.WorkOrderMe finder1 := db.Table("work_order_me").Where("order_issuance_id = ?", id) err = finder1.Find(&workOrderIssuanceRes.WorkOrderMe) if err != nil { err = resp.DbSelectError.WithError(err) return } err = json.Unmarshal([]byte(workOrderIssuance.PushObj), &workOrderIssuanceRes.PushObj) if err != nil { err = resp.FAIL.WithError(err) return } workOrderIssuanceRes.Id = workOrderIssuance.Id workOrderIssuanceRes.OrderId = workOrderIssuance.OrderId workOrderIssuanceRes.OrderName = workOrderIssuance.OrderName workOrderIssuanceRes.OrderLevel = workOrderIssuance.OrderLevel workOrderIssuanceRes.OrderDesc = workOrderIssuance.OrderDesc workOrderIssuanceRes.OrderState = workOrderIssuance.OrderState workOrderIssuanceRes.CreateUser = workOrderIssuance.CreateUser workOrderIssuanceRes.CreateTime = workOrderIssuance.CreateTime workOrderIssuanceRes.CompleteTime = workOrderIssuance.CompleteTime return } // FeedbackWorkOrderMe 处置反馈 func (w *WorkOrderManageSvc) FeedbackWorkOrderMe(req request.FeedbackWorkOrderReq) (err error) { db, err := client.GetDbClient() if err != nil { err = resp.DbConnectError.WithError(err) return } session := db.NewSession() defer session.Close() session.Begin() completeTime := time.Now() //修改 个人业务工单表 数据 _, err = session.Table("work_order_me").Where("id = ?", req.Id).Cols("order_state,result_feedback,complete_time"). Update(&entity.WorkOrderMe{ OrderState: 2, ResultFeedback: req.ResultFeedback, CompleteTime: completeTime, }) if err != nil { err = resp.DbInsertError.WithError(err) session.Rollback() return } //查询此工单是否已完成 has, err := session.Table("work_order_me").Where("order_state = 1 AND order_issuance_id = ?", req.OrderIssuanceId).Exist() if !has { //修改 下发工单 数据 _, err = session.Table("work_order_issuance").Where("id = ?", req.OrderIssuanceId).Cols("order_state,complete_time"). Update(&entity.WorkOrderIssuance{ OrderState: 2, CompleteTime: completeTime, }) if err != nil { err = resp.DbInsertError.WithError(err) session.Rollback() return } } if err != nil { err = resp.DbSelectError.WithError(err) session.Rollback() return } session.Commit() return } // ListWorkOrderMe 我的业务工单列表 func (w *WorkOrderManageSvc) ListWorkOrderMe(req request.ListWorkOrderReq) (total int64, workOrderMeListRes []response.WorkOrderMeListRes, err error) { db, err := client.GetDbClient() if err != nil { err = resp.DbConnectError.WithError(err) return } finder := db.Table("work_order_me").Alias("wome"). Join("INNER", "work_order_issuance woi", "wome.order_issuance_id = woi.id"). Join("INNER", "work_order_manage wom", "woi.order_id = wom.id") finder.Where("wome.system_account = ?", w.User.SystemAccount) if req.Search != "" { finder.Where(fmt.Sprintf("wom.order_name LIKE '%s'", "%"+req.Search+"%")) } if req.OrderLevel != 0 { finder.Where("wom.order_level = ?", req.OrderLevel) } if req.OrderState != 0 { finder.Where("wome.order_state = ?", req.OrderState) } if req.CreateDateFrom != "" { finder.Where("woi.create_time >= ?", req.CreateDateFrom) } if req.CreateDateTo != "" { finder.Where("woi.create_time <= ?", req.CreateDateTo) } if req.CompleteTimeFrom != "" { finder.Where("wome.complete_time >= ?", req.CompleteTimeFrom) } if req.CompleteTimeTo != "" { finder.Where("wome.complete_time <= ?", req.CompleteTimeTo) } finder.OrderBy("woi.create_time desc") //查询任务 total, err = finder.Select("wome.\"id\",wome.order_id,wome.order_issuance_id,wom.order_name,wom.order_level,"+ "wome.order_state,woi.push_obj,woi.create_user,woi.create_time,wome.complete_time"). Limit(req.PageSize, (req.Page-1)*req.PageSize).FindAndCount(&workOrderMeListRes) if err != nil { err = resp.DbSelectError.WithError(err) return } for k, v := range workOrderMeListRes { var pushObj request.PushObj err = json.Unmarshal([]byte(v.PushObj), &pushObj) if err != nil { err = resp.FAIL.WithError(err) return } workOrderMeListRes[k].PushObj = pushObj.UserObj[0].UserName for i := 1; i < len(pushObj.UserObj); i++ { workOrderMeListRes[k].PushObj = workOrderMeListRes[k].PushObj + "、" + pushObj.UserObj[i].UserName } } return } // WorkOrderPushDingTalkMsg 推送钉钉消息 func WorkOrderPushDingTalkMsg(orderName string, orderLevel int, phones []string) (err error) { d := ding.Webhook{ AccessToken: conf.Options.OrderDingTalkAccessToken, //"203fe1644b446bba0a34e6e622c523d39ee9916fdad94b9c64224449f659e20b", Secret: conf.Options.OrderDingTalkSecret, //"SECa73d8372e336451c9daf29a99f750ee1bdd170c1dab910eab9cd06d729a831b7", } var orderLevels string switch orderLevel { case 1: orderLevels = "紧急任务" case 2: orderLevels = "重要任务" case 3: orderLevels = "一般任务" } //有一条工单需要您处理:工单类型:【业务工单】 工单名称:【$工单名称】 工单等级:【$工单等级】 err = d.SendMessageText("您有一条业务工单需要处理:工单名称:"+orderName+",工单等级:"+orderLevels+",请及时前往智能运维平台处理!", phones...) if err != nil { err = resp.FAIL.ErrorDetail(err) return } return } // WorkOrderPushNoteMsg 推送工单短信消息 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)) err = resp.FAIL.ErrorDetail(err) return } var orderLevels string switch orderLevel { case 1: orderLevels = "紧急任务" case 2: orderLevels = "重要任务" case 3: orderLevels = "一般任务" } tickettype := "业务工单" params := map[string]interface{}{"tickettype": tickettype, "ticketname": orderName, "ticketlevel": orderLevels} templateParam, err := json.Marshal(params) if err != nil { conf.Logger.Error("序列化模板失败!", zap.Error(err)) err = resp.FAIL.ErrorDetail(err) return } request := dysmsapi.CreateSendSmsRequest() request.Scheme = "https" request.PhoneNumbers = strings.Join(phone, ",") request.TemplateCode = conf.Options.SmsWorkOrderTemplate request.SignName = conf.Options.SmsSignName request.TemplateParam = string(templateParam) req, err := smsClient.SendSms(request) if err != nil { err = resp.FAIL.ErrorDetail(err) return } fmt.Printf("response is %#v\n", req) return } // PushObjMsg 解析用户并推送消息 func PushObjMsg(obj, orderName string, orderLevel int) (err error) { var pushObj request.PushObj err = json.Unmarshal([]byte(obj), &pushObj) if err != nil { return } var phones []string for _, v := range pushObj.UserObj { phones = append(phones, v.Phone) } switch pushObj.PushMethod { case 1: //发送钉钉消息 err = WorkOrderPushDingTalkMsg(orderName, orderLevel, phones) if err != nil { return } case 2: //发送短信 err = WorkOrderPushNoteMsg(orderName, phones, orderLevel) if err != nil { return } case 3: //发送钉钉消息 err = WorkOrderPushDingTalkMsg(orderName, orderLevel, phones) if err != nil { return } //发送短信 err = WorkOrderPushNoteMsg(orderName, phones, orderLevel) if err != nil { return } } conf.Logger.Info("定时下发工单完成,工单名称:" + orderName) return } var c = cron.New(cron.WithSeconds()) // CronPushWorkOrder 创建工单下发定时任务 func CronPushWorkOrder() { db, err := client.GetDbClient() if err != nil { conf.Logger.Error("获取数据库连接", zap.Error(err)) return } //查询推送工单 workOrderList := make([]entity.WorkOrder, 0) finder := db.Table("work_order_manage").Where("timing_state = ? AND (timing_type = ? "+ "OR timing_type = ?)", constant.TimingClick, constant.TimingWeekly, constant.TimingCustom) err = finder.Find(&workOrderList) if err != nil { conf.Logger.Error("查询推送工单", zap.Error(err)) return } c.Stop() defer c.Start() for _, v := range workOrderList { var pushObj request.PushObj err = json.Unmarshal([]byte(v.PushObj), &pushObj) if err != nil { return } svc := WorkOrderManageSvc{User: entity.SystemUserInfo{SystemAccount: v.CreateUser}} if v.TimingType == constant.TimingWeekly { var timingWeekly request.TimingWeekly err = json.Unmarshal([]byte(v.TimingRule), &timingWeekly) if err != nil { conf.Logger.Error("反序列化定时规则", zap.Error(err)) continue } for k, v1 := range timingWeekly.Week { if v1 == 7 { timingWeekly.Week[k] = 0 } } t, err := time.Parse(jsontime.LocalTimeFormat, timingWeekly.PointTime) if err != nil { conf.Logger.Error("时间点类型转换错误", zap.Error(err)) continue } expr := fmt.Sprintf("%d %d %d * * %s", t.Second(), t.Minute(), t.Hour(), strings.Join(util.IntsToStrings(timingWeekly.Week), ",")) //创建定时任务 c.AddFunc(expr, func() { err = svc.PushWorkOrderManage(request.PushWorkOrderReq{Id: v.Id, PushObj: pushObj}) //err = PushObjMsg(v.PushObj, v.OrderName, v.OrderLevel) if err != nil { conf.Logger.Error("发送定时消息失败", zap.Error(err)) } }) } else { var timingCustom request.TimingCustom err = json.Unmarshal([]byte(v.TimingRule), &timingCustom) if err != nil { conf.Logger.Error("反序列化定时规则", zap.Error(err)) continue } dateFrom, err := time.Parse(jsontime.LocalDateFormat, timingCustom.DateFrom) if err != nil { conf.Logger.Error("时间类型转换错误", zap.Error(err)) continue } dateTo, err := time.Parse(jsontime.LocalDateFormat, timingCustom.DateTo) if err != nil { conf.Logger.Error("时间类型转换错误", zap.Error(err)) continue } t, err := time.Parse(jsontime.LocalDateFormat, timingCustom.PointTime) if err != nil { conf.Logger.Error("时间点类型转换错误", zap.Error(err)) continue } for d := dateFrom; d.Before(dateTo); d = d.AddDate(0, 0, 1) { expr := fmt.Sprintf("%d %d %d %d %d %d", t.Second(), t.Minute(), t.Hour(), d.Day(), d.Month(), d.Year()) //创建定时任务 c.AddFunc(expr, func() { err = svc.PushWorkOrderManage(request.PushWorkOrderReq{Id: v.Id, PushObj: pushObj}) //err = PushObjMsg(v.PushObj, v.OrderName, v.OrderLevel) if err != nil { conf.Logger.Error("发送定时消息失败", zap.Error(err)) } }) } } } }