Files
medical-mall/utils/homecareStatus.uts

317 lines
16 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// =============================================================================
// 居家服务统一状态常量与映射
// 说明:
// - 本文件对齐数据库 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<string> = [
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<string> {
const actions = [] as Array<string>
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'
}