package service import ( "github.com/go-xorm/xorm" "leit.com/leit_seat_aps/common" "leit.com/leit_seat_aps/db" "strconv" "strings" "time" "xorm.io/core" ) /**流水号相关服务**/ // 获取指定序列的下一个流水号 func SN_GetNextSnr(snr string) (retsnr string, err error) { var ( snrtab db.Snrtab lastupdtime time.Time y, l_y, d, l_d, wk, l_wk int m, l_m time.Month layout []byte i, nextsnr int sql string ) snrtab = db.Snrtab{} if _, err = db.G_DbEngine.Id(core.PK{db.G_FINR, snr}).Get(&snrtab); err != nil { return } snrtab.Clipped() if snrtab.Lastnrcreate == "" { nextsnr = snrtab.Nextnr } else { if lastupdtime, err = common.DateParse(snrtab.Lastnrcreate, "YmdHis"); err != nil { return } // 获取下一序列值 y = time.Now().Year() m = time.Now().Month() d = time.Now().Day() _, wk = time.Now().ISOWeek() l_y = lastupdtime.Year() l_m = lastupdtime.Month() l_d = lastupdtime.Day() _, l_wk = lastupdtime.ISOWeek() switch strings.ToUpper(snrtab.Resetnrrule) { case "DAILY": if y == l_y && m == l_m && wk == l_wk && d == l_d { nextsnr = snrtab.Nextnr } else { nextsnr = snrtab.Startnr } case "WEEKLY": if y == l_y && m == l_m && wk == l_wk { nextsnr = snrtab.Nextnr } else { nextsnr = snrtab.Startnr } case "MONTHLY": if y == l_y && m == l_m { nextsnr = snrtab.Nextnr } else { nextsnr = snrtab.Startnr } case "YEARLY": if y == l_y { nextsnr = snrtab.Nextnr } else { nextsnr = snrtab.Startnr } case "NEVER": nextsnr = snrtab.Nextnr default: nextsnr = snrtab.Nextnr } } // 组合返回值 layout = []byte(snrtab.Identifierlayout) for i = 0; i < len(layout); i++ { switch string(layout[i]) { case "1": //前缀 retsnr = retsnr + snrtab.Prefix case "2": //日期变量 retsnr = retsnr + common.Date(time.Now().Unix(), snrtab.Dateformat) case "3": //中缀 retsnr = retsnr + snrtab.Infix case "4": //流水号 if snrtab.Identifierformat == "CHAR" { retsnr = retsnr + common.ConvInt2FormatString(nextsnr, snrtab.Length) } else { retsnr = retsnr + strconv.Itoa(nextsnr) } case "5": //后缀 retsnr = retsnr + snrtab.Postfix } } //更新下一序列值 // 处理数值超限 snrtab.Nextnr = nextsnr + snrtab.Step snrtab.Lastnrcreate = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") snrtab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") if snrtab.Nextnr > snrtab.Endnr { switch strings.ToUpper(snrtab.Overflowhandling) { case "NO": case "RESET": snrtab.Nextnr = snrtab.Startnr } } sql = "update `snrtab` set nextnr = ?, lastnrcreate = ?, lastmodif = ? where finr = ? AND snrid = ?" if _, err = db.G_DbEngine.Exec(sql, snrtab.Nextnr, snrtab.Lastnrcreate, snrtab.Lastmodif, db.G_FINR, snrtab.Snrid); err != nil { return } return } func SN_GetNextSnrBySession(snr string, session *xorm.Session) (retsnr string, err error) { var ( snrtab db.Snrtab lastupdtime time.Time y, l_y, d, l_d, wk, l_wk int m, l_m time.Month layout []byte i, nextsnr int sql string ) snrtab = db.Snrtab{} if _, err = session.ID(core.PK{db.G_FINR, snr}).Get(&snrtab); err != nil { return } snrtab.Clipped() if snrtab.Lastnrcreate == "" { nextsnr = snrtab.Nextnr } else { if lastupdtime, err = common.DateParse(snrtab.Lastnrcreate, "YmdHis"); err != nil { return } // 获取下一序列值 y = time.Now().Year() m = time.Now().Month() d = time.Now().Day() _, wk = time.Now().ISOWeek() l_y = lastupdtime.Year() l_m = lastupdtime.Month() l_d = lastupdtime.Day() _, l_wk = lastupdtime.ISOWeek() switch strings.ToUpper(snrtab.Resetnrrule) { case "DAILY": if y == l_y && m == l_m && wk == l_wk && d == l_d { nextsnr = snrtab.Nextnr } else { nextsnr = snrtab.Startnr } case "WEEKLY": if y == l_y && m == l_m && wk == l_wk { nextsnr = snrtab.Nextnr } else { nextsnr = snrtab.Startnr } case "MONTHLY": if y == l_y && m == l_m { nextsnr = snrtab.Nextnr } else { nextsnr = snrtab.Startnr } case "YEARLY": if y == l_y { nextsnr = snrtab.Nextnr } else { nextsnr = snrtab.Startnr } case "NEVER": nextsnr = snrtab.Nextnr default: nextsnr = snrtab.Nextnr } } // 组合返回值 layout = []byte(snrtab.Identifierlayout) for i = 0; i < len(layout); i++ { switch string(layout[i]) { case "1": //前缀 retsnr = retsnr + snrtab.Prefix case "2": //日期变量 retsnr = retsnr + common.Date(time.Now().Unix(), snrtab.Dateformat) case "3": //中缀 retsnr = retsnr + snrtab.Infix case "4": //流水号 if snrtab.Identifierformat == "CHAR" { retsnr = retsnr + common.ConvInt2FormatString(nextsnr, snrtab.Length) } else { retsnr = retsnr + strconv.Itoa(nextsnr) } case "5": //后缀 retsnr = retsnr + snrtab.Postfix } } //更新下一序列值 // 处理数值超限 snrtab.Nextnr = nextsnr + snrtab.Step snrtab.Lastnrcreate = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") snrtab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") if snrtab.Nextnr > snrtab.Endnr { switch strings.ToUpper(snrtab.Overflowhandling) { case "NO": case "RESET": snrtab.Nextnr = snrtab.Startnr } } sql = "update `snrtab` set nextnr = ?, lastnrcreate = ?, lastmodif = ? where finr = ? AND snrid = ?" if _, err = session.Exec(sql, snrtab.Nextnr, snrtab.Lastnrcreate, snrtab.Lastmodif, db.G_FINR, snrtab.Snrid); err != nil { return } return } func SN_SyncGetNextSnr(snr string) (retsnr string, err error) { tmStr := time.Now().Format("060102150405.999999") + "000000" str := strings.Replace(tmStr, ".", "", -1) if len(str) < 16 { tmStr = tmStr + common.CreateCaptchaFour() return tmStr, err } str = str[:16] str = str + common.CreateCaptchaFour() return str, nil } // 获取指定序列的下一个流水号(异步获取) //func SN_SyncGetNextSnr(snr string) (retsnr string, err error) { // /* 获取锁 */ //LOOPSNR: // err = etcd.Snr_jobLock.TryLock("msgid") // if err != nil { // time.Sleep(1 * time.Millisecond) // goto LOOPSNR // } // var ( // snrtab db.Snrtab // lastupdtime time.Time // y, l_y, d, l_d, wk, l_wk int // m, l_m time.Month // layout []byte // i, nextsnr int // sql string // ) // // snrtab = db.Snrtab{} // if _, err = db.G_DbEngine.Id(core.PK{db.G_FINR, snr}).Get(&snrtab); err != nil { // etcd.Snr_jobLock.UnLock() // return // } // snrtab.Clipped() // // if snrtab.Lastnrcreate == "" { // nextsnr = snrtab.Nextnr // } else { // if lastupdtime, err = common.DateParse(snrtab.Lastnrcreate, "YmdHis"); err != nil { // etcd.Snr_jobLock.UnLock() // return // } // // 获取下一序列值 // y = time.Now().Year() // m = time.Now().Month() // d = time.Now().Day() // _, wk = time.Now().ISOWeek() // l_y = lastupdtime.Year() // l_m = lastupdtime.Month() // l_d = lastupdtime.Day() // _, l_wk = lastupdtime.ISOWeek() // switch strings.ToUpper(snrtab.Resetnrrule) { // case "DAILY": // if y == l_y && m == l_m && wk == l_wk && d == l_d { // nextsnr = snrtab.Nextnr // } else { // nextsnr = snrtab.Startnr // } // case "WEEKLY": // if y == l_y && m == l_m && wk == l_wk { // nextsnr = snrtab.Nextnr // } else { // nextsnr = snrtab.Startnr // } // case "MONTHLY": // if y == l_y && m == l_m { // nextsnr = snrtab.Nextnr // } else { // nextsnr = snrtab.Startnr // } // case "YEARLY": // if y == l_y { // nextsnr = snrtab.Nextnr // } else { // nextsnr = snrtab.Startnr // } // case "NEVER": // nextsnr = snrtab.Nextnr // default: // nextsnr = snrtab.Nextnr // } // } // // 组合返回值 // layout = []byte(snrtab.Identifierlayout) // for i = 0; i < len(layout); i++ { // switch string(layout[i]) { // case "1": //前缀 // retsnr = retsnr + snrtab.Prefix // case "2": //日期变量 // retsnr = retsnr + common.Date(time.Now().Unix(), snrtab.Dateformat) // case "3": //中缀 // retsnr = retsnr + snrtab.Infix // case "4": //流水号 // if snrtab.Identifierformat == "CHAR" { // retsnr = retsnr + common.ConvInt2FormatString(nextsnr, snrtab.Length) // } else { // retsnr = retsnr + strconv.Itoa(nextsnr) // } // case "5": //后缀 // retsnr = retsnr + snrtab.Postfix // } // } // //更新下一序列值 // // 处理数值超限 // snrtab.Nextnr = nextsnr + snrtab.Step // snrtab.Lastnrcreate = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") // snrtab.Lastmodif = common.Date(time.Now().Unix(), "YYYYMMDDHHmmss") // if snrtab.Nextnr > snrtab.Endnr { // switch strings.ToUpper(snrtab.Overflowhandling) { // case "NO": // case "RESET": // snrtab.Nextnr = snrtab.Startnr // } // } // // sql = "update `snrtab` set nextnr = ?, lastnrcreate = ?, lastmodif = ? where finr = ? AND snrid = ?" // if _, err = db.G_DbEngine.Exec(sql, snrtab.Nextnr, snrtab.Lastnrcreate, snrtab.Lastmodif, db.G_FINR, snrtab.Snrid); err != nil { // etcd.Snr_jobLock.UnLock() // return // } // etcd.Snr_jobLock.UnLock() // return //}