SJA APS后端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

223 lines
5.6 KiB

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
}