| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- <?php
- namespace App\Services;
- use App\Models\Config;
- use Illuminate\Validation\ValidationException;
- class UsdtRechargeConfigService
- {
- /** 能量兑换:多少能量对应多少 TRX,两个值作为一组保存。 */
- private const ENERGY_FIELDS = ['energy_amount' => '能量数量', 'energy_trx' => '能量对应TRX数量'];
- public function get(): array
- {
- $values = Config::whereIn('field', array_merge(['public_chain'], array_keys(self::ENERGY_FIELDS)))->pluck('val', 'field');
- return [
- 'public_chain' => (string)($values['public_chain'] ?? ''),
- 'energy_amount' => (string)($values['energy_amount'] ?? ''),
- 'energy_trx' => (string)($values['energy_trx'] ?? ''),
- ];
- }
- public function save(array $input): array
- {
- foreach (array_merge(['public_chain'], array_keys(self::ENERGY_FIELDS)) as $field) {
- if (isset($input[$field]) && is_string($input[$field])) {
- $input[$field] = trim($input[$field]);
- }
- }
- $data = validator($input, [
- 'public_chain' => ['present', 'nullable', 'string', 'max:2048'],
- 'energy_amount' => ['nullable', 'integer', 'min:1', 'max:4294967295'],
- 'energy_trx' => ['nullable', 'numeric', 'gt:0', 'max:999999999', 'regex:/^\d+(\.\d{1,6})?$/'],
- ], [
- 'energy_amount.*' => '能量数量须为正整数',
- 'energy_trx.*' => 'TRX数量须大于0,最多6位小数',
- ])->validate();
- // Old pages omit both energy fields and keep the saved pair; a pair is either fully set or fully cleared.
- $energy = array_intersect_key($input, self::ENERGY_FIELDS);
- if ($energy) {
- $filled = array_filter(array_keys(self::ENERGY_FIELDS), fn ($f) => ($data[$f] ?? null) !== null && $data[$f] !== '');
- if (count($filled) === 1) {
- throw ValidationException::withMessages(['energy_amount' => '能量数量与TRX数量需同时填写或同时清空']);
- }
- }
- Config::updateOrCreate(['field' => 'public_chain'], [
- 'val' => $data['public_chain'] ?? '',
- 'remark' => 'Public Chain 公链地址',
- 'group_id' => 1,
- ]);
- if ($energy) {
- foreach (self::ENERGY_FIELDS as $field => $remark) {
- $val = (string)($data[$field] ?? '');
- if ($val !== '') {
- // Canonical decimal text without float rounding: "003.500" -> "3.5".
- [$int, $dec] = array_pad(explode('.', $val, 2), 2, '');
- $val = (ltrim($int, '0') ?: '0') . (rtrim($dec, '0') === '' ? '' : '.' . rtrim($dec, '0'));
- }
- Config::updateOrCreate(['field' => $field], ['val' => $val, 'remark' => $remark, 'group_id' => 1]);
- }
- }
- return $this->get();
- }
- }
|