diff --git a/business/jxstore/cms/job.go b/business/jxstore/cms/job.go index 4d23875b3..26c6f120a 100644 --- a/business/jxstore/cms/job.go +++ b/business/jxstore/cms/job.go @@ -5,6 +5,7 @@ import ( "fmt" "math" "strings" + "sync" "time" "git.rosy.net.cn/jx-callback/business/jxutils/ddmsg" @@ -38,14 +39,22 @@ const ( mtwmMemberPrice = 1100 ) -var ( +type JobTimer struct { JobTimerMap map[int64]*time.Timer JobAuditTimerMap map[int64]*time.Timer + s *sync.RWMutex +} + +var ( + JobTimers = &JobTimer{} ) func init() { - JobTimerMap = make(map[int64]*time.Timer) - JobAuditTimerMap = make(map[int64]*time.Timer) + JobTimerMap := make(map[int64]*time.Timer) + JobAuditTimerMap := make(map[int64]*time.Timer) + JobTimers.JobTimerMap = JobTimerMap + JobTimers.JobAuditTimerMap = JobAuditTimerMap + JobTimers.s = new(sync.RWMutex) } func PublishJob(ctx *jxcontext.Context, jobExt *model.JobExt) (errCode string, err error) { @@ -389,7 +398,9 @@ func AcceptJob(ctx *jxcontext.Context, jobID, dropShippingDeliveryID, dropShippi } else { //任务限时完成 timer := checkLimitJobOrders(db, job, jobOrder, model.JobTimerTypeAccept) - JobTimerMap[jobOrder.JobOrderID] = timer + JobTimers.s.Lock() + JobTimers.JobTimerMap[jobOrder.JobOrderID] = timer + JobTimers.s.Unlock() } dao.Commit(db) @@ -481,40 +492,59 @@ func checkLimitJobOrders(db *dao.DaoDB, job *model.Job, jobOrder *model.JobOrder case <-timer.C: switch jobTimerType { case model.JobTimerTypeAccept: - UpdateLimitJobOrders(db, timer, job.ID, jobOrder, jobTimer) + UpdateLimitJobOrders(db, timer, job.ID, jobOrder.JobOrderID, jobTimer) case model.JobTimerTypeSubmit: - UpdateLimitAuditJobOrders(db, timer, job.ID, jobOrder, jobTimer) + UpdateLimitAuditJobOrders(db, timer, job.ID, jobOrder.JobOrderID, jobTimer) case model.JobTimerTypeDropShipping: - + UpdateDropShippingJobOrders(db, timer, job.ID, jobOrder.JobOrderID, jobTimer) } } }) return timer } -func UpdateLimitJobOrders(db *dao.DaoDB, timer *time.Timer, jobID int, jobOrder *model.JobOrder, jobTimer *model.JobTimer) { - globals.SugarLogger.Debugf("updateLimitJobOrders jobID: %v, jobOrderID: %v", jobID, jobOrder.JobOrderID) +func UpdateLimitJobOrders(db *dao.DaoDB, timer *time.Timer, jobID int, jobOrderID int64, jobTimer *model.JobTimer) { + globals.SugarLogger.Debugf("updateLimitJobOrders jobID: %v, jobOrderID: %v", jobID, jobOrderID) defer timer.Stop() - if jobOrder.Status > model.JobOrderStatusAccept { - return - } - jobOrder.Status = model.JobOrderStatusCancel - if _, err := dao.UpdateEntity(db, jobOrder, "Status"); err == nil { - jobTimer.Status = model.JobTimerStatusFinish - dao.UpdateEntity(db, jobTimer, "Status") + jobOrder := &model.JobOrder{JobOrderID: jobOrderID} + if err := dao.GetEntity(db, jobOrder, "JobOrderID"); err == nil { + if jobOrder.Status > model.JobOrderStatusAccept { + return + } + jobOrder.Status = model.JobOrderStatusCancel + if _, err := dao.UpdateEntity(db, jobOrder, "Status"); err == nil { + jobTimer.Status = model.JobTimerStatusFinish + dao.UpdateEntity(db, jobTimer, "Status") + } } } -func UpdateLimitAuditJobOrders(db *dao.DaoDB, timer *time.Timer, jobID int, jobOrder *model.JobOrder, jobTimer *model.JobTimer) { - globals.SugarLogger.Debugf("checkLimitAuditJobOrders jobID: %v, jobOrderID: %v", jobID, jobOrder.JobOrderID) +func UpdateLimitAuditJobOrders(db *dao.DaoDB, timer *time.Timer, jobID int, jobOrderID int64, jobTimer *model.JobTimer) { + globals.SugarLogger.Debugf("checkLimitAuditJobOrders jobID: %v, jobOrderID: %v", jobID, jobOrderID) defer timer.Stop() - if jobOrder.Status == model.JobOrderStatusWaitAudit { - err := AuditJob(jxcontext.AdminCtx, int(jobOrder.JobOrderID), model.JobOrderStatusAuditPass, "超时系统通过") - if err != nil { - globals.SugarLogger.Debugf("checkLimitAuditJobOrders err: %v jobID: %v, jobOrderID: %v", err, jobID, jobOrder.JobOrderID) - } else { - jobTimer.Status = model.JobTimerStatusFinish - dao.UpdateEntity(db, jobTimer, "Status") + jobOrder := &model.JobOrder{JobOrderID: jobOrderID} + if err := dao.GetEntity(db, jobOrder, "JobOrderID"); err == nil { + if jobOrder.Status == model.JobOrderStatusWaitAudit { + err := AuditJob(jxcontext.AdminCtx, int(jobOrderID), model.JobOrderStatusAuditPass, "超时系统通过") + if err != nil { + globals.SugarLogger.Debugf("checkLimitAuditJobOrders err: %v jobID: %v, jobOrderID: %v", err, jobID, jobOrderID) + } else { + jobTimer.Status = model.JobTimerStatusFinish + dao.UpdateEntity(db, jobTimer, "Status") + } + } + } +} + +func UpdateDropShippingJobOrders(db *dao.DaoDB, timer *time.Timer, jobID int, jobOrderID int64, jobTimer *model.JobTimer) { + globals.SugarLogger.Debugf("UpdateDropShippingJobOrders jobID: %v, jobOrderID: %v", jobID, jobOrderID) + defer timer.Stop() + jobOrder := &model.JobOrder{JobOrderID: jobOrderID} + job := &model.Job{} + job.ID = jobID + if err := dao.GetEntity(db, jobOrder, "JobOrderID"); err == nil { + if err := dao.GetEntity(db, job); err == nil { + } } } @@ -554,8 +584,9 @@ func SubmitJob(ctx *jxcontext.Context, jobOrder *model.JobOrder) (err error) { jobOrder2.Status = model.JobOrderStatusWaitAudit if _, err = dao.UpdateEntity(db, jobOrder2, "Imgs", "Content", "SubmitAuditAt", "Status", "UserActualPrice"); err == nil { //任务定时器停止 - if JobTimerMap[jobOrder2.JobOrderID] != nil { - JobTimerMap[jobOrder2.JobOrderID].Stop() + JobTimers.s.RLock() + if JobTimers.JobTimerMap[jobOrder2.JobOrderID] != nil { + JobTimers.JobTimerMap[jobOrder2.JobOrderID].Stop() //任务定时表状态完成 jobTimer := &model.JobTimer{ JobID: job.ID, @@ -567,6 +598,7 @@ func SubmitJob(ctx *jxcontext.Context, jobOrder *model.JobOrder) (err error) { dao.UpdateEntity(db, jobTimer, "Status") } } + JobTimers.s.RUnlock() //一件代发 var timerType int if job.JobCategoryID == model.JobCategoryIDDropShipping { @@ -576,7 +608,9 @@ func SubmitJob(ctx *jxcontext.Context, jobOrder *model.JobOrder) (err error) { } //审核定时开启 timer := checkLimitJobOrders(db, job, jobOrder2, timerType) - JobAuditTimerMap[jobOrder2.JobOrderID] = timer + JobTimers.s.Lock() + JobTimers.JobAuditTimerMap[jobOrder2.JobOrderID] = timer + JobTimers.s.Unlock() } return err } @@ -684,9 +718,11 @@ func AuditJob(ctx *jxcontext.Context, jobOrderID, status int, comment string) (e } dao.Commit(db) //任务定时器停止 - if JobAuditTimerMap[int64(jobOrderID)] != nil { - JobAuditTimerMap[int64(jobOrderID)].Stop() + JobTimers.s.RLock() + if JobTimers.JobAuditTimerMap[int64(jobOrderID)] != nil { + JobTimers.JobAuditTimerMap[int64(jobOrderID)].Stop() } + JobTimers.s.RUnlock() //任务定时表状态完成 jobTimer := &model.JobTimer{ JobID: job.ID, @@ -1148,9 +1184,9 @@ func ResetJobTimers() { case <-timer.C: switch jobTimer.Type { case model.JobTimerTypeAccept: - UpdateLimitJobOrders(db, timer, jobTimer.JobID, jobOrders[0], jobTimer) + UpdateLimitJobOrders(db, timer, jobTimer.JobID, jobOrders[0].JobOrderID, jobTimer) case model.JobTimerTypeSubmit: - UpdateLimitAuditJobOrders(db, timer, jobTimer.JobID, jobOrders[0], jobTimer) + UpdateLimitAuditJobOrders(db, timer, jobTimer.JobID, jobOrders[0].JobOrderID, jobTimer) } } })