文件
yjyf/server/application/common/library/OrderStatus.php
linda 376ce7b5c9 feat(api): 全链路后端 + 数据库设计 + E2E 测试(65 项断言全通过)
数据库:
- db/schema_phase1.sql  16 张业务表(类目/服务/地址/师傅/订单/流水/取证/报价/评价/券/钱包/提现/结算/消息)
- db/seed_phase1.sql    15 类目 + 32 服务项目 + 新人券(幂等)

后端 API (application/api/controller):
- Base/Auth/Home/Address/Order/Master/Review
- app/common/library/OrderStatus  11 状态机 + 流转矩阵
- application/api/common.php  PHP 8.5 兼容垫片(E_DEPRECATED 不再升级为异常)

测试:
- tests/e2e_flow.js  用户下单→支付→师傅抢单→履约→验收→结算→评价 全链路 65 项断言
- 含异常用例:越权/重复操作/非法状态流转/2h 未联系自动回流
2026-10-28 15:45:51 +08:00

122 行
3.8 KiB
PHP

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

<?php
namespace app\common\library;
/**
* 订单状态机
* 统一维护状态常量、文案与合法流转关系,前后端与后台共用同一套口径
*/
class OrderStatus
{
const PENDING_PAY = 0; // 待支付
const PENDING_ACCEPT = 1; // 待接单(进入订单大厅)
const QUOTING = 2; // 报价中(竞价单)
const ACCEPTED = 3; // 已接单
const SCHEDULED = 4; // 待上门(已约时间)
const ARRIVED = 5; // 已到达(师傅定位打卡)
const WORKING = 6; // 服务中(已开工)
const PENDING_VERIFY = 7; // 待验收(师傅完工)
const COMPLETED = 8; // 已完成(用户验收/自动验收)
const CANCELLED = 9; // 已取消
const AFTERSALE = 10; // 售后中
/** 状态文案 */
protected static $labels = [
self::PENDING_PAY => '待支付',
self::PENDING_ACCEPT => '待接单',
self::QUOTING => '报价中',
self::ACCEPTED => '已接单',
self::SCHEDULED => '待上门',
self::ARRIVED => '已到达',
self::WORKING => '服务中',
self::PENDING_VERIFY => '待验收',
self::COMPLETED => '已完成',
self::CANCELLED => '已取消',
self::AFTERSALE => '售后中',
];
/** 合法流转:from => [to, to, ...] */
protected static $transitions = [
self::PENDING_PAY => [self::PENDING_ACCEPT, self::CANCELLED],
self::PENDING_ACCEPT => [self::QUOTING, self::ACCEPTED, self::CANCELLED],
self::QUOTING => [self::ACCEPTED, self::CANCELLED],
self::ACCEPTED => [self::SCHEDULED, self::ARRIVED, self::PENDING_ACCEPT, self::CANCELLED],
self::SCHEDULED => [self::ARRIVED, self::PENDING_ACCEPT, self::CANCELLED],
self::ARRIVED => [self::WORKING],
self::WORKING => [self::PENDING_VERIFY],
self::PENDING_VERIFY => [self::COMPLETED, self::WORKING, self::AFTERSALE],
self::COMPLETED => [self::AFTERSALE],
self::AFTERSALE => [self::COMPLETED, self::CANCELLED],
];
/** 进行中(用户端"我的订单-进行中"、师傅端"待处理") */
protected static $activeStatus = [1, 2, 3, 4, 5, 6, 7];
/**
* 取状态文案
*/
public static function label($status)
{
$status = (int)$status;
return isset(self::$labels[$status]) ? self::$labels[$status] : '未知状态';
}
/**
* 全部状态(供前端渲染筛选 Tab)
*/
public static function all()
{
$ret = [];
foreach (self::$labels as $k => $v) {
$ret[] = ['value' => $k, 'label' => $v];
}
return $ret;
}
/**
* 判断是否允许从 $from 流转到 $to
*/
public static function can($from, $to)
{
$from = (int)$from;
$to = (int)$to;
if (!isset(self::$transitions[$from])) {
return false;
}
return in_array($to, self::$transitions[$from], true);
}
/**
* 某状态可流转到的下一批状态
*/
public static function next($from)
{
$from = (int)$from;
return isset(self::$transitions[$from]) ? self::$transitions[$from] : [];
}
/**
* 是否进行中
*/
public static function isActive($status)
{
return in_array((int)$status, self::$activeStatus, true);
}
/**
* 进行中的状态集合(用于 SQL in 查询)
*/
public static function activeValues()
{
return self::$activeStatus;
}
/**
* 用户是否可以取消
*/
public static function canCancelByUser($status)
{
return in_array((int)$status, [self::PENDING_PAY, self::PENDING_ACCEPT, self::ACCEPTED, self::SCHEDULED], true);
}
}