RedpackWallet.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <?php
  2. namespace addons\Redpack\common\models;
  3. use addons\Redpack\common\enums\RedpackEnum;
  4. use common\enums\RedisKeyEnum;
  5. use common\enums\StatusEnum;
  6. use common\helpers\LockHelper;
  7. use Yii;
  8. use yii\db\Exception;
  9. /**
  10. * This is the model class for table "{{%addons_redpack_wallet}}".
  11. *
  12. * @property int $id
  13. * @property int $mall_id 商城id
  14. * @property int $user_id 会员id
  15. * @property float $redpack 激活红包
  16. * @property float $frozen_redpack 冻结红包
  17. * @property float $total_redpack 总激活红包
  18. * @property float $total_frozen_redpack 总冻结红包
  19. * @property float $total_use_redpack 已使用激活红包
  20. * @property float $total_use_frozen_redpack 已使用冻结红包
  21. * @property int|null $status 状态[-1:删除;0:禁用;1启用]
  22. * @property int $created_at
  23. * @property int $updated_at
  24. */
  25. class RedpackWallet extends \common\models\base\BaseActiveRecord
  26. {
  27. /**
  28. * {@inheritdoc}
  29. */
  30. public static function tableName()
  31. {
  32. return '{{%addons_redpack_wallet}}';
  33. }
  34. public static function briefTableName()
  35. {
  36. return 'addons_redpack_wallet';
  37. }
  38. /**
  39. * {@inheritdoc}
  40. */
  41. public function rules()
  42. {
  43. return [
  44. [['mall_id', 'user_id', 'status', 'created_at', 'updated_at'], 'integer'],
  45. [['redpack', 'frozen_redpack', 'total_redpack', 'total_frozen_redpack', 'total_use_redpack', 'total_use_frozen_redpack'], 'number'],
  46. ];
  47. }
  48. /**
  49. * {@inheritdoc}
  50. */
  51. public function attributeLabels()
  52. {
  53. return [
  54. 'id' => 'ID',
  55. 'mall_id' => '商城id',
  56. 'user_id' => '会员id',
  57. 'redpack' => '激活红包',
  58. 'frozen_redpack' => '冻结红包',
  59. 'total_redpack' => '总激活红包',
  60. 'total_frozen_redpack' => '总冻结红包',
  61. 'total_use_redpack' => '已使用激活红包',
  62. 'total_use_frozen_redpack' => '已使用冻结红包',
  63. 'status' => '状态[-1:删除;0:禁用;1启用]',
  64. 'created_at' => 'Created At',
  65. 'updated_at' => 'Updated At',
  66. ];
  67. }
  68. /**
  69. * 保存数据
  70. * $params数组参数如下
  71. * mall_id 必填 商城id
  72. * user_id 必填 用户id
  73. * is_frozen 必填 是否是冻结,值为[true,false]
  74. * is_deduct 非必填 余额不足是否扣减至0元(money必须为负数),值为[true,false]
  75. * money 必填 增加或扣减的金额
  76. * source_table 非必填 来源表,如 addons_redpack
  77. * source_table_id 非必填 来源表id
  78. * from_type 来源 值请参考 RedpackEnum::getFromType()
  79. * desc 非必填 变动说明
  80. * @Author: lun
  81. * @DateTime: 2022/3/22 0022 10:29
  82. * @Copyright: copyright (c) 2021 广东七件事集团
  83. * @param $params
  84. * @param $is_log 是否生成红包日志
  85. * @return array|bool
  86. */
  87. public static function setData($params, $is_log = true)
  88. {
  89. $trans = Yii::$app->db->beginTransaction();
  90. // 加锁
  91. $lock_key = RedisKeyEnum::suffix(RedpackEnum::LOCK_WALLET , $params['user_id']);
  92. $identification = uniqid();
  93. try {
  94. if ($params['money'] == 0) throw new \Exception("变动红包金额不能为0");
  95. // 判断是否有被锁住
  96. if (!LockHelper::lock($lock_key, $identification, 100, 100)) {
  97. throw new \Exception("红包被锁定请稍后进行操作");
  98. }
  99. $model = self::findOne(['user_id' => $params['user_id'], 'status' => StatusEnum::ENABLED]);
  100. if (empty($model)) {
  101. $model = new self();
  102. $model->mall_id = $params['mall_id'];
  103. $model->user_id = $params['user_id'];
  104. $model->loadDefaultValues();
  105. }
  106. // 红包变动字段处理
  107. $field = $params['is_frozen'] == false ? 'redpack' : 'frozen_redpack';
  108. $use_field = $params['is_frozen'] == false ? 'total_use_redpack' : 'total_use_frozen_redpack';
  109. $total_field = $params['is_frozen'] == false ? 'total_redpack' : 'total_frozen_redpack';
  110. $redpack_wallet_type = $params['is_frozen'] == false ? RedpackEnum::WALLET_REDPACK : RedpackEnum::WALLET_REDPACK_FROZEN;
  111. if ($params['money'] < 0) {
  112. if (($model[$field] + $params['money']) < 0) {
  113. if (isset($params['is_deduct']) && $params['is_deduct'] == true) {
  114. $params['money'] = -$model[$field];
  115. if ($params['money'] == 0) {
  116. throw new \Exception(RedpackEnum::getRedpackText($redpack_wallet_type, $params['mall_id']) . "余额不足");
  117. }
  118. } else {
  119. throw new \Exception(RedpackEnum::getRedpackText($redpack_wallet_type, $params['mall_id']) . "余额不足");
  120. }
  121. }
  122. $model[$use_field] = $model[$use_field] + abs($params['money']);
  123. }
  124. $model[$field] = $model[$field] + $params['money'];
  125. $after_num = $model[$field];// 变动后余额
  126. $params['money'] > 0 && empty($params['no_icr_total']) && $model[$total_field] = $model[$total_field] + $params['money'];
  127. if (!$model->save()) throw new Exception($model->getErrorMessage());
  128. // 增加余额变动记录
  129. if ($is_log) {
  130. $res = RedpackWalletLog::setData([
  131. 'mall_id' => $params['mall_id'],
  132. 'user_id' => $params['user_id'],
  133. 'redpack_wallet_type' => $redpack_wallet_type,
  134. 'change_type' => $params['money'] > 0 ? RedpackEnum::CHANGE_TYPE_ADD : RedpackEnum::CHANGE_TYPE_SUB,
  135. 'change_num' => abs($params['money']),
  136. 'after_num' => $after_num,
  137. 'desc' => $params['desc'] ?? '',
  138. 'source_table' => $params['source_table'] ?? '',
  139. 'source_table_id' => $params['source_table_id'] ?? 0,
  140. 'from_type' => $params['from_type'],
  141. ]);
  142. if ($res == false) throw new \Exception(RedpackWalletLog::getStaticError());
  143. }
  144. $trans->commit();
  145. // 解锁
  146. LockHelper::uLock($lock_key, $identification);
  147. return ['redpack' => $model->toArray(), 'money' => abs($params['money'])];
  148. } catch (\Exception $e) {
  149. self::setStaticError($e->getMessage());
  150. $trans->rollBack();
  151. // 解锁
  152. LockHelper::uLock($lock_key, $identification);
  153. return false;
  154. }
  155. }
  156. }