From a6748103b7a867871e01d75ffa5987ddd15033b5 Mon Sep 17 00:00:00 2001 From: louwenzhi Date: Wed, 28 Apr 2021 12:12:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- etcd/etcd.go | 2 +- main.go | 7 ++++++- task/func.go | 56 +++++++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 56 insertions(+), 9 deletions(-) diff --git a/etcd/etcd.go b/etcd/etcd.go index 5422015..f23425f 100644 --- a/etcd/etcd.go +++ b/etcd/etcd.go @@ -4,7 +4,7 @@ import ( "time" "context" "fmt" - "github.com/coreos/etcd/clientv3" + clientv3 "go.etcd.io/etcd/client/v3" ) //创建租约注册服务 diff --git a/main.go b/main.go index b78cd3c..8ee9f9a 100644 --- a/main.go +++ b/main.go @@ -4,6 +4,7 @@ import ( "LAPP_SJA_ME/conf" "LAPP_SJA_ME/db" Engine "LAPP_SJA_ME/engine" + "LAPP_SJA_ME/etcd" "LAPP_SJA_ME/inits/parse" "LAPP_SJA_ME/lab" "LAPP_SJA_ME/task" @@ -116,7 +117,11 @@ func imain() { //go func() { // http.ListenAndServe("0.0.0.0:8899", nil) //}() - + //创建etcd连接 + if err = etcd.InitJobLock(); err != nil { + glog.Infoln("初始化EtCD连接", "InitJobLock return fail") + return + } //打印服务 go Engine.RunEngine(conf) diff --git a/task/func.go b/task/func.go index e0928d4..9d9dc05 100644 --- a/task/func.go +++ b/task/func.go @@ -2,8 +2,10 @@ package task import ( "LAPP_SJA_ME/db" + "LAPP_SJA_ME/etcd" "LAPP_SJA_ME/utils" "LAPP_SJA_ME/web/models" + "fmt" "time" ) @@ -16,52 +18,92 @@ import ( *情况2: 如果生产订单号是80状态:如果客户订单号对应的生产订单有小于80的状态;那么客户订单不更新,只需要更新生产订单 */ func UpdatePlnWorkorder(finr int, workordernr string, status int) error { + + /* 获取锁 */ +LOOP: + err := etcd.G_jobLock.TryLock("lock") + if err != nil { + fmt.Println("pln_workorder groutine lock fail!") + time.Sleep(5 * time.Millisecond) + goto LOOP + } + fmt.Println("pln_workorder groutine lock success!") engine := db.Eloquent.Master() + session := engine.NewSession() + if err = session.Begin(); err != nil { + session.Close() + etcd.G_jobLock.UnLock() + return err + } //判断传入状态 switch status { case 40: //更新生产订单表 - _, err := engine.Table("pln_workorder").Cols("status").Where("finr = ? and workordernr = ? and status <= ?", finr, workordernr, status).Update(&map[string]interface{}{"status": 40}) + _, err := session.Table("pln_workorder").Cols("status").Where("finr = ? and workordernr = ? and status <= ?", finr, workordernr, status).Update(&map[string]interface{}{"status": 40}) if err != nil { + session.Rollback() + session.Close() + etcd.G_jobLock.UnLock() return err } //查询生产订单对应的客户订单是否有小于80状态的订单 var pln models.Pln_workorder - _, err = engine.Table("pln_workorder").Where("finr = ? and workordernr = ?", finr, workordernr).Get(&pln) + _, err = session.Table("pln_workorder").Where("finr = ? and workordernr = ?", finr, workordernr).Get(&pln) if err != nil { + session.Rollback() + session.Close() + etcd.G_jobLock.UnLock() return err } //更新客户订单 - _, err = engine.Table("pln_custorder").Cols("status").Where("finr = ? and custordernr = ? and status <= ?", finr, pln.Custordernr, status).Update(&map[string]interface{}{"status": 40}) + _, err = session.Table("pln_custorder").Cols("status").Where("finr = ? and custordernr = ? and status <= ?", finr, pln.Custordernr, status).Update(&map[string]interface{}{"status": 40}) if err != nil { + session.Rollback() + session.Close() + etcd.G_jobLock.UnLock() return err } case 80: //更新生产订单表 - _, err := engine.Table("pln_workorder").Cols("status").Where("finr = ? and workordernr = ? and status <= ?", finr, workordernr, status).Update(&map[string]interface{}{"status": 80}) + _, err := session.Table("pln_workorder").Cols("status").Where("finr = ? and workordernr = ? and status <= ?", finr, workordernr, status).Update(&map[string]interface{}{"status": 80}) if err != nil { + session.Rollback() + session.Close() + etcd.G_jobLock.UnLock() return err } //查询生产订单对应的客户订单是否有小于80状态的订单 var pln models.Pln_workorder - _, err = engine.Table("pln_workorder").Where("finr = ? and workordernr = ?", finr, workordernr).Get(&pln) + _, err = session.Table("pln_workorder").Where("finr = ? and workordernr = ?", finr, workordernr).Get(&pln) if err != nil { + session.Rollback() + session.Close() + etcd.G_jobLock.UnLock() return err } var plc models.Pln_workorder - ok, err := engine.Table("pln_workorder").Where("finr = ? and custordernr = ? and status < ?", finr, pln.Custordernr, status).Get(&plc) + ok, err := session.Table("pln_workorder").Where("finr = ? and custordernr = ? and status < ?", finr, pln.Custordernr, status).Get(&plc) if err != nil { + session.Rollback() + session.Close() + etcd.G_jobLock.UnLock() return err } if !ok { //生产订单不存在小于80的状态,更新生产订单 - _, err := engine.Table("pln_custorder").Cols("status").Where("finr = ? and custordernr = ?", finr, pln.Custordernr).Update(&map[string]interface{}{"status": 80}) + _, err := session.Table("pln_custorder").Cols("status").Where("finr = ? and custordernr = ?", finr, pln.Custordernr).Update(&map[string]interface{}{"status": 80}) if err != nil { + session.Rollback() + session.Close() + etcd.G_jobLock.UnLock() return err } } default: } + session.Commit() + session.Close() + etcd.G_jobLock.UnLock() return nil }