SJA APS后端代码
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.

157 lines
4.5 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. package seq
  2. import (
  3. "fmt"
  4. "leit.com/leit_seat_aps/common"
  5. "leit.com/leit_seat_aps/db"
  6. "leit.com/leit_seat_aps/glog"
  7. "leit.com/leit_seat_aps/service"
  8. "strings"
  9. "time"
  10. )
  11. /**
  12. 基于产线排序派工下达逻辑
  13. 1. 按产线启动 Go Routine
  14. 2. 按产线加载未下达已计划的生产订单
  15. 3. 对于非混线的产线按照指定规则对订单队列排序按SEQ或SWET
  16. 4. 按照产线指定规则下达生产订单并同步更新客户订单状态
  17. **/
  18. func RunScheduler() (err error) {
  19. var (
  20. se service.SchedEngine
  21. bl_wl service.BL_Workline
  22. i int
  23. )
  24. se = service.SchedEngine{}
  25. se.PlanMode = common.LINE_PLAN_IN_SEQ
  26. se.LineTypes = append(se.LineTypes, "A", "M", "V")
  27. // 加载排序产线
  28. if err = se.LoadMasterData(); err != nil {
  29. return
  30. }
  31. // 按产线启动排序派工服务
  32. for i = 0; i < len(se.Wltablst); i++ {
  33. fmt.Println("Start line:", bl_wl.WorklineId, " schedule service!")
  34. bl_wl = service.BL_Workline{}
  35. bl_wl.PickTmpDict = make(map[string]service.BL_PickingTemplate)
  36. bl_wl.WorklineId = se.Wltablst[i].Worklineid
  37. bl_wl.SortMode = se.Wltablst[i].Taskqueuesortway
  38. if se.Wltablst[i].Multiqueuemixsort == 1 {
  39. bl_wl.MixSort = true
  40. bl_wl.MixSortMode = se.Wltablst[i].Taskqueuemixsortway
  41. bl_wl.MixSortRule = se.Wltablst[i].Mixsortlogic
  42. } else {
  43. bl_wl.MixSort = false
  44. }
  45. bl_wl.ReleaseMode = se.Wltablst[i].Taskreleaseway
  46. bl_wl.ReleaseValue = se.Wltablst[i].Releaseparameter
  47. bl_wl.Worklinetab = se.Wltablst[i]
  48. go ScheduleTaskToRelease(bl_wl, &se)
  49. }
  50. // 循环避免主函数退出
  51. for {
  52. time.Sleep(1 * time.Hour)
  53. }
  54. return
  55. }
  56. // 产线的排序派工服务
  57. // 1. 读取调度到产线的生产订单,状态 = 20
  58. // 2. 按照 swet 和 Oemseq 排序
  59. // 3. 根据指定规则下达生产订单
  60. func ScheduleTaskToRelease(bl_wl service.BL_Workline, se *service.SchedEngine) {
  61. var (
  62. err error
  63. workline db.Workline
  64. )
  65. // 循环加载产线的待派工的任务,并依次处理
  66. for {
  67. //查询产线信息
  68. if workline, err = bl_wl.SelectWorkline(); err != nil {
  69. glog.InfoExtln("排序调度", "LoadPlannedTask err: ", err)
  70. // 报错并返回
  71. return
  72. }
  73. bl_wl.SortMode = workline.Taskqueuesortway
  74. if workline.Multiqueuemixsort == 1 {
  75. bl_wl.MixSort = true
  76. bl_wl.MixSortMode = workline.Taskqueuemixsortway
  77. bl_wl.MixSortRule = workline.Mixsortlogic
  78. } else {
  79. bl_wl.MixSort = false
  80. }
  81. bl_wl.ReleaseMode = workline.Taskreleaseway
  82. bl_wl.ReleaseValue = workline.Releaseparameter
  83. bl_wl.Worklinetab = workline
  84. // 基于产线的派工策略获取派工订单
  85. bl_wolst := make([]service.BL_WorkOrder,0)
  86. switch bl_wl.ReleaseMode {
  87. case common.LINE_REL_BY_QTY:
  88. if bl_wolst,err = bl_wl.GetTaskToReleaseByQty(); err != nil {
  89. glog.InfoExtln("排序调度", "GetTaskToReleaseByQty1 err: ", err)
  90. errstr := err.Error()
  91. if ok := strings.Contains(errstr, "mssql: Transaction (Process ID"); ok {
  92. glog.InfoExtln("排序调度", "GetTaskToReleaseByQty2 err: ", err)
  93. time.Sleep(5 * time.Second)
  94. continue
  95. }
  96. // 报错并返回
  97. return
  98. }
  99. // 派工订单
  100. if err = bl_wl.ReleaseTasks(bl_wolst, se); err != nil {
  101. glog.InfoExtln("排序调度", "ReleaseTasks err: ", err)
  102. errstr := err.Error()
  103. if ok := strings.Contains(errstr, "mssql: Transaction (Process ID"); ok {
  104. time.Sleep(1 * time.Second)
  105. continue
  106. }
  107. // 报错并返回
  108. return
  109. }
  110. case common.LINE_REL_BY_OEMSEQ:
  111. if bl_wolst,err = bl_wl.GetTaskToReleaseByTime(); err != nil {
  112. glog.InfoExtln("排序调度", "GetTaskToReleaseByTime err: ", err)
  113. // 报错并返回
  114. return
  115. }
  116. // 派工订单
  117. if err = bl_wl.ReleaseTasks(bl_wolst, se); err != nil {
  118. glog.InfoExtln("排序调度", "ReleaseTasks err: ", err)
  119. errstr := err.Error()
  120. if ok := strings.Contains(errstr, "mssql: Transaction (Process ID"); ok {
  121. time.Sleep(1 * time.Second)
  122. continue
  123. }
  124. // 报错并返回
  125. return
  126. }
  127. case common.LINE_REL_BY_DURATION:
  128. if err = bl_wl.GetTaskToReleaseByDuration(&bl_wolst); err != nil {
  129. glog.InfoExtln("排序调度", "GetTaskToReleaseByDuration err: ", err)
  130. // 报错并返回
  131. return
  132. }
  133. // 派工订单
  134. if err = bl_wl.ReleaseTasks(bl_wolst, se); err != nil {
  135. glog.InfoExtln("排序调度", "ReleaseTasks err: ", err)
  136. errstr := err.Error()
  137. if ok := strings.Contains(errstr, "mssql: Transaction (Process ID"); ok {
  138. time.Sleep(1 * time.Second)
  139. continue
  140. }
  141. // 报错并返回
  142. return
  143. }
  144. }
  145. time.Sleep(2 * time.Second)
  146. }
  147. }