| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312 |
- <?php
- namespace App\Module\Point\Logic;
- use App\Module\Point\Models\PointTransferModel;
- /**
- * 积分转账逻辑类
- *
- * 处理不同用户间的积分转账操作
- * 专注于整数积分处理,不涉及小数运算
- */
- class Transfer
- {
- /**
- * 处理用户间积分转账
- *
- * @param int $fromUserId 转出用户ID
- * @param int $pointId 积分类型ID
- * @param int $toUserId 转入用户ID
- * @param int $amount 转账积分数量
- * @param string $remark 备注
- * @return int|string 成功返回转账记录ID,失败返回错误信息
- */
- public static function to_user(int $fromUserId, int $pointId, int $toUserId, int $amount, string $remark)
- {
- # 参数验证
- 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;
- }
- # 创建转账记录
- $transfer = PointTransferModel::createRecord(
- $fromUserId,
- $toUserId,
- $pointId,
- $amount,
- $remark
- );
- if (!$transfer) {
- return '创建转账记录失败';
- }
- return $transfer->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;
- }
- }
|