/**
|
* 订单工作流程控制器
|
* 管理订单状态流转和操作权限
|
*/
|
|
// 订单状态枚举(按照流程顺序)
|
export enum OrderStatus {
|
WAIT_UPLOAD = '待上传文件', // 1
|
WAIT_AUTHORIZE = '待授权', // 2
|
WAIT_CONFIRM = '待交易确认', // 3
|
COMPLETED = '已完成', // 4
|
EVALUATED = '已评价' // 5 (最终状态)
|
}
|
|
// 操作类型枚举
|
export enum ActionType {
|
VIEW = '查看',
|
TRACK = '追踪',
|
UPLOAD_FILE = '提交文件',
|
AUTHORIZE = '授权',
|
CONFIRM_TRADE = '交易确认',
|
EVALUATE = '评价',
|
CANCEL_ORDER = '取消订单'
|
}
|
|
// 页面类型枚举
|
export enum PageType {
|
TRADE_APPROVAL = 'tradeApproval', // 交易审核
|
BUYER_CENTER = 'buyerCenter', // 买家中心
|
SELLER_CENTER = 'sellerCenter' // 卖家中心
|
}
|
|
// 操作配置接口
|
interface ActionConfig {
|
type: ActionType
|
routeName?: string
|
params?: Record<string, any>
|
}
|
|
// 各页面在不同状态下的操作配置
|
const PAGE_ACTION_CONFIG: Record<PageType, Record<OrderStatus, ActionConfig[]>> = {
|
[PageType.TRADE_APPROVAL]: {
|
[OrderStatus.WAIT_UPLOAD]: [
|
{ type: ActionType.VIEW, routeName: 'tradeOrderDetail' },
|
{ type: ActionType.TRACK }
|
],
|
[OrderStatus.WAIT_AUTHORIZE]: [
|
{ type: ActionType.VIEW, routeName: 'tradeOrderDetail' },
|
{ type: ActionType.TRACK },
|
{ type: ActionType.AUTHORIZE, routeName: 'tradeApproval' }
|
],
|
[OrderStatus.WAIT_CONFIRM]: [
|
{ type: ActionType.VIEW, routeName: 'tradeOrderDetail' },
|
{ type: ActionType.TRACK }
|
],
|
[OrderStatus.COMPLETED]: [
|
{ type: ActionType.VIEW, routeName: 'tradeOrderDetail' },
|
{ type: ActionType.TRACK }
|
],
|
[OrderStatus.EVALUATED]: [
|
{ type: ActionType.VIEW, routeName: 'tradeOrderDetail' },
|
{ type: ActionType.TRACK }
|
]
|
},
|
[PageType.BUYER_CENTER]: {
|
[OrderStatus.WAIT_UPLOAD]: [
|
{ type: ActionType.VIEW, routeName: 'tradeOrderDetail' },
|
{ type: ActionType.TRACK },
|
{ type: ActionType.UPLOAD_FILE, routeName: 'tradeOrderUpload' },
|
{ type: ActionType.CANCEL_ORDER }
|
],
|
[OrderStatus.WAIT_AUTHORIZE]: [
|
{ type: ActionType.VIEW, routeName: 'tradeOrderDetail' },
|
{ type: ActionType.TRACK },
|
{ type: ActionType.CANCEL_ORDER }
|
],
|
[OrderStatus.WAIT_CONFIRM]: [
|
{ type: ActionType.VIEW, routeName: 'tradeOrderDetail' },
|
{ type: ActionType.TRACK },
|
{ type: ActionType.CONFIRM_TRADE, routeName: 'tradeOrderConfirm' },
|
{ type: ActionType.CANCEL_ORDER }
|
],
|
[OrderStatus.COMPLETED]: [
|
{ type: ActionType.VIEW, routeName: 'tradeOrderDetail' },
|
{ type: ActionType.TRACK },
|
{ type: ActionType.EVALUATE, routeName: 'tradeOrderEvaluate' }
|
],
|
[OrderStatus.EVALUATED]: [
|
{ type: ActionType.VIEW, routeName: 'tradeOrderDetail' },
|
{ type: ActionType.TRACK }
|
]
|
},
|
[PageType.SELLER_CENTER]: {
|
[OrderStatus.WAIT_UPLOAD]: [
|
{ type: ActionType.VIEW, routeName: 'tradeOrderDetail' },
|
{ type: ActionType.TRACK }
|
],
|
[OrderStatus.WAIT_AUTHORIZE]: [
|
{ type: ActionType.VIEW, routeName: 'tradeOrderDetail' },
|
{ type: ActionType.TRACK }
|
],
|
[OrderStatus.WAIT_CONFIRM]: [
|
{ type: ActionType.VIEW, routeName: 'tradeOrderDetail' },
|
{ type: ActionType.TRACK }
|
],
|
[OrderStatus.COMPLETED]: [
|
{ type: ActionType.VIEW, routeName: 'tradeOrderDetail' },
|
{ type: ActionType.TRACK }
|
],
|
[OrderStatus.EVALUATED]: [
|
{ type: ActionType.VIEW, routeName: 'tradeOrderDetail' },
|
{ type: ActionType.TRACK }
|
]
|
}
|
}
|
|
// 状态流转映射(当前状态 -> 下一个状态)
|
const STATUS_FLOW_MAP: Record<OrderStatus, OrderStatus | null> = {
|
[OrderStatus.WAIT_UPLOAD]: OrderStatus.WAIT_AUTHORIZE,
|
[OrderStatus.WAIT_AUTHORIZE]: OrderStatus.WAIT_CONFIRM,
|
[OrderStatus.WAIT_CONFIRM]: OrderStatus.COMPLETED,
|
[OrderStatus.COMPLETED]: OrderStatus.EVALUATED,
|
[OrderStatus.EVALUATED]: null // 最终状态,无下一状态
|
}
|
|
/**
|
* 订单工作流程控制器类
|
*/
|
export class OrderWorkflowController {
|
|
/**
|
* 获取指定页面和状态下的可用操作列表
|
* @param pageType 页面类型
|
* @param currentStatus 当前订单状态
|
* @returns 操作配置列表
|
*/
|
static getAvailableActions(pageType: PageType, currentStatus: OrderStatus): ActionConfig[] {
|
const pageConfig = PAGE_ACTION_CONFIG[pageType]
|
if (!pageConfig) {
|
console.warn(`未找到页面类型 ${pageType} 的配置`)
|
return []
|
}
|
|
const statusConfig = pageConfig[currentStatus]
|
if (!statusConfig) {
|
console.warn(`未找到状态 ${currentStatus} 在页面 ${pageType} 中的配置`)
|
return []
|
}
|
|
return statusConfig
|
}
|
|
/**
|
* 判断是否可以执行指定操作
|
* @param pageType 页面类型
|
* @param currentStatus 当前订单状态
|
* @param actionType 操作类型
|
* @returns 是否可以执行
|
*/
|
static canExecuteAction(pageType: PageType, currentStatus: OrderStatus, actionType: ActionType): boolean {
|
const actions = this.getAvailableActions(pageType, currentStatus)
|
return actions.some(action => action.type === actionType)
|
}
|
|
/**
|
* 获取下一个状态
|
* @param currentStatus 当前状态
|
* @returns 下一个状态,如果已是最终状态则返回null
|
*/
|
static getNextStatus(currentStatus: OrderStatus): OrderStatus | null {
|
return STATUS_FLOW_MAP[currentStatus] || null
|
}
|
|
/**
|
* 判断当前状态是否为最终状态
|
* @param currentStatus 当前状态
|
* @returns 是否为最终状态
|
*/
|
static isFinalStatus(currentStatus: OrderStatus): boolean {
|
return currentStatus === OrderStatus.EVALUATED
|
}
|
|
/**
|
* 验证状态流转是否合法
|
* @param fromStatus 起始状态
|
* @param toStatus 目标状态
|
* @returns 是否为合法的状态流转
|
*/
|
static validateStatusTransition(fromStatus: OrderStatus, toStatus: OrderStatus): boolean {
|
const expectedNextStatus = this.getNextStatus(fromStatus)
|
return expectedNextStatus === toStatus
|
}
|
|
/**
|
* 获取所有状态的顺序列表
|
* @returns 状态列表
|
*/
|
static getAllStatusInOrder(): OrderStatus[] {
|
return [
|
OrderStatus.WAIT_UPLOAD,
|
OrderStatus.WAIT_AUTHORIZE,
|
OrderStatus.WAIT_CONFIRM,
|
OrderStatus.COMPLETED,
|
OrderStatus.EVALUATED
|
]
|
}
|
|
/**
|
* 根据产品套件判断初始状态
|
* @param orderDetails 订单详情列表
|
* @returns 初始状态
|
*/
|
static determineInitialStatus(orderDetails: any[]): OrderStatus {
|
// 检查是否有价格类型为"协议"的套件
|
const hasAgreementPrice = orderDetails.some(detail => {
|
const priceType = String(detail.priceType || '').toLowerCase()
|
return priceType.includes('协议') || priceType.includes('agreement')
|
})
|
|
// 如果有协议价格,从"待上传文件"开始,否则从"待授权"开始
|
return hasAgreementPrice ? OrderStatus.WAIT_UPLOAD : OrderStatus.WAIT_AUTHORIZE
|
}
|
}
|
|
// 状态映射工具函数(用于前后端状态转换)
|
export const StatusMapper = {
|
/**
|
* 前端枚举状态转后端中文状态
|
*/
|
toServerStatus: (uiStatus: string): string => {
|
// 直接返回中文状态,因为枚举值本身就是中文
|
return uiStatus
|
},
|
|
/**
|
* 后端中文状态转前端枚举状态
|
*/
|
toUIStatus: (serverStatus: string): OrderStatus => {
|
// 标准化状态名称
|
const normalizedStatus = serverStatus?.trim()
|
|
switch (normalizedStatus) {
|
case '待上传文件':
|
return OrderStatus.WAIT_UPLOAD
|
case '待授权':
|
return OrderStatus.WAIT_AUTHORIZE
|
case '待交易确认':
|
return OrderStatus.WAIT_CONFIRM
|
case '已完成':
|
return OrderStatus.COMPLETED
|
case '已评价':
|
return OrderStatus.EVALUATED
|
default:
|
console.warn(`未知的订单状态: ${serverStatus},默认返回待授权状态`)
|
return OrderStatus.WAIT_AUTHORIZE
|
}
|
}
|
}
|