// ============================================================================= // 居家服务统一状态常量与映射 // 说明: // - 本文件对齐数据库 ec_care_tasks.status 口径与 ORDER_* 枚举。 // - delivery / consumer 两端共用同一套状态常量,禁止各自维护不同文案。 // - 状态流转必须由后端 RPC 推导,前端只做展示与权限判断。 // ============================================================================= // 工单主状态(来自 ec_care_tasks.status) export const ORDER_CREATED = 'ORDER_CREATED' export const ORDER_ASSIGNED = 'ORDER_ASSIGNED' export const ORDER_ACCEPTED = 'ORDER_ACCEPTED' export const ORDER_REJECTED = 'ORDER_REJECTED' export const ORDER_CHECKED_IN = 'ORDER_CHECKED_IN' export const ORDER_IN_SERVICE = 'ORDER_IN_SERVICE' export const ORDER_EXCEPTION = 'ORDER_EXCEPTION' export const ORDER_COMPLETED = 'ORDER_COMPLETED' export const ACCEPTANCE_PENDING = 'ACCEPTANCE_PENDING' export const ACCEPTED = 'ACCEPTED' export const ACCEPTANCE_REJECTED = 'ACCEPTANCE_REJECTED' export const SETTLEMENT_READY = 'SETTLEMENT_READY' export const ARCHIVED = 'ARCHIVED' export const ORDER_CANCELLED = 'ORDER_CANCELLED' export const ORDER_CLOSED = 'ORDER_CLOSED' // 合法状态集合(用于校验) export const HOMEcare_TASK_STATUSES: Array = [ ORDER_CREATED, ORDER_ASSIGNED, ORDER_ACCEPTED, ORDER_REJECTED, ORDER_CHECKED_IN, ORDER_IN_SERVICE, ORDER_EXCEPTION, ORDER_COMPLETED, ACCEPTANCE_PENDING, ACCEPTED, ACCEPTANCE_REJECTED, SETTLEMENT_READY, ARCHIVED, ORDER_CANCELLED, ORDER_CLOSED ] // consumer 端展示文案 export function getHomecareTaskStatusText(status: string): string { if (status == ORDER_CREATED) return '待安排服务' if (status == ORDER_ASSIGNED) return '已安排服务人员,等待接单' if (status == ORDER_ACCEPTED) return '服务人员已接单,等待上门' if (status == ORDER_REJECTED) return '正在重新安排人员' if (status == ORDER_CHECKED_IN) return '服务人员已到达' if (status == ORDER_IN_SERVICE) return '服务进行中' if (status == ORDER_EXCEPTION) return '服务处理异常中' if (status == ORDER_COMPLETED) return '服务已完成,待验收' if (status == ACCEPTANCE_PENDING) return '待验收' if (status == ACCEPTED) return '已验收' if (status == ACCEPTANCE_REJECTED) return '验收未通过' if (status == SETTLEMENT_READY) return '待结算' if (status == ARCHIVED) return '已归档' if (status == ORDER_CANCELLED) return '已取消' if (status == ORDER_CLOSED) return '已关闭' return status } // 主题色/标签色(用于 UI 标签) export function getHomecareTaskStatusTheme(status: string): string { if (status == ORDER_CREATED) return 'warning' if (status == ORDER_ASSIGNED) return 'primary' if (status == ORDER_ACCEPTED) return 'primary' if (status == ORDER_REJECTED) return 'danger' if (status == ORDER_CHECKED_IN) return 'success' if (status == ORDER_IN_SERVICE) return 'success' if (status == ORDER_EXCEPTION) return 'danger' if (status == ORDER_COMPLETED) return 'primary' if (status == ACCEPTANCE_PENDING) return 'warning' if (status == ACCEPTED) return 'success' if (status == ACCEPTANCE_REJECTED) return 'danger' if (status == SETTLEMENT_READY) return 'warning' if (status == ARCHIVED) return 'info' if (status == ORDER_CANCELLED) return 'info' if (status == ORDER_CLOSED) return 'info' return 'default' } // 给定角色与状态,返回允许的前端操作标识 export function getHomecareTaskAllowedActions(status: string, role: string): Array { const actions = [] as Array const normalizedStatus = normalizeToOrderStatus(status) if (role == 'FAMILY_USER' || role == 'consumer') { if (status == ORDER_COMPLETED || status == ACCEPTANCE_PENDING) { actions.push('confirm_acceptance') actions.push('reject_acceptance') } } if (role == 'HOMECARE_WORKER' || role == 'delivery' || role == 'staff') { if (status == ORDER_ASSIGNED) { actions.push('accept') actions.push('reject') } if (status == ORDER_ACCEPTED) { actions.push('checkin') actions.push('report_exception') } if (status == ORDER_CHECKED_IN) { actions.push('start_service') actions.push('report_exception') } if (status == ORDER_IN_SERVICE) { actions.push('save_record') actions.push('upload_evidence') actions.push('report_exception') actions.push('finish_service') } } if (role == 'HOMECARE_DISPATCHER' || role == 'dispatcher') { if (status == ORDER_CREATED || status == ORDER_REJECTED || status == ORDER_EXCEPTION) { actions.push('dispatch') } } console.log('[HOMECARE_STATUS_TRACE][ACTIONS]', { rawStatus: status, normalizedStatus: normalizedStatus, role: role, actions: actions, departedAllowsCheckin: normalizedStatus == ORDER_ACCEPTED }) return actions } // 将旧 hss / delivery 前端状态归一化为 ORDER_* 状态 export function normalizeToOrderStatus(raw: string): string { const s = raw.trim().toUpperCase() if (s == 'CREATED' || s == 'SUBMITTED') return ORDER_CREATED if (s == 'PAID') return ORDER_CREATED if (s == 'ASSIGNED' || s == 'PENDING_ASSIGNMENT' || s == 'PENDING_DISPATCH' || s == 'PENDING_ACCEPT') return ORDER_ASSIGNED if (s == 'ACCEPTED' || s == 'PENDING_ACCEPT') return ORDER_ACCEPTED if (s == 'REJECTED') return ORDER_REJECTED if (s == 'DEPARTED' || s == 'ON_THE_WAY' || s == 'WAITING_DEPARTURE') return ORDER_ACCEPTED if (s == 'ARRIVED' || s == 'CHECKED_IN') return ORDER_CHECKED_IN if (s == 'IN_SERVICE' || s == 'SERVING') return ORDER_IN_SERVICE if (s == 'COMPLETED') return ORDER_COMPLETED if (s == 'PENDING_ACCEPTANCE' || s == 'PENDING_CONFIRM' || s == 'PENDING_SUBMIT') return ACCEPTANCE_PENDING if (s == 'ACCEPTED_BY_USER') return ACCEPTED if (s == 'REVIEWED') return ACCEPTED if (s == 'SETTLED') return SETTLEMENT_READY if (s == 'EXCEPTION' || s == 'ABNORMAL' || s == 'EXCEPTION_PENDING') return ORDER_EXCEPTION if (s == 'CANCELLED') return ORDER_CANCELLED if (s == 'ARCHIVED') return ARCHIVED if (s == 'ORDER_CREATED') return ORDER_CREATED if (s == 'ORDER_ASSIGNED') return ORDER_ASSIGNED if (s == 'ORDER_ACCEPTED') return ORDER_ACCEPTED if (s == 'ORDER_REJECTED') return ORDER_REJECTED if (s == 'ORDER_CHECKED_IN') return ORDER_CHECKED_IN if (s == 'ORDER_IN_SERVICE') return ORDER_IN_SERVICE if (s == 'ORDER_EXCEPTION') return ORDER_EXCEPTION if (s == 'ORDER_COMPLETED') return ORDER_COMPLETED if (s == 'ACCEPTANCE_PENDING') return ACCEPTANCE_PENDING if (s == 'ACCEPTED') return ACCEPTED if (s == 'ACCEPTANCE_REJECTED') return ACCEPTANCE_REJECTED if (s == 'SETTLEMENT_READY') return SETTLEMENT_READY if (s == 'ORDER_CANCELLED') return ORDER_CANCELLED if (s == 'ORDER_CLOSED') return ORDER_CLOSED return raw } // 判断是否为已关闭/终态 export function isHomecareTaskClosed(status: string): boolean { return status == ARCHIVED || status == ORDER_CANCELLED || status == ORDER_CLOSED || status == ACCEPTED || status == SETTLEMENT_READY } // ============================================================================= // 新增:delivery / consumer 通用订单状态映射(含 ARRIVAL_PENDING) // 用于 deliveryService、checkin.uvue、order-detail.uvue 等 // ============================================================================= /** 服务人员已提交到达签到,等待消费者确认 */ export const ARRIVAL_PENDING = 'ARRIVAL_PENDING' /** 订单状态元信息 */ export type OrderStatusMeta = { statusText: string statusDesc: string statusTone: string waitingConsumerConfirm: boolean canArriveCheckin: boolean canStartService: boolean canFinishService: boolean tab: string } /** * 归一化订单状态元信息 * 覆盖旧 delivery 状态 + 居家服务新状态(含 ARRIVAL_PENDING) */ export function normalizeOrderStatus(raw: string): OrderStatusMeta { const s = raw.trim().toUpperCase() // ARRIVAL_PENDING — 服务人员已提交到达签到,等待消费者确认 if (s == ARRIVAL_PENDING) { return { statusText: '等待消费者确认到达', statusDesc: '服务人员已提交到达签到,等待消费者确认', statusTone: 'warning', waitingConsumerConfirm: true, canArriveCheckin: false, canStartService: false, canFinishService: false, tab: 'in_progress' } as OrderStatusMeta } // 旧 delivery 状态映射 if (s == 'PENDING_ASSIGNMENT' || s == 'CREATED') return { statusText: '待派单', statusDesc: '订单已创建,等待调度员派单', statusTone: 'default', waitingConsumerConfirm: false, canArriveCheckin: false, canStartService: false, canFinishService: false, tab: 'pending' } as OrderStatusMeta if (s == 'PENDING_ACCEPT' || s == 'PENDING_ACCEPTANCE') return { statusText: '待接单', statusDesc: '订单已派发,等待服务人员接单', statusTone: 'warning', waitingConsumerConfirm: false, canArriveCheckin: false, canStartService: false, canFinishService: false, tab: 'pending_accept' } as OrderStatusMeta if (s == 'ACCEPTED') return { statusText: '已接单', statusDesc: '服务人员已接单,准备出发', statusTone: 'primary', waitingConsumerConfirm: false, canArriveCheckin: false, canStartService: false, canFinishService: false, tab: 'in_progress' } as OrderStatusMeta if (s == 'WAITING_DEPARTURE') return { statusText: '待出发', statusDesc: '等待服务人员出发', statusTone: 'primary', waitingConsumerConfirm: false, canArriveCheckin: false, canStartService: false, canFinishService: false, tab: 'in_progress' } as OrderStatusMeta if (s == 'DEPARTED' || s == 'ON_THE_WAY') return { statusText: '前往中', statusDesc: '服务人员正在前往服务地点', statusTone: 'primary', waitingConsumerConfirm: false, canArriveCheckin: false, canStartService: false, canFinishService: false, tab: 'in_progress' } as OrderStatusMeta if (s == 'ARRIVED' || s == 'CHECKED_IN') return { statusText: '已到达', statusDesc: '服务人员已到达服务地点', statusTone: 'success', waitingConsumerConfirm: false, canArriveCheckin: false, canStartService: true, canFinishService: false, tab: 'in_progress' } as OrderStatusMeta if (s == 'IN_SERVICE' || s == 'SERVING') return { statusText: '服务中', statusDesc: '服务人员正在提供服务', statusTone: 'success', waitingConsumerConfirm: false, canArriveCheckin: false, canStartService: false, canFinishService: true, tab: 'in_progress' } as OrderStatusMeta if (s == 'PENDING_CONFIRM' || s == 'PENDING_SUBMIT') return { statusText: '待确认', statusDesc: '等待消费者确认服务完成', statusTone: 'warning', waitingConsumerConfirm: true, canArriveCheckin: false, canStartService: false, canFinishService: false, tab: 'in_progress' } as OrderStatusMeta if (s == 'COMPLETED') return { statusText: '已完成', statusDesc: '订单已完成', statusTone: 'success', waitingConsumerConfirm: false, canArriveCheckin: false, canStartService: false, canFinishService: false, tab: 'completed' } as OrderStatusMeta if (s == 'CANCELLED') return { statusText: '已取消', statusDesc: '订单已取消', statusTone: 'info', waitingConsumerConfirm: false, canArriveCheckin: false, canStartService: false, canFinishService: false, tab: 'cancelled' } as OrderStatusMeta if (s == 'REJECTED') return { statusText: '已拒绝', statusDesc: '服务人员已拒绝该订单', statusTone: 'danger', waitingConsumerConfirm: false, canArriveCheckin: false, canStartService: false, canFinishService: false, tab: 'cancelled' } as OrderStatusMeta if (s == 'ABNORMAL' || s == 'EXCEPTION' || s == 'EXCEPTION_PENDING') return { statusText: '异常处理中', statusDesc: '订单发生异常', statusTone: 'danger', waitingConsumerConfirm: false, canArriveCheckin: false, canStartService: false, canFinishService: false, tab: 'in_progress' } as OrderStatusMeta if (s == 'SETTLED' || s == 'ARCHIVED') return { statusText: '已完成', statusDesc: '订单已完成', statusTone: 'success', waitingConsumerConfirm: false, canArriveCheckin: false, canStartService: false, canFinishService: false, tab: 'completed' } as OrderStatusMeta // 居家服务 ORDER_* 状态 if (s == ORDER_CREATED) return { statusText: '待安排服务', statusDesc: '订单已创建,等待调度员派单', statusTone: 'default', waitingConsumerConfirm: false, canArriveCheckin: false, canStartService: false, canFinishService: false, tab: 'pending' } as OrderStatusMeta if (s == ORDER_ASSIGNED) return { statusText: '已安排服务人员,等待接单', statusDesc: '工单已分配至服务人员', statusTone: 'primary', waitingConsumerConfirm: false, canArriveCheckin: false, canStartService: false, canFinishService: false, tab: 'pending_accept' } as OrderStatusMeta if (s == ORDER_ACCEPTED) return { statusText: '服务人员已接单,等待上门', statusDesc: '服务人员已接单', statusTone: 'primary', waitingConsumerConfirm: false, canArriveCheckin: false, canStartService: false, canFinishService: false, tab: 'in_progress' } as OrderStatusMeta if (s == ORDER_CHECKED_IN) return { statusText: '服务人员已到达', statusDesc: '服务人员已到达现场', statusTone: 'success', waitingConsumerConfirm: false, canArriveCheckin: false, canStartService: true, canFinishService: false, tab: 'in_progress' } as OrderStatusMeta if (s == ORDER_IN_SERVICE) return { statusText: '服务进行中', statusDesc: '服务人员正在提供服务', statusTone: 'success', waitingConsumerConfirm: false, canArriveCheckin: false, canStartService: false, canFinishService: true, tab: 'in_progress' } as OrderStatusMeta if (s == ORDER_COMPLETED) return { statusText: '服务已完成,待验收', statusDesc: '服务人员已提交完成', statusTone: 'primary', waitingConsumerConfirm: true, canArriveCheckin: false, canStartService: false, canFinishService: false, tab: 'in_progress' } as OrderStatusMeta if (s == ACCEPTANCE_PENDING) return { statusText: '待验收', statusDesc: '等待消费者验收', statusTone: 'warning', waitingConsumerConfirm: true, canArriveCheckin: false, canStartService: false, canFinishService: false, tab: 'in_progress' } as OrderStatusMeta if (s == ACCEPTED) return { statusText: '已验收', statusDesc: '消费者已验收', statusTone: 'success', waitingConsumerConfirm: false, canArriveCheckin: false, canStartService: false, canFinishService: false, tab: 'completed' } as OrderStatusMeta if (s == ORDER_CANCELLED) return { statusText: '已取消', statusDesc: '订单已取消', statusTone: 'info', waitingConsumerConfirm: false, canArriveCheckin: false, canStartService: false, canFinishService: false, tab: 'cancelled' } as OrderStatusMeta if (s == ARCHIVED) return { statusText: '已归档', statusDesc: '订单已归档', statusTone: 'info', waitingConsumerConfirm: false, canArriveCheckin: false, canStartService: false, canFinishService: false, tab: 'completed' } as OrderStatusMeta // 未知状态 return { statusText: raw, statusDesc: '未知状态', statusTone: 'default', waitingConsumerConfirm: false, canArriveCheckin: false, canStartService: false, canFinishService: false, tab: 'pending' } as OrderStatusMeta } /** * 获取状态文本(用于卡片标签) */ export function getOrderStatusText(raw: string): string { return normalizeOrderStatus(raw).statusText } /** * 获取状态描述(用于详情页说明) */ export function getOrderStatusDesc(raw: string): string { return normalizeOrderStatus(raw).statusDesc } /** * 获取状态色调(用于 UI 颜色) */ export function getOrderStatusTone(raw: string): string { return normalizeOrderStatus(raw).statusTone } /** * 是否可以显示"到达签到"按钮 */ export function canShowArriveCheckin(raw: string): boolean { return normalizeOrderStatus(raw).canArriveCheckin } /** * 是否需要等待消费者确认(到达确认 / 服务验收) */ export function canShowWaitingConsumerConfirm(raw: string): boolean { return normalizeOrderStatus(raw).waitingConsumerConfirm } /** * 判断订单是否属于"进行中" tab */ export function isInProgress(raw: string): boolean { return normalizeOrderStatus(raw).tab == 'in_progress' } /** * 判断订单是否属于"待接单" tab */ export function isPendingAccept(raw: string): boolean { return normalizeOrderStatus(raw).tab == 'pending_accept' } /** * 判断订单是否属于"已完成" tab */ export function isCompleted(raw: string): boolean { return normalizeOrderStatus(raw).tab == 'completed' } /** * 判断订单是否属于"已取消" tab */ export function isCancelled(raw: string): boolean { return normalizeOrderStatus(raw).tab == 'cancelled' }