第二代基于事件的高级计划排程引擎
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.

199 lines
6.1 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. package service
  2. import (
  3. "leit.com/aps_engine/models"
  4. "strconv"
  5. "time"
  6. )
  7. // 订单工序对象
  8. type OperationSrv struct{
  9. OperationNr int // 工序号
  10. SplitNr int // 工序拆分号
  11. OrderId string // 订单号
  12. SchedStatus int // 在内存中的调度状态:0:未调度;1:已调度
  13. Status int // 工序状态
  14. WorkPlaceGrpNr int // 对应资源组号
  15. WorkPlaceNr int // 计划工位号
  16. PlanQty float32
  17. ToolGrpNr int
  18. PlanToolNr int
  19. PlanWorkPlaceNr int
  20. SetupDuration time.Duration // 换型工时
  21. SetupStartTime time.Time // 换型开始
  22. SetupEndTime time.Time // 换型结束
  23. PlanDuration time.Duration // 计划工时
  24. PlanStartTime time.Time // 计划生产开始
  25. PlanEndTime time.Time // 计划生产结束
  26. PostDuration time.Duration // 后处理工时
  27. PostStartTime time.Time // 计划后处理开始
  28. PostEndTime time.Time // 计划后处理结束
  29. PrevOpDict map[string]OperationRelSrv // 前工序
  30. NextOpDict map[string]OperationRelSrv // 后工序
  31. AttributeDict map[int]OpAttributeSrv // 工序分配的属性
  32. ToolDemandDict map[int]OpToolDemandSrv // 工序的工具需求
  33. ArtDemandDict map[string]OpArticleDemandSrv // 工序的物料需求
  34. SkillDemandDict map[int]OpSkillDemandSrv // 工序的技能需求
  35. SecResDemandDict map[int]OpSecResourceDemandSrv // 工序的次要资源需求
  36. ArtYieldDict map[string]OpArticleYieldSrv // 工序的物料产出
  37. }
  38. // 工序分配的属性,用于匹配计划设备
  39. type OpAttributeSrv struct {
  40. AttributeNr int
  41. }
  42. // 工序的工具需求
  43. type OpToolDemandSrv struct {
  44. ToolGrpNr int
  45. ReqQty float32
  46. Operation *OperationSrv
  47. }
  48. // 工序的物料需求
  49. type OpArticleDemandSrv struct {
  50. ArtId string
  51. ReqQty float32
  52. Operation *OperationSrv
  53. }
  54. // 工序的物料产出(中间品)
  55. type OpArticleYieldSrv struct {
  56. ArtId string
  57. YieldQty float32
  58. Operation *OperationSrv
  59. }
  60. // 工序的技能需求
  61. type OpSkillDemandSrv struct {
  62. SkillNr int
  63. ReqQty float32
  64. Operation *OperationSrv
  65. DemandPeriod string // 需求时段:SETUP / PROD / AFTERPROCESS
  66. }
  67. // 工序的次要资源需求
  68. type OpSecResourceDemandSrv struct {
  69. ResourceNr int
  70. ReqQty float32
  71. Operation *OperationSrv
  72. DemandPeriod string // 需求时段:SETUP / PROD / AFTERPROCESS
  73. }
  74. // 获取工序键值:工序号-工序拆分号
  75. func(ops *OperationSrv)GetOpKey()(string){
  76. return strconv.Itoa(ops.OperationNr) + "-" + strconv.Itoa(ops.SplitNr)
  77. }
  78. // 获取工序键值:工序号-工序拆分号
  79. func(ops *OperationSrv)GetOrdOpKey()(string){
  80. return ops.OrderId + "-" + strconv.Itoa(ops.OperationNr) + "-" + strconv.Itoa(ops.SplitNr)
  81. }
  82. // 初始化
  83. func(ops *OperationSrv)Init(){
  84. ops.PrevOpDict = make(map[string]OperationRelSrv)
  85. ops.NextOpDict = make(map[string]OperationRelSrv)
  86. ops.AttributeDict = make(map[int]OpAttributeSrv)
  87. ops.ToolDemandDict = make(map[int]OpToolDemandSrv)
  88. ops.SkillDemandDict = make(map[int]OpSkillDemandSrv)
  89. ops.ArtDemandDict = make(map[string]OpArticleDemandSrv)
  90. ops.SecResDemandDict= make(map[int]OpSecResourceDemandSrv)
  91. ops.ArtYieldDict = make(map[string]OpArticleYieldSrv)
  92. }
  93. // 创建工序对象
  94. func(ops *OperationSrv)Create(optab models.OmWooperation){
  95. var (
  96. optooltab models.OmWooperationtoollst
  97. oparttab models.OmWooperationartlst
  98. opyieldtab models.OmWooperationyieldlst
  99. oprestab models.OmWooperationresourcelst
  100. opskilltab models.OmWooperationskilllst
  101. optoolsrv OpToolDemandSrv
  102. opskillsrv OpSkillDemandSrv
  103. opartsrv OpArticleDemandSrv
  104. opressrv OpSecResourceDemandSrv
  105. opyieldsrv OpArticleYieldSrv
  106. )
  107. ops.OrderId = optab.Workorderid
  108. ops.OperationNr = optab.Operationnr
  109. ops.SplitNr = optab.Splitnr
  110. ops.WorkPlaceGrpNr = optab.Workplacegrpnr
  111. ops.WorkPlaceNr = optab.Workplacenr
  112. ops.PrevOpDict = make(map[string]OperationRelSrv)
  113. ops.NextOpDict = make(map[string]OperationRelSrv)
  114. ops.AttributeDict = make(map[int]OpAttributeSrv)
  115. ops.ToolDemandDict = make(map[int]OpToolDemandSrv)
  116. ops.SkillDemandDict = make(map[int]OpSkillDemandSrv)
  117. ops.ArtDemandDict = make(map[string]OpArticleDemandSrv)
  118. ops.SecResDemandDict= make(map[int]OpSecResourceDemandSrv)
  119. ops.ArtYieldDict = make(map[string]OpArticleYieldSrv)
  120. // 加载工具需求
  121. for _, optooltab = range optab.Toollst {
  122. optoolsrv = OpToolDemandSrv{Operation: ops}
  123. optoolsrv.ToolGrpNr = optooltab.Toolgrpnr
  124. optoolsrv.ReqQty = optooltab.Planqty
  125. ops.ToolDemandDict[optoolsrv.ToolGrpNr] = optoolsrv
  126. }
  127. // 加载物料需求
  128. for _, oparttab = range optab.Artlst {
  129. opartsrv = OpArticleDemandSrv{Operation: ops}
  130. opartsrv.ArtId = oparttab.Artid
  131. opartsrv.ReqQty = oparttab.Planqty
  132. ops.ArtDemandDict[opartsrv.ArtId] = opartsrv
  133. }
  134. // 加载物料产出
  135. for _, opyieldtab = range optab.Yieldlst {
  136. opyieldsrv = OpArticleYieldSrv{Operation: ops}
  137. opyieldsrv.ArtId = opyieldtab.Artid
  138. opyieldsrv.YieldQty = opyieldtab.Planqty
  139. ops.ArtYieldDict[opartsrv.ArtId] = opyieldsrv
  140. }
  141. // 加载技能需求,需要区分需求时段
  142. for _, opskilltab = range optab.Skilllst {
  143. opskillsrv = OpSkillDemandSrv{Operation: ops}
  144. opskillsrv.SkillNr = opskilltab.Skillnr
  145. opskillsrv.ReqQty = opskilltab.Planqty
  146. opskillsrv.DemandPeriod = opskilltab.Opdemandperiod
  147. }
  148. // 加载次要资源需求,需要区分需求时段
  149. for _, oprestab = range optab.Resourcelst {
  150. opressrv = OpSecResourceDemandSrv{Operation: ops}
  151. opressrv.ResourceNr = oprestab.Resourcenr
  152. opressrv.ReqQty = oprestab.Planqty
  153. opressrv.DemandPeriod = oprestab.Opdemandperiod
  154. }
  155. }
  156. // 获取任务计划开始事件
  157. func(ops *OperationSrv)GetPlanStartEvent(t time.Time)(SchedEvent){
  158. var(
  159. opet OperationEvent
  160. )
  161. opet = OperationEvent{TriggerTime: t, EventType: EVENT_OBJ_OPTASK, Event: EVENT_TASK_PLANBEG}
  162. opet.OrderId = ops.OrderId
  163. opet.OperationNr = ops.OperationNr
  164. opet.SplitNr = ops.SplitNr
  165. return SchedEvent(opet)
  166. }
  167. // 获取任务计划结束事件
  168. func(ops *OperationSrv)GetPlanEndEvent(t time.Time)(SchedEvent){
  169. var(
  170. opet OperationEvent
  171. )
  172. opet = OperationEvent{TriggerTime: t, EventType: EVENT_OBJ_OPTASK, Event: EVENT_TASK_PLANEND}
  173. opet.OrderId = ops.OrderId
  174. opet.OperationNr = ops.OperationNr
  175. opet.SplitNr = ops.SplitNr
  176. return SchedEvent(opet)
  177. }