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
|
|
//}
|