CaiWuXiTong/modules/EcommerceFinance/Services/DingPayableWorkflowStatus.php

85 lines
2.7 KiB
PHP
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.

<?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;
}
}