Compare commits

..

2 Commits

Author SHA1 Message Date
liuyun
c825ff8a5f fix(seed-demo): itemSnapshot 返回类型 InputJsonObject,修 tsc 类型错误
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-15 10:18:10 +08:00
liuyun
266ce08dd4 fix(order): today 返回附加 elderName 供 APP 卡片显示
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-10-15 08:59:10 +08:00
3 changed files with 39 additions and 4 deletions

View File

@ -1,4 +1,4 @@
import { PrismaClient } from '@prisma/client';
import { Prisma, PrismaClient } from '@prisma/client';
import bcrypt from 'bcryptjs';
import { TENANT_ADMIN_ROLE_CODE } from '../src/common/constants.js';
import { initTenant } from '../src/common/tenant-template.js';
@ -115,7 +115,7 @@ interface SvcRecord {
needCert: boolean;
}
function itemSnapshot(s: SvcRecord): Record<string, unknown> {
function itemSnapshot(s: SvcRecord): Prisma.InputJsonObject {
return {
svcId: s.svcId,
svcName: s.svcName,

View File

@ -47,6 +47,7 @@ function makeService(
planFindFirst?: ReturnType<typeof vi.fn>;
planItemFindMany?: ReturnType<typeof vi.fn>;
elderFindFirst?: ReturnType<typeof vi.fn>;
elderFindMany?: ReturnType<typeof vi.fn>;
staffFindFirst?: ReturnType<typeof vi.fn>;
staffFindMany?: ReturnType<typeof vi.fn>;
} = {},
@ -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();
});
});

View File

@ -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)。 */