id; } /** * 批量处理积分转账 * * @param array $transfers 转账操作数组 * @return array 处理结果数组 */ public static function batchTransfer(array $transfers): array { $results = []; foreach ($transfers as $index => $transfer) { if (!isset( $transfer['from_user_id'], $transfer['to_user_id'], $transfer['point_id'], $transfer['amount'], $transfer['remark'] )) { $results[$index] = '转账参数不完整'; continue; } $result = self::to_user( $transfer['from_user_id'], $transfer['point_id'], $transfer['to_user_id'], $transfer['amount'], $transfer['remark'] ); $results[$index] = $result; } return $results; } /** * 完成转账操作 * * @param int $transferId 转账记录ID * @return bool|string 成功返回true,失败返回错误信息 */ public static function complete(int $transferId) { $transfer = PointTransferModel::find($transferId); if (!$transfer) { return '转账记录不存在'; } if ($transfer->isCompleted()) { return '转账记录已完成'; } if ($transfer->isFailed()) { return '转账记录已失败,无法完成'; } return $transfer->markCompleted(); } /** * 标记转账失败 * * @param int $transferId 转账记录ID * @return bool|string 成功返回true,失败返回错误信息 */ public static function fail(int $transferId) { $transfer = PointTransferModel::find($transferId); if (!$transfer) { return '转账记录不存在'; } if ($transfer->isCompleted()) { return '转账记录已完成,无法标记为失败'; } if ($transfer->isFailed()) { return '转账记录已失败'; } return $transfer->markFailed(); } /** * 获取用户转账记录 * * @param int $userId 用户ID * @param int $limit 限制数量 * @return array 转账记录数组 */ public static function getUserRecords(int $userId, int $limit = 50): array { $records = PointTransferModel::getUserRecords($userId, $limit); $result = []; foreach ($records as $record) { $result[] = [ 'id' => $record->id, 'from_user_id' => $record->from_user_id, 'to_user_id' => $record->to_user_id, 'point_id' => $record->point_id, 'amount' => $record->amount, 'remark' => $record->remark, 'status' => $record->status, 'status_name' => $record->getStatusName(), 'create_time' => $record->create_time, 'update_time' => $record->update_time, 'is_transfer_out' => $record->isTransferOut($userId), 'is_transfer_in' => $record->isTransferIn($userId), ]; } return $result; } /** * 获取用户转出记录 * * @param int $userId 用户ID * @param int $limit 限制数量 * @return array 转出记录数组 */ public static function getUserTransferOutRecords(int $userId, int $limit = 50): array { $records = PointTransferModel::getUserTransferOutRecords($userId, $limit); $result = []; foreach ($records as $record) { $result[] = [ 'id' => $record->id, 'from_user_id' => $record->from_user_id, 'to_user_id' => $record->to_user_id, 'point_id' => $record->point_id, 'amount' => $record->amount, 'remark' => $record->remark, 'status' => $record->status, 'status_name' => $record->getStatusName(), 'create_time' => $record->create_time, 'update_time' => $record->update_time, ]; } return $result; } /** * 获取用户转入记录 * * @param int $userId 用户ID * @param int $limit 限制数量 * @return array 转入记录数组 */ public static function getUserTransferInRecords(int $userId, int $limit = 50): array { $records = PointTransferModel::getUserTransferInRecords($userId, $limit); $result = []; foreach ($records as $record) { $result[] = [ 'id' => $record->id, 'from_user_id' => $record->from_user_id, 'to_user_id' => $record->to_user_id, 'point_id' => $record->point_id, 'amount' => $record->amount, 'remark' => $record->remark, 'status' => $record->status, 'status_name' => $record->getStatusName(), 'create_time' => $record->create_time, 'update_time' => $record->update_time, ]; } return $result; } /** * 验证转账操作的有效性 * * @param int $fromUserId 转出用户ID * @param int $toUserId 转入用户ID * @param int $pointId 积分类型ID * @param int $amount 转账积分数量 * @return bool|string 有效返回true,无效返回错误信息 */ public static function validate(int $fromUserId, int $toUserId, int $pointId, int $amount) { # 检查用户ID if ($fromUserId <= 0 || $toUserId <= 0) { return '用户ID无效'; } # 检查是否向自己转账 if ($fromUserId === $toUserId) { return '不能向自己转账'; } # 检查积分数量 if ($amount <= 0) { return '转账积分数量必须大于0'; } # 检查转出方积分余额 $checkResult = User::checkBalance($fromUserId, $pointId, $amount); if ($checkResult !== true) { return $checkResult; } return true; } /** * 获取转账统计信息 * * @param int $userId 用户ID * @param int|null $pointId 积分类型ID(可选) * @return array 统计信息数组 */ public static function getTransferStats(int $userId, ?int $pointId = null): array { $query = PointTransferModel::where(function($q) use ($userId) { $q->where('from_user_id', $userId)->orWhere('to_user_id', $userId); }); if ($pointId !== null) { $query->where('point_id', $pointId); } $records = $query->get(); $stats = [ 'total_count' => $records->count(), 'transfer_out_count' => 0, 'transfer_in_count' => 0, 'transfer_out_amount' => 0, 'transfer_in_amount' => 0, ]; foreach ($records as $record) { if ($record->from_user_id === $userId) { $stats['transfer_out_count']++; $stats['transfer_out_amount'] += $record->amount; } else { $stats['transfer_in_count']++; $stats['transfer_in_amount'] += $record->amount; } } return $stats; } }