| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- <?php
- namespace App\Module\Point\Models;
- use App\Module\Point\Enums\POINT_TYPE;
- use UCore\ModelCore;
- use Illuminate\Database\Eloquent\Relations\BelongsTo;
- /**
- * 用户积分表
- *
- * 存储用户的各种积分账户信息及积分余额。每个用户可以拥有多个不同种类的积分账户,
- * 每个积分账户对应一种积分类型(PointConfigModel)。
- * 专注于整数型积分处理,不涉及小数运算。
- *
- * field start
- * @property int $id 自增
- * @property int $user_id 用户ID
- * @property \App\Module\Point\Enums\POINT_TYPE $point_id 积分类型ID
- * @property int $balance 积分余额(整数)
- * @property int $update_time 更新时间
- * @property int $create_time 创建时间
- * field end
- */
- class PointModel extends ModelCore
- {
- protected $table = 'point';
- public $timestamps = false;
- // attrlist start
- protected $fillable = [
- 'id',
- 'user_id',
- 'point_id',
- 'balance',
- 'update_time',
- 'create_time',
- ];
- // attrlist end
- protected $casts = [
- 'point_id' => POINT_TYPE::class
- ];
- /**
- * 获取用户积分账户
- *
- * @param int $userId 用户ID
- * @param int $pointId 积分类型ID
- * @return PointModel|null 积分账户模型
- */
- public static function getAccount(int $userId, int $pointId): ?PointModel
- {
- return self::where('user_id', $userId)
- ->where('point_id', $pointId)
- ->first();
- }
- /**
- * 获取用户所有积分账户
- *
- * @param int $userId 用户ID
- * @return \Illuminate\Database\Eloquent\Collection 积分账户集合
- */
- public static function userAccount(int $userId)
- {
- return self::where('user_id', $userId)->get();
- }
- /**
- * 创建或获取用户积分账户
- *
- * @param int $userId 用户ID
- * @param int $pointId 积分类型ID
- * @return PointModel 积分账户模型
- */
- public static function createOrGet(int $userId, int $pointId): PointModel
- {
- $account = self::getAccount($userId, $pointId);
-
- if (!$account) {
- $account = new self();
- $account->user_id = $userId;
- $account->point_id = $pointId;
- $account->balance = 0;
- $account->create_time = time();
- $account->update_time = time();
- $account->save();
- }
-
- return $account;
- }
- /**
- * 增加积分
- *
- * @param int $userId 用户ID
- * @param int $pointId 积分类型ID
- * @param int $amount 积分数量(正整数)
- * @return bool 是否成功
- */
- public static function inc(int $userId, int $pointId, int $amount): bool
- {
- if ($amount <= 0) {
- return false;
- }
- $account = self::createOrGet($userId, $pointId);
- $account->balance += $amount;
- $account->update_time = time();
-
- return $account->save();
- }
- /**
- * 减少积分
- *
- * @param int $userId 用户ID
- * @param int $pointId 积分类型ID
- * @param int $amount 积分数量(正整数)
- * @return bool|string 成功返回true,失败返回错误信息
- */
- public static function dec(int $userId, int $pointId, int $amount)
- {
- if ($amount <= 0) {
- return '积分数量必须大于0';
- }
- $account = self::getAccount($userId, $pointId);
- if (!$account) {
- return '积分账户不存在';
- }
- if ($account->balance < $amount) {
- return '积分余额不足';
- }
- $account->balance -= $amount;
- $account->update_time = time();
-
- return $account->save();
- }
- /**
- * 获取用户积分余额
- *
- * @param int $userId 用户ID
- * @param int $pointId 积分类型ID
- * @return int 积分余额
- */
- public static function getBalance(int $userId, int $pointId): int
- {
- $account = self::getAccount($userId, $pointId);
- return $account ? $account->balance : 0;
- }
- /**
- * 检查积分余额是否足够
- *
- * @param int $userId 用户ID
- * @param int $pointId 积分类型ID
- * @param int $amount 需要的积分数量
- * @return bool 是否足够
- */
- public static function checkBalance(int $userId, int $pointId, int $amount): bool
- {
- $balance = self::getBalance($userId, $pointId);
- return $balance >= $amount;
- }
- /**
- * 设置积分余额
- *
- * @param int $userId 用户ID
- * @param int $pointId 积分类型ID
- * @param int $balance 新的积分余额
- * @return bool 是否成功
- */
- public static function setBalance(int $userId, int $pointId, int $balance): bool
- {
- if ($balance < 0) {
- return false;
- }
- $account = self::createOrGet($userId, $pointId);
- $account->balance = $balance;
- $account->update_time = time();
-
- return $account->save();
- }
- /**
- * 获取积分类型名称
- *
- * @return string 积分类型名称
- */
- public function getPointTypeName(): string
- {
- return $this->point_id->getTypeName();
- }
- }
|