DefaultController.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. <?php
  2. namespace addons\RandomRedPacket\api\modules\v1\controllers;
  3. use addons\ContributionCurrency\common\enums\ContributionCurrencyEnum;
  4. use addons\ContributionCurrency\common\models\ContributionCurrencyLog;
  5. use addons\ContributionCurrency\common\models\ContributionWallet;
  6. use addons\HiGo\common\logic\WalletLogic;
  7. use addons\RandomRedPacket\common\enums\RandomRedPacketEnum;
  8. use addons\RandomRedPacket\common\models\RandomRedPacket;
  9. use addons\RandomRedPacket\common\models\RandomRedPacketRecord;
  10. use addons\RandomRedPacket\common\models\RandomRedPacketRelation;
  11. use addons\ScoreExpansion\common\enums\ScoreExpansionEnum;
  12. use addons\ScoreExpansion\common\models\ScoreExpansion;
  13. use addons\ScoreExpansion\common\models\ScoreExpansionWallet;
  14. use common\enums\AddonsEnum;
  15. use common\enums\StatusEnum;
  16. use common\enums\UserWalletEnum;
  17. use common\helpers\FormatHelper;
  18. use common\models\common\CapitalLog;
  19. use common\models\order\Order;
  20. use services\common\UserWalletService;
  21. use Yii;
  22. use api\controllers\OnAuthController;
  23. use Exception;
  24. /**
  25. * 默认控制器
  26. *
  27. * Class DefaultController
  28. * @package addons\RandomRedPacket\api\modules\v1\controllers
  29. */
  30. class DefaultController extends OnAuthController
  31. {
  32. public $modelClass = '';
  33. /**
  34. * 不用进行登录验证的方法
  35. *
  36. * 例如: ['index', 'update', 'create', 'view', 'delete']
  37. * 默认全部需要验证
  38. *
  39. * @var array
  40. */
  41. protected $authOptional = ['index','detail-red-packet'];
  42. /**
  43. * 首页
  44. *
  45. * @return string
  46. */
  47. public function actionIndex()
  48. {
  49. return 'Hello world';
  50. }
  51. /**
  52. * 商品详情页是否展示红包浮层
  53. *
  54. * @return string
  55. */
  56. public function actionDetailRedPacket()
  57. {
  58. $params = \Yii::$app->request->post();
  59. $params['mall_id'] = $this->mall_id;
  60. if(empty($params['goods_id'])){
  61. return $this->error('请选择商品');
  62. }
  63. //活动开始时展示图标,其余状态不展示
  64. $relationList = RandomRedPacketRelation::find()
  65. ->where(['mall_id'=>$params['mall_id'], 'goods_id'=>$params['goods_id']])
  66. ->select('packet_id')
  67. ->all();
  68. $packetIds = array_column($relationList, 'packet_id');
  69. $time = time();
  70. //
  71. $where = [
  72. ['in', 'id', $packetIds],
  73. ['mall_id' => $this->mall_id],
  74. ['status' => StatusEnum::ENABLED],
  75. ['<', 'start_at', $time],
  76. ['>', 'end_at', $time],
  77. ];
  78. $packetArr = RandomRedPacket::getOne($where, true);
  79. if ($packetArr === false) return $this->error(RandomRedPacket::getStaticError());
  80. if(empty($packetArr)){
  81. return $this->error('红包活动不存在');
  82. }
  83. $color = 1;
  84. //判断用户是否领取
  85. if($this->user_id){
  86. $find = RandomRedPacketRecord::find()
  87. ->where(['uid'=>$this->user_id, 'mall_id'=>$this->mall_id, 'packet_id'=>$packetArr['id']])
  88. ->one();
  89. if(!empty($find)){
  90. $color = 2;
  91. }
  92. }
  93. $data = [];
  94. $data['detail_show'] = $packetArr['detail_show'];
  95. $data['color'] = $color;//1红色 2灰色
  96. $data['packet_id'] = $packetArr['id'];//红包活动id
  97. return $this->success('成功', $data);
  98. }
  99. /**
  100. * 领取红包
  101. *
  102. * @return string
  103. */
  104. public function actionReceiveRedPacket()
  105. {
  106. $params = \Yii::$app->request->post();
  107. if (empty($params['packet_id'])) {
  108. return $this->error('请选择红包');
  109. }
  110. //查询活动
  111. $time = time();
  112. $where = [
  113. ['id' => $params['packet_id']],
  114. ['mall_id' => $this->mall_id],
  115. ['status' => StatusEnum::ENABLED],
  116. ['<', 'start_at', $time],
  117. ['>', 'end_at', $time],
  118. ];
  119. $redPacket = RandomRedPacket::getOne($where, false);
  120. if (empty($redPacket)) {
  121. return $this->error('活动不存在');
  122. }
  123. //是否有领取资格
  124. $findRecord = RandomRedPacketRecord::find()->where(['packet_id' => $redPacket->id, 'uid' => $this->user_id])->one();
  125. if (!empty($findRecord)) {
  126. return $this->error('您已领取红包,请勿重复操作');
  127. }
  128. //判断剩余个数
  129. if ($redPacket->sum_total < 1) {
  130. return $this->error('红包已经被抢完了');
  131. }
  132. //获取随机值
  133. $min = $redPacket->min_value;
  134. $max = $redPacket->max_value;
  135. $rand = $min + mt_rand() / mt_getrandmax() * ($max - $min);
  136. $rewardValue = floatval(sprintf('%.2f', $rand));
  137. $trans = Yii::$app->db->beginTransaction();
  138. try {
  139. //添加记录
  140. $recordModel = new RandomRedPacketRecord();
  141. $recordModel->mall_id = $this->mall_id;
  142. $recordModel->uid = $this->user_id;
  143. $recordModel->packet_id = $redPacket->id;
  144. $recordModel->reward_value = $rewardValue;
  145. if (!$recordModel->save()) {
  146. throw new Exception('领取失败');
  147. }
  148. if($redPacket->reward_type == RandomRedPacket::INTEGRAL){//激活积分
  149. // 插入用户积分表(激活积分)
  150. $wallet = ScoreExpansionWallet::setData([
  151. 'mall_id' => $this->mall_id,
  152. 'user_id' => $this->user_id,
  153. 'is_frozen' => false,
  154. 'integral' => $rewardValue,
  155. 'source_table' => RandomRedPacket::tableName(),
  156. 'source_table_id' => $redPacket->id,
  157. 'from_type' => ScoreExpansionEnum::FROM_RANDOM_RED_PACKET,
  158. 'desc' => '领取随机红包',
  159. ]);
  160. if ($wallet == false) throw new \yii\db\Exception(ScoreExpansionWallet::getStaticError());
  161. }
  162. if($redPacket->reward_type == RandomRedPacket::CONTRIBUTION){//贡献值
  163. //贡献值
  164. $wallet_log = [
  165. 'mall_id' => $this->mall_id,
  166. 'user_id' => $this->user_id,
  167. 'change_type' => CapitalLog::CHANGE_TYPE_ADD,
  168. 'change_num' => $rewardValue,
  169. 'reward_type' => ContributionCurrencyLog::CASHIER_RANDOM_RED_PACKET,
  170. 'desc' => '领取随机红包',
  171. 'source_table' => RandomRedPacket::tableName(),
  172. 'source_table_id' => $redPacket->id,
  173. 'from_type' => AddonsEnum::ADDONS_NAME_RANDOM_RED_PACKET,
  174. 'wallet_type' => ContributionCurrencyEnum::CONTRIBUTION_VALUE,
  175. 'is_send' => false
  176. ];
  177. $res = ContributionWallet::handleInQueue($wallet_log,true);
  178. if(!$res){
  179. throw new \Exception('转换失败:'.WalletLogic::getStaticError());
  180. }
  181. }
  182. if($redPacket->reward_type == RandomRedPacket::RED_PACKET || $redPacket->reward_type == RandomRedPacket::BALANCE){//红包 余额
  183. if($redPacket->reward_type == RandomRedPacket::BALANCE){
  184. $transfer_type = UserWalletService::WALLET_TYPE_BALANCE;
  185. }elseif($redPacket->reward_type == RandomRedPacket::RED_PACKET){
  186. $transfer_type = UserWalletService::WALLET_TYPE_SCORE;
  187. }
  188. //当转账类型为余额和红包时
  189. $insert_wallet [] = ['mall_id' => $this->mall_id, 'user_id' => $this->user_id,
  190. 'is_frozen' => false,
  191. 'wallet_type' => $transfer_type,
  192. 'money' => $rewardValue,
  193. 'desc' => '领取随机红包',
  194. 'source_table' => RandomRedPacket::tableName(),
  195. 'source_table_id' => $redPacket->id,
  196. 'from_type' => UserWalletEnum::FORM_RANDOM_RED_PACKET,
  197. 'capital_type' => UserWalletEnum::RANDOM_RED_PACKET_TRANSFER,
  198. ];
  199. $res = UserWalletService::batchHandleByQueue($insert_wallet);
  200. if ($res == false) throw new \yii\db\Exception(UserWalletService::getStaticError());
  201. }
  202. //红包个数-1 领取人数+1
  203. $redPacket->surplus_num = $redPacket->surplus_num - 1;
  204. $redPacket->get_number = $redPacket->get_number + 1;
  205. // if($redPacket->reward_type == RandomRedPacket::BALANCE){//余额
  206. // //个人奖励值增加
  207. // $insert_wallet[] = [
  208. // 'mall_id' => $this->mall_id,
  209. // 'user_id' => $this->user_id,
  210. // 'is_frozen' => false,
  211. // 'wallet_type' => UserWalletService::WALLET_TYPE_BALANCE,
  212. // 'money' => $rewardValue,
  213. // 'desc' => '随机红包',
  214. // 'source_table' => 'random_red_packet',
  215. // 'source_table_id' => $redPacket->id,
  216. // 'from_type' => RandomRedPacketEnum::ADDONS_NAME,
  217. // 'capital_type' => 'eight_out_two',
  218. // ];
  219. // $res = UserWalletService::batchHandleByQueue($insert_wallet);
  220. // if (empty($res)) throw new \Exception(UserWalletService::getStaticError());
  221. // //红包个数-1 领取人数+1
  222. // $redPacket->surplus_num = $redPacket->surplus_num - 1;
  223. // $redPacket->get_number = $redPacket->get_number + 1;
  224. // }
  225. $redPacket->save();
  226. if (!$redPacket->save()) {
  227. throw new Exception('领取失败');
  228. }
  229. $text = RandomRedPacket::labelText($redPacket->reward_type);
  230. $data = [];
  231. $data['text'] = '恭喜您获得';
  232. $data['value'] = $rewardValue . $text;
  233. $trans->commit();
  234. return $this->success('成功', $data);
  235. } catch (Exception $e) {
  236. $trans->rollBack();
  237. return $this->error('领取失败:' . $e->getMessage());
  238. }
  239. }
  240. }