高级排程
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.

227 lines
6.9 KiB

  1. package service
  2. import (
  3. "LAPP_AS/common"
  4. om_model "LAPP_AS/models/om"
  5. "strconv"
  6. "strings"
  7. "time"
  8. )
  9. // 订单工序对象
  10. type OperationSrv struct{
  11. OperationNr int // 工序号
  12. SplitNr int // 工序拆分号
  13. OrderId string // 订单号
  14. SchedStatus int // 在内存中的调度状态:0:未调度;1:已调度
  15. Status int // 工序状态
  16. WorkPlaceGrpId string // 对应资源组号
  17. WorkPlaceId string // 计划工位号
  18. PlanQty float32
  19. ToolGrpId string // todo 按一组处理
  20. PlanToolId string
  21. PlanWorkPlaceId string
  22. SetupDuration time.Duration // 换型工时
  23. SetupStartTime time.Time // 换型开始
  24. SetupEndTime time.Time // 换型结束
  25. PlanDuration time.Duration // 计划工时
  26. PlanStartTime time.Time // 计划生产开始
  27. PlanEndTime time.Time // 计划生产结束
  28. PostDuration time.Duration // 后处理工时
  29. PostStartTime time.Time // 计划后处理开始
  30. PostEndTime time.Time // 计划后处理结束
  31. PrevOpDict map[string]OperationRelSrv // 前工序
  32. NextOpDict map[string]OperationRelSrv // 后工序
  33. AttributeDict map[int]OpAttributeSrv // 工序分配的属性
  34. ToolDemandDict map[string]OpToolDemandSrv // 工序的工具需求
  35. ArtDemandDict map[string]OpArticleDemandSrv // 工序的物料需求
  36. SkillDemandDict map[int]OpSkillDemandSrv // 工序的技能需求
  37. SecResDemandDict map[int]OpSecResourceDemandSrv // 工序的次要资源需求
  38. ArtYieldDict map[string]OpArticleYieldSrv // 工序的物料产出
  39. }
  40. // 工序分配的属性,用于匹配计划设备
  41. type OpAttributeSrv struct {
  42. AttributeNr int
  43. }
  44. // 工序的工具需求
  45. type OpToolDemandSrv struct {
  46. ToolGrpId string
  47. ReqQty float64
  48. Operation *OperationSrv
  49. }
  50. // 工序的物料需求
  51. type OpArticleDemandSrv struct {
  52. ArtId string
  53. ReqQty float64
  54. Operation *OperationSrv
  55. }
  56. // 工序的物料产出(中间品)
  57. type OpArticleYieldSrv struct {
  58. ArtId string
  59. YieldQty float64
  60. Operation *OperationSrv
  61. }
  62. // 工序的技能需求
  63. type OpSkillDemandSrv struct {
  64. SkillNr int
  65. ReqQty float64
  66. Operation *OperationSrv
  67. DemandPeriod string // 需求时段:SETUP / PROD / AFTERPROCESS
  68. }
  69. // 工序的次要资源需求
  70. type OpSecResourceDemandSrv struct {
  71. ResourceId string
  72. ReqQty float64
  73. Operation *OperationSrv
  74. DemandPeriod string // 需求时段:SETUP / PROD / AFTERPROCESS
  75. }
  76. // 获取工序键值:工序号-工序拆分号
  77. func(ops *OperationSrv)GetOpKey()(string){
  78. return strconv.Itoa(ops.OperationNr) + "-" + strconv.Itoa(ops.SplitNr)
  79. }
  80. // 获取工序键值:工序号-工序拆分号
  81. func(ops *OperationSrv)GetOrdOpKey()(string){
  82. return ops.OrderId + "-" + strconv.Itoa(ops.OperationNr) + "-" + strconv.Itoa(ops.SplitNr)
  83. }
  84. // 初始化
  85. func(ops *OperationSrv)Init(){
  86. ops.PrevOpDict = make(map[string]OperationRelSrv)
  87. ops.NextOpDict = make(map[string]OperationRelSrv)
  88. ops.AttributeDict = make(map[int]OpAttributeSrv)
  89. ops.ToolDemandDict = make(map[string]OpToolDemandSrv)
  90. ops.SkillDemandDict = make(map[int]OpSkillDemandSrv)
  91. ops.ArtDemandDict = make(map[string]OpArticleDemandSrv)
  92. ops.SecResDemandDict= make(map[int]OpSecResourceDemandSrv)
  93. ops.ArtYieldDict = make(map[string]OpArticleYieldSrv)
  94. }
  95. // 创建工序对象
  96. func(ops *OperationSrv)Create(optab om_model.WOOperation){
  97. var (
  98. optooltab om_model.WOOperationToolLst
  99. oparttab om_model.WOOperationArtLst
  100. opyieldtab om_model.WOOperationYieldLst
  101. oprestab om_model.WOOperationResourceLst
  102. opskilltab om_model.WOOperationSkillLst
  103. optoolsrv OpToolDemandSrv
  104. opskillsrv OpSkillDemandSrv
  105. opartsrv OpArticleDemandSrv
  106. opressrv OpSecResourceDemandSrv
  107. opyieldsrv OpArticleYieldSrv
  108. )
  109. ops.OrderId = optab.WorkOrderId
  110. ops.OperationNr = optab.OperationNr
  111. ops.SplitNr = optab.SplitNr
  112. ops.WorkPlaceGrpId = optab.WorkPlaceGrpId
  113. ops.WorkPlaceId = optab.WorkPlaceId
  114. ops.PrevOpDict = make(map[string]OperationRelSrv)
  115. ops.NextOpDict = make(map[string]OperationRelSrv)
  116. ops.AttributeDict = make(map[int]OpAttributeSrv)
  117. ops.ToolDemandDict = make(map[string]OpToolDemandSrv)
  118. ops.SkillDemandDict = make(map[int]OpSkillDemandSrv)
  119. ops.ArtDemandDict = make(map[string]OpArticleDemandSrv)
  120. ops.SecResDemandDict= make(map[int]OpSecResourceDemandSrv)
  121. ops.ArtYieldDict = make(map[string]OpArticleYieldSrv)
  122. //todo
  123. perItemSeconds := float64(optab.OpTimePerItem) * GetTimeUomSeconds(optab.DurationUomId)
  124. ops.PlanDuration = time.Duration(float64(optab.SetupDuration)*perItemSeconds) * time.Second
  125. // 加载工具需求
  126. for _, optooltab = range optab.Toollst {
  127. optoolsrv = OpToolDemandSrv{Operation: ops}
  128. optoolsrv.ToolGrpId = optooltab.ToolGrpId
  129. optoolsrv.ReqQty = optooltab.PlanQty
  130. ops.ToolDemandDict[optoolsrv.ToolGrpId] = optoolsrv
  131. //todo
  132. ops.ToolGrpId = optooltab.ToolGrpId
  133. }
  134. // 加载物料需求
  135. for _, oparttab = range optab.Artlst {
  136. opartsrv = OpArticleDemandSrv{Operation: ops}
  137. opartsrv.ArtId = oparttab.ArtId
  138. opartsrv.ReqQty = oparttab.PlanQty
  139. ops.ArtDemandDict[opartsrv.ArtId] = opartsrv
  140. }
  141. // 加载物料产出
  142. for _, opyieldtab = range optab.Yieldlst {
  143. opyieldsrv = OpArticleYieldSrv{Operation: ops}
  144. opyieldsrv.ArtId = opyieldtab.ArtId
  145. opyieldsrv.YieldQty = opyieldtab.PlanQty
  146. ops.ArtYieldDict[opartsrv.ArtId] = opyieldsrv
  147. }
  148. // 加载技能需求,需要区分需求时段
  149. for _, opskilltab = range optab.Skilllst {
  150. opskillsrv = OpSkillDemandSrv{Operation: ops}
  151. opskillsrv.SkillNr = opskilltab.SkillNr
  152. opskillsrv.ReqQty = opskilltab.PlanQty
  153. opskillsrv.DemandPeriod = opskilltab.OPDemandPeriod
  154. }
  155. // 加载次要资源需求,需要区分需求时段
  156. for _, oprestab = range optab.Resourcelst {
  157. opressrv = OpSecResourceDemandSrv{Operation: ops}
  158. opressrv.ResourceId = oprestab.ResourceId
  159. opressrv.ReqQty = oprestab.PlanQty
  160. opressrv.DemandPeriod = oprestab.OPDemandPeriod
  161. }
  162. }
  163. // 获取任务计划开始事件
  164. func(ops *OperationSrv)GetPlanStartEvent(t time.Time)(SchedEvent){
  165. var(
  166. opet OperationEvent
  167. )
  168. opet = OperationEvent{TriggerTime: t, EventType: EVENT_OBJ_OPTASK, Event: EVENT_TASK_PLANBEG}
  169. opet.OrderId = ops.OrderId
  170. opet.OperationNr = ops.OperationNr
  171. opet.SplitNr = ops.SplitNr
  172. return SchedEvent(opet)
  173. }
  174. // 获取任务计划结束事件
  175. func(ops *OperationSrv)GetPlanEndEvent(t time.Time)(SchedEvent){
  176. var(
  177. opet OperationEvent
  178. )
  179. opet = OperationEvent{TriggerTime: t, EventType: EVENT_OBJ_OPTASK, Event: EVENT_TASK_PLANEND}
  180. opet.OrderId = ops.OrderId
  181. opet.OperationNr = ops.OperationNr
  182. opet.SplitNr = ops.SplitNr
  183. return SchedEvent(opet)
  184. }
  185. // 基于时间单位获取秒数
  186. func GetTimeUomSeconds(uomId string)(seconds float64){
  187. seconds = 0
  188. switch strings.ToUpper(uomId) {
  189. case common.TIME_UOM_WEEK:
  190. seconds = 7 * 24 * 3600
  191. case common.TIME_UOM_DAY:
  192. seconds = 24 * 3600
  193. case common.TIME_UOM_HOUR:
  194. seconds = 3600
  195. case common.TIME_UOM_MINUTE:
  196. seconds = 60
  197. case common.TIME_UOM_SECOND:
  198. seconds = 1
  199. }
  200. return
  201. }