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