'能量数量', '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(); } }