mobile-dispatch-calendar.test.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import assert from 'node:assert/strict'
  2. import test from 'node:test'
  3. import {
  4. buildAgendaDays,
  5. validCalendarDate,
  6. validCalendarMonth
  7. } from '../src/views/m/pl/dispatch-calendar/model'
  8. import { toCalendarTrips } from '../src/views/pl/dispatch-calendar/model'
  9. import type { Plan } from '../src/api/pl'
  10. const plans = [
  11. {
  12. id: 'a',
  13. calendarVehicleType: 'self',
  14. planDate: '2026-10-25',
  15. planNo: '1',
  16. followStatus: 'pending',
  17. vehicleId: 'v1',
  18. licensePlate: '皖H21522',
  19. load: { customerName: '安庆山峡' },
  20. deliveries: [
  21. {
  22. id: 's1',
  23. customerId: 'c1',
  24. customerName: '甲',
  25. products: [{ productId: 'p1', productName: '98酸' }]
  26. },
  27. {
  28. id: 's2',
  29. customerId: 'c1',
  30. customerName: '甲',
  31. products: [{ productId: 'p1', productName: '98酸' }]
  32. },
  33. {
  34. id: 's3',
  35. customerId: 'c2',
  36. customerName: '安徽云栋',
  37. products: [{ productId: 'p2', productName: '液碱' }]
  38. }
  39. ]
  40. },
  41. {
  42. id: 'b',
  43. calendarVehicleType: 'self',
  44. planDate: '2026-10-24',
  45. planNo: '2',
  46. followStatus: 'pending',
  47. vehicleId: 'v2',
  48. licensePlate: '皖HA4855',
  49. products: [{ productName: '98酸' }]
  50. }
  51. ] as Plan[]
  52. const trips = toCalendarTrips(plans, '2026-10')
  53. test('每天独立切换,承运商日期在自有模式下保留入口,汇总跟随筛选', () => {
  54. const mixed = toCalendarTrips(
  55. [
  56. ...plans,
  57. { ...plans[0], id: 'carrier', vehicleId: 'carrier', calendarVehicleType: 'carrier' },
  58. { ...plans[1], id: 'carrier-only', planDate: '2026-10-26', calendarVehicleType: 'carrier' }
  59. ] as Plan[],
  60. '2026-10'
  61. )
  62. const defaults = buildAgendaDays(mixed, '2026-10', '', '')
  63. assert.deepEqual(
  64. defaults.map((day) => day.total),
  65. [1, 1, 0]
  66. )
  67. assert.equal(defaults[2].hasPlans, true)
  68. const switched = buildAgendaDays(mixed, '2026-10', '', '', { '2026-10-25': 'all' })
  69. assert.deepEqual(
  70. switched.map((day) => day.total),
  71. [1, 2, 0]
  72. )
  73. assert.deepEqual(
  74. switched[1].summary.map((product) => product.count),
  75. [2, 2]
  76. )
  77. })
  78. test('纵向日期升序,只加入定位的空日期', () => {
  79. const days = buildAgendaDays(trips, '2026-10', '', '2026-10-26')
  80. assert.deepEqual(
  81. days.map((d) => d.date),
  82. ['2026-10-24', '2026-10-25', '2026-10-26']
  83. )
  84. assert.equal(days[2].total, 0)
  85. assert.equal(buildAgendaDays([], '2026-11', '', '').length, 0)
  86. })
  87. test('车辆筛选后汇总和明细一致,多段仍合计一个计划', () => {
  88. const days = buildAgendaDays(trips, '2026-10', 'v1', '')
  89. assert.equal(days.length, 1)
  90. assert.equal(days[0].total, 1)
  91. assert.equal(days[0].vehicles[0].tasks.length, 2)
  92. assert.equal(days[0].vehicles[0].tasks[0].segmentCount, 2)
  93. assert.equal(days[0].vehicles[0].tasks[0].count, 1)
  94. assert.equal(days[0].vehicles[0].tasks[1].route, '山峡 → 云栋')
  95. assert.deepEqual(
  96. days[0].summary.map((p) => p.count),
  97. [1, 1]
  98. )
  99. })
  100. test('月份边界与日期有效性,拒绝溢出日期', () => {
  101. assert.equal(validCalendarMonth('2100-12'), true)
  102. for (const value of ['1899-12', '2101-01', '2026-13', '2026-1', ''])
  103. assert.equal(validCalendarMonth(value), false)
  104. assert.equal(validCalendarDate('2024-02-29'), true)
  105. for (const value of ['2026-02-29', '2026-04-31', '2026-00-01', '', '2026-10-32'])
  106. assert.equal(validCalendarDate(value), false)
  107. assert.deepEqual(buildAgendaDays(trips, '2026-11', '', '2026-10-25'), [])
  108. })