Bank::getBankList()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 3
rs 10
1
<?php
2
namespace SimpleCMS\Bank\Packages;
3
4
use Illuminate\Support\Collection;
5
6
/**
7
 * 银行卡模块
8
 */
9
class Bank
10
{
11
    protected Collection $banks;
12
13
    /**
14
     * Bank构造函数
15
     *
16
     * @param string $region_path 区域路径
17
     */
18
    public function __construct(protected string $bank_path)
19
    {
20
        $this->banks = new Collection();
21
        $this->loadBanks();
22
    }
23
24
    /**
25
     * 从指定区域路径加载银行数据
26
     */
27
    protected function loadBanks(): void
28
    {
29
        $content = file_get_contents(env('REGION_PATH', $this->bank_path));
30
31
        try {
32
            $data = json_decode($content, true);
33
34
            foreach ($data as $bank) {
35
                $this->banks->push($this->convertBank($bank));
36
            }
37
        } catch (\Exception $e) {
38
            error_log($e->getMessage());
39
        }
40
    }
41
42
    /**
43
     * 将表示银行的数组转换为BankModel对象
44
     *
45
     * @param array $bankData 银行数据数组
46
     * @return BankModel
47
     */
48
    protected function convertBank(array $bankData): BankModel
49
    {
50
        $obj = new BankModel(
51
            $bankData['name'] ?? null,
52
            $bankData['code'] ?? null,
53
            $bankData['bin'] ?? []
54
        );
55
56
        return $obj;
57
    }
58
59
    /**
60
     * 获取银行列表
61
     *
62
     * @return Collection
63
     */
64
    public function getBankList(): Collection
65
    {
66
        return $this->banks;
67
    }
68
69
    /**
70
     * 通过银行代码查询银行
71
     *
72
     * @param string $code 银行代码
73
     * @return BankModel|null
74
     */
75
    public function getBankByCode(string $code): ?BankModel
76
    {
77
        return $this->banks->first(fn($bank) => $bank->code === $code);
78
    }
79
80
    /**
81
     * 通过银行名称查询银行
82
     *
83
     * @param string $name 银行名称
84
     * @return BankModel|null
85
     */
86
    public function getBankByName(string $name): ?BankModel
87
    {
88
        return $this->banks->first(fn($bank) => $bank->name === $name);
89
    }
90
91
    /**
92
     * 通过BIN查询银行
93
     *
94
     * @param string $bin BIN码
95
     * @return BankModel|null
96
     */
97
    public function getBankByBin(string $bin): ?BankModel
98
    {
99
        return $this->banks->first(fn(BankModel $bank) => $bank->hasBin($bin));
100
    }
101
102
    /**
103
     * 通过卡号查询银行
104
     *
105
     * @param string $cardNumber 完整卡号
106
     * @return BankModel|null
107
     */
108
    public function getBankByCardNumber(string $cardNumber): ?BankModel
109
    {
110
        return $this->banks->first(fn(BankModel $bank) => $bank->hasCardNumber($cardNumber));
111
    }
112
113
    /**
114
     * 检查指定BIN是否有效
115
     *
116
     * @param string $bin BIN码
117
     * @return bool
118
     */
119
    public function checkBin(string $bin): bool
120
    {
121
        return $this->banks->contains(fn(BankModel $bank) => $bank->isValid($bin));
122
    }
123
124
    /**
125
     * 检查卡号有效性
126
     *
127
     * @param string $bin BIN码
128
     * @return bool
129
     */
130
    public function checkCardNumber(string $bin): bool
131
    {
132
        return $this->banks->contains(fn(BankModel $bank) => $bank->hasCardNumber($bin));
133
    }
134
135
    /**
136
     * 返回<value:,name:>格式的选项列表
137
     *
138
     * @param string $type 获取类型
139
     * @return Collection
140
     */
141
    public function getOptions(string $type = 'all'): Collection
142
    {
143
        if ($type == 'all')
144
            return $this->banks->map(fn(BankModel $bankModel) => ['value' => $bankModel->code, 'name' => $bankModel->name]);
145
        $type = strtoupper($type);
146
        return $this->banks->filter(function (BankModel $bankModel) use ($type) {
147
            return match ($type) {
148
                'PC' => $bankModel->getPC()->count() > 0,
149
                'CC' => $bankModel->getCC()->count() > 0,
150
                'DC' => $bankModel->getDC()->count() > 0,
151
                'SCC' => $bankModel->getSCC()->count() > 0,
152
                default => false
153
            };
154
        })->values()->map(fn(BankModel $bankModel) => ['value' => $bankModel->code, 'name' => $bankModel->name]);
155
    }
156
}