diff --git a/src/api/elder-svc.ts b/src/api/elder-svc.ts new file mode 100644 index 0000000..4370e39 --- /dev/null +++ b/src/api/elder-svc.ts @@ -0,0 +1,38 @@ +import { http } from '@/api/http' + +/** + * 老人个人项目库(ltc_elder_svc)API。 + * 字段锚点见 shared/data-model spec(ltc_elder_svc)。 + * PUT 为整表覆盖:care_mode + svc_ids(落本机构 L4),旧行软删留档。 + */ + +/** 老人个人项目库项(含 svcNameSnapshot/svcCodeSnapshot 快照)。 */ +export interface ElderSvc { + id: string + tenantCode?: string + elderId: string + svcId: string + svcNameSnapshot: string + svcCodeSnapshot?: string | null + careMode: string + isActive?: boolean + createdAt?: number + updatedAt?: number +} + +/** 整表覆盖入参:care_mode 为整库统一护理方式,svc_ids 为本机构 L4 项目库 svc_org.id 列表。 */ +export interface PutElderSvcData { + /** inst_medical/inst_nursing/home_org/home_individual */ + careMode: string + svcIds: string[] +} + +/** 当前(未软删)个人项目库。 */ +export function getElderSvc(elderId: string): Promise { + return http.get(`/elder-svc/${elderId}`) +} + +/** 整表覆盖保存个人项目库。 */ +export function putElderSvc(elderId: string, data: PutElderSvcData): Promise { + return http.put(`/elder-svc/${elderId}`, data) +} diff --git a/src/api/order.ts b/src/api/order.ts new file mode 100644 index 0000000..4bdc22a --- /dev/null +++ b/src/api/order.ts @@ -0,0 +1,154 @@ +import { http } from '@/api/http' + +/** + * 工单(svc_order)API。 + * 字段锚点见 shared/data-model spec(svc_order)。 + * - 时间字段(timeSlotStart/End 为 datetime、serviceDate/assignTime 为日期)后端返回毫秒时间戳; + * - 派单冲突(2001)/无待遇(1001)/无计划(1002)/资质提示(1006)由后端以 ApiError.message 返回,前端直接展示。 + * + * 注意:后端暂无「按日期列全部工单(管理员视角)」的列表接口,仅有 GET /order/today(当前登录 + * 护理员本人当日工单)。排班派单页的「全部当日工单」数据源见 task-5-report(NEEDS_CONTEXT)。 + */ + +/** 工单八态(order_status)。 */ +export const ORDER_STATUSES = [ + 'to_assign', + 'assigned', + 'serving', + 'done', + 'abnormal', + 'cancelled', + 'overdue', + 'not_met', +] as const + +export type OrderStatus = (typeof ORDER_STATUSES)[number] + +/** 派单方式:manual(人工)/ batch_recommend(批量推荐确认)。 */ +export const ASSIGN_MODES = ['manual', 'batch_recommend'] as const + +/** 工单计划项快照(item_list 元素)。 */ +export interface OrderItemSnapshot { + svcId: string + svcName: string + svcCode: string | null + freqType: string | null + freqValue: number | null + durationMin: number | null + photoTier: string + needCert: boolean + isMedical: boolean +} + +/** 工单(svc_order,时间字段为毫秒时间戳)。 */ +export interface Order { + id: string + tenantCode?: string + elderId: string + planId: string + serviceDate?: number + timeSlotStart?: number + timeSlotEnd?: number + assigneeId?: string | null + assignTime?: number | null + assignMode?: string | null + orderStatus: string + itemList: OrderItemSnapshot[] + needPhoto?: boolean + cancelReason?: string | null + rescheduleLog?: unknown + qualificationCheck?: string | null + billable?: boolean + createdAt?: number + updatedAt?: number +} + +/** 生成工单入参(plan_id 须为 active)。 */ +export interface GenerateOrderData { + elderId: string + planId: string + /** YYYY-MM-DD */ + serviceDate: string + /** ISO datetime */ + timeSlotStart: string + /** ISO datetime */ + timeSlotEnd: string +} + +/** 派单入参(工单态须为 to_assign)。 */ +export interface AssignOrderData { + orderId: string + /** 护理员 staff.id */ + assigneeId: string + assignMode?: string +} + +/** 调单入参:改派护理员与/或改时段(均可选,缺省保留原值)。 */ +export interface ReassignOrderData { + assigneeId?: string + /** ISO datetime */ + timeSlotStart?: string + /** ISO datetime */ + timeSlotEnd?: string + reason?: string +} + +/** 取消工单入参。 */ +export interface CancelOrderData { + cancelReason: string +} + +/** 批量推荐结果(只读,不自动派)。 */ +export interface BatchRecommendItem { + staffId: string + name: string + jobType: string + score: number + reasons: string[] +} + +/** 批量推荐查询。 */ +export interface BatchRecommendQuery { + elderId: string + /** YYYY-MM-DD */ + serviceDate?: string + /** ISO datetime */ + timeSlotStart?: string + /** ISO datetime */ + timeSlotEnd?: string +} + +/** 生成工单(to_assign)。 */ +export function generateOrder(data: GenerateOrderData): Promise { + return http.post('/order/generate', data) +} + +/** 派单(to_assign → assigned)。 */ +export function assignOrder(data: AssignOrderData): Promise { + return http.post('/order/assign', data) +} + +/** 调单(改派/改时段,写 reschedule_log)。 */ +export function reassignOrder(id: string, data: ReassignOrderData): Promise { + return http.post(`/order/${id}/reassign`, data) +} + +/** 取消工单(cancel_reason 必填)。 */ +export function cancelOrder(id: string, data: CancelOrderData): Promise { + return http.post(`/order/${id}/cancel`, data) +} + +/** 工单详情。 */ +export function getOrder(id: string): Promise { + return http.get(`/order/${id}`) +} + +/** 今日工单(当前登录护理员本人;serviceDate 缺省为今天)。 */ +export function getTodayOrders(serviceDate?: string): Promise { + return http.get('/order/today', { params: serviceDate ? { serviceDate } : undefined }) +} + +/** 批量推荐(只读,返回推荐护理员 + 理由,不自动派)。 */ +export function batchRecommend(query: BatchRecommendQuery): Promise { + return http.get('/order/batch-recommend', { params: query }) +} diff --git a/src/api/plan.ts b/src/api/plan.ts new file mode 100644 index 0000000..2828ba3 --- /dev/null +++ b/src/api/plan.ts @@ -0,0 +1,118 @@ +import { http } from '@/api/http' + +/** + * 服务计划(svc_plan / svc_plan_item)API。 + * 字段锚点见 shared/data-model spec(svc_plan / svc_plan_item)。 + * - 日期字段(planPeriodStart/End、confirmTime)后端经 TransformInterceptor 序列化为毫秒时间戳; + * - 计划项 svcId 引用本机构 L4(svc_org.id),落库时快照 svcNameSnapshot/svcCodeSnapshot。 + */ + +/** 计划项入参(PlanItemInputDto)。freqType: daily/weekly_n/monthly_n/as_needed;photoTier: must/optional/free。 */ +export interface PlanItemInput { + svcId: string + freqType?: string + freqValue?: number + durationMin?: number + photoTier?: string + cautionNote?: string + isMedical?: boolean + needCert?: boolean +} + +/** 制定计划入参(CreatePlanDto)。plan_status 由服务端置 active,不接受前端传入。 */ +export interface CreatePlanData { + elderId: string + /** YYYY-MM-DD */ + planPeriodStart: string + /** YYYY-MM-DD */ + planPeriodEnd: string + /** care_1/care_2/care_3 */ + careLevel: string + /** inst_medical/inst_nursing/home_org/home_individual */ + careMode: string + items: PlanItemInput[] + weekFreq?: number + monthHours?: number + extraItemCount?: number + planBasis?: unknown +} + +/** 变更计划入参:change_from_plan_id 指向被变更的旧计划。 */ +export interface ChangePlanData extends CreatePlanData { + changeFromPlanId: string +} + +/** 计划确认入参(老人/家属确认)。 */ +export interface ConfirmPlanData { + confirmElder: boolean + confirmGuardian?: boolean +} + +/** 服务计划头(svc_plan,日期字段为毫秒时间戳)。 */ +export interface Plan { + id: string + tenantCode?: string + elderId: string + planPeriodStart?: number + planPeriodEnd?: number + careLevel: string + careMode: string + itemCount: number + itemCountRule?: string | null + extraItemCount?: number + weekFreq?: number | null + monthHours?: number | null + planStatus: string + confirmElder?: boolean + confirmGuardian?: boolean + confirmTime?: number | null + planBasis?: unknown + changeFromPlanId?: string | null + bizLine?: string + createdAt?: number + updatedAt?: number +} + +/** 服务计划项(svc_plan_item)。 */ +export interface PlanItem { + id: string + planId: string + svcId: string + svcNameSnapshot: string + svcCodeSnapshot?: string | null + freqType?: string | null + freqValue?: number | null + durationMin?: number | null + photoTier?: string + cautionNote?: string | null + isMedical?: boolean + needCert?: boolean +} + +/** 计划详情 = 计划头 + 计划项。 */ +export type PlanDetail = Plan & { items: PlanItem[] } + +/** 制定服务计划(服务端置 active)。 */ +export function createPlan(data: CreatePlanData): Promise { + return http.post('/plan', data) +} + +/** 变更服务计划(新建 active + 旧计划转 changed)。 */ +export function changePlan(data: ChangePlanData): Promise { + return http.post('/plan/change', data) +} + +/** 计划详情(含计划项)。 */ +export function getPlan(id: string): Promise { + return http.get(`/plan/${id}`) +} + +/** 计划确认(写 confirm_time + elder/guardian 布尔,不改 plan_status)。 */ +export function confirmPlan(id: string, data: ConfirmPlanData): Promise { + return http.post(`/plan/${id}/confirm`, data) +} + +/** 按老人查计划(新→旧)。 */ +export function listPlansByElder(elderId: string): Promise { + return http.get(`/plan/by-elder/${elderId}`) +} diff --git a/src/components/elder-detail.vue b/src/components/elder-detail.vue index 5982348..77ed263 100644 --- a/src/components/elder-detail.vue +++ b/src/components/elder-detail.vue @@ -26,6 +26,30 @@ {{ elder.note ?? '-' }} + 个人项目库 +
+ + + + + + + + 保存项目库 + + + + + {{ p.name }} + + + +
+ +
+ 制定计划 +
+
状态变更 @@ -58,10 +82,15 @@ + + diff --git a/src/components/plan-form.vue b/src/components/plan-form.vue new file mode 100644 index 0000000..ca9446f --- /dev/null +++ b/src/components/plan-form.vue @@ -0,0 +1,212 @@ + + + diff --git a/src/pages/ltc/elder/constants.ts b/src/pages/ltc/elder/constants.ts index aed7d63..6d91a13 100644 --- a/src/pages/ltc/elder/constants.ts +++ b/src/pages/ltc/elder/constants.ts @@ -32,6 +32,14 @@ export const CARE_LEVEL_OPTIONS: LabeledValue[] = [ { label: '三级护理', value: 'care_3' }, ] +/** 护理方式(值唯一来源:后端 plan/elder-svc CARE_MODE)。 */ +export const CARE_MODE_OPTIONS: LabeledValue[] = [ + { label: '机构医疗', value: 'inst_medical' }, + { label: '机构护理', value: 'inst_nursing' }, + { label: '居家机构上门', value: 'home_org' }, + { label: '居家个人', value: 'home_individual' }, +] + /** 待遇状态十态(值唯一来源:后端 elder TREAT_STATUSES)。 */ export const TREAT_STATUS_OPTIONS: LabeledValue[] = [ { label: '待建档', value: 'pending_file' }, diff --git a/src/pages/ltc/schedule/index.vue b/src/pages/ltc/schedule/index.vue index 2f0eeb4..ac3d0b1 100644 --- a/src/pages/ltc/schedule/index.vue +++ b/src/pages/ltc/schedule/index.vue @@ -1,7 +1,431 @@ + +