UsdtRechargeConfigService.php 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. <?php
  2. namespace App\Services;
  3. use App\Models\Config;
  4. use Illuminate\Validation\ValidationException;
  5. class UsdtRechargeConfigService
  6. {
  7. /** 能量兑换:多少能量对应多少 TRX,两个值作为一组保存。 */
  8. private const ENERGY_FIELDS = ['energy_amount' => '能量数量', 'energy_trx' => '能量对应TRX数量'];
  9. public function get(): array
  10. {
  11. $values = Config::whereIn('field', array_merge(['public_chain'], array_keys(self::ENERGY_FIELDS)))->pluck('val', 'field');
  12. return [
  13. 'public_chain' => (string)($values['public_chain'] ?? ''),
  14. 'energy_amount' => (string)($values['energy_amount'] ?? ''),
  15. 'energy_trx' => (string)($values['energy_trx'] ?? ''),
  16. ];
  17. }
  18. public function save(array $input): array
  19. {
  20. foreach (array_merge(['public_chain'], array_keys(self::ENERGY_FIELDS)) as $field) {
  21. if (isset($input[$field]) && is_string($input[$field])) {
  22. $input[$field] = trim($input[$field]);
  23. }
  24. }
  25. $data = validator($input, [
  26. 'public_chain' => ['present', 'nullable', 'string', 'max:2048'],
  27. 'energy_amount' => ['nullable', 'integer', 'min:1', 'max:4294967295'],
  28. 'energy_trx' => ['nullable', 'numeric', 'gt:0', 'max:999999999', 'regex:/^\d+(\.\d{1,6})?$/'],
  29. ], [
  30. 'energy_amount.*' => '能量数量须为正整数',
  31. 'energy_trx.*' => 'TRX数量须大于0,最多6位小数',
  32. ])->validate();
  33. // Old pages omit both energy fields and keep the saved pair; a pair is either fully set or fully cleared.
  34. $energy = array_intersect_key($input, self::ENERGY_FIELDS);
  35. if ($energy) {
  36. $filled = array_filter(array_keys(self::ENERGY_FIELDS), fn ($f) => ($data[$f] ?? null) !== null && $data[$f] !== '');
  37. if (count($filled) === 1) {
  38. throw ValidationException::withMessages(['energy_amount' => '能量数量与TRX数量需同时填写或同时清空']);
  39. }
  40. }
  41. Config::updateOrCreate(['field' => 'public_chain'], [
  42. 'val' => $data['public_chain'] ?? '',
  43. 'remark' => 'Public Chain 公链地址',
  44. 'group_id' => 1,
  45. ]);
  46. if ($energy) {
  47. foreach (self::ENERGY_FIELDS as $field => $remark) {
  48. $val = (string)($data[$field] ?? '');
  49. if ($val !== '') {
  50. // Canonical decimal text without float rounding: "003.500" -> "3.5".
  51. [$int, $dec] = array_pad(explode('.', $val, 2), 2, '');
  52. $val = (ltrim($int, '0') ?: '0') . (rtrim($dec, '0') === '' ? '' : '.' . rtrim($dec, '0'));
  53. }
  54. Config::updateOrCreate(['field' => $field], ['val' => $val, 'remark' => $remark, 'group_id' => 1]);
  55. }
  56. }
  57. return $this->get();
  58. }
  59. }