45 lines
1.6 KiB
PHP
45 lines
1.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace app\common\service\pharmacy;
|
|
|
|
use DomainException;
|
|
|
|
final class PharmacySubmissionClaimPolicy
|
|
{
|
|
/** @param array<string,mixed> $claim @return array<string,mixed> */
|
|
public static function existingDecision(array $claim, string $requestedTarget, ?int $now = null): array
|
|
{
|
|
$target = (string) ($claim['target'] ?? '');
|
|
$status = strtoupper(trim((string) ($claim['status'] ?? '')));
|
|
if ($status === 'SUCCESS') {
|
|
if ($target !== $requestedTarget) {
|
|
throw new DomainException('该订单已上传其他药房');
|
|
}
|
|
return ['action' => 'IDEMPOTENT'] + $claim;
|
|
}
|
|
if ($status === 'PENDING') {
|
|
$leaseExpiresAt = (int) ($claim['lease_expires_at'] ?? 0);
|
|
if ($leaseExpiresAt > 0 && $leaseExpiresAt <= ($now ?? time())) {
|
|
return [
|
|
'action' => $target === 'gancao' ? 'RECONCILE' : 'RETRY',
|
|
'lease_expired' => true,
|
|
] + $claim;
|
|
}
|
|
throw new DomainException('该订单正在上传药房,请勿重复提交');
|
|
}
|
|
if (in_array($status, ['UNKNOWN', 'PENDING_RECONCILE'], true)) {
|
|
if ($target !== $requestedTarget) {
|
|
throw new DomainException('该订单远端结果待对账,禁止切换药房');
|
|
}
|
|
return ['action' => 'RECONCILE'] + $claim;
|
|
}
|
|
if ($status === 'FAILED') {
|
|
return ['action' => 'RETRY'] + $claim;
|
|
}
|
|
|
|
throw new DomainException('药房提交状态异常,请先对账处理');
|
|
}
|
|
}
|