Browse Source

提交事务锁

master
娄文智 3 years ago
parent
commit
d6c10870a0
2 changed files with 52 additions and 10 deletions
  1. +34
    -10
      calloff/Callofftask.go
  2. +18
    -0
      service/Workline.go

+ 34
- 10
calloff/Callofftask.go View File

@ -214,9 +214,19 @@ func ParseCalloffOrder() {
}
// 2. 判断客户订单是否存在
/* 获取锁 */
LOOP:
err = etcd.G_jobLock.TryLock("lock")
if err != nil {
fmt.Println("calloff groutine lock fail!")
time.Sleep(5 * time.Millisecond)
goto LOOP
}
fmt.Println("calloff groutine lock success!")
bl_co = service.BL_CustOrder{Projnr: cflandtablst[j].Projnr, Oemordernr: cflandtablst[j].Oemordernr, Partfamilyid: cflandtablst[j].Partfamilyid}
if exist, err = bl_co.GetCalloffOemorder(); err != nil {
glog.InfoExtln("读取Calloff信息并生成发运包装", "Failed to get custorder for oemorder due to: ", cflandtablst[j].Oemordernr, err)
etcd.G_jobLock.UnLock()
return
}
if !exist {
@ -236,6 +246,12 @@ func ParseCalloffOrder() {
}
glog.InfoExtln("CALLOFF-Debug", "获取客户订单:", bl_co.Custordertab.Custordernr, "生产工单数:", len(bl_co.Custordertab.Wotablst))
// 如果没有生产工单,则不再处理
if len(bl_co.Custordertab.Wotablst) <= 0 {
fmt.Println("获取客户订单:", bl_co.Custordertab.Custordernr, "生产工单数:", len(bl_co.Custordertab.Wotablst))
etcd.G_jobLock.UnLock()
continue
}
prevCS, _ = cfProj.Pfcsdict[cflandtablst[j].Partfamilyid]
prevOemord = ""
@ -248,23 +264,27 @@ func ParseCalloffOrder() {
// 获取前序calloff的所有记录
if cftablst, err = cftab.GetByProjectOemorder(); err != nil {
glog.InfoExtln("读取Calloff信息并生成发运包装", "查询项目客户订单的calloff记录失败:", cftab.Projnr, cftab.Oemordernr, err)
etcd.G_jobLock.UnLock()
return
}
// 获取前序客户订单
bl_prevco = service.BL_CustOrder{Projnr: cfProj.Projectid, Oemordernr: cflandtablst2[0].Oemordernr, Partfamilyid: cflandtablst2[0].Partfamilyid}
if exist, err = bl_prevco.GetCalloffOemorder(); err != nil {
glog.InfoExtln("读取Calloff信息并生成发运包装", "获取前序客户订单失败:", cflandtablst2[0].Oemordernr, err)
etcd.G_jobLock.UnLock()
return
}
// 校验客户订单的零件族是否齐全
sgdict = make(map[string]string)
if sgdict, err = bl_prevco.GetOemorderModelSpecPfdict(); err != nil {
glog.InfoExtln("读取Calloff信息并生成发运包装", "查询项目客户订单的车型规格字典记录失败:", bl_co.Custordertab.Projnr, bl_co.Custordertab.Custordernr, err)
etcd.G_jobLock.UnLock()
return
}
if len(sgdict) != len(cftablst) {
// 整车副缺零件族
glog.InfoExtln("CALLOFF-Debug", "整车副缺零件族len(cftablst):", len(cftablst), "整车副缺零件族len(sgdict):", len(sgdict))
etcd.G_jobLock.UnLock()
continue
}
// 校验是否解析有错误
@ -280,6 +300,7 @@ func ParseCalloffOrder() {
}
if stop {
fmt.Println("前序未完成处理,跳过!")
etcd.G_jobLock.UnLock()
continue
}
}
@ -306,6 +327,7 @@ func ParseCalloffOrder() {
if projtablst[i].Calloff_verify_orderspec > 0 {
if audit, err = bl_co.IsCarmodelSpecAudited(); err != nil {
glog.InfoExtln("读取Calloff信息并生成发运包装", "获取客户订单规格失败 :", bl_co.Custordernr)
etcd.G_jobLock.UnLock()
return
} else {
if !audit {
@ -328,13 +350,17 @@ func ParseCalloffOrder() {
// 如果有错,则停下不解析
if len(errorlst) > 0 {
session = db.G_DbEngine.NewSession()
defer session.Close()
if err = session.Begin(); err != nil {
session.Close()
etcd.G_jobLock.UnLock()
return
}
//保存错误
if err = cferror.InsertList(session, errorlst); err != nil {
glog.InfoExtln("读取Calloff信息并生成发运包装", "插入Calloff解析错误记录失败 :", err)
session.Rollback()
session.Close()
etcd.G_jobLock.UnLock()
return
}
@ -360,9 +386,13 @@ func ParseCalloffOrder() {
if err = cflandtablst[j].UpdateFields(session, "parsed,handlestatus,lastmodif"); err != nil {
glog.InfoExtln("读取Calloff信息并生成发运包装", "更新Calloff解析记录失败 :", err)
session.Rollback()
session.Close()
etcd.G_jobLock.UnLock()
return
}
session.Commit()
session.Close()
etcd.G_jobLock.UnLock()
continue
}
@ -371,21 +401,15 @@ func ParseCalloffOrder() {
// 获取同项目OEMORDER的Calloff判断解析状态
if exist, err = cflandtab.ExistUnParsedCfByProjectOemorderPf(cfProj.Projectid, cflandtablst[j].Oemordernr, "SITKD1"); err != nil {
glog.InfoExtln("读取Calloff信息并生成发运包装", "获取项目客户订单零件族的calloff记录失败 :", cfProj.Projectid, cflandtablst[j].Oemordernr, cflandtablst[j].Partfamilyid, err)
etcd.G_jobLock.UnLock()
return
}
if exist {
glog.InfoExtln("读取Calloff信息并生成发运包装", "408行 exist is false :", err)
etcd.G_jobLock.UnLock()
continue
}
}
/* 获取锁 */
LOOP:
err = etcd.G_jobLock.TryLock("lock")
if err != nil {
fmt.Println("calloff groutine lock fail!")
time.Sleep(5 * time.Millisecond)
goto LOOP
}
fmt.Println("calloff groutine lock success!")
session = db.G_DbEngine.NewSession()
if err = session.Begin(); err != nil {


+ 18
- 0
service/Workline.go View File

@ -178,6 +178,14 @@ LOOP:
//解析数据(G38:2;G18:1 )
data := strings.Split(bl_wl.Worklinetab.Mixsortlogic, ";")
if len(data) >= 2 {
/* 获取锁 */
LOCK:
err = etcd.G_jobLock.TryLock("lock")
if err != nil {
fmt.Println("seq groutine lock fail!")
time.Sleep(10 * time.Millisecond)
goto LOCK
}
//项目1
info1 := strings.Split(data[0], ":")
if len(info1) >= 2 {
@ -188,10 +196,12 @@ LOOP:
}
if wotablst1, err = bl_wl.GetLineProjectTaskWorkordersBySwet(projnr1, bl_wl.WorklineId, value1); err != nil {
err = errors.New(fmt.Sprintf("Failed to load work order for workline: %s due to: %v", bl_wl.WorklineId, err))
etcd.G_jobLock.UnLock()
return
}
} else {
etcd.G_jobLock.UnLock()
return
}
info2 := strings.Split(data[1], ":")
@ -203,9 +213,11 @@ LOOP:
}
if wotablst2, err = bl_wl.GetLineProjectTaskWorkordersBySwet(projnr2, bl_wl.WorklineId, value2); err != nil {
err = errors.New(fmt.Sprintf("Failed to load work order for workline: %s due to: %v", bl_wl.WorklineId, err))
etcd.G_jobLock.UnLock()
return
}
} else {
etcd.G_jobLock.UnLock()
return
}
//比较swet时间
@ -215,8 +227,13 @@ LOOP:
if len(wotablst2) > 0 {
swet2 = wotablst2[0].Swet
}
//记录日志
glog.InfoExtln("scheduler","swet1",swet1)
glog.InfoExtln("scheduler","swet2",swet2)
if common.ValueIsEmpty(swet1) {
if common.ValueIsEmpty(swet2) {
etcd.G_jobLock.UnLock()
return
} else {
for i = 0; i < len(wotablst2); i++ {
@ -297,6 +314,7 @@ LOOP:
}
}
}
etcd.G_jobLock.UnLock()
} else if len(data) == 1{
//项目1
info1 := strings.Split(data[0], ":")


Loading…
Cancel
Save