85 lines
2.7 KiB
PHP
85 lines
2.7 KiB
PHP
<?php
|
||
|
||
namespace Modules\EcommerceFinance\Services;
|
||
|
||
/**
|
||
* 将钉钉审批实例的生命周期状态和审批结果统一成页面状态。
|
||
*
|
||
* 钉钉的 status 表示流程生命周期,result 表示最终审批结论;例如
|
||
* COMPLETED + refuse 在钉钉页面应显示为“已拒绝”,不能只按 COMPLETED
|
||
* 显示为“已完成”。
|
||
*/
|
||
final class DingPayableWorkflowStatus
|
||
{
|
||
/** @return array<string,string> */
|
||
public static function filterOptions(): array
|
||
{
|
||
return [
|
||
'' => '全部状态',
|
||
'RUNNING' => '进行中',
|
||
'COMPLETED' => '已完成',
|
||
'REJECTED' => '已拒绝',
|
||
'WITHDRAWN' => '已撤回',
|
||
'FAILED' => '失败',
|
||
'EXPIRED' => '已过期',
|
||
'DELETED' => '已删除',
|
||
];
|
||
}
|
||
|
||
/** @param array<string,mixed> $workflow */
|
||
public static function key(array $workflow): string
|
||
{
|
||
$status = strtoupper(trim((string) ($workflow['status'] ?? '')));
|
||
$result = strtoupper(trim((string) ($workflow['result'] ?? '')));
|
||
|
||
// 审批结果优先于生命周期状态:流程完成但被拒绝时,钉钉显示“已拒绝”。
|
||
if (in_array($result, ['REFUSE', 'REJECT', 'REJECTED'], true)) {
|
||
return 'REJECTED';
|
||
}
|
||
|
||
return match ($status) {
|
||
'RUNNING', 'PENDING', 'WAITING' => 'RUNNING',
|
||
'COMPLETED' => 'COMPLETED',
|
||
'REJECTED' => 'REJECTED',
|
||
'TERMINATED', 'CANCELED', 'CANCELLED', 'REVOKED' => 'WITHDRAWN',
|
||
'FAILED' => 'FAILED',
|
||
'EXPIRED' => 'EXPIRED',
|
||
'DELETED' => 'DELETED',
|
||
'NEW' => 'NEW',
|
||
'DRAFT' => 'DRAFT',
|
||
default => $status !== '' ? $status : 'UNKNOWN',
|
||
};
|
||
}
|
||
|
||
/** @param array<string,mixed> $workflow */
|
||
public static function label(array $workflow): string
|
||
{
|
||
$key = self::key($workflow);
|
||
|
||
return self::filterOptions()[$key] ?? match ($key) {
|
||
'NEW' => '待提交',
|
||
'DRAFT' => '草稿',
|
||
'UNKNOWN' => '-',
|
||
default => $key,
|
||
};
|
||
}
|
||
|
||
/** @param array<string,mixed> $workflow */
|
||
public static function matchesFilter(array $workflow, string $requested): bool
|
||
{
|
||
$requested = strtoupper(trim($requested));
|
||
if ($requested === '') {
|
||
return true;
|
||
}
|
||
|
||
// 兼容旧链接中的原始钉钉状态值,同时让筛选结果与页面显示一致。
|
||
$requested = match ($requested) {
|
||
'PENDING', 'WAITING' => 'RUNNING',
|
||
'TERMINATED', 'CANCELED', 'CANCELLED', 'REVOKED' => 'WITHDRAWN',
|
||
default => $requested,
|
||
};
|
||
|
||
return self::key($workflow) === $requested;
|
||
}
|
||
}
|