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

674 lines
19 KiB

  1. package service
  2. import (
  3. "LAPP_AS/utils"
  4. "container/list"
  5. "fmt"
  6. "time"
  7. )
  8. type TimeCurveSrv struct {
  9. StartTime time.Time // 时间曲线的起始时间点
  10. EndTime time.Time // 时间曲线的结束时间点
  11. EffFactor float64 // 效率因子
  12. TimeLineArray []TimeLineSrv
  13. TimeLineList *list.List
  14. }
  15. // 初始化
  16. func(tcs *TimeCurveSrv)Init(starttime, endtime time.Time){
  17. tcs.StartTime = starttime
  18. tcs.EndTime = endtime
  19. tcs.TimeLineArray = []TimeLineSrv{}
  20. }
  21. // 将时间数组转化成列表
  22. func (tcs *TimeCurveSrv) GetLineList() {
  23. // 初始化
  24. tcs.TimeLineList = list.New()
  25. for _, tlsrv := range tcs.TimeLineArray {
  26. tcs.TimeLineList.PushBack(tlsrv)
  27. }
  28. }
  29. // 将时间列表转化成数组
  30. func (tcs *TimeCurveSrv) GetLineArray() {
  31. // 初始化数组
  32. tcs.TimeLineArray = []TimeLineSrv{}
  33. for e := tcs.TimeLineList.Front(); e != nil; e = e.Next() {
  34. tlsrv := e.Value.(TimeLineSrv)
  35. tcs.TimeLineArray = append(tcs.TimeLineArray, tlsrv)
  36. }
  37. }
  38. // 获取某时间点在时间曲线上的位置(哪条时间线上)
  39. func (tcs *TimeCurveSrv) GetTimeLine(tp time.Time) (node *list.Element, err error) {
  40. var (
  41. e *list.Element
  42. tl, prevtl TimeLineSrv
  43. )
  44. /** 如果结束时间点小于计划曲线的起始时间点
  45. |-------------------|
  46. *
  47. *
  48. */
  49. if tp.Unix() < tcs.StartTime.Unix() || tp.Unix() > tcs.EndTime.Unix() {
  50. node = nil
  51. fmt.Println(11)
  52. return
  53. }
  54. for e = tcs.TimeLineList.Front(); e != nil; e = e.Next() {
  55. tl = e.Value.(TimeLineSrv)
  56. if tp.Unix() >= tl.StartTime.Unix() && tp.Unix() <= tl.EndTime.Unix() {
  57. node = e
  58. return
  59. }
  60. // 如果正好落在两段时间之内不可用时段,则返回后面时段的位置
  61. if e.Prev() != nil {
  62. prevtl = e.Prev().Value.(TimeLineSrv)
  63. if tp.Unix() >= prevtl.EndTime.Unix() && tp.Unix() <= tl.StartTime.Unix() {
  64. node = e
  65. return
  66. }
  67. }
  68. }
  69. node = nil
  70. return
  71. }
  72. // 删除指定时间线节点之后的所有节点
  73. func (tcs *TimeCurveSrv) RemoveListAllAfterItem(delNode *list.Element, delItem bool) (err error) {
  74. var (
  75. e, el, next, n *list.Element
  76. )
  77. // 删除litem之后所有的节点
  78. for e = tcs.TimeLineList.Front(); e != nil; e = e.Next() {
  79. if delNode == e {
  80. next = e.Next()
  81. if delItem {
  82. tcs.TimeLineList.Remove(e)
  83. }
  84. for el = next; el != nil; el = n {
  85. n = el.Next()
  86. tcs.TimeLineList.Remove(el)
  87. }
  88. break
  89. }
  90. }
  91. return
  92. }
  93. // 删除指定时间线节点之前的所有节点
  94. func (tcs *TimeCurveSrv) RemoveListAllBeforeItem(delNode *list.Element, delItem bool) (err error) {
  95. var (
  96. e, el, prev, p *list.Element
  97. )
  98. // 删除litem之前所有的节点
  99. for e = tcs.TimeLineList.Front(); e != nil; e = e.Next() {
  100. if delNode == e {
  101. prev = e.Prev()
  102. if delItem {
  103. tcs.TimeLineList.Remove(e)
  104. }
  105. for el = prev; el != nil; el = p {
  106. p = el.Prev()
  107. tcs.TimeLineList.Remove(el)
  108. }
  109. break
  110. }
  111. }
  112. return
  113. }
  114. // 增加工作时段
  115. func (tcs *TimeCurveSrv) AddTimeLine(addtlsrv TimeLineSrv) (err error) {
  116. var (
  117. tlsrv TimeLineSrv
  118. tl, tlb, tle *TimeLineSrv
  119. e, next, nodeBeg, nodeEnd *list.Element
  120. )
  121. if addtlsrv.EndTime.Unix() <= addtlsrv.StartTime.Unix() {
  122. return
  123. }
  124. /** 如果结束时间点小于计划曲线的起始时间点
  125. |-------------------|
  126. <---->
  127. */
  128. if addtlsrv.EndTime.Unix() <= tcs.StartTime.Unix() {
  129. return
  130. }
  131. /** 如果计算起始时间点大于等于计划曲线的起始时间点
  132. |--------------------|
  133. <----------->
  134. */
  135. if addtlsrv.StartTime.Unix() >= tcs.EndTime.Unix() {
  136. return
  137. }
  138. /** |-------------------|
  139. <--------------------------->
  140. */
  141. if addtlsrv.StartTime.Unix() < tcs.StartTime.Unix() && addtlsrv.EndTime.Unix() > tcs.EndTime.Unix() {
  142. tlsrv = TimeLineSrv{}
  143. tlsrv.StartTime = addtlsrv.StartTime
  144. tlsrv.EndTime = addtlsrv.EndTime
  145. tlsrv.EffFactor = addtlsrv.EffFactor
  146. tcs.TimeLineList.Init()
  147. tcs.StartTime = addtlsrv.StartTime
  148. tcs.EndTime = addtlsrv.EndTime
  149. tcs.EffFactor = addtlsrv.EffFactor
  150. tcs.TimeLineList.PushBack(tlsrv)
  151. return
  152. }
  153. /** |-------------------|
  154. <------>
  155. */
  156. if addtlsrv.StartTime.Unix() < tcs.StartTime.Unix() && addtlsrv.EndTime.Unix() > tcs.StartTime.Unix() && addtlsrv.EndTime.Unix() <= tcs.EndTime.Unix() {
  157. if nodeEnd, err = tcs.GetTimeLine(addtlsrv.EndTime); err != nil {
  158. return
  159. }
  160. if nodeEnd != nil {
  161. tl = nodeEnd.Value.(*TimeLineSrv)
  162. tl.StartTime = addtlsrv.StartTime
  163. tcs.RemoveListAllBeforeItem(nodeEnd, false)
  164. tcs.StartTime = addtlsrv.StartTime
  165. } else {
  166. // 删除时段内的节点
  167. for e = tcs.TimeLineList.Front(); e != nil; e = next {
  168. next = e.Next()
  169. tl = e.Value.(*TimeLineSrv)
  170. if tl.StartTime.Unix() > addtlsrv.StartTime.Unix() && tl.EndTime.Unix() < addtlsrv.EndTime.Unix() {
  171. tcs.TimeLineList.Remove(e)
  172. }
  173. }
  174. tlsrv = TimeLineSrv{}
  175. tlsrv.StartTime = addtlsrv.StartTime
  176. tlsrv.EndTime = addtlsrv.EndTime
  177. tlsrv.EffFactor = tcs.EffFactor
  178. tcs.TimeLineList.PushFront(tlsrv)
  179. tcs.StartTime = addtlsrv.StartTime
  180. }
  181. }
  182. /** |-------------------|
  183. <------>
  184. */
  185. if addtlsrv.StartTime.Unix() >= tcs.StartTime.Unix() && addtlsrv.EndTime.Unix() <= tcs.EndTime.Unix() {
  186. if nodeBeg, err = tcs.GetTimeLine(addtlsrv.StartTime); err != nil {
  187. return
  188. }
  189. if nodeEnd, err = tcs.GetTimeLine(addtlsrv.EndTime); err != nil {
  190. return
  191. }
  192. /** 落在可用时段内
  193. 情况一 |-------|
  194. |****|
  195. **/
  196. if nodeBeg != nil && nodeEnd == nil {
  197. tlb = nodeBeg.Value.(*TimeLineSrv)
  198. // 删除开始节点之后到结束时间点之间的Node
  199. for e = nodeBeg.Next(); e != nil; e = next {
  200. next = e.Next()
  201. tl = e.Value.(*TimeLineSrv)
  202. if tl.EndTime.Unix() <= addtlsrv.EndTime.Unix() {
  203. tcs.TimeLineList.Remove(e)
  204. } else {
  205. break
  206. }
  207. }
  208. // 更新开始节点的结束时间
  209. tlb.EndTime = addtlsrv.EndTime
  210. }
  211. /**
  212. 情况二 |-------| |-------|
  213. |***|
  214. **/
  215. if nodeBeg == nil && nodeEnd == nil {
  216. tlsrv = TimeLineSrv{}
  217. tlsrv.StartTime = addtlsrv.StartTime
  218. tlsrv.EndTime = addtlsrv.EndTime
  219. tlsrv.EffFactor = addtlsrv.EffFactor
  220. // 删除开始节点之后到结束时间点之间的Node
  221. for e = tcs.TimeLineList.Front(); e != nil; e = next {
  222. next = e.Next()
  223. tl = e.Value.(*TimeLineSrv)
  224. if tl.StartTime.Unix() > addtlsrv.StartTime.Unix() && tl.EndTime.Unix() < addtlsrv.EndTime.Unix() {
  225. tcs.TimeLineList.Remove(e)
  226. }
  227. }
  228. // 添加节点到时间曲线中
  229. for e = tcs.TimeLineList.Front(); e != nil; e = next {
  230. tl = e.Value.(*TimeLineSrv)
  231. if tl.EndTime.Unix() >= tlsrv.StartTime.Unix() {
  232. tcs.TimeLineList.InsertAfter(tlsrv, e)
  233. break
  234. }
  235. }
  236. }
  237. /**
  238. 情况三 |-------| |-------|
  239. |**|
  240. **/
  241. if nodeBeg == nil && nodeEnd != nil {
  242. tle = nodeEnd.Value.(*TimeLineSrv)
  243. // 删除开始节点到结束时间点之间的Node
  244. for e = tcs.TimeLineList.Front(); e != nil; e = next {
  245. next = e.Next()
  246. tl = e.Value.(*TimeLineSrv)
  247. if tl.StartTime.Unix() > addtlsrv.StartTime.Unix() && tl.EndTime.Unix() < addtlsrv.EndTime.Unix() {
  248. tcs.TimeLineList.Remove(e)
  249. }
  250. }
  251. // 更新结束节点的开始时间
  252. tle.StartTime = addtlsrv.StartTime
  253. }
  254. /**
  255. 情况四 |-------| |-------|
  256. |****|
  257. */
  258. if nodeBeg != nil && nodeEnd != nil {
  259. if nodeBeg != nodeEnd {
  260. tlb = nodeBeg.Value.(*TimeLineSrv)
  261. tle = nodeEnd.Value.(*TimeLineSrv)
  262. if tlb != tle {
  263. // 删除两节点之间的所有节点
  264. for e = nodeBeg.Next(); e != nil && e != nodeEnd; e = next {
  265. next = e.Next()
  266. tcs.TimeLineList.Remove(e)
  267. }
  268. // 更新起始时间点
  269. tlb.EndTime = tle.EndTime
  270. tcs.TimeLineList.Remove(nodeEnd)
  271. }
  272. }
  273. }
  274. }
  275. /** |-------------------|
  276. <------>
  277. */
  278. if addtlsrv.StartTime.Unix() >= tcs.StartTime.Unix() && addtlsrv.StartTime.Unix() < tcs.EndTime.Unix() && addtlsrv.EndTime.Unix() > tcs.EndTime.Unix() {
  279. if nodeBeg, err = tcs.GetTimeLine(addtlsrv.StartTime); err != nil {
  280. return
  281. }
  282. if nodeBeg != nil {
  283. tl = nodeBeg.Value.(*TimeLineSrv)
  284. tl.EndTime = addtlsrv.EndTime
  285. tcs.RemoveListAllAfterItem(nodeBeg, false)
  286. tcs.EndTime = addtlsrv.EndTime
  287. } else {
  288. // 删除时段内的节点
  289. for e = tcs.TimeLineList.Front(); e != nil; e = next {
  290. next = e.Next()
  291. tl = e.Value.(*TimeLineSrv)
  292. if tl.StartTime.Unix() > addtlsrv.StartTime.Unix() && tl.EndTime.Unix() < addtlsrv.EndTime.Unix() {
  293. tcs.TimeLineList.Remove(e)
  294. }
  295. }
  296. tlsrv = TimeLineSrv{}
  297. tlsrv.StartTime = addtlsrv.StartTime
  298. tlsrv.EndTime = addtlsrv.EndTime
  299. tlsrv.EffFactor = addtlsrv.EffFactor
  300. tcs.TimeLineList.PushBack(tlsrv)
  301. tcs.EndTime = addtlsrv.EndTime
  302. }
  303. }
  304. return
  305. }
  306. // 减少工作时段
  307. func (tcs *TimeCurveSrv) SubTimeLine(subtlsrv TimeLineSrv) (err error) {
  308. var (
  309. tlsrv TimeLineSrv
  310. tl, tlb, tle TimeLineSrv
  311. e, next, nodeBeg, nodeEnd *list.Element
  312. )
  313. if subtlsrv.EndTime.Unix() <= subtlsrv.StartTime.Unix() {
  314. return
  315. }
  316. /** 如果结束时间点小于计划曲线的起始时间点
  317. |-------------------|
  318. <---->
  319. */
  320. if subtlsrv.EndTime.Unix() <= tcs.StartTime.Unix() {
  321. return
  322. }
  323. /** 如果计算起始时间点大于等于计划曲线的起始时间点
  324. |--------------------|
  325. <----------->
  326. */
  327. if subtlsrv.StartTime.Unix() >= tcs.EndTime.Unix() {
  328. return
  329. }
  330. /** |-------------------|
  331. <--------------------------->
  332. */
  333. if subtlsrv.StartTime.Unix() < tcs.StartTime.Unix() && subtlsrv.EndTime.Unix() > tcs.EndTime.Unix() {
  334. tcs.TimeLineList.Init()
  335. return
  336. }
  337. /** |-------------------|
  338. <------>
  339. */
  340. if subtlsrv.StartTime.Unix() < tcs.StartTime.Unix() && subtlsrv.EndTime.Unix() > tcs.StartTime.Unix() && subtlsrv.EndTime.Unix() <= tcs.EndTime.Unix() {
  341. if nodeEnd, err = tcs.GetTimeLine(subtlsrv.EndTime); err != nil {
  342. return
  343. }
  344. if nodeEnd != nil {
  345. tl = nodeEnd.Value.(TimeLineSrv)
  346. tl.StartTime = subtlsrv.EndTime
  347. tcs.RemoveListAllBeforeItem(nodeEnd, false)
  348. tcs.StartTime = subtlsrv.EndTime
  349. } else {
  350. // 删除时段内的节点
  351. for e = tcs.TimeLineList.Front(); e != nil; e = next {
  352. next = e.Next()
  353. tl = e.Value.(TimeLineSrv)
  354. if tl.StartTime.Unix() > subtlsrv.StartTime.Unix() && tl.EndTime.Unix() < subtlsrv.EndTime.Unix() {
  355. tcs.TimeLineList.Remove(e)
  356. }
  357. }
  358. tl = tcs.TimeLineList.Front().Value.(TimeLineSrv)
  359. tcs.StartTime = tl.StartTime
  360. }
  361. }
  362. /** |-------------------|
  363. <------>
  364. */
  365. if subtlsrv.StartTime.Unix() >= tcs.StartTime.Unix() && subtlsrv.EndTime.Unix() <= tcs.EndTime.Unix() {
  366. if nodeBeg, err = tcs.GetTimeLine(subtlsrv.StartTime); err != nil || nodeBeg == nil {
  367. return
  368. }
  369. if nodeEnd, err = tcs.GetTimeLine(subtlsrv.EndTime); err != nil || nodeEnd == nil {
  370. return
  371. }
  372. /** 落在可用时段内
  373. 情况一 |-------|
  374. |****|
  375. **/
  376. if nodeBeg != nil && nodeEnd == nil {
  377. tlb = nodeBeg.Value.(TimeLineSrv)
  378. // 删除开始节点之后到结束时间点之间的Node
  379. for e = nodeBeg.Next(); e != nil; e = next {
  380. next = e.Next()
  381. tl = e.Value.(TimeLineSrv)
  382. if tl.EndTime.Unix() <= subtlsrv.EndTime.Unix() {
  383. tcs.TimeLineList.Remove(e)
  384. } else {
  385. break
  386. }
  387. }
  388. // 更新开始节点的结束时间
  389. tlb.EndTime = subtlsrv.StartTime
  390. }
  391. /**
  392. 情况二 |-------| |-------|
  393. |***|
  394. **/
  395. if nodeBeg == nil && nodeEnd == nil {
  396. tlsrv = TimeLineSrv{}
  397. tlsrv.StartTime = subtlsrv.StartTime
  398. tlsrv.EndTime = subtlsrv.EndTime
  399. tlsrv.EffFactor = subtlsrv.EffFactor
  400. // 删除开始节点之后到结束时间点之间的Node
  401. for e = tcs.TimeLineList.Front(); e != nil; e = next {
  402. next = e.Next()
  403. tl = e.Value.(TimeLineSrv)
  404. if tl.StartTime.Unix() > subtlsrv.StartTime.Unix() && tl.EndTime.Unix() < subtlsrv.EndTime.Unix() {
  405. tcs.TimeLineList.Remove(e)
  406. }
  407. }
  408. }
  409. /**
  410. 情况三 |-------| |-------|
  411. |**|
  412. **/
  413. if nodeBeg == nil && nodeEnd != nil {
  414. tle = nodeEnd.Value.(TimeLineSrv)
  415. // 删除开始节点到结束时间点之间的Node
  416. for e = tcs.TimeLineList.Front(); e != nil; e = next {
  417. next = e.Next()
  418. tl = e.Value.(TimeLineSrv)
  419. if tl.StartTime.Unix() > subtlsrv.StartTime.Unix() && tl.EndTime.Unix() < subtlsrv.EndTime.Unix() {
  420. tcs.TimeLineList.Remove(e)
  421. }
  422. }
  423. // 更新结束节点的开始时间
  424. tle.StartTime = subtlsrv.EndTime
  425. }
  426. /**
  427. 情况四 |-------| |-------|
  428. |****|
  429. */
  430. if nodeBeg != nil && nodeEnd != nil {
  431. if nodeBeg != nodeEnd {
  432. tlb = nodeBeg.Value.(TimeLineSrv)
  433. tle = nodeEnd.Value.(TimeLineSrv)
  434. if tlb != tle {
  435. // 删除两节点之间的所有节点
  436. for e = nodeBeg.Next(); e != nil && e != nodeEnd; e = next {
  437. next = e.Next()
  438. tcs.TimeLineList.Remove(e)
  439. }
  440. // 更新起始时间点
  441. tlb.EndTime = subtlsrv.StartTime
  442. tle.StartTime = subtlsrv.EndTime
  443. }
  444. } else {
  445. tlb.EndTime = subtlsrv.StartTime
  446. tlsrv = TimeLineSrv{}
  447. tlsrv.StartTime = subtlsrv.StartTime
  448. tlsrv.EndTime = subtlsrv.EndTime
  449. tlsrv.EffFactor = subtlsrv.EffFactor
  450. tcs.TimeLineList.InsertAfter(tlsrv, nodeBeg)
  451. }
  452. }
  453. }
  454. /** |-------------------|
  455. <------>
  456. */
  457. if subtlsrv.StartTime.Unix() >= tcs.StartTime.Unix() && subtlsrv.StartTime.Unix() < tcs.EndTime.Unix() && subtlsrv.EndTime.Unix() > tcs.EndTime.Unix() {
  458. fmt.Println(777)
  459. if nodeBeg, err = tcs.GetTimeLine(subtlsrv.StartTime); err != nil {
  460. return
  461. }
  462. if nodeBeg != nil {
  463. tl = nodeBeg.Value.(TimeLineSrv)
  464. tl.EndTime = subtlsrv.StartTime
  465. tcs.RemoveListAllAfterItem(nodeBeg, false)
  466. tcs.EndTime = subtlsrv.StartTime
  467. } else {
  468. // 删除时段内的节点
  469. for e = tcs.TimeLineList.Front(); e != nil; e = next {
  470. next = e.Next()
  471. tl = e.Value.(TimeLineSrv)
  472. if tl.StartTime.Unix() > subtlsrv.StartTime.Unix() && tl.EndTime.Unix() < subtlsrv.EndTime.Unix() {
  473. tcs.TimeLineList.Remove(e)
  474. }
  475. }
  476. // 获取最后一个节点
  477. tl = tcs.TimeLineList.Back().Value.(TimeLineSrv)
  478. tcs.EndTime = tl.EndTime
  479. }
  480. }
  481. return
  482. }
  483. // 基于起始时间点和Duration计算在当前时间曲线上的结束时间点
  484. func (tcs *TimeCurveSrv) CalEndTime(startTime time.Time, duration time.Duration) (sTime time.Time ,endTime time.Time) {
  485. var (
  486. i int
  487. zeroDuration, calDuration, totalDuration time.Duration
  488. )
  489. // 处理临界条件
  490. if duration <= 0 {
  491. endTime = startTime
  492. return
  493. }
  494. // 如果计算起始时间点大于等于计划曲线的结束时间点
  495. if startTime.Unix() >= tcs.EndTime.Unix() {
  496. endTime = startTime.Add(duration)
  497. return
  498. }
  499. // 初始化
  500. calDuration = duration
  501. endTime = startTime
  502. // 如果计算起始时间点小于计划曲线的起始时间点
  503. if startTime.Unix() < tcs.StartTime.Unix() {
  504. if startTime.Add(duration).Unix() <= tcs.StartTime.Unix() {
  505. endTime = startTime.Add(duration)
  506. return
  507. } else {
  508. calDuration = duration - tcs.StartTime.Sub(startTime)
  509. }
  510. }
  511. if len(tcs.TimeLineArray) <= 0 {
  512. return
  513. }
  514. totalDuration = 0
  515. zeroDuration = 0
  516. /************
  517. * / ------ / *** ------***----- /
  518. * / -----*** ------***--- /
  519. * 0 1 2 3
  520. * 横线代表可用时间*代表不可用时间
  521. *问题 求出时间2 的时间节点? 已知 时间1和时间3的节点0-3的可用时间间隔1-2的可用时间间隔
  522. *逻辑: 求出 0-1的时间间隔 用0-3的时间间隔 减去0-1减去1-2 计算出2-3间隔 用3点时间点减去2-3时间间隔得出时间2的时间点
  523. **********************/
  524. startbool := true
  525. sTime = startTime
  526. for i = 0; i < len(tcs.TimeLineArray); i++ {
  527. if startTime.Unix() >= tcs.TimeLineArray[i].EndTime.Unix() {
  528. continue
  529. }
  530. if startbool {
  531. //记录时间0的节点
  532. zeroStartTime := tcs.TimeLineArray[i].StartTime
  533. //计算0-1时间间隔
  534. zeroDuration = utils.GetDuration(zeroStartTime, startTime, tcs.TimeLineArray[i].EffFactor)
  535. //如果开始时间落到中断时间区间内,则开始时间变成可用时间的开始时间
  536. if startTime.Unix() < tcs.TimeLineArray[i].StartTime.Unix(){
  537. sTime = tcs.TimeLineArray[i].StartTime
  538. }
  539. startbool = false
  540. }
  541. totalDuration = totalDuration + tcs.TimeLineArray[i].Duration
  542. if (totalDuration - zeroDuration) >= calDuration {
  543. endTime = tcs.TimeLineArray[i].GetEndTimeByDuration(totalDuration - calDuration - zeroDuration)
  544. return
  545. }
  546. //endTime = tcs.TimeLineArray[i].EndTime.Add(calDuration - totalDuration)
  547. }
  548. return
  549. }
  550. // 基于给定的两个时间点获取时间曲线上的Duration
  551. func (tcs *TimeCurveSrv) CalDuration(startTime, endTime time.Time) (totalDuration time.Duration) {
  552. var (
  553. i int
  554. actStartTime, actEndTime time.Time
  555. )
  556. // 初始化
  557. totalDuration = 0
  558. // 临界条件处理
  559. if startTime.Unix() >= endTime.Unix() {
  560. return
  561. }
  562. if endTime.Unix() <= tcs.StartTime.Unix() || startTime.Unix() >= tcs.EndTime.Unix() {
  563. //totalDuration = endTime.Sub(startTime)
  564. return
  565. }
  566. // |-------------------|
  567. // <------>
  568. if startTime.Unix() < tcs.StartTime.Unix() && endTime.Unix() > tcs.StartTime.Unix() && endTime.Unix() <= tcs.EndTime.Unix() {
  569. actStartTime = tcs.StartTime
  570. actEndTime = endTime
  571. totalDuration = tcs.StartTime.Sub(startTime)
  572. }
  573. // |-------------------|
  574. // <--------------------------->
  575. if startTime.Unix() < tcs.StartTime.Unix() && endTime.Unix() > tcs.EndTime.Unix() {
  576. actStartTime = tcs.StartTime
  577. actEndTime = tcs.EndTime
  578. totalDuration = tcs.StartTime.Sub(startTime) + endTime.Sub(tcs.EndTime)
  579. }
  580. // |-------------------|
  581. // <------>
  582. if startTime.Unix() >= tcs.StartTime.Unix() && endTime.Unix() <= tcs.EndTime.Unix() {
  583. actStartTime = startTime
  584. actEndTime = endTime
  585. totalDuration = 0
  586. }
  587. // |-------------------|
  588. // <------>
  589. if startTime.Unix() >= tcs.StartTime.Unix() && endTime.Unix() > tcs.EndTime.Unix() {
  590. actStartTime = startTime
  591. actEndTime = tcs.EndTime
  592. totalDuration = endTime.Sub(tcs.EndTime)
  593. }
  594. /**# 计算落在计划时间区间内的有效时间
  595. # ===================
  596. #NO |-------|
  597. #NO |-----|
  598. #1.YES |--------|
  599. #2.YES |---------------------------|
  600. #3.YES |------------|
  601. #4.YES |---------------------| **/
  602. for i = 0; i < len(tcs.TimeLineArray); i++ {
  603. if actEndTime.Unix() <= tcs.TimeLineArray[i].StartTime.Unix() || actStartTime.Unix() >= tcs.TimeLineArray[i].EndTime.Unix() {
  604. continue
  605. }
  606. if tcs.TimeLineArray[i].EffFactor <= 0 {
  607. tcs.TimeLineArray[i].EffFactor = 1.0
  608. }
  609. if actStartTime.Unix() < tcs.TimeLineArray[i].StartTime.Unix() && actEndTime.Unix() > tcs.TimeLineArray[i].StartTime.Unix() {
  610. if actEndTime.Unix() <= tcs.TimeLineArray[i].EndTime.Unix() {
  611. // 条件1
  612. totalDuration = totalDuration + tcs.TimeLineArray[i].GetDurationByEndTime(actEndTime)
  613. break
  614. } else {
  615. // 条件2
  616. totalDuration = totalDuration + tcs.TimeLineArray[i].Duration
  617. actStartTime = tcs.TimeLineArray[i].EndTime
  618. }
  619. }
  620. if actStartTime.Unix() >= tcs.TimeLineArray[i].StartTime.Unix() && actStartTime.Unix() < tcs.TimeLineArray[i].EndTime.Unix() {
  621. if actEndTime.Unix() <= tcs.TimeLineArray[i].EndTime.Unix() {
  622. // 条件3
  623. totalDuration = totalDuration + tcs.TimeLineArray[i].GetDurationByStartEndTime(actStartTime, actEndTime)
  624. break
  625. } else {
  626. // 条件4
  627. totalDuration = totalDuration + tcs.TimeLineArray[i].GetDurationByStartTime(actStartTime)
  628. actStartTime = tcs.TimeLineArray[i].EndTime
  629. }
  630. }
  631. }
  632. return
  633. }