沈阳玫苑物业管理后端
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.

228 lines
6.4 KiB

  1. package models
  2. import (
  3. "lapp_-wy/db"
  4. "lapp_-wy/utils"
  5. "strconv"
  6. "strings"
  7. "sync"
  8. "time"
  9. "xorm.io/core"
  10. "errors"
  11. )
  12. type Snrtab struct {
  13. Cid int `xorm:"pk comment('工厂号') Int" json:"snrtab-cid"`
  14. Snrid string `xorm:"pk comment('Id') VARCHAR(12)" json:"snrtab-snrid"`
  15. Descr string `xorm:"comment('描述') VARCHAR(30)" json:"snrtab-descr"`
  16. Validfrom string `xorm:"comment('有效起始日期') VARCHAR(8)" json:"snrtab-validfrom"`
  17. Validto string `xorm:"comment('有效截至日期') VARCHAR(8)" json:"snrtab-validto"`
  18. Prefix string `xorm:"comment('前缀') VARCHAR(20)" json:"snrtab-prefix"`
  19. Infix string `xorm:"comment('中缀') VARCHAR(20)" json:"snrtab-infix"`
  20. Postfix string `xorm:"comment('后缀') VARCHAR(20)" json:"snrtab-postfix"`
  21. Startnr int `xorm:"comment('流水号起始值') INT" json:"snrtab-startnr"`
  22. Endnr int `xorm:"comment('流水号截止值') INT" json:"snrtab-endnr"`
  23. Step int `xorm:"comment('步幅') INT" json:"snrtab-step"`
  24. Length int `xorm:"comment('长度') INT" json:"snrtab-length"`
  25. Nextnr int `xorm:"comment('下一流水号') INT" json:"snrtab-nextnr"`
  26. Lastnrcreate string `xorm:"comment('上个序号创建时间') VARCHAR(14)" json:"snrtab-lastnrcreate"`
  27. Resetnrrule string `xorm:"comment('序号重置规则') VARCHAR(10)" json:"snrtab-resetnrrule"`
  28. Overflowhandling string `xorm:"comment('序号溢出处理') VARCHAR(10)" json:"snrtab-overflowhandling"`
  29. Identifierformat string `xorm:"comment('流水号格式') VARCHAR(10)" json:"snrtab-identifierformat"`
  30. Datevariable string `xorm:"comment('日期变量') VARCHAR(20)" json:"snrtab-datevariable"`
  31. Dateformat string `xorm:"comment('日期格式') VARCHAR(14)" json:"snrtab-dateformat"`
  32. Identifierlayout string `xorm:"comment('标识符布局') VARCHAR(5)" json:"snrtab-identifierlayout"`
  33. Lastmodif string `xorm:"comment('最近一次更改时间') VARCHAR(14)" json:"snrtab-lastmodif"`
  34. Lastuser string `xorm:"comment('最近一次更改人') VARCHAR(20)" json:"snrtab-lastuser"`
  35. Credatuz string `xorm:"comment('创建时间') VARCHAR(14)" json:"snrtab-credatuz"`
  36. }
  37. func (t *Snrtab) TableName() string {
  38. return "snrtab"
  39. }
  40. // 清除string字段的右侧空格
  41. func (t *Snrtab) Clipped() {
  42. utils.TrimStruct(t, *t)
  43. }
  44. //增
  45. func (t *Snrtab) Add() error {
  46. e := db.MasterEngine()
  47. countrole := new(Snrtab)
  48. affw, err := e.Table("snrtab").ID(core.PK{t.Cid, t.Snrid}).Count(countrole)
  49. if err != nil {
  50. return err
  51. }
  52. if affw > 0 {
  53. return errors.New("数据已经存在!")
  54. }
  55. _, err = e.Table("snrtab").Insert(t)
  56. if err != nil {
  57. return err
  58. }
  59. return nil
  60. }
  61. //删
  62. func (t *Snrtab) Del() bool {
  63. e := db.MasterEngine()
  64. _, err := e.ID(core.PK{t.Cid, t.Snrid}).Delete(&Snrtab{})
  65. if err != nil {
  66. return false
  67. }
  68. return true
  69. }
  70. //改
  71. func (t *Snrtab) Update() bool {
  72. e := db.MasterEngine()
  73. _, err := e.ID(core.PK{t.Cid, t.Snrid}).Update(t)
  74. if err != nil {
  75. return false
  76. }
  77. return true
  78. }
  79. //查
  80. func (t *Snrtab) SelectOne() (Snrtab, error) {
  81. e := db.MasterEngine()
  82. var data Snrtab
  83. _, err := e.ID(core.PK{t.Cid, t.Snrid}).Get(&data)
  84. if err != nil {
  85. return data, err
  86. }
  87. return data, nil
  88. }
  89. //分页
  90. func (t *Snrtab) GetPage(pageSize int, pageIndex int) ([]Snrtab, int, error) {
  91. data := make([]Snrtab, 0)
  92. e := db.MasterEngine()
  93. query := e.Table("snrtab").Where("cid = ? ", t.Cid)
  94. table := e.Table("snrtab").Where("cid = ? ", t.Cid)
  95. if !utils.ValueIsEmpty(t.Snrid) {
  96. query = query.And("snrid = ?", t.Snrid)
  97. table = table.And("snrid = ?", t.Snrid)
  98. }
  99. Offset := (pageIndex - 1) * pageSize
  100. err := query.Limit(pageSize,Offset).Desc("credatuz").Find(&data)
  101. pcount := new(Snrtab)
  102. count, err := table.Count(pcount)
  103. if err != nil {
  104. return data, 0, err
  105. }
  106. for k, _ := range data {
  107. data[k].Clipped()
  108. }
  109. return data, int(count), nil
  110. }
  111. var slock sync.RWMutex
  112. // 获取指定序列的下一个流水号
  113. func (t *Snrtab) GetNextSnr(snr string)(retsnr string, err error){
  114. slock.Lock()
  115. defer slock.Unlock()
  116. var(
  117. snrtab Snrtab
  118. lastupdtime time.Time
  119. y, l_y, d, l_d, wk, l_wk int
  120. m,l_m time.Month
  121. layout []byte
  122. i, nextsnr int
  123. )
  124. snrtab = Snrtab{}
  125. snrtab.Snrid = snr
  126. snrtab.Cid = t.Cid
  127. if snrtab, err = snrtab.SelectOne(); err != nil{
  128. return
  129. }
  130. snrtab.Clipped()
  131. if snrtab.Lastnrcreate == ""{
  132. nextsnr = snrtab.Nextnr
  133. }else {
  134. if lastupdtime, err = utils.DateParse(snrtab.Lastnrcreate, "YmdHis"); err != nil {
  135. return
  136. }
  137. // 获取下一序列值
  138. y = time.Now().Year()
  139. m = time.Now().Month()
  140. d = time.Now().Day()
  141. _, wk = time.Now().ISOWeek()
  142. l_y = lastupdtime.Year()
  143. l_m = lastupdtime.Month()
  144. l_d = lastupdtime.Day()
  145. _, l_wk = lastupdtime.ISOWeek()
  146. switch strings.ToUpper(snrtab.Resetnrrule) {
  147. case "DAILY":
  148. if y == l_y && m == l_m && wk == l_wk && d == l_d {
  149. nextsnr = snrtab.Nextnr
  150. }else{
  151. nextsnr = snrtab.Startnr
  152. }
  153. case "WEEKLY":
  154. if y == l_y && m == l_m && wk == l_wk {
  155. nextsnr = snrtab.Nextnr
  156. }else{
  157. nextsnr = snrtab.Startnr
  158. }
  159. case "MONTHLY":
  160. if y == l_y && m == l_m {
  161. nextsnr = snrtab.Nextnr
  162. }else{
  163. nextsnr = snrtab.Startnr
  164. }
  165. case "YEARLY":
  166. if y == l_y {
  167. nextsnr = snrtab.Nextnr
  168. }else{
  169. nextsnr = snrtab.Startnr
  170. }
  171. case "NEVER":
  172. nextsnr = snrtab.Nextnr
  173. default:
  174. nextsnr = snrtab.Nextnr
  175. }
  176. }
  177. // 组合返回值
  178. layout = []byte(snrtab.Identifierlayout)
  179. for i = 0; i < len(layout); i++ {
  180. switch string(layout[i]) {
  181. case "1": //前缀
  182. retsnr = retsnr + snrtab.Prefix
  183. case "2": //日期变量
  184. retsnr = retsnr + utils.Date(time.Now().Unix(), snrtab.Dateformat)
  185. case "3": //中缀
  186. retsnr = retsnr + snrtab.Infix
  187. case "4": //流水号
  188. if snrtab.Identifierformat == "CHAR" {
  189. retsnr = retsnr + utils.ConvInt2FormatString(nextsnr, snrtab.Length)
  190. }else{
  191. retsnr = retsnr + strconv.Itoa(nextsnr)
  192. }
  193. case "5": //后缀
  194. retsnr = retsnr + snrtab.Postfix
  195. }
  196. }
  197. //更新下一序列值
  198. // 处理数值超限
  199. snrtab.Nextnr = nextsnr + snrtab.Step
  200. snrtab.Lastnrcreate = utils.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
  201. snrtab.Lastmodif = utils.Date(time.Now().Unix(), "YYYYMMDDHHmmss")
  202. if snrtab.Nextnr > snrtab.Endnr {
  203. switch strings.ToUpper(snrtab.Overflowhandling) {
  204. case "NO":
  205. case "RESET":
  206. snrtab.Nextnr = snrtab.Startnr
  207. }
  208. }
  209. if res := snrtab.Update(); !res {
  210. return
  211. }
  212. return
  213. }