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.
 

412 lines
11 KiB

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