diff --git a/src/order/order.service.spec.ts b/src/order/order.service.spec.ts index 3ba1c15..824c740 100644 --- a/src/order/order.service.spec.ts +++ b/src/order/order.service.spec.ts @@ -47,6 +47,7 @@ function makeService( planFindFirst?: ReturnType; planItemFindMany?: ReturnType; elderFindFirst?: ReturnType; + elderFindMany?: ReturnType; staffFindFirst?: ReturnType; staffFindMany?: ReturnType; } = {}, @@ -60,6 +61,7 @@ function makeService( const planFindFirst = overrides.planFindFirst ?? vi.fn().mockResolvedValue(null); const planItemFindMany = overrides.planItemFindMany ?? vi.fn().mockResolvedValue([]); const elderFindFirst = overrides.elderFindFirst ?? vi.fn().mockResolvedValue(null); + const elderFindMany = overrides.elderFindMany ?? vi.fn().mockResolvedValue([]); const staffFindFirst = overrides.staffFindFirst ?? vi.fn().mockResolvedValue(null); const staffFindMany = overrides.staffFindMany ?? vi.fn().mockResolvedValue([]); @@ -74,7 +76,7 @@ function makeService( }, plan: { findUnique: planFindUnique, findFirst: planFindFirst }, planItem: { findMany: planItemFindMany }, - elder: { findFirst: elderFindFirst }, + elder: { findFirst: elderFindFirst, findMany: elderFindMany }, staff: { findFirst: staffFindFirst, findMany: staffFindMany }, }, }; @@ -90,6 +92,7 @@ function makeService( planFindFirst, planItemFindMany, elderFindFirst, + elderFindMany, staffFindFirst, staffFindMany, }; @@ -412,3 +415,29 @@ describe('OrderService.list', () => { }); }); }); + +describe('OrderService.today', () => { + it('返回当日工单并附加 elderName', async () => { + const staffFindFirst = vi.fn().mockResolvedValue({ id: 's1', userId: 'u1' }); + const orderFindMany = vi.fn().mockResolvedValue([makeOrder({ assigneeId: 's1', elderId: 'e1' })]); + const elderFindMany = vi.fn().mockResolvedValue([{ id: 'e1', name: '张三' }]); + const { service } = makeService({ staffFindFirst, orderFindMany, elderFindMany }); + + const res = await runWithRequestContext(ctx, () => service.today({})); + + expect(res).toHaveLength(1); + expect(res[0].elderName).toBe('张三'); + expect(elderFindMany).toHaveBeenCalledWith({ where: { id: { in: ['e1'] } } }); + }); + + it('无对应老人时 elderName 为 null', async () => { + const staffFindFirst = vi.fn().mockResolvedValue({ id: 's1', userId: 'u1' }); + const orderFindMany = vi.fn().mockResolvedValue([makeOrder({ assigneeId: 's1', elderId: 'e-missing' })]); + const elderFindMany = vi.fn().mockResolvedValue([]); + const { service } = makeService({ staffFindFirst, orderFindMany, elderFindMany }); + + const res = await runWithRequestContext(ctx, () => service.today({})); + + expect(res[0].elderName).toBeNull(); + }); +}); diff --git a/src/order/order.service.ts b/src/order/order.service.ts index e83bda2..a6b4915 100644 --- a/src/order/order.service.ts +++ b/src/order/order.service.ts @@ -208,10 +208,16 @@ export class OrderService { const staff = await this.prisma.client.staff.findFirst({ where: { userId: ctx.userId } }); if (!staff) return []; const serviceDate = q.serviceDate ? toDateOnly(q.serviceDate) : toDateOnly(todayStr()); - return this.prisma.client.order.findMany({ + const orders = await this.prisma.client.order.findMany({ where: { assigneeId: staff.id, serviceDate }, orderBy: { timeSlotStart: 'asc' }, }); + const elderIds = [...new Set(orders.map((o) => o.elderId).filter((id): id is string => !!id))]; + const elders = elderIds.length + ? await this.prisma.client.elder.findMany({ where: { id: { in: elderIds } } }) + : []; + const nameMap = new Map(elders.map((e) => [e.id, e.name])); + return orders.map((order) => ({ ...order, elderName: nameMap.get(order.elderId) ?? null })); } /** 批量推荐:只读,不自动派。权重:同资质→历史服务过→距离近→负荷低(距离/负荷留 TODO)。 */