package models import ( "lapp_-wy/db" "lapp_-wy/utils" "strconv" "strings" "sync" "time" "xorm.io/core" "errors" ) type Snrtab struct { Cid int `xorm:"pk comment('工厂号') Int" json:"snrtab-cid"` Snrid string `xorm:"pk comment('Id') VARCHAR(12)" json:"snrtab-snrid"` Descr string `xorm:"comment('描述') VARCHAR(30)" json:"snrtab-descr"` Validfrom string `xorm:"comment('有效起始日期') VARCHAR(8)" json:"snrtab-validfrom"` Validto string `xorm:"comment('有效截至日期') VARCHAR(8)" json:"snrtab-validto"` Prefix string `xorm:"comment('前缀') VARCHAR(20)" json:"snrtab-prefix"` Infix string `xorm:"comment('中缀') VARCHAR(20)" json:"snrtab-infix"` Postfix string `xorm:"comment('后缀') VARCHAR(20)" json:"snrtab-postfix"` Startnr int `xorm:"comment('流水号起始值') INT" json:"snrtab-startnr"` Endnr int `xorm:"comment('流水号截止值') INT" json:"snrtab-endnr"` Step int `xorm:"comment('步幅') INT" json:"snrtab-step"` Length int `xorm:"comment('长度') INT" json:"snrtab-length"` Nextnr int `xorm:"comment('下一流水号') INT" json:"snrtab-nextnr"` Lastnrcreate string `xorm:"comment('上个序号创建时间') VARCHAR(14)" json:"snrtab-lastnrcreate"` Resetnrrule string `xorm:"comment('序号重置规则') VARCHAR(10)" json:"snrtab-resetnrrule"` Overflowhandling string `xorm:"comment('序号溢出处理') VARCHAR(10)" json:"snrtab-overflowhandling"` Identifierformat string `xorm:"comment('流水号格式') VARCHAR(10)" json:"snrtab-identifierformat"` Datevariable string `xorm:"comment('日期变量') VARCHAR(20)" json:"snrtab-datevariable"` Dateformat string `xorm:"comment('日期格式') VARCHAR(14)" json:"snrtab-dateformat"` Identifierlayout string `xorm:"comment('标识符布局') VARCHAR(5)" json:"snrtab-identifierlayout"` Lastmodif string `xorm:"comment('最近一次更改时间') VARCHAR(14)" json:"snrtab-lastmodif"` Lastuser string `xorm:"comment('最近一次更改人') VARCHAR(20)" json:"snrtab-lastuser"` Credatuz string `xorm:"comment('创建时间') VARCHAR(14)" json:"snrtab-credatuz"` } func (t *Snrtab) TableName() string { return "snrtab" } // 清除string字段的右侧空格 func (t *Snrtab) Clipped() { utils.TrimStruct(t, *t) } //增 func (t *Snrtab) Add() error { e := db.MasterEngine() countrole := new(Snrtab) affw, err := e.Table("snrtab").ID(core.PK{t.Cid, t.Snrid}).Count(countrole) if err != nil { return err } if affw > 0 { return errors.New("数据已经存在!") } _, err = e.Table("snrtab").Insert(t) if err != nil { return err } return nil } //删 func (t *Snrtab) Del() bool { e := db.MasterEngine() _, err := e.ID(core.PK{t.Cid, t.Snrid}).Delete(&Snrtab{}) if err != nil { return false } return true } //改 func (t *Snrtab) Update() bool { e := db.MasterEngine() _, err := e.ID(core.PK{t.Cid, t.Snrid}).Update(t) if err != nil { return false } return true } //查 func (t *Snrtab) SelectOne() (Snrtab, error) { e := db.MasterEngine() var data Snrtab _, err := e.ID(core.PK{t.Cid, t.Snrid}).Get(&data) if err != nil { return data, err } return data, nil } //分页 func (t *Snrtab) GetPage(pageSize int, pageIndex int) ([]Snrtab, int, error) { data := make([]Snrtab, 0) e := db.MasterEngine() query := e.Table("snrtab").Where("cid = ? ", t.Cid) table := e.Table("snrtab").Where("cid = ? ", t.Cid) if !utils.ValueIsEmpty(t.Snrid) { query = query.And("snrid = ?", t.Snrid) table = table.And("snrid = ?", t.Snrid) } Offset := (pageIndex - 1) * pageSize err := query.Limit(pageSize,Offset).Desc("credatuz").Find(&data) pcount := new(Snrtab) count, err := table.Count(pcount) if err != nil { return data, 0, err } for k, _ := range data { data[k].Clipped() } return data, int(count), nil } var slock sync.RWMutex // 获取指定序列的下一个流水号 func (t *Snrtab) GetNextSnr(snr string)(retsnr string, err error){ slock.Lock() defer slock.Unlock() var( snrtab Snrtab lastupdtime time.Time y, l_y, d, l_d, wk, l_wk int m,l_m time.Month layout []byte i, nextsnr int ) snrtab = Snrtab{} snrtab.Snrid = snr snrtab.Cid = t.Cid if snrtab, err = snrtab.SelectOne(); err != nil{ return } snrtab.Clipped() if snrtab.Lastnrcreate == ""{ nextsnr = snrtab.Nextnr }else { if lastupdtime, err = utils.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 + utils.Date(time.Now().Unix(), snrtab.Dateformat) case "3": //中缀 retsnr = retsnr + snrtab.Infix case "4": //流水号 if snrtab.Identifierformat == "CHAR" { retsnr = retsnr + utils.ConvInt2FormatString(nextsnr, snrtab.Length) }else{ retsnr = retsnr + strconv.Itoa(nextsnr) } case "5": //后缀 retsnr = retsnr + snrtab.Postfix } } //更新下一序列值 // 处理数值超限 snrtab.Nextnr = nextsnr + snrtab.Step snrtab.Lastnrcreate = utils.Date(time.Now().Unix(), "YYYYMMDDHHmmss") snrtab.Lastmodif = utils.Date(time.Now().Unix(), "YYYYMMDDHHmmss") if snrtab.Nextnr > snrtab.Endnr { switch strings.ToUpper(snrtab.Overflowhandling) { case "NO": case "RESET": snrtab.Nextnr = snrtab.Startnr } } if res := snrtab.Update(); !res { return } return }