// Copyright (c) Shenyang Leading Edge Intelligent Technology Co., Ltd. All rights reserved.
|
|
package models
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"github.com/go-xorm/xorm"
|
|
"leit.com/LAPP_GAAS_GFrame/db"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
"xorm.io/core"
|
|
)
|
|
|
|
type Snrtab struct {
|
|
Plantnr int `json:"PlantNr" xorm:"not null pk INT(4)"`
|
|
Snrid string `json:"SnrId" xorm:"not null pk NVARCHAR(80)"`
|
|
Descr string `json:"Descr" xorm:"not null NVARCHAR(200)"`
|
|
Validfrom time.Time `json:"ValidFrom" xorm:"DATE(3)"`
|
|
Validto time.Time `json:"ValidTo" xorm:"DATE(3)"`
|
|
Prefix string `json:"PreFix" xorm:"not null NVARCHAR(40)"`
|
|
Infix string `json:"InFix" xorm:"not null NVARCHAR(40)"`
|
|
Postfix string `json:"PostFix" xorm:"not null NVARCHAR(40)"`
|
|
Startnr int `json:"StartNr" xorm:"not null INT(4)"`
|
|
Endnr int `json:"EndNr" xorm:"not null INT(4)"`
|
|
Step int `json:"Step" xorm:"not null INT(4)"`
|
|
Length int `json:"Length" xorm:"not null INT(4)"`
|
|
Nextnr int `json:"NextNr" xorm:"not null INT(4)"`
|
|
Lastnrcreate time.Time `json:"LastNrCreate" xorm:"DATETIME(8)"`
|
|
Resetnrrule string `json:"ResetNrRule" xorm:"not null NVARCHAR(20)"`
|
|
Overflowhandling string `json:"OverFlowHandling" xorm:"not null NVARCHAR(20)"`
|
|
Identifierformat string `json:"IdentifierFormat" xorm:"not null NVARCHAR(80)"`
|
|
Datevariable string `json:"DateVariable" xorm:"not null NVARCHAR(80)"`
|
|
Dateformat string `json:"DateFormat" xorm:"not null NVARCHAR(80)"`
|
|
Identifierlayout string `json:"IdentifierLayout" xorm:"not null NVARCHAR(10)"`
|
|
Lastmodify time.Time `json:"LastModify" xorm:"DATETIME(8)"`
|
|
Lastuser string `json:"LastUser" xorm:"not null NVARCHAR(40)"`
|
|
Createtime time.Time `json:"CreateTime" xorm:"DATETIME(8)"`
|
|
}
|
|
|
|
/******数据表名******/
|
|
func (t *Snrtab) TableName() string {
|
|
return "Snrtab"
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* @Function Name :
|
|
*-----------------------------------------------------------------------------
|
|
*
|
|
* @Description : 数据添加
|
|
*
|
|
* @Function Parameters:
|
|
*
|
|
* @Return Value :
|
|
*
|
|
* @Author : Lou Wenzhi
|
|
*
|
|
* @Date : 2021/3/6 8:47
|
|
*
|
|
******************************************************************************/
|
|
func (t *Snrtab) Add() error {
|
|
e := db.Eloquent.Master()
|
|
snrtab := new(Snrtab)
|
|
|
|
/******/
|
|
affw, err := e.Table(t.TableName()).ID(core.PK{t.Plantnr, t.Snrid}).Count(snrtab)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if affw > 0 {
|
|
return errors.New("数据已经存在!")
|
|
}
|
|
_, err = e.Table(t.TableName()).Insert(t)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* @Function Name :
|
|
*-----------------------------------------------------------------------------
|
|
*
|
|
* @Description : 数据删除
|
|
*
|
|
* @Function Parameters:
|
|
*
|
|
* @Return Value :
|
|
*
|
|
* @Author : Lou Wenzhi
|
|
*
|
|
* @Date : 2021/3/6 8:47
|
|
*
|
|
******************************************************************************/
|
|
func (t *Snrtab) Del() error {
|
|
e := db.Eloquent.Master()
|
|
|
|
/******/
|
|
_, err := e.ID(core.PK{t.Plantnr, t.Snrid}).Delete(&Snrtab{})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* @Function Name :
|
|
*-----------------------------------------------------------------------------
|
|
*
|
|
* @Description : 数据修改
|
|
*
|
|
* @Function Parameters:
|
|
*
|
|
* @Return Value :
|
|
*
|
|
* @Author : Lou Wenzhi
|
|
*
|
|
* @Date : 2021/3/6 8:47
|
|
*
|
|
******************************************************************************/
|
|
func (t *Snrtab) Update() error {
|
|
e := db.Eloquent.Master()
|
|
|
|
_, err := e.ID(core.PK{t.Plantnr, t.Snrid}).Update(t)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
func (t *Snrtab) UpdateBySession(session *xorm.Session) error {
|
|
_, err := session.ID(core.PK{t.Plantnr, t.Snrid}).Update(t)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* @Function Name :
|
|
*-----------------------------------------------------------------------------
|
|
*
|
|
* @Description : 数据查找
|
|
*
|
|
* @Function Parameters:
|
|
*
|
|
* @Return Value :
|
|
*
|
|
* @Author : Lou Wenzhi
|
|
*
|
|
* @Date : 2021/3/6 8:47
|
|
*
|
|
******************************************************************************/
|
|
func (t *Snrtab) SelectOne() (Snrtab, error) {
|
|
var data Snrtab
|
|
|
|
e := db.Eloquent.Master()
|
|
_, err := e.ID(core.PK{t.Plantnr, t.Snrid}).Get(&data)
|
|
if err != nil {
|
|
return data, err
|
|
}
|
|
return data, nil
|
|
}
|
|
func (t *Snrtab) SelectOneBySession(session *xorm.Session) (Snrtab, error) {
|
|
var data Snrtab
|
|
|
|
_, err := session.ID(core.PK{t.Plantnr, t.Snrid}).Get(&data)
|
|
if err != nil {
|
|
return data, err
|
|
}
|
|
return data, nil
|
|
}
|
|
|
|
// 获取指定序列的下一个流水号
|
|
func (t *Snrtab) GetNextSnr() (retsnr string, err error) {
|
|
var (
|
|
snrtab Snrtab
|
|
y, l_y, d, l_d, wk, l_wk int
|
|
m, l_m time.Month
|
|
layout []byte
|
|
i, nextsnr int
|
|
)
|
|
|
|
if snrtab, err = t.SelectOne(); err != nil {
|
|
return
|
|
}
|
|
|
|
// 获取下一序列值
|
|
y = time.Now().Year()
|
|
m = time.Now().Month()
|
|
d = time.Now().Day()
|
|
_, wk = time.Now().ISOWeek()
|
|
l_y = snrtab.Lastnrcreate.Year()
|
|
l_m = snrtab.Lastnrcreate.Month()
|
|
l_d = snrtab.Lastnrcreate.Day()
|
|
_, l_wk = snrtab.Lastnrcreate.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 + FormatUnixTimeToString(time.Now().Unix(), snrtab.Dateformat)
|
|
case "3": //中缀
|
|
retsnr = retsnr + snrtab.Infix
|
|
case "4": //流水号
|
|
if snrtab.Identifierformat == "CHAR" {
|
|
retsnr = retsnr + ConvInt2FormatString(nextsnr, snrtab.Length)
|
|
} else {
|
|
retsnr = retsnr + strconv.Itoa(nextsnr)
|
|
}
|
|
case "5": //后缀
|
|
retsnr = retsnr + snrtab.Postfix
|
|
}
|
|
}
|
|
//更新下一序列值
|
|
// 处理数值超限
|
|
snrtab.Nextnr = nextsnr + snrtab.Step
|
|
snrtab.Lastnrcreate = time.Now()
|
|
if snrtab.Nextnr > snrtab.Endnr {
|
|
switch strings.ToUpper(snrtab.Overflowhandling) {
|
|
case "NO":
|
|
case "RESET":
|
|
snrtab.Nextnr = snrtab.Startnr
|
|
}
|
|
}
|
|
|
|
snrtab.Lastmodify = time.Now()
|
|
if err = snrtab.Update(); err != nil {
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 获取指定序列的下一个流水号
|
|
func (t *Snrtab) GetNextSnrBySession(session *xorm.Session) (retsnr string, err error) {
|
|
var (
|
|
snrtab Snrtab
|
|
y, l_y, d, l_d, wk, l_wk int
|
|
m, l_m time.Month
|
|
layout []byte
|
|
i, nextsnr int
|
|
)
|
|
|
|
if snrtab, err = t.SelectOneBySession(session); err != nil {
|
|
return
|
|
}
|
|
|
|
// 获取下一序列值
|
|
y = time.Now().Year()
|
|
m = time.Now().Month()
|
|
d = time.Now().Day()
|
|
_, wk = time.Now().ISOWeek()
|
|
l_y = snrtab.Lastnrcreate.Year()
|
|
l_m = snrtab.Lastnrcreate.Month()
|
|
l_d = snrtab.Lastnrcreate.Day()
|
|
_, l_wk = snrtab.Lastnrcreate.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 + FormatUnixTimeToString(time.Now().Unix(), snrtab.Dateformat)
|
|
case "3": //中缀
|
|
retsnr = retsnr + snrtab.Infix
|
|
case "4": //流水号
|
|
if snrtab.Identifierformat == "CHAR" {
|
|
retsnr = retsnr + ConvInt2FormatString(nextsnr, snrtab.Length)
|
|
} else {
|
|
retsnr = retsnr + strconv.Itoa(nextsnr)
|
|
}
|
|
case "5": //后缀
|
|
retsnr = retsnr + snrtab.Postfix
|
|
}
|
|
}
|
|
//更新下一序列值
|
|
// 处理数值超限
|
|
snrtab.Nextnr = nextsnr + snrtab.Step
|
|
snrtab.Lastnrcreate = time.Now()
|
|
if snrtab.Nextnr > snrtab.Endnr {
|
|
switch strings.ToUpper(snrtab.Overflowhandling) {
|
|
case "NO":
|
|
case "RESET":
|
|
snrtab.Nextnr = snrtab.Startnr
|
|
}
|
|
}
|
|
|
|
snrtab.Lastmodify = time.Now()
|
|
if err = snrtab.UpdateBySession(session); err != nil {
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 将给定的整数值转换成给定长度的字符串,不足长度的在前面补足0
|
|
func ConvInt2FormatString(input, ilen int) (retstring string) {
|
|
var igap int
|
|
|
|
if len(string(input)) >= ilen {
|
|
retstring = string(input)
|
|
} else {
|
|
igap = ilen - len(strconv.Itoa(input))
|
|
retstring = strings.Repeat("0", igap) + strconv.Itoa(input)
|
|
}
|
|
return
|
|
}
|
|
|
|
// Format unix time int64 to string
|
|
/** Format time.Time struct to string
|
|
// MM - month - 01
|
|
// M - month - 1, single bit
|
|
// DD - day - 02
|
|
// D - day 2
|
|
// YYYY - year - 2006
|
|
// YY - year - 06
|
|
// HH - 24 hours - 03
|
|
// H - 24 hours - 3
|
|
// hh - 12 hours - 03
|
|
// h - 12 hours - 3
|
|
// mm - minute - 04
|
|
// m - minute - 4
|
|
// ss - second - 05
|
|
// s - second = 5 **/
|
|
func FormatUnixTimeToString(ti int64, format string) string {
|
|
t := time.Unix(int64(ti), 0)
|
|
res := strings.Replace(format, "MM", t.Format("01"), -1)
|
|
res = strings.Replace(res, "M", t.Format("1"), -1)
|
|
res = strings.Replace(res, "DD", t.Format("02"), -1)
|
|
res = strings.Replace(res, "D", t.Format("2"), -1)
|
|
res = strings.Replace(res, "YYYY", t.Format("2006"), -1)
|
|
res = strings.Replace(res, "YY", t.Format("06"), -1)
|
|
res = strings.Replace(res, "HH", fmt.Sprintf("%02d", t.Hour()), -1)
|
|
res = strings.Replace(res, "H", fmt.Sprintf("%d", t.Hour()), -1)
|
|
res = strings.Replace(res, "hh", t.Format("03"), -1)
|
|
res = strings.Replace(res, "h", t.Format("3"), -1)
|
|
res = strings.Replace(res, "mm", t.Format("04"), -1)
|
|
res = strings.Replace(res, "m", t.Format("4"), -1)
|
|
res = strings.Replace(res, "ss", t.Format("05"), -1)
|
|
res = strings.Replace(res, "s", t.Format("5"), -1)
|
|
return res
|
|
}
|