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'), []) })