LotteryController.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. <?php
  2. namespace mobile\controllers;
  3. use Yii;
  4. use common\components\util;
  5. use common\models\xhLuckyDrawAwardCustomer;
  6. use common\models\xhLuckyDrawAwardParticipant;
  7. use common\services\xhLuckyDrawAwardService;
  8. use common\services\xhLuckyDrawActivityService;
  9. use common\services\xhUserService;
  10. use common\services\xhLuckyDrawAwardParticipantService;
  11. use common\services\xhLuckyDrawAwardCustomerService;
  12. class LotteryController extends MobileendController
  13. {
  14. /**
  15. * 抽奖活动首页
  16. * @return string
  17. */
  18. public function actionIndex()
  19. {
  20. $luckyDrawActivityId = Yii::$app->request->get('id');
  21. $inviteEncriptKey = urldecode(Yii::$app->request->get('encryptKey'));//加密的用户ID值
  22. $inviteEncriptKey = empty($inviteEncriptKey) ? '' : $inviteEncriptKey;
  23. $account = Yii::$app->request->get('account');
  24. $needAttention = 0;
  25. $needVip = 0;
  26. $activity = xhLuckyDrawActivityService::getById($luckyDrawActivityId);
  27. if(empty($activity)){
  28. $this->error($_GET['account']);
  29. }
  30. //取奖品
  31. $awardIds = $activity['awardIds'];
  32. $awardIdsArr = explode(',', $awardIds);
  33. foreach ($awardIdsArr as $awardId){
  34. $awards[] = xhLuckyDrawAwardService::getById($awardId);
  35. }
  36. //无奖品情况的特殊处理
  37. if(empty($awards[0])){
  38. unset($awards[0]);
  39. }
  40. /* if(!empty($awards)){
  41. $awards = \common\components\util::arraySequence($awards, 'order', 'SORT_ASC');
  42. }*/
  43. if(!empty($awards)){
  44. $newAwards = [];
  45. foreach($awards as $key => $award){
  46. $newAwards[$award['order']] = $award;
  47. }
  48. $awards = $newAwards;
  49. }
  50. //dump($awards);die;
  51. //$this->merchantId = 1;
  52. $this->merchantCheck($activity, $account);//检测权限
  53. $customer = xhUserService::getById($this->userId);
  54. //$isMember = $customer['isMember'];//会员
  55. $isMember = isset($customer['mobile']) ? 1 : 0;//会员暂时用有无手机号识别
  56. $subscribe = $customer['subscribe'];//关注
  57. if($activity['needAttention'] == 1 && $subscribe == 0){//活动需关注
  58. $needAttention = 1;
  59. }
  60. if($activity['needVip'] == 1 && $isMember == 0){//活动需是会员
  61. $needVip = 1;
  62. }
  63. $participant = xhLuckyDrawAwardParticipant::getByCondition(['uid'=>$this->userId, 'luckyDrawActivityId'=>$luckyDrawActivityId]);
  64. if(empty($participant)){
  65. $drawCount = $activity['drawCount'];
  66. }else{
  67. $drawCount = xhLuckyDrawAwardParticipantService::getDrawCount($participant['id'], $activity['drawCount'], $activity['rewardCount'], $activity['inviteCount']);
  68. }
  69. return $this->renderPartial('index', [
  70. 'account'=>$account,
  71. 'activity'=>$activity,
  72. 'luckyDrawActivityId'=>$luckyDrawActivityId,
  73. 'drawCount'=>$drawCount,//客户拥有抽奖次数
  74. 'awardsCount'=>count($awards),//奖品数量
  75. 'awards' => $awards,
  76. 'uid' => $this->userId,
  77. 'needAttention' => $needAttention,
  78. 'needVip' => $needVip,
  79. 'encryptKey' => Yii::$app->getSecurity()->encryptByPassword($this->userId, Yii::$app->params['luckDrawSecretKey']),
  80. 'inviteEncriptKey' => $inviteEncriptKey,//邀请人的uid(加密过的)
  81. ]);
  82. }
  83. /**
  84. * 抽奖活动介绍
  85. */
  86. public function actionActivityIntro(){
  87. $luckyDrawActivityId = Yii::$app->request->get('id');
  88. $account = Yii::$app->request->get('account');
  89. $activity = xhLuckyDrawActivityService::getById($luckyDrawActivityId);
  90. $this->merchantCheck($activity, $account);//检测权限
  91. dump($activity);
  92. }
  93. /**
  94. * 中奖列表
  95. * @return string
  96. */
  97. public function actionWinList()
  98. {
  99. $luckyDrawActivityId = Yii::$app->request->post('id');
  100. $condition = ['luckyDrawActivityId' => $luckyDrawActivityId];
  101. $winnerList = xhLuckyDrawAwardCustomer::getAllByCondition($condition);
  102. if(!empty($winnerList)){
  103. foreach ($winnerList as $key => $winner){
  104. $uid = $winner['uid'];
  105. $customer = xhUserService::getById($uid);
  106. $winnerList[$key]['avatar'] = $customer['avatar'];
  107. }
  108. }
  109. //按照奖品分类,展出获奖者
  110. util::successInfo('获取成功', 'success', ['winnerList'=>$winnerList]);
  111. }
  112. /**
  113. * 我参与的活动
  114. * @return string
  115. */
  116. public function actionMyParticipation()
  117. {
  118. }
  119. /**
  120. * 我获得的奖品
  121. */
  122. public function actionMyAwards(){
  123. $uid = $this->userId;
  124. $luckyDrawActivityId = Yii::$app->request->post('id');
  125. $condition = ['uid' => $uid, 'luckyDrawActivityId' => $luckyDrawActivityId];
  126. $winnerList = xhLuckyDrawAwardCustomer::getAllByCondition($condition);
  127. util::successInfo('获取成功', 'success', ['winnerList'=>$winnerList]);
  128. }
  129. /**
  130. * 按概率进行抽奖
  131. */
  132. public function actionDraw(){
  133. $encryptKey = Yii::$app->request->get('key');//加密的用户ID值
  134. $post = Yii::$app->request->post();
  135. $luckyDrawActivityId = intval($post['id']);
  136. $totalProbability = 1000;//总概率大小
  137. $inviteUid = 0;
  138. $awardSortKeys = [];//所有奖品的排列序号
  139. $activity = xhLuckyDrawActivityService::getById($luckyDrawActivityId);
  140. //更新客户抽奖数
  141. $participant = xhLuckyDrawAwardParticipant::getByCondition(['uid'=>$this->userId, 'luckyDrawActivityId'=>$luckyDrawActivityId]);
  142. if(empty($participant)){//新增参与者
  143. if(!empty($encryptKey)){//判断是否受邀请而来,是:更新邀请者的数据
  144. $encryptKey = urldecode($encryptKey);
  145. $inviteUid = Yii::$app->getSecurity()->decryptByPassword($encryptKey, Yii::$app->params['luckDrawSecretKey']);
  146. Yii::warning('lottory:InviteUid '.$inviteUid, __METHOD__);
  147. if(!is_numeric($inviteUid)){
  148. $this->error($_GET['account']);
  149. }
  150. if($inviteUid != $this->userId){//排除自己邀请自己的情形
  151. //更新此$inviteUid邀请人数
  152. $inviteParticipant = xhLuckyDrawAwardParticipant::getByCondition(['uid'=>$inviteUid, 'luckyDrawActivityId'=>$luckyDrawActivityId]);
  153. if(empty($inviteParticipant)) {//若推荐人未参加抽奖,也给其记录推荐好友数,但不记录参与时间
  154. $data = [
  155. 'luckyDrawActivityId' => $activity['id'],
  156. 'uid' => $inviteUid,
  157. 'useDrawCount' => 0,
  158. 'inviteCount' => 1,
  159. //'participateTime' => time(),
  160. 'invite' => 0,
  161. ];
  162. xhLuckyDrawAwardParticipantService::add($data);
  163. }else{
  164. $data = ['inviteCount' => $inviteParticipant['inviteCount'] + 1];//更新邀请好友数
  165. xhLuckyDrawAwardParticipantService::updateById($inviteParticipant['id'], $data);
  166. }
  167. }
  168. }
  169. Yii::warning('123 como int');
  170. $drawCount = $activity['drawCount'];
  171. $data = [
  172. 'luckyDrawActivityId' => $activity['id'],
  173. 'uid' => $this->userId,
  174. 'useDrawCount' => 1,
  175. 'participateTime' => time(),
  176. 'invite' => $inviteUid,
  177. ];
  178. xhLuckyDrawAwardParticipantService::add($data);
  179. $data = ['participants' => $activity['participants']+1];
  180. xhLuckyDrawActivityService::updateById($luckyDrawActivityId, $data);
  181. }else{
  182. $drawCount = xhLuckyDrawAwardParticipantService::getDrawCount($participant['id'], $activity['drawCount'], $activity['rewardCount'], $activity['inviteCount']);
  183. if($drawCount <= 0){
  184. util::failInfo('您已无抽奖机会,去邀请好友获取吧!', 'A0004', ['key'=>-1, 'drawCount'=>$drawCount]);
  185. Yii::$app->end();
  186. }
  187. $data = ['useDrawCount' => $participant['useDrawCount'] + 1];
  188. if($participant['participateTime'] == 0){//邀请他人新增的记录,无参与时间及增加抽奖活动的人数
  189. $data['participateTime'] = time();
  190. $activityData = ['participants' => $activity['participants']+1];
  191. xhLuckyDrawActivityService::updateById($luckyDrawActivityId, $activityData);
  192. }
  193. xhLuckyDrawAwardParticipantService::updateById($participant['id'], $data);
  194. }
  195. //获取该抽奖活动的奖品数据
  196. $awardIds = $activity['awardIds'];
  197. $awardIdsArr = explode(',', $awardIds);
  198. foreach ($awardIdsArr as $awardId){
  199. $awards[] = xhLuckyDrawAwardService::getById($awardId);
  200. }
  201. //无奖品情况的特殊处理
  202. if(empty($awards[0])){
  203. unset($awards[0]);
  204. }
  205. /*$awards = \common\components\util::arraySequence($awards, 'order', 'SORT_ASC');*/
  206. if(!empty($awards)){
  207. $newAwards = [];
  208. foreach($awards as $key => $award){
  209. $newAwards[$award['order']] = $award;
  210. $awardSortKeys[] = $award['order'];
  211. }
  212. $awards = $newAwards;
  213. }
  214. //dump($awards);die;
  215. foreach ($awards as $key => $val) {
  216. $arr[$key] = $val['probability'];
  217. }
  218. $key = $this->getRand($arr, $totalProbability); //根据概率获取奖品id
  219. if($key == ''){
  220. $count = count($awards);
  221. while(true){
  222. $randomKey = mt_rand($count, 8);
  223. if(!in_array($randomKey, $awardSortKeys)){
  224. $key = $randomKey;
  225. break;
  226. }
  227. }
  228. $code = 'notHit';
  229. $msg = '未中奖';
  230. }else{
  231. //验证有无奖品,有往下走程序,否则报未中奖(终止)
  232. $award = xhLuckyDrawAwardService::getById($awards[$key]['id']);
  233. if(($award['count'] - $award['drawCount']) == 0 ){
  234. $code = 'notHit';
  235. $count = count($awards);
  236. while(true){
  237. $randomKey = mt_rand($count, 8);
  238. if(!in_array($randomKey, $awardSortKeys)){
  239. $key = $randomKey;
  240. break;
  241. }
  242. }
  243. $msg = '未中奖';
  244. }else{
  245. $code = 'hit';
  246. $key = $awards[$key]['order'];
  247. $msg = '获得'.$awards[$key]['awardName'];
  248. //记录获奖客户
  249. $data = [
  250. 'uid' => $this->userId,
  251. 'userName' => $this->userName,
  252. 'awardId' => $awards[$key]['id'],
  253. 'awardName' => $awards[$key]['awardName'],
  254. 'count' => 1,
  255. 'luckyDrawActivityId' => $luckyDrawActivityId,
  256. 'hitTime' => time(),
  257. ];
  258. xhLuckyDrawAwardCustomerService::add($data);
  259. //更新奖品数量
  260. $data = ['drawCount' => $awards[$key]['drawCount']+1];
  261. xhLuckyDrawAwardService::updateById($awards[$key]['id'], $data);
  262. }
  263. }
  264. $drawCount -= 1;
  265. util::successInfo($msg, $code, ['key'=>$key, 'drawCount'=>$drawCount]);
  266. }
  267. /**
  268. * 中奖运算
  269. * @param $proArr
  270. * @param $totalProbability
  271. * @return int|string
  272. */
  273. private function getRand($proArr, $totalProbability) { //计算中奖概率
  274. $rs = ''; //中奖结果
  275. $proSum = $totalProbability; //概率数组的总概率精度
  276. //概率数组循环
  277. foreach ($proArr as $key => $proCur) {
  278. $randNum = mt_rand(1, $proSum);
  279. if ($randNum <= $proCur) {
  280. $rs = $key;
  281. break;
  282. } else {
  283. $proSum -= $proCur;
  284. }
  285. }
  286. return $rs;
  287. }
  288. }