Lottery.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  1. <?php
  2. namespace app\api\controller;
  3. use think\facade\Request;
  4. use app\model\Org;
  5. use app\model\Employee;
  6. use app\model\LotteryActivity;
  7. use app\model\LotteryUser;
  8. use app\model\LotteryActivityGoods;
  9. use app\model\LotteryLuckyUser;
  10. use app\model\Company;
  11. use think\facade\Db;
  12. use app\event\FootPrints;
  13. use app\model\Footprints as ModelFootprints;
  14. class Lottery extends Base
  15. {
  16. //添加抽奖用户
  17. public function add_user()
  18. {
  19. $token = $this->request->token;
  20. if ($token['isEmployee']) return json(['code' => 1, 'msg' => '您的身份是业务员,不能参加活动']);
  21. $data = $this->request->only(['actid','empid']);
  22. $ms=LotteryActivity::where([['end_date','<',date('Y-m-d')],['root_id','=',$token['root_org']],['status','=',1]])->update(['status'=>2]);
  23. $you=LotteryUser::where([['uid','=',$token['uid']],['actid','=',$data['actid']]])->find();
  24. $act_data=LotteryActivity::with(['company'=>function($query){
  25. $query->field('root_id,company_name,tel,company_address');
  26. },'good'=> function($query) {
  27. $query->field('actid,good_name,good_img,id');
  28. }])->where([['id','=',$data['actid']],['status','=',1]])->field('id,lottery_num,start_date,end_date,share_count,root_id,type,title,lottery_tel,lottery_address,shareimg')->find();
  29. if(empty($act_data)){
  30. return json(['code' => 1,'msg' => '活动不存在或者已结束']);
  31. }
  32. $egg_status_log=null;
  33. if(empty($you)){
  34. if(empty($data['empid'])) return json(['code' => 1, 'msg' => '缺少员工id']);
  35. $you= new LotteryUser;
  36. if($act_data['type']==2){
  37. for($i=1;$i<10;$i++){
  38. $log[]=array('id'=>$i,'status'=>false,'good_name'=>null);
  39. }
  40. $egg_status_log=json_encode($log);
  41. }
  42. $you->uid=$token['uid'];
  43. $you->empid=$data['empid'];
  44. $you->lottery_num=$act_data['lottery_num'];
  45. $you->actid=$act_data['id'];
  46. $you->egg_status_log=$egg_status_log;
  47. $you->save();
  48. }
  49. $user_data=array(
  50. 'lottery'=>$you['lottery_num'],
  51. 'share_status'=>!empty($you['share_img'])?2:1,
  52. 'egg_status_log'=>$you['egg_status_log']
  53. );
  54. $data=['user_data'=>$user_data,'act_data'=>$act_data];
  55. return json(['code' => 0, 'data'=>$data ,'msg' => '请求成功.']);
  56. }
  57. //用户抽奖页面中奖用户显示
  58. public function user_detail_lukus()
  59. {
  60. $token = $this->request->token;
  61. $data = $this->request->only(['actid']);
  62. $list=LotteryLuckyUser::with(['user'=>function($query){
  63. $query->field('id,nickname,phone');
  64. },'good'=>function($query){
  65. $query->field('id,good_name');
  66. }])->where('actid','=',$data['actid'])
  67. ->field('id,uid,good_id,actid')
  68. ->select();
  69. return json(['code' => 0, 'data'=>$list ,'msg' => '请求成功.']);
  70. }
  71. //砸金蛋活动详情
  72. public function egg_act_detail()
  73. {
  74. $token = $this->request->token;
  75. $data = $this->request->only(['actid','empid']);
  76. $act_data=LotteryActivity::with(['good'=> function($query) {
  77. $query->field('actid,good_name,good_img');
  78. },
  79. 'company'=>function($query){
  80. $query->field('root_id,company_name,tel,company_address');
  81. }])
  82. ->where([['status','=',1],['type','=',2],['root_id','=',$token['root_org']]])
  83. ->find();
  84. return json(['code' => 0, 'data'=>empty($act_data) ? null:$act_data->toArray() ,'msg' => '请求成功.']);
  85. }
  86. //活动详情
  87. public function act_detail()
  88. {
  89. $token = $this->request->token;
  90. $data = $this->request->only(['actid','empid']);
  91. $act_data=LotteryActivity::with(['good'=> function($query) {
  92. $query->field('actid,good_name,good_img');
  93. },
  94. 'company'=>function($query){
  95. $query->field('root_id,company_name,tel,company_address');
  96. }])
  97. ->where([['status','=',1],['type','=',1],['root_id','=',$token['root_org']]])
  98. ->find();
  99. return json(['code' => 0, 'data'=>empty($act_data) ? null:$act_data->toArray(),'msg' => '请求成功.']);
  100. }
  101. //活动转发记录
  102. public function act_forward_log()
  103. {
  104. $token = $this->request->token;
  105. $data = $this->request->only(['actid']);
  106. $act_data=LotteryActivity::where('id',$data['actid'])->find();
  107. if(!empty($act_data['share_log'])){
  108. $log=json_decode($act_data['share_log'],true);
  109. $isup=0;
  110. foreach($log as $key=>$val){
  111. if($val['id']==$token['employee_id']){
  112. $val['num']++;
  113. $isup=1;
  114. }
  115. $xin[]=$val;
  116. }
  117. if(empty($isup)){
  118. $xin[]=['id'=>$token['employee_id'],'num'=>1];
  119. }
  120. }else{
  121. $xin[]=array('id'=>$token['employee_id'],'num'=>1);
  122. }
  123. $act_data->share_num=$act_data['share_num']+1;
  124. $act_data->share_log=json_encode($xin);
  125. $ms=$act_data->save();
  126. if($ms){
  127. return json(['code' => 0,'msg' => '请求成功.']);
  128. }else{
  129. return json(['code' => 1, 'msg' => '请求失败.']);
  130. }
  131. }
  132. //用户上传截图
  133. public function user_upimg()
  134. {
  135. $token = $this->request->token;
  136. $share_img=$this->request->post('img');
  137. $data = $this->request->only(['actid']);
  138. $data['share_img']=$share_img;
  139. $user_data=LotteryUser::where([['uid','=',$token['uid']],['actid','=',$data['actid']]])->find();
  140. if($user_data['lottery_num']==0 && empty($user_data['share_img'])){
  141. $user_data->share_img=$data['share_img'];
  142. $user_data->lottery_num=1;
  143. $ms=$user_data->save();
  144. }
  145. if(!empty($ms)){
  146. return json(['code' => 0,'msg' => '上传成功,已经获取抽奖机会']);
  147. }else{
  148. return json(['code' => 1,'msg' => '上传失败,或已经上传过图片']);
  149. }
  150. }
  151. //用户中奖记录
  152. public function user_lucky_list()
  153. {
  154. $token = $this->request->token;
  155. $data = $this->request->only(['actid']);
  156. $list= LotteryLuckyUser::with(['good'=> function($query) {
  157. $query->field('id,good_name,good_img');
  158. }])
  159. ->where([['uid','=',$token['uid']],['actid','=',$data['actid']]])
  160. ->order('id desc')
  161. ->select()
  162. ->toArray();
  163. return json(['code' => 0,'data'=>$list,'msg' => '请求成功.']);
  164. }
  165. //员工查看所有用户中奖记录
  166. public function emp_user_lucky_list()
  167. {
  168. $token = $this->request->token;
  169. if (!$token['isEmployee']) return json(['code' => 1, 'msg' => '您不是员工,无权查看']);
  170. $data = $this->request->only(['actid']);
  171. $list=LotteryLuckyUser::with(['good'=>function($query){
  172. $query->field('id,good_name,good_img');
  173. },'user'=>function($query){
  174. $query->field('id,nickname,headimgurl,phone');
  175. }])
  176. ->where([['actid','=',$data['actid']],['empid','=',$token['employee_id']]])
  177. ->order('id desc')
  178. ->select()
  179. ->toArray();
  180. return json(['code' => 0,'data'=>$list,'msg' => '请求成功.']);
  181. }
  182. //员工查看所有未中奖用户记录
  183. public function emp_user_no_lucky_list()
  184. {
  185. $token = $this->request->token;
  186. if (!$token['isEmployee']) return json(['code' => 1, 'msg' => '您不是员工,无权查看']);
  187. $data = $this->request->only(['actid']);
  188. $list=LotteryUser::with(['user'=>function($query){
  189. $query->field('id,nickname,headimgurl,phone');
  190. }])
  191. ->where([['actid','=',$data['actid']],['is_prize','=',0],['empid','=',$token['employee_id']]])
  192. ->select()
  193. ->toArray();
  194. return json(['code' => 0,'data'=>$list,'msg' => '请求成功.']);
  195. }
  196. //员工页面中奖统计
  197. public function emp_user_lucky_statistics()
  198. {
  199. $token = $this->request->token;
  200. if (!$token['isEmployee']) return json(['code' => 1, 'msg' => '您不是员工,无权查看']);
  201. $data = $this->request->only(['actid']);
  202. $act_data=LotteryActivity::where([['id','=',$data['actid']],['root_id','=',$token['root_org']]])->find();
  203. $zf=0;
  204. foreach(json_decode($act_data['share_log'],true) as $key=>$val){
  205. if($token['employee_id']==$val['id']){
  206. $zf=$val['num'];
  207. }
  208. }
  209. $is_lucky=LotteryLuckyUser::where([['actid','=',$data['actid']],['empid','=',$token['employee_id']]])
  210. ->group('uid')
  211. ->count();
  212. $lucky_num=LotteryUser::where([['actid','=',$data['actid']],['empid','=',$token['employee_id']]])->sum('is_lottery');
  213. $data=['zfnum'=>$zf,'is_lucky'=>$is_lucky,'lucky_num'=>$lucky_num];
  214. return json(['code' => 0,'data'=>$data,'msg' => '请求成功.']);
  215. }
  216. //用户抽奖
  217. public function user_lottery()
  218. {
  219. $token = $this->request->token;
  220. $data = $this->request->only(['actid','eggid']);
  221. if ($token['isEmployee']) return json(['code' => 1, 'msg' => '您的身份是业务员,不能参加活动']);
  222. $luck_data=LotteryUser::where([['uid','=',$token['uid']],['actid','=',$data['actid']]])->find();
  223. $act_data=LotteryActivity::find($data['actid']);
  224. if($act_data['status']==2 || ($act_data['end_date'] < date('Y-m-d',time()))){
  225. return json(['code' => 1, 'msg' => '活动已经结束']);
  226. }
  227. if($luck_data['lottery_num']<=0){
  228. return json(['code' => 1, 'msg' => '抽奖次数已经用完']);
  229. }
  230. $goodid=$this->get_rand($data['actid']);
  231. $is_share_yes=0;
  232. if(!empty($luck_data['share_img'])){
  233. $is_share_yes=1;
  234. }
  235. Db::startTrans();
  236. try {
  237. if(!empty($goodid)&& $goodid>0){
  238. $add=array(
  239. 'uid'=>$token['uid'],
  240. 'actid'=>$data['actid'],
  241. 'good_id'=>$goodid,
  242. 'wiped_sn'=>str_rand(6),
  243. 'empid'=>$luck_data['empid'],
  244. 'is_share_yes'=>$is_share_yes
  245. );
  246. $good_data=LotteryActivityGoods::find($goodid);
  247. if($good_data['surplus']<=0){
  248. return json(['code' => 1, 'msg' => '奖品已中完']);
  249. }
  250. $good_data->surplus= Db::raw('surplus-1');
  251. $good_data->save();
  252. LotteryLuckyUser::insert($add);
  253. $luck_data->is_prize = 1;
  254. }
  255. if($act_data['type']==2){
  256. if(empty($data['eggid'])) return json(['code' => 1, 'msg' => '金蛋id为空']);
  257. foreach(json_decode($luck_data['egg_status_log'],true) as $key=>$val){
  258. if($data['eggid']==$val['id']){
  259. $val['status']=true;
  260. if(!empty($goodid)&& $goodid>0){
  261. $val['good_name']=$good_data['good_name'];
  262. }
  263. }
  264. $p[]=$val;
  265. }
  266. $luck_data->egg_status_log=json_encode($p);
  267. }
  268. $luck_data->lottery_num = Db::raw('lottery_num-1');
  269. $luck_data->is_lottery = Db::raw('is_lottery+1');
  270. $luck_data->save();
  271. $this->add_foots($act_data);
  272. Db::commit();
  273. }catch (\Exception $e) {
  274. Db::rollback();
  275. return json(['code' => 1, 'msg' => '录入数据失败.']);
  276. }
  277. return json(['code' => 0, 'data'=>$goodid ,'msg' => '请求成功.']);
  278. }
  279. //添加足迹
  280. public function add_foots($act_data)
  281. {
  282. $token = $this->request->token;
  283. //$act_data = LotteryActivity::find($act_data);
  284. $luck_data = LotteryUser::where([['uid', '=', $token['uid']], ['actid', '=', $act_data['id']]])->find();
  285. $luck_good = LotteryLuckyUser::with(['good' => function ($query) {
  286. $query->field('id,good_name');
  287. }])->where([['uid', '=', $token['uid']], ['actid', '=', $act_data['id']]])->select()->toArray();
  288. $luckname = '';
  289. if (!empty($luck_good)) {
  290. foreach ($luck_good as $key => $val) {
  291. $xin[$val['good_id']][] = $val;
  292. }
  293. foreach ($xin as $key => $val) {
  294. $luckname .= $val[0]['good']['good_name'] . count($val) . '个,';
  295. }
  296. $luckname = trim($luckname, ',');
  297. }
  298. $updata = ['actid' => $act_data['id'], 'type' => $act_data['type'], 'title' => $act_data['title'], 'luckname' => $luckname];
  299. $you = ModelFootprints::where([['uid', '=', $token['uid']], ['employee_id', '=', $luck_data['empid']], ['pipe_type', '=', 'lottery'], ['reg_info', 'like', '{"actid":' . $act_data['id'] . ',%']])->find();
  300. if ($you) {
  301. $you->reg_info = json_encode($updata);
  302. $you->save();
  303. } else {
  304. event(new FootPrints($token['uid'], $luck_data['empid'], $token['root_org'], $updata, 'lottery'));
  305. }
  306. }
  307. public function get_rand($actid){
  308. $allpr=0;
  309. $list=LotteryActivityGoods::where([['actid','=',$actid],['surplus','<>',0]])->select()->toArray();
  310. foreach($list as $key=>$val){
  311. $as=array(
  312. 'id'=>$val['id'],
  313. 'name'=>$val['good_name'],
  314. 'gailv'=>$val['probability'],
  315. 'img'=>$val['good_img']
  316. );
  317. $allpr+=$val['probability'];
  318. $goods[]=$as;
  319. }
  320. $yupr=100-$allpr;
  321. $newpr=['id'=>-1,'name'=>'谢谢参与','gailv'=>$yupr,'img'=>''];
  322. $goods[]=$newpr;
  323. //中奖数字
  324. $zhongjiang_num = mt_rand(1, 100); //例:55
  325. //读取商品概率
  326. foreach($goods as $v){
  327. $gailv[] = $v['gailv'];
  328. }
  329. //计算概率总数:此处原则上总数为100,但是不排除有没有谢谢参与这种商品的情况,所以兼容各种概率设定
  330. $num_count = array_sum($gailv);
  331. //生成1到100个数字并组成数组
  332. for($i=1;$i<=100;$i++){
  333. $a[] = $i;
  334. }
  335. //从数组中选出指定个数的随机数并返回键
  336. $b = array_rand($a,$num_count);
  337. //由于array_rand读取出的数组中的键,所以多一步将键转化为值的过程
  338. foreach($b as $v){
  339. $c[] = $a[$v];
  340. }
  341. //打乱数组排序
  342. shuffle($c);
  343. foreach($goods as $k => $v){
  344. //如果概率不是0
  345. if($v['gailv'] > 0){
  346. $num_sub = [];
  347. if($v['gailv'] > 1){
  348. $num_sub_key = array_rand($c,$v['gailv']);
  349. foreach($num_sub_key as $vv){
  350. $num_sub[] = $c[$vv];
  351. unset($c[$vv]);
  352. }
  353. }else{
  354. $num_sub_key = array_rand($c);
  355. $num_sub[] = $c[$num_sub_key];
  356. unset($c[$num_sub_key]);
  357. }
  358. $c = array_values($c);
  359. $goods[$k]['gailv_num'] = $num_sub;
  360. }else{
  361. //永远中不到的商品的值设为999,永远匹配不到
  362. $goods[$k]['gailv_num'][] = 999;
  363. }
  364. }
  365. //检测商品是否中奖了
  366. foreach($goods as $v){
  367. if(in_array($zhongjiang_num, $v['gailv_num'])){
  368. //恭喜您中奖了,虽然中的可能是谢谢参与
  369. return $v['id'];//返回中奖的商品ID
  370. }
  371. }
  372. //一个都没中,当有谢谢参与的商品时,走不到这里,只有概率相加小于100时,可能走到这里
  373. return FALSE;
  374. }
  375. }