SJA工艺
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.

223 lines
6.6 KiB

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