validate([ 'amount' => ['required', 'numeric', 'min:0.01'], 'remark' => ['required', 'string', 'min:1'], 'change_type' => ['required', 'string', 'in:' . implode(',', BalanceLogService::$manualRecharge)], 'id' => ['required', 'integer', 'min:1'], ]); $id = request()->input('id'); $params['action'] = request()->route()->getActionName(); $amount = request()->input('amount'); $remark = request()->input('remark'); $changeType = request()->input('change_type'); $key = 'api_request_' . md5(json_encode($params)); if (Cache::has($key)) throw new Exception("请求太频繁,请稍后再试。", HttpStatus::CUSTOM_ERROR); Cache::put($key, true, 3); $activityUser = ActivityUserService::findOne(['id' => $id, 'status' => 0]); if (!$activityUser) throw new Exception("活动不存在或已完成", HttpStatus::CUSTOM_ERROR); $memberId = $activityUser->member_id; $activityUser->status = 1; $activityUser->finish_time = time(); $activityUser->save(); $wallet = WalletModel::where('member_id', $memberId)->first(); if (!$wallet) throw new Exception('用户不存在', HttpStatus::CUSTOM_ERROR); $availableBalance = bcadd($wallet->available_balance, $amount, 10); BalanceLogService::addLog($memberId, $amount, $wallet->available_balance, $availableBalance, $changeType, null, $remark); $wallet->available_balance = $availableBalance; $wallet->save(); DB::commit(); } catch (ValidationException $e) { DB::rollBack(); return $this->error(HttpStatus::CUSTOM_ERROR, $e->validator->errors()->first()); } catch (Exception $e) { DB::rollBack(); return $this->error($e->getCode(), $e->getMessage()); } $availableBalance = floatval($availableBalance); // 去除多余0后,再用 sprintf 补足两位 $availableBalance = sprintf('%.2f', $availableBalance); TopUpService::notifyTransferSuccess($memberId, "完成活动:" . ($amount > 0 ? '+' : '') . "{$amount} \n总余额为:{$availableBalance}"); return $this->success(); } public function index(): JsonResponse { try { $params = request()->validate([ 'page' => ['required', 'integer', 'min:1'], 'limit' => ['required', 'integer', 'min:1'], 'title' => ['nullable', 'string'], 'member_id' => ['nullable', 'string'], ]); $page = request()->input('page', 1); $limit = request()->input('limit', 10); $where = ActivityUserService::getWhere($params); $query = ActivityUserModel::where($where); $count = $query->count(); $list = $query->orderByDesc('status') ->orderByDesc('part_in_time') ->forPage($page, $limit)->get()->toArray(); $result = ['total' => $count, 'data' => $list]; } catch (ValidationException $e) { return $this->error(HttpStatus::CUSTOM_ERROR, $e->validator->errors()->first()); } catch (Exception $e) { return $this->error($e->getCode(), $e->getMessage()); } return $this->success($result); } }