ShortVideoBrowseAward.php.bak 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. <?php
  2. namespace addons\ShortVideo\common\models;
  3. use addons\ShortVideo\common\enums\AddonsShortVideoEnum;
  4. use common\enums\StatusEnum;
  5. use common\enums\UserWalletEnum;
  6. use common\models\user\User;
  7. use services\common\UserWalletService;
  8. use Yii;
  9. /**
  10. * This is the model class for table "{{%addons_short_video_browse_award}}".
  11. *
  12. * @property int $id
  13. * @property int $mall_id
  14. * @property int $video_id 视频id
  15. * @property int $user_id 用户id
  16. * @property int|null $source_user_id 源头id
  17. * @property int|null $user_type 用户类型:0:本人 1:一级 2:二级
  18. * @property int $award_type 奖励类型 0:积分 1:现金
  19. * @property float $award_integral 奖励积分
  20. * @property float $award_money 奖励金额
  21. * @property int $status 状态[-1:删除;0:禁用;1启用]
  22. * @property int $created_at
  23. * @property int $updated_at
  24. */
  25. class ShortVideoBrowseAward extends \common\models\base\BaseActiveRecord
  26. {
  27. /**
  28. * {@inheritdoc}
  29. */
  30. public static function tableName()
  31. {
  32. return '{{%addons_short_video_browse_award}}';
  33. }
  34. /**
  35. * {@inheritdoc}
  36. */
  37. public function rules()
  38. {
  39. return [
  40. [['mall_id', 'video_id', 'user_id'], 'required'],
  41. [['mall_id', 'video_id', 'user_id', 'source_user_id', 'user_type', 'award_type', 'status', 'created_at', 'updated_at'], 'integer'],
  42. [['award_integral', 'award_money'], 'number'],
  43. ];
  44. }
  45. /**
  46. * {@inheritdoc}
  47. */
  48. public function attributeLabels()
  49. {
  50. return [
  51. 'id' => 'ID',
  52. 'mall_id' => '商城ID',
  53. 'video_id' => '视频ID',
  54. 'user_id' => '会员ID',
  55. 'source_user_id' => '来源会员ID',
  56. 'user_type' => '会员类型',
  57. 'award_type' => '奖励类型',
  58. 'award_integral' => '奖励积分',
  59. 'award_money' => '奖励金额',
  60. 'status' => '状态[-1:删除;0:禁用;1启用]',
  61. 'created_at' => 'Created At',
  62. 'updated_at' => 'Updated At',
  63. ];
  64. }
  65. /**
  66. * @name:
  67. * @msg: 发放观看视频奖励和分享视频奖励(分享的只发一级)
  68. * @param {int} $mall_id
  69. * @param {array} $data video_id:视频id;user_id:当前会员id;browse_log_id:浏览视频记录id
  70. * @return {*}
  71. */
  72. public static function grantReward(int $mall_id, array $data)
  73. {
  74. $video = ShortVideo::findOne(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'id' => $data['video_id'], 'check_status' => AddonsShortVideoEnum::VIDEO_AUDIT_STATUS1, 'is_blacklist' => 0]);
  75. if (empty($video)) {
  76. self::$static_error = '视频不存在';
  77. return false;
  78. }
  79. $reward_info = ShortVideoBrowseAward::find()
  80. ->select('video_id,user_id')
  81. ->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'video_id' => $data['video_id'], 'user_id' => $data['user_id'], 'user_type' => 0])
  82. ->asArray()
  83. ->one();
  84. // 如果已经发过观看奖励则不再发
  85. if (!empty($reward_info)) return true;
  86. $params_video = [
  87. 'id' => $data['video_id'],
  88. 'look_complete_num' => $video->look_complete_num + 1,
  89. ];
  90. $transaction = \Yii::$app->db->beginTransaction();
  91. $res_video = ShortVideo::setData($mall_id, $params_video);
  92. if (false === $res_video) {
  93. self::$static_error = ShortVideo::getStaticError();
  94. return false;
  95. }
  96. $time = time();
  97. // 奖励记录数据
  98. $browse_reward_log_datas = [];
  99. // 钱包数据
  100. $wallet_datas = [];
  101. // 当前会员id
  102. $user_id_0 = $data['user_id'];
  103. // 上一级分享会员id
  104. $user_id_1 = 0;
  105. // 查询当前视频是否分享观看
  106. $browse = ShortVideoBrowse::find()
  107. ->where(['mall_id' => $mall_id, 'user_id' => $data['user_id'], 'is_share' => 1, 'video_id' => $data['video_id'], 'id' => $data['browse_log_id']])
  108. ->one();
  109. if (!empty($browse)) {
  110. // 更新当前会员浏览记录
  111. $browse->is_complete_look = 1;
  112. $browse->complete_time = time();
  113. $res_browse = $browse->save();
  114. if (false === $res_browse) {
  115. $transaction->rollBack();
  116. self::$static_error = '完整观看视频回调发放观看奖励出错--更新会员浏览记录出错:' . $browse->getErrors();
  117. return false;
  118. }
  119. $share_log = ShortVideoShare::findOne(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'video_id' => $data['video_id'], 'id' => $browse->share_log_id, ]);
  120. if (!empty($share_log) && $user_id_0 != $share_log->user_id) {
  121. // 如果是自己分享的视频自己看,则不发放上级的奖励
  122. $user_id_1 = $share_log->user_id;
  123. $user = User::findOne(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'id' => $user_id_1]);
  124. if (empty($user)) $user_id_1 = 0;
  125. }
  126. }
  127. if (1 == $video->open_integral_award) {
  128. // 开启积分奖励
  129. // 当前视频可以用于奖励的基准积分
  130. $score_reward_base = min($video->watch_integral_sum, $video->max_integral);
  131. // 当前会员获得的奖励
  132. $score_user_reward_0 = bcmul($score_reward_base, $video->watch_integral / 100, 2);
  133. // 分享上级获得的积分奖励
  134. $score_user_reward_1 = bcmul($score_reward_base, $video->watch_integral_one / 100, 2);
  135. if ($score_user_reward_0 > 0) {
  136. $browse_reward_log_datas[] = [$mall_id, $data['video_id'], $user_id_0, 0, 0, 0, $score_user_reward_0, 0, 1, $time, $time];
  137. $wallet_datas[] = [
  138. 'mall_id' => $mall_id,
  139. 'user_id' => $user_id_0,
  140. 'is_frozen' => false,
  141. 'wallet_type' => UserWalletService::WALLET_TYPE_SCORE,
  142. 'money' => $score_user_reward_0,
  143. 'desc' => '观看短视频获得积分奖励',
  144. 'source_table' => $browse->tableSchema->name,
  145. 'source_table_id' => $data['browse_log_id'],
  146. 'from_type' => UserWalletEnum::REWARD,
  147. 'capital_type' => UserWalletEnum::SHORT_VIDEO_REWARD,
  148. ];
  149. }
  150. if (!empty($user_id_1) && $score_user_reward_1 > 0) {
  151. $browse_reward_log_datas[] = [$mall_id, $data['video_id'], $user_id_1, 0, 1, 0, $score_user_reward_1, 0, 1, $time, $time];
  152. $wallet_datas[] = [
  153. 'mall_id' => $mall_id,
  154. 'user_id' => $user_id_0,
  155. 'is_frozen' => false,
  156. 'wallet_type' => UserWalletService::WALLET_TYPE_SCORE,
  157. 'money' => $score_user_reward_1,
  158. 'desc' => '分享短视频获得积分奖励',
  159. 'source_table' => $browse->tableSchema->name,
  160. 'source_table_id' => $data['browse_log_id'],
  161. 'from_type' => UserWalletEnum::REWARD,
  162. 'capital_type' => UserWalletEnum::SHORT_VIDEO_REWARD,
  163. ];
  164. }
  165. }
  166. if (1 == $video->open_money_award) {
  167. // 开启现金奖励
  168. // 当前视频可以用于奖励的基准现金
  169. $money_reward_base = min($video->watch_money_sum, $video->max_money);
  170. // 当前会员获得的奖励
  171. $money_user_reward_0 = bcmul($money_reward_base, $video->watch_money / 100, 2);
  172. // 分享上级获得的积分奖励
  173. $money_user_reward_1 = bcmul($money_reward_base, $video->watch_money_one / 100, 2);
  174. if ($money_user_reward_0 > 0) {
  175. $browse_reward_log_datas[] = [$mall_id, $data['video_id'], $user_id_0, 0, 0, 1, 0, $money_user_reward_0, 1, $time, $time];
  176. $wallet_datas[] = [
  177. 'mall_id' => $mall_id,
  178. 'user_id' => $user_id_0,
  179. 'is_frozen' => false,
  180. 'wallet_type' => UserWalletService::WALLET_TYPE_BALANCE,
  181. 'money' => $money_user_reward_0,
  182. 'desc' => '观看短视频获得积分奖励',
  183. 'source_table' => $browse->tableSchema->name,
  184. 'source_table_id' => $data['browse_log_id'],
  185. 'from_type' => UserWalletEnum::REWARD,
  186. 'capital_type' => UserWalletEnum::SHORT_VIDEO_REWARD,
  187. ];
  188. }
  189. if (!empty($user_id_1) && $money_user_reward_1 > 0) {
  190. $browse_reward_log_datas[] = [$mall_id, $data['video_id'], $user_id_1, 0, 1, 1, 0, $money_user_reward_1, 1, $time, $time];
  191. $wallet_datas[] = [
  192. 'mall_id' => $mall_id,
  193. 'user_id' => $user_id_1,
  194. 'is_frozen' => false,
  195. 'wallet_type' => UserWalletService::WALLET_TYPE_BALANCE,
  196. 'money' => $money_user_reward_1,
  197. 'desc' => '分享短视频获得积分奖励',
  198. 'source_table' => $browse->tableSchema->name,
  199. 'source_table_id' => $data['browse_log_id'],
  200. 'from_type' => UserWalletEnum::REWARD,
  201. 'capital_type' => UserWalletEnum::SHORT_VIDEO_REWARD,
  202. ];
  203. }
  204. }
  205. // 添加观看奖励记录
  206. if (!empty($browse_reward_log_datas)) {
  207. $field = ['mall_id', 'video_id', 'user_id', 'source_user_id', 'user_type', 'award_type', 'award_integral', 'award_money', 'status', 'created_at', 'updated_at'];
  208. $res_reward = Yii::$app->db->createCommand()->batchInsert(self::tableName(), $field, $browse_reward_log_datas)->execute();
  209. if (false === $res_reward) {
  210. $transaction->rollBack();
  211. self::$static_error = '完整观看视频回调发放观看奖励出错--插入奖励记录出错';
  212. return false;
  213. }
  214. }
  215. if (!empty($wallet_datas)) {
  216. $res = UserWalletService::batchHandleByQueue($wallet_datas);
  217. if ($res === false) {
  218. $transaction->rollBack();
  219. self::$static_error = '完整观看视频回调发放观看奖励出错--奖励奖励发放到会员账号出错:' . UserWalletService::getStaticError();
  220. return false;
  221. }
  222. }
  223. $transaction->commit();
  224. return true;
  225. }
  226. }