From 64ee822347938b106b033deb8cdfff37b4adcf6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=85=89=E6=98=A5?= Date: Sat, 11 Jun 2022 13:46:24 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E6=9B=B4=E6=96=B0=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 4 ++ go.mod | 7 +- go.sum | 18 +++-- jobs_gorm.go | 31 ++++++-- jobs_gorm/check_task.go | 19 +++++ jobs_gorm/const.go | 70 +++++++++++++++++++ jobs_gorm/const_test.go | 18 +++++ jobs_gorm/ip.go | 19 +++++ jobs_gorm/jobs_gorm.go | 18 +++++ jobs_gorm/lock.go | 35 ++++++++++ .../task.go => jobs_gorm/model_task.go | 51 +++++++++++++- jobs_gorm/model_task_ip.go | 64 +++++++++++++++++ .../model_task_log.go | 4 +- .../model_task_log_run.go | 12 +++- jobs_gorm/params.go | 29 ++++++++ jobs_gorm/type.go | 25 +++++++ jobs_gorm_model/task_ip.go | 12 ---- version.go | 2 +- 18 files changed, 409 insertions(+), 29 deletions(-) create mode 100644 jobs_gorm/check_task.go create mode 100644 jobs_gorm/const.go create mode 100644 jobs_gorm/const_test.go create mode 100644 jobs_gorm/ip.go create mode 100644 jobs_gorm/jobs_gorm.go create mode 100644 jobs_gorm/lock.go rename jobs_gorm_model/task.go => jobs_gorm/model_task.go (51%) create mode 100644 jobs_gorm/model_task_ip.go rename jobs_gorm_model/task_log.go => jobs_gorm/model_task_log.go (84%) rename jobs_gorm_model/task_log_run.go => jobs_gorm/model_task_log_run.go (72%) create mode 100644 jobs_gorm/params.go create mode 100644 jobs_gorm/type.go delete mode 100644 jobs_gorm_model/task_ip.go diff --git a/CHANGELOG.md b/CHANGELOG.md index eb8fd75..72594cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## v1.0.18 + +- 更新任务 + ## v1.0.17 - 优化任务 diff --git a/go.mod b/go.mod index 961a614..68c55b9 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,10 @@ require ( gitee.com/chunanyong/zorm v1.5.5 github.com/beego/beego/v2 v2.0.3 github.com/robfig/cron/v3 v3.0.1 + go.dtapp.net/goarray v1.0.0 go.dtapp.net/goip v1.0.17 + go.dtapp.net/goredis v1.0.0 + go.dtapp.net/gotime v1.0.2 go.dtapp.net/gouuid v1.0.0 go.etcd.io/etcd/api/v3 v3.5.4 go.etcd.io/etcd/client/v3 v3.5.4 @@ -17,8 +20,11 @@ require ( ) require ( + github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/coreos/go-semver v0.3.0 // indirect github.com/coreos/go-systemd/v22 v22.3.2 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/go-redis/redis/v8 v8.11.5 // indirect github.com/goccy/go-json v0.9.7 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.2 // indirect @@ -37,7 +43,6 @@ require ( github.com/ulikunitz/xz v0.5.10 // indirect go.dtapp.net/gorequest v1.0.19 // indirect go.dtapp.net/gostring v1.0.3 // indirect - go.dtapp.net/gotime v1.0.2 // indirect go.etcd.io/etcd/client/pkg/v3 v3.5.4 // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.8.0 // indirect diff --git a/go.sum b/go.sum index eaf3f49..74cdd39 100644 --- a/go.sum +++ b/go.sum @@ -39,6 +39,8 @@ github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= @@ -66,6 +68,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/denisenkom/go-mssqldb v0.10.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= @@ -84,6 +88,7 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= @@ -92,6 +97,8 @@ github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vb github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= +github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= @@ -181,7 +188,6 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= @@ -313,14 +319,15 @@ github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzE github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= @@ -429,8 +436,12 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= +go.dtapp.net/goarray v1.0.0 h1:M2oopyC290j7HGkrhUxJB5w+a7fmPgGU5Q0CHYaNB8k= +go.dtapp.net/goarray v1.0.0/go.mod h1:/MPhlFCAhQyeNV1M0v1PAOOX33Sg705fVjUgMO12IBQ= go.dtapp.net/goip v1.0.17 h1:xkUSTwMNjx1uc4MCs6vmSmiDNlcFNlCTA1tqrM9fmAY= go.dtapp.net/goip v1.0.17/go.mod h1:VrFnytj/KJH81m7Hx43mekbqJvsHbiNOS1Ikm2XaFFw= +go.dtapp.net/goredis v1.0.0 h1:IvoOvdPeQlT2UR6lbumr+zN0x7ikTz9ro7od7jydD2U= +go.dtapp.net/goredis v1.0.0/go.mod h1:Wmrgb5yfbV7SiIK0NLdBOFWKnrQs+5g8p3t5+cjQkMM= go.dtapp.net/gorequest v1.0.19 h1:ZBkXb/oD59aChfzHfReK6M3M4eu3dwpaPTefe1c8P90= go.dtapp.net/gorequest v1.0.19/go.mod h1:EwOfdfxsWPszOWrphCWHTN4DbYtU6fyQ/fuWQyQwSnk= go.dtapp.net/gostring v1.0.3 h1:KSOq4D77/g5yZN/bqWfZ0kOOaPr/P1240vg03+XdENI= @@ -668,7 +679,6 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= diff --git a/jobs_gorm.go b/jobs_gorm.go index b003f30..ab005e0 100644 --- a/jobs_gorm.go +++ b/jobs_gorm.go @@ -1,15 +1,34 @@ package gojobs -import "gorm.io/gorm" +import ( + "go.dtapp.net/goarray" + "go.dtapp.net/goip" + "go.dtapp.net/gojobs/jobs_gorm" + "go.dtapp.net/goredis" + "gorm.io/gorm" + "runtime" +) -type JobsGorm struct { - Db *gorm.DB +type ConfigJobsGorm struct { + MainService int // 主要服务 + Db *gorm.DB // 数据库 + Redis goredis.App // 缓存数据库服务 } -func NewJobsGorm(db *gorm.DB) *JobsGorm { +func NewJobsGorm(config *ConfigJobsGorm) *jobs_gorm.JobsGorm { var ( - jobsGorm = &JobsGorm{} + jobsGorm = &jobs_gorm.JobsGorm{} ) - jobsGorm.Db = db + jobsGorm.RunVersion = Version + jobsGorm.Os = runtime.GOOS + jobsGorm.Arch = runtime.GOARCH + jobsGorm.MaxProCs = runtime.GOMAXPROCS(0) + jobsGorm.Version = runtime.Version() + jobsGorm.MacAddrS = goarray.TurnString(goip.GetMacAddr()) + jobsGorm.InsideIp = goip.GetInsideIp() + jobsGorm.OutsideIp = goip.GetOutsideIp() + jobsGorm.MainService = config.MainService + jobsGorm.Db = config.Db + jobsGorm.Redis = config.Redis return jobsGorm } diff --git a/jobs_gorm/check_task.go b/jobs_gorm/check_task.go new file mode 100644 index 0000000..7307dfd --- /dev/null +++ b/jobs_gorm/check_task.go @@ -0,0 +1,19 @@ +package jobs_gorm + +import ( + "go.dtapp.net/gotime" + "gorm.io/gorm" + "log" +) + +func (jobsGorm *JobsGorm) Check(tx *gorm.DB, vs []Task) { + if jobsGorm.MainService > 0 && len(vs) > 0 { + for _, v := range vs { + diffInSecondWithAbs := gotime.Current().DiffInSecondWithAbs(gotime.SetCurrentParse(v.UpdatedAt).Time) + if diffInSecondWithAbs >= v.Frequency*3 { + log.Printf("每隔%v秒任务:%v相差%v秒\n", v.Frequency, v.Id, diffInSecondWithAbs) + tx.Where("task_id = ?", v.Id).Where("run_id = ?", v.RunId).Delete(&TaskLogRun{}) // 删除 + } + } + } +} diff --git a/jobs_gorm/const.go b/jobs_gorm/const.go new file mode 100644 index 0000000..9db92cf --- /dev/null +++ b/jobs_gorm/const.go @@ -0,0 +1,70 @@ +package jobs_gorm + +import ( + "fmt" + "net/http" +) + +const ( + CodeAbnormal = 0 // 异常 + CodeError = http.StatusInternalServerError // 失败 + CodeSuccess = http.StatusOK // 成功 + CodeEnd = http.StatusCreated // 结束 +) + +// 每隔n秒执行一次 +const specSeconds = "*/%d * * * * *" + +// GetSpecSeconds 每隔n秒执行一次 +var GetSpecSeconds = func(n int64) string { + if n < 0 && n > 59 { + return "" + } + return fmt.Sprintf(specSeconds, n) +} + +// GetFrequencySeconds 每隔n秒执行一次 +var GetFrequencySeconds = func(n int64) int64 { + if n < 0 && n > 59 { + return -1 + } + return n +} + +// 每隔n分钟执行一次 +const specMinutes = "0 */%d * * * *" + +// GetSpecMinutes 每隔n分钟执行一次 +var GetSpecMinutes = func(n int64) string { + if n < 0 && n > 59 { + return "" + } + return fmt.Sprintf(specMinutes, n) +} + +// GetFrequencyMinutes 每隔n分钟执行一次 +var GetFrequencyMinutes = func(n int64) int64 { + if n < 0 && n > 59 { + return -1 + } + return n * 60 +} + +// 每天n点执行一次 +const specHour = "0 0 */%d * * *" + +// GetSpecHour 每天n点执行一次 +var GetSpecHour = func(n int64) string { + if n < 0 && n > 23 { + return "" + } + return fmt.Sprintf(specHour, n) +} + +// GetFrequencyHour 每天n点执行一次 +var GetFrequencyHour = func(n int64) int64 { + if n < 0 && n > 23 { + return -1 + } + return n * 60 * 60 +} diff --git a/jobs_gorm/const_test.go b/jobs_gorm/const_test.go new file mode 100644 index 0000000..b42935f --- /dev/null +++ b/jobs_gorm/const_test.go @@ -0,0 +1,18 @@ +package jobs_gorm + +import "testing" + +func TestSpec(t *testing.T) { + t.Log(GetSpecSeconds(10)) + t.Log(GetFrequencySeconds(10)) + + t.Log(GetSpecMinutes(1)) + t.Log(GetFrequencyMinutes(1)) + t.Log(GetSpecMinutes(10)) + t.Log(GetFrequencyMinutes(10)) + t.Log(GetSpecMinutes(30)) + t.Log(GetFrequencyMinutes(30)) + + t.Log(GetSpecHour(10)) + t.Log(GetFrequencyHour(10)) +} diff --git a/jobs_gorm/ip.go b/jobs_gorm/ip.go new file mode 100644 index 0000000..5c7f9d2 --- /dev/null +++ b/jobs_gorm/ip.go @@ -0,0 +1,19 @@ +package jobs_gorm + +import ( + "go.dtapp.net/goip" + "gorm.io/gorm" +) + +// RefreshIp 刷新Ip +func (jobsGorm *JobsGorm) RefreshIp(tx *gorm.DB) { + xip := goip.GetOutsideIp() + if jobsGorm.OutsideIp == "" || jobsGorm.OutsideIp == "0.0.0.0" { + return + } + if jobsGorm.OutsideIp == xip { + return + } + tx.Where("ips = ?", jobsGorm.OutsideIp).Delete(&TaskIp{}) // 删除 + jobsGorm.OutsideIp = xip +} diff --git a/jobs_gorm/jobs_gorm.go b/jobs_gorm/jobs_gorm.go new file mode 100644 index 0000000..ebe201c --- /dev/null +++ b/jobs_gorm/jobs_gorm.go @@ -0,0 +1,18 @@ +package jobs_gorm + +import "gorm.io/gorm" +import "go.dtapp.net/goredis" + +type JobsGorm struct { + RunVersion string // 运行版本 + Os string // 系统类型 + Arch string // 系统架构 + MaxProCs int // CPU核数 + Version string // GO版本 + MacAddrS string // Mac地址 + InsideIp string // 内网ip + OutsideIp string // 外网ip + MainService int // 主要服务 + Db *gorm.DB // 数据库 + Redis goredis.App // 缓存数据库服务 +} diff --git a/jobs_gorm/lock.go b/jobs_gorm/lock.go new file mode 100644 index 0000000..63e311e --- /dev/null +++ b/jobs_gorm/lock.go @@ -0,0 +1,35 @@ +package jobs_gorm + +import ( + "fmt" + "go.dtapp.net/goredis" + "time" +) + +// Lock 上锁 +func (jobsGorm *JobsGorm) Lock(info Task, id any) string { + cacheName := fmt.Sprintf("cron:%v:%v", info.Type, id) + judgeCache := jobsGorm.Redis.NewStringOperation().Get(cacheName).UnwrapOr("") + if judgeCache != "" { + return judgeCache + } + jobsGorm.Redis.NewStringOperation().Set(cacheName, fmt.Sprintf("已在%v机器上锁成功", jobsGorm.OutsideIp), goredis.WithExpire(time.Millisecond*time.Duration(info.Frequency)*3)) + return "" +} + +// Unlock Lock 解锁 +func (jobsGorm *JobsGorm) Unlock(info Task, id any) { + cacheName := fmt.Sprintf("cron:%v:%v", info.Type, id) + jobsGorm.Redis.NewStringOperation().Del(cacheName) +} + +// LockForever 永远上锁 +func (jobsGorm *JobsGorm) LockForever(info Task, id any) string { + cacheName := fmt.Sprintf("cron:%v:%v", info.Type, id) + judgeCache := jobsGorm.Redis.NewStringOperation().Get(cacheName).UnwrapOr("") + if judgeCache != "" { + return judgeCache + } + jobsGorm.Redis.NewStringOperation().Set(cacheName, fmt.Sprintf("已在%v机器永远上锁成功", jobsGorm.OutsideIp)) + return "" +} diff --git a/jobs_gorm_model/task.go b/jobs_gorm/model_task.go similarity index 51% rename from jobs_gorm_model/task.go rename to jobs_gorm/model_task.go index a81d385..ea41543 100644 --- a/jobs_gorm_model/task.go +++ b/jobs_gorm/model_task.go @@ -1,6 +1,9 @@ -package jobs_gorm_model +package jobs_gorm -import "gorm.io/gorm" +import ( + "go.dtapp.net/gojobs" + "gorm.io/gorm" +) // Task 任务 type Task struct { @@ -28,3 +31,47 @@ type Task struct { func (m *Task) TableName() string { return "task" } + +// TaskTake 查询任务 +func (jobsGorm *JobsGorm) TaskTake(tx *gorm.DB, customId string) (result Task) { + tx.Where("custom_id = ?", customId).Where("status = ?", gojobs.TASK_IN).Take(&result) + return result +} + +// TaskCustomIdTake 查询任务 +func (jobsGorm *JobsGorm) TaskCustomIdTake(tx *gorm.DB, Type, customId string) (result Task) { + tx.Where("type = ?", Type).Where("custom_id = ?", customId).Take(&result) + return result +} + +// TaskCustomIdTakeStatus 查询任务 +func (jobsGorm *JobsGorm) TaskCustomIdTakeStatus(tx *gorm.DB, Type, customId, status string) (result Task) { + tx.Where("type = ?", Type).Where("custom_id = ?", customId).Where("status = ?", status).Take(&result) + return result +} + +// TaskFind 查询任务 +func (jobsGorm *JobsGorm) TaskFind(tx *gorm.DB, frequency int64) (results []Task) { + tx.Table("task").Select("task.*").Where("task.frequency = ?", frequency).Where("task.status = ?", gojobs.TASK_IN).Where("task_ip.ips = ?", jobsGorm.OutsideIp).Order("task.id asc").Joins("left join task_ip on task_ip.task_type = task.type").Find(&results) + return jobsGorm.taskFindCheck(results) +} + +// TaskFindAll 查询任务 +func (jobsGorm *JobsGorm) TaskFindAll(tx *gorm.DB, frequency int64) (results []Task) { + tx.Where("frequency = ?", frequency).Where("status = ?", gojobs.TASK_IN).Order("id asc").Find(&results) + return results +} + +// 检查任务 +func (jobsGorm *JobsGorm) taskFindCheck(lists []Task) (results []Task) { + for _, v := range lists { + if v.SpecifyIp == "" { + results = append(results, v) + } else { + if jobsGorm.OutsideIp == v.SpecifyIp { + results = append(results, v) + } + } + } + return results +} diff --git a/jobs_gorm/model_task_ip.go b/jobs_gorm/model_task_ip.go new file mode 100644 index 0000000..4086066 --- /dev/null +++ b/jobs_gorm/model_task_ip.go @@ -0,0 +1,64 @@ +package jobs_gorm + +import ( + "gorm.io/gorm" + "log" + "strings" +) + +// TaskIp 任务Ip +type TaskIp struct { + Id int64 `gorm:"primaryKey" json:"id"` // 记录编号 + TaskType string `json:"task_type"` // 任务编号 + Ips string `json:"ips"` // 任务IP +} + +func (m *TaskIp) TableName() string { + return "task_ip" +} + +func (jobsGorm *JobsGorm) TaskIpUpdate(tx *gorm.DB, taskType, ips string) *gorm.DB { + var query TaskIp + tx.Where("task_type = ?", taskType).Where("ips = ?", ips).Take(&query) + if query.Id != 0 { + return tx + } + updateStatus := tx.Create(&TaskIp{ + TaskType: taskType, + Ips: ips, + }) + if updateStatus.RowsAffected == 0 { + log.Println("任务更新失败:", updateStatus.Error) + } + return updateStatus +} + +// TaskIpInit 实例任务ip +func (jobsGorm *JobsGorm) TaskIpInit(tx *gorm.DB, ips map[string]string) bool { + if jobsGorm.OutsideIp == "" || jobsGorm.OutsideIp == "0.0.0.0" { + return false + } + tx.Where("ips = ?", jobsGorm.OutsideIp).Delete(&TaskIp{}) // 删除 + for k, v := range ips { + if v == "" { + jobsGorm.TaskIpUpdate(tx, k, jobsGorm.OutsideIp) + } else { + find := strings.Contains(v, ",") + if find == true { + // 包含 + parts := strings.Split(v, ",") + for _, vv := range parts { + if vv == jobsGorm.OutsideIp { + jobsGorm.TaskIpUpdate(tx, k, jobsGorm.OutsideIp) + } + } + } else { + // 不包含 + if v == jobsGorm.OutsideIp { + jobsGorm.TaskIpUpdate(tx, k, jobsGorm.OutsideIp) + } + } + } + } + return true +} diff --git a/jobs_gorm_model/task_log.go b/jobs_gorm/model_task_log.go similarity index 84% rename from jobs_gorm_model/task_log.go rename to jobs_gorm/model_task_log.go index 28c54be..bc48ac2 100644 --- a/jobs_gorm_model/task_log.go +++ b/jobs_gorm/model_task_log.go @@ -1,4 +1,4 @@ -package jobs_gorm_model +package jobs_gorm // TaskLog 任务日志模型 type TaskLog struct { @@ -6,7 +6,7 @@ type TaskLog struct { TaskId uint `json:"task_id"` // 任务编号 StatusCode int `json:"status_code"` // 状态码 Desc string `json:"desc"` // 结果 - Version int `json:"version"` // 版本 + Version string `json:"version"` // 版本 CreatedAt string `gorm:"type:text" json:"created_at"` // 创建时间 } diff --git a/jobs_gorm_model/task_log_run.go b/jobs_gorm/model_task_log_run.go similarity index 72% rename from jobs_gorm_model/task_log_run.go rename to jobs_gorm/model_task_log_run.go index 668ce3a..53d1971 100644 --- a/jobs_gorm_model/task_log_run.go +++ b/jobs_gorm/model_task_log_run.go @@ -1,4 +1,8 @@ -package jobs_gorm_model +package jobs_gorm + +import ( + "gorm.io/gorm" +) // TaskLogRun 任务执行日志模型 type TaskLogRun struct { @@ -18,3 +22,9 @@ type TaskLogRun struct { func (m *TaskLogRun) TableName() string { return "task_log_run" } + +// TaskLogRunTake 查询任务执行日志 +func (jobsGorm *JobsGorm) TaskLogRunTake(tx *gorm.DB, taskId uint, runId string) (result TaskLogRun) { + tx.Select("id", "os", "arch", "outside_ip", "created_at").Where("task_id = ?", taskId).Where("run_id = ?", runId).Take(&result) + return result +} diff --git a/jobs_gorm/params.go b/jobs_gorm/params.go new file mode 100644 index 0000000..33e1893 --- /dev/null +++ b/jobs_gorm/params.go @@ -0,0 +1,29 @@ +package jobs_gorm + +var ParamsOrderType = "order" + +// ParamsOrderId 订单任务 +type ParamsOrderId struct { + OrderId string `json:"order_id,omitempty"` +} + +var ParamsMerchantGoldenBeanType = "merchant.golden_bean" + +var ParamsNewServiceType = "new_service" + +// ParamsTaskId 企业自定义任务 +type ParamsTaskId struct { + TaskId int64 `json:"task_id,omitempty"` +} + +var ParamsNewServiceNextType = "new_service.next" + +// ParamsTaskIdNext 企业自定义下一步任务 +type ParamsTaskIdNext struct { + TaskId int64 `json:"task_id,omitempty"` + MerchantUserId int64 `json:"merchant_user_id,omitempty"` + CurrentNumber int `json:"current_number,omitempty"` + MaxNumber int `json:"max_number,omitempty"` +} + +var ParamsTeamInvType = "team.inv" diff --git a/jobs_gorm/type.go b/jobs_gorm/type.go new file mode 100644 index 0000000..cf9d1c7 --- /dev/null +++ b/jobs_gorm/type.go @@ -0,0 +1,25 @@ +package jobs_gorm + +func GetTypeApiPaySubmit(Type string) string { + return "api.pay.submit." + Type +} + +func GetTypeWechatRefundsSubmit(Type string) string { + return "wechat.refunds.submit." + Type +} + +func GetTypeWechatRefundsQuery(Type string) string { + return "wechat.refunds.query." + Type +} + +func GetTypeGoldenBeansIssue(Type string) string { + return "golden_beans.issue." + Type +} + +func GetTypeGoldenBeansRefunds(Type string) string { + return "golden_beans.refunds." + Type +} + +func GetTypeCustomerAuto(Type string) string { + return "customer.auto." + Type +} diff --git a/jobs_gorm_model/task_ip.go b/jobs_gorm_model/task_ip.go deleted file mode 100644 index 8de9ee8..0000000 --- a/jobs_gorm_model/task_ip.go +++ /dev/null @@ -1,12 +0,0 @@ -package jobs_gorm_model - -// TaskIp 任务Ip -type TaskIp struct { - Id int64 `gorm:"primaryKey" json:"id"` - TaskType string `json:"task_type"` // 任务编号 - Ips string `json:"ips"` // 任务IP -} - -func (m *TaskIp) TableName() string { - return "task_ip" -} diff --git a/version.go b/version.go index c73ea3c..41f40d1 100644 --- a/version.go +++ b/version.go @@ -1,3 +1,3 @@ package gojobs -const Version = "1.0.17" +const Version = "1.0.18"