112 lines
3.4 KiB
TypeScript
112 lines
3.4 KiB
TypeScript
import assert from 'node:assert/strict'
|
|
import test from 'node:test'
|
|
import {
|
|
buildAgendaDays,
|
|
validCalendarDate,
|
|
validCalendarMonth
|
|
} from '../src/views/m/pl/dispatch-calendar/model'
|
|
import { toCalendarTrips } from '../src/views/pl/dispatch-calendar/model'
|
|
import type { Plan } from '../src/api/pl'
|
|
|
|
const plans = [
|
|
{
|
|
id: 'a',
|
|
calendarVehicleType: 'self',
|
|
planDate: '2026-10-25',
|
|
planNo: '1',
|
|
followStatus: 'pending',
|
|
vehicleId: 'v1',
|
|
licensePlate: '皖H21522',
|
|
load: { customerName: '安庆山峡' },
|
|
deliveries: [
|
|
{
|
|
id: 's1',
|
|
customerId: 'c1',
|
|
customerName: '甲',
|
|
products: [{ productId: 'p1', productName: '98酸' }]
|
|
},
|
|
{
|
|
id: 's2',
|
|
customerId: 'c1',
|
|
customerName: '甲',
|
|
products: [{ productId: 'p1', productName: '98酸' }]
|
|
},
|
|
{
|
|
id: 's3',
|
|
customerId: 'c2',
|
|
customerName: '安徽云栋',
|
|
products: [{ productId: 'p2', productName: '液碱' }]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
id: 'b',
|
|
calendarVehicleType: 'self',
|
|
planDate: '2026-10-24',
|
|
planNo: '2',
|
|
followStatus: 'pending',
|
|
vehicleId: 'v2',
|
|
licensePlate: '皖HA4855',
|
|
products: [{ productName: '98酸' }]
|
|
}
|
|
] as Plan[]
|
|
const trips = toCalendarTrips(plans, '2026-10')
|
|
|
|
test('每天独立切换,承运商日期在自有模式下保留入口,汇总跟随筛选', () => {
|
|
const mixed = toCalendarTrips(
|
|
[
|
|
...plans,
|
|
{ ...plans[0], id: 'carrier', vehicleId: 'carrier', calendarVehicleType: 'carrier' },
|
|
{ ...plans[1], id: 'carrier-only', planDate: '2026-10-26', calendarVehicleType: 'carrier' }
|
|
] as Plan[],
|
|
'2026-10'
|
|
)
|
|
const defaults = buildAgendaDays(mixed, '2026-10', '', '')
|
|
assert.deepEqual(
|
|
defaults.map((day) => day.total),
|
|
[1, 1, 0]
|
|
)
|
|
assert.equal(defaults[2].hasPlans, true)
|
|
const switched = buildAgendaDays(mixed, '2026-10', '', '', { '2026-10-25': 'all' })
|
|
assert.deepEqual(
|
|
switched.map((day) => day.total),
|
|
[1, 2, 0]
|
|
)
|
|
assert.deepEqual(
|
|
switched[1].summary.map((product) => product.count),
|
|
[2, 2]
|
|
)
|
|
})
|
|
|
|
test('纵向日期升序,只加入定位的空日期', () => {
|
|
const days = buildAgendaDays(trips, '2026-10', '', '2026-10-26')
|
|
assert.deepEqual(
|
|
days.map((d) => d.date),
|
|
['2026-10-24', '2026-10-25', '2026-10-26']
|
|
)
|
|
assert.equal(days[2].total, 0)
|
|
assert.equal(buildAgendaDays([], '2026-11', '', '').length, 0)
|
|
})
|
|
test('车辆筛选后汇总和明细一致,多段仍合计一个计划', () => {
|
|
const days = buildAgendaDays(trips, '2026-10', 'v1', '')
|
|
assert.equal(days.length, 1)
|
|
assert.equal(days[0].total, 1)
|
|
assert.equal(days[0].vehicles[0].tasks.length, 2)
|
|
assert.equal(days[0].vehicles[0].tasks[0].segmentCount, 2)
|
|
assert.equal(days[0].vehicles[0].tasks[0].count, 1)
|
|
assert.equal(days[0].vehicles[0].tasks[1].route, '山峡 → 云栋')
|
|
assert.deepEqual(
|
|
days[0].summary.map((p) => p.count),
|
|
[1, 1]
|
|
)
|
|
})
|
|
test('月份边界与日期有效性,拒绝溢出日期', () => {
|
|
assert.equal(validCalendarMonth('2100-12'), true)
|
|
for (const value of ['1899-12', '2101-01', '2026-13', '2026-1', ''])
|
|
assert.equal(validCalendarMonth(value), false)
|
|
assert.equal(validCalendarDate('2024-02-29'), true)
|
|
for (const value of ['2026-02-29', '2026-04-31', '2026-00-01', '', '2026-10-32'])
|
|
assert.equal(validCalendarDate(value), false)
|
|
assert.deepEqual(buildAgendaDays(trips, '2026-11', '', '2026-10-25'), [])
|
|
})
|