317 lines
16 KiB
Plaintext
317 lines
16 KiB
Plaintext
// =============================================================================
|
||
// 居家服务统一状态常量与映射
|
||
// 说明:
|
||
// - 本文件对齐数据库 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'
|
||
}
|