go一个代码优化示例
2026/5/9 13:16:30 网站建设 项目流程

优化后:

package traintask import ( "time" "gitea.super-study.com/ys-study/gotrain/beapi/common" "gitea.super-study.com/ys-study/gotrain/beapi/db/apiconst/planconst" "gitea.super-study.com/ys-study/gotrain/beapi/db/dbdao/plandao" "gitea.super-study.com/ys-study/gotrain/beapi/db/dbentity/planentity" "gitea.super-study.com/ys-study/gotrain/beapi/db/dbfacade/planfacade" "gitea.super-study.com/ys-study/gotrain/beapi/gotool/gobatch/batchframe" "gitea.super-study.com/ys-study/gotrain/beapi/trainframe/model" "gitea.super-study.com/ys-study/gotrain/beapi/trainframe/repository" "gitea.super-study.com/ys-study/gotrain/beapi/trainframe/service" "gitee.com/gowebframe3/webframe.git/goconfig/base/basedto" "gitee.com/gowebframe3/webframe.git/goconfig/ichublog/golog" "gitee.com/gowebframe3/webframe.git/goweb/pagemodel" "github.com/gin-gonic/gin" ) type TrainPlanTask struct { basedto.BaseEntitySingle batchframe.BatchService } func NewTrainPlanTask() *TrainPlanTask { return &TrainPlanTask{} } func (self *TrainPlanTask) QueryModelCancelOverdue() *pagemodel.PageResult[*planentity.TrainPlan] { var dao = plandao.FindBeanTrainPlanDao() now := time.Now().Add(30 * time.Minute) before := now.Add(-24 * time.Hour * 30) dao.DbIn("status", model.StatusNotInvited, model.StatusNotStarted) dao.DbBetween("end_at", before, now) dao.DbNe("type", model.TrainTypeSelfScreen) return dao.QueryModel() } func (self *TrainPlanTask) CancelOverdueFn() func() error { return func() error { golog.Stat("cancel overdue fn") // 查询超时未开始的训练课程 var ret = self.QueryModelCancelOverdue() if ret.NotExistRecord() { golog.Info("CancelOverdueFn no overtime processing train-plan exist!", time.Now()) return ret.Result2Error() } for _, plan := range ret.Data { golog.Info("取消超时未开始的训练课程 -> 课程号: , 学员ID: , 开始时间: ", plan.TrainPlanId, plan.StudentId, plan.StartdAt) user, err := repository.FindBeanrepository().User().GetUserByID(plan.StudentId) if err != nil { golog.Info("cancelOverdueTrainings failed to get user by ID ", plan.StudentId, err) continue } // 使用学员身份取消训练 ctx := &gin.Context{} common.SetUser(ctx, user) if err := service.FindBeantrainPlanService().CancelTrainPlan(ctx, plan.Id, "超时未应邀,已自动取消"); err != nil { return err } } return ret.Result2Error() } } func (self *TrainPlanTask) QueryModelAutoCloseOverdue() *pagemodel.PageResult[*planentity.TrainPlan] { var dao = plandao.FindBeanTrainPlanDao() now := time.Now().Add(-5 * time.Minute) before := now.Add(-30 * 24 * time.Hour) dao.DbIn("status", model.StatusInProgress) dao.DbBetween("end_at", before, now) dao.DbNe("type", model.TrainTypeSelfScreen) return dao.QueryModel() } func (self *TrainPlanTask) AutoCloseOverdueFn() func() error { return func() error { golog.Stat("AutoCloseOverdueFn ") var ret = self.QueryModelAutoCloseOverdue() if ret.NotExistRecord() { golog.Info("AutoCloseOverdueTrainingFn no overtime processing train-plan exist!", time.Now()) return ret.Result2Error() } for _, plan := range ret.Data { golog.Info("取消超时未开始的训练课程 -> 课程号: , 学员ID: , 开始时间: ", plan.TrainPlanId, plan.StudentId, plan.StartdAt) user, err := repository.FindBeanrepository().User().GetUserByID(plan.StudentId) if err != nil { golog.Warn("autoclose_overdue_trainings failed to get user by ID ", plan.StudentId, err) continue } // 使用学员身份取消训练 ctx := &gin.Context{} common.SetUser(ctx, user) if plan.Status == planconst.StatusInProgress { updatePlan := &model.UpdateTrainPlan{ Status: model.StatusCompleted, ID: plan.Id, Now: time.Now(), Progressing: 0, StudentId: plan.StudentId, } //err := TrainPlanService.UpdateStatus(ctx, updatedTrainPlan) ret := planfacade.FindBeanTrainPlanFacade().UpdateStatus(ctx, updatePlan) if ret.IsFailed() { golog.Warn("autoclose_overdueTrainings failed to update trainPlan'sstatus for studentID ", plan.StudentId, err) } } } return ret.Result2Error() } } func (self *TrainPlanTask) CancelOverdue() error { return self.BatchRunLocker(self.CancelOverdueFn()) } func (self *TrainPlanTask) AutoCloseOverdue() error { return self.BatchRunLocker(self.AutoCloseOverdueFn()) } func (self *TrainPlanTask) BatchTaskOverdueTrain() error { var err = self.CancelOverdue() if err != nil { golog.Error("BatchTaskOverdueTrain CancelOverdue err: ", err) } return self.AutoCloseOverdue() }
type BatchService struct { basedto.BaseEntitySingle common.BaseService } func NewBatchService() *BatchService { return &BatchService{} } func (self *BatchService) BatchRunLocker(batch func() error) error { // 用锁限制只能单个执行 lockValue := time.Now().Format("20060102150405") + "-" + strconv.Itoa(time.Now().Nanosecond()) if !database.FindBeanRedisDB().AcquireLock("cron:cancel_overdue_trainings", lockValue, time.Minute) { return fmt.Errorf("cron:cancel_overdue_trainings lock failed") } defer func() { if err := recover(); err != nil { golog.Info("recovered from panic: ", err) } database.FindBeanRedisDB().ReleaseLock("cron:cancel_overdue_trainings", lockValue) }() return batch() }

优化前

func CancelOverdueTrainings() { // 用锁限制只能单个执行 lockValue := time.Now().Format("20060102150405") + "-" + strconv.Itoa(time.Now().Nanosecond()) if !rdb.AcquireLock("cron:cancel_overdue_trainings", lockValue, time.Minute) { return } defer func() { if err := recover(); err != nil { log.Printf("recovered from panic: %v", err) } rdb.ReleaseLock("cron:cancel_overdue_trainings", lockValue) }() // 查询超时未开始的训练课程 now := time.Now() before := now.Add(-24 * time.Hour * 30) var plans []model.TrainPlan // startd_at 有索引 Repository.TrainPlan().GetDB().Model(&plans).Where("end_at between ? and ? and status in (?, ?) and type != ?", before, now, model.StatusNotInvited, model.StatusNotStarted, model.TrainTypeSelfScreen).Find(&plans) for _, plan := range plans { golog.Info("取消超时未开始的训练课程 -> 课程号: , 学员ID: , 开始时间: ", plan.TrainPlanID, plan.StudentID, plan.StartdAt) user, err := Repository.User().GetUserByID(plan.StudentID) if err != nil { golog.Info("cancelOverdueTrainings failed to get user by ID ", plan.StudentID, err) continue } // 使用学员身份取消训练 ctx := &gin.Context{} common.SetUser(ctx, user) if plan.Status == model.StatusNotInvited { TrainPlanService.CancelTrainPlan(ctx, plan.ID, "超时未应邀,已自动取消") continue } // 处理超结束时间 , 但未开始的训练课程 if now.After(plan.EndAt) { TrainPlanService.CancelTrainPlan(ctx, plan.ID, "超时未开始,已自动取消") } } }
func AutoCloseOverdueTrainings() { golog.Info("autoCloseOverdueTrainings", time.Now()) // 用锁限制只能单个执行 lockValue := time.Now().Format("20060102150405") + "-" + strconv.Itoa(time.Now().Nanosecond()) if !rdb.AcquireLock("cron:autoclose_overdue_trainings", lockValue, time.Minute) { return } defer func() { if err := recover(); err != nil { log.Printf("recovered from panic: %v", err) } rdb.ReleaseLock("cron:autoclose_overdue_trainings", lockValue) }() // 查询超时未开始的训练课程 now := time.Now().Add(24 * time.Hour) before := now.Add(-30 * 24 * time.Hour) // 7 天前 var plans []model.TrainPlan var planss []model.TrainPlan // startd_at 有索引 Repository.TrainPlan().GetDB().Model(&plans).Where("startd_at between ? and ? and status = ? and type != ?", before, now, model.StatusInProgress, model.TrainTypeSelfScreen).Find(&plans) for _, plan := range plans { log.Printf("取消超时未开始的训练课程 -> 课程号:%v, 学员ID:%v , 开始时间:%v", plan.TrainPlanID, plan.StudentID, plan.StartdAt) user, err := Repository.User().GetUserByID(plan.StudentID) if err != nil { golog.Warn("autoclose_overdue_trainings failed to get user by ID ", plan.StudentID, err) continue } // 使用学员身份取消训练 ctx := &gin.Context{} common.SetUser(ctx, user) var over = now.Sub(plan.EndAt).Minutes() > apiconst.AUTO_CLOSE_TIME_M if over && plan.Status == model.StatusInProgress { planss = append(planss, plan) updatedTrainPlan := &model.UpdateTrainPlan{ Status: model.StatusCompleted, ID: plan.ID, Now: now, Progressing: 0, StudentId: plan.StudentID, } //err := TrainPlanService.UpdateStatus(ctx, updatedTrainPlan) ret := planfacade.FindBeanTrainPlanFacade().UpdateStatus(ctx, updatedTrainPlan) if ret.IsFailed() { golog.Warn("autoclose_overdueTrainings failed to update trainPlan'sstatus for studentID ", plan.StudentID, err) } } } if len(planss) == 0 { golog.Info("autoclose_overdue_trainings no overtime processing train-plan exist!", time.Now()) } }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询