diff --git a/calloff/Callofftask.go b/calloff/Callofftask.go index 379ba2b..b7404b8 100644 --- a/calloff/Callofftask.go +++ b/calloff/Callofftask.go @@ -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 { diff --git a/service/Workline.go b/service/Workline.go index 018f528..dbca7f5 100644 --- a/service/Workline.go +++ b/service/Workline.go @@ -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], ":")