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

126 lines
3.4 KiB

3 years ago
3 years ago
3 years ago
  1. package service
  2. import (
  3. "time"
  4. )
  5. // 绝对时间线段
  6. type TimeLineSrv struct {
  7. StartTime time.Time // 时间曲线的起始时间点
  8. EndTime time.Time // 时间曲线的结束时间点
  9. Duration time.Duration
  10. EffFactor float64 // 效率因子
  11. WorkShiftNr int // 人员班组编号
  12. }
  13. // 初始化,获取时间差值 = (结束时间 - 开始时间) * 效率因子
  14. func (tlsrv *TimeLineSrv)Init(starttime, endtime time.Time){
  15. var seconds float64
  16. tlsrv.StartTime = starttime
  17. tlsrv.EndTime = endtime
  18. if tlsrv.EffFactor <= 0 {
  19. tlsrv.EffFactor = 1.0
  20. }
  21. if tlsrv.StartTime.Unix() > tlsrv.EndTime.Unix() {
  22. tlsrv.Duration = 0
  23. }else{
  24. seconds = tlsrv.EndTime.Sub(tlsrv.StartTime).Seconds() * tlsrv.EffFactor
  25. tlsrv.Duration = time.Duration(seconds) * time.Second
  26. }
  27. }
  28. // 获取时间线的Duration,不考虑效率因子
  29. func (tlsrv *TimeLineSrv)GetDuration()(duration time.Duration){
  30. if tlsrv.StartTime.Unix() > tlsrv.EndTime.Unix() {
  31. duration = 0
  32. return
  33. }else{
  34. duration = tlsrv.EndTime.Sub(tlsrv.StartTime)
  35. return
  36. }
  37. }
  38. // 获取时间线的Duration,考虑效率因子
  39. func (tlsrv *TimeLineSrv)GetEffDuration()(effDuration time.Duration){
  40. var seconds float64
  41. if tlsrv.StartTime.Unix() > tlsrv.EndTime.Unix() {
  42. effDuration = 0
  43. return
  44. }else{
  45. if tlsrv.EffFactor <= 0 {
  46. tlsrv.EffFactor = 1.0
  47. }
  48. seconds = tlsrv.EndTime.Sub(tlsrv.StartTime).Seconds() * tlsrv.EffFactor
  49. effDuration = time.Duration(seconds) * time.Second
  50. return
  51. }
  52. }
  53. // 基于线段的起始时间和持续时间计算在该线段上的结束时间
  54. func (tlsrv *TimeLineSrv)GetEndTimeByDuration(duration time.Duration)(endTime time.Time){
  55. var seconds float64
  56. if tlsrv.Duration <= duration{
  57. endTime = tlsrv.EndTime
  58. return
  59. }else{
  60. if tlsrv.EffFactor <= 0 {
  61. tlsrv.EffFactor = 1.0
  62. }
  63. seconds = duration.Seconds() / tlsrv.EffFactor
  64. endTime = tlsrv.EndTime.Add(-time.Duration(seconds) * time.Second)
  65. return
  66. }
  67. return
  68. }
  69. // 基于落在线段内的起始时间计算到线段结束的Duration
  70. func (tlsrv *TimeLineSrv)GetDurationByStartTime(startTime time.Time)(duration time.Duration){
  71. var seconds float64
  72. if startTime.Unix() >= tlsrv.EndTime.Unix(){
  73. duration = 0
  74. return
  75. }
  76. if startTime.Unix() < tlsrv.StartTime.Unix(){
  77. duration = tlsrv.Duration
  78. return
  79. }
  80. seconds = tlsrv.EndTime.Sub(startTime).Seconds() * tlsrv.EffFactor
  81. duration = time.Duration(seconds) * time.Second
  82. return
  83. }
  84. // 基于落在线段的起始时间计算到指定结束时间的Duration
  85. func (tlsrv *TimeLineSrv)GetDurationByEndTime(endTime time.Time)(duration time.Duration){
  86. var seconds float64
  87. if endTime.Unix() <= tlsrv.StartTime.Unix(){
  88. duration = 0
  89. return
  90. }
  91. if endTime.Unix() >= tlsrv.EndTime.Unix(){
  92. duration = tlsrv.Duration
  93. return
  94. }
  95. seconds = endTime.Sub(tlsrv.StartTime).Seconds() * tlsrv.EffFactor
  96. duration = time.Duration(seconds) * time.Second
  97. return
  98. }
  99. // 获取线段上两个时间点之间的Duration
  100. func (tlsrv *TimeLineSrv)GetDurationByStartEndTime(startTime, endTime time.Time)(duration time.Duration){
  101. var seconds float64
  102. if startTime.Unix() < tlsrv.StartTime.Unix(){
  103. startTime = tlsrv.StartTime
  104. }
  105. if endTime.Unix() > tlsrv.EndTime.Unix(){
  106. endTime = tlsrv.EndTime
  107. }
  108. if endTime.Unix() <= startTime.Unix(){
  109. duration = 0
  110. return
  111. }
  112. seconds = endTime.Sub(startTime).Seconds() * tlsrv.EffFactor
  113. duration = time.Duration(seconds) * time.Second
  114. return
  115. }