From a3ef52b9a5ccf07f862585d78515d3b11de75913 Mon Sep 17 00:00:00 2001
From: Anyon <zoujingli@qq.com>
Date: Mon, 12 Oct 2020 14:14:23 +0800
Subject: [PATCH] Update Luckdraw.php

---
 app/data/controller/app/Luckdraw.php | 77 ++++++++++++++--------------
 1 file changed, 38 insertions(+), 39 deletions(-)

diff --git a/app/data/controller/app/Luckdraw.php b/app/data/controller/app/Luckdraw.php
index 14de6de7f..367811906 100644
--- a/app/data/controller/app/Luckdraw.php
+++ b/app/data/controller/app/Luckdraw.php
@@ -114,55 +114,54 @@ class Luckdraw extends Controller
      */
     public function prize()
     {
-        if ($this->record) $this->error('已经参与抽奖,不能再抽奖了!');
+        if ($this->record) {
+            $this->error('已经参与抽奖,不能再抽奖了!');
+        }
         /* 统计已经发出的奖品 */
-        $query = $this->app->db->name('ActivityLuckdrawRecord')->group('prize_code');
-        $useds = $query->where(['code' => $this->code])->column('count(1) count', 'prize_code');
+        $map = ['code' => $this->code];
+        [$check, $useds, $rateNumber, $rateRand] = [[], [], 0, rand(1, 1000000) / 10000];
+        $query = $this->app->db->name('ActivityLuckdrawRecord')->where($map)->group('prize_code,prize_level');
+        $query->field('prize_code,prize_level,count(1) prize_used')->select()->map(function ($item) use (&$useds) {
+            $useds["{$item['prize_code']}_{$item['prize_level']}"] = $item['prize_used'];
+        });
         /* 统计活动的奖品数据 */
-        $query = $this->app->db->name('ActivityLuckdrawConfigRecord');
-        $query->field('prize_num,prize_rate,prize_level,prize_code');
-        $prizes = $query->where(['code' => $this->code])->select()->toArray();
-        /* 统计奖品信息 */
-        [$prize, $prizesNum, $tempRate, $tempNumber] = [[], [], 0, rand(1, 1000000) / 10000];
-        foreach ($prizes as $item) $prizesNum[$item['prize_code']] = ($prizesNum[$item['prize_code']] ?? 0) + $item['prize_num'];
+        $query = $this->app->db->name('ActivityLuckdrawConfigRecord')->field('prize_num,prize_rate,prize_level,prize_code');
         /* 计算抽奖的中奖数据 */
-        foreach ($prizes as $key => $item) {
-            if (isset($useds[$item['prize_code']]) && $useds[$item['prize_code']] >= $prizesNum[$item['prize_code']]) {
-                unset($prizes[$key]);
+        foreach ($query->where($map)->select()->toArray() as $key => $item) {
+            $item['prize_used'] = $useds["{$item['prize_code']}_{$item['prize_level']}"] ?? 0;
+            if (empty($item['prize_num']) || $item['prize_used'] >= $item['prize_num']) {
                 continue;
-            }
-            if ($tempNumber <= ($tempRate += $item['prize_rate'])) {
-                $prize = $item;
+            } elseif ($rateRand <= ($rateNumber += $item['prize_rate'])) {
+                $check = $item;
                 break;
             }
         }
-        if (empty($prize)) {
-            $data = [
-                'mid'         => $this->member['id'],
-                'username'    => $this->member['username'],
-                'code'        => $this->vo['code'],
-                'prize_level' => '未中奖',
-                'prize_code'  => '',
-            ];
+        /* 组装活动中奖记录 */
+        $data = ['code' => $this->code];
+        $data['mid'] = $this->member['id'];
+        $data['phone'] = $this->member['phone'];
+        $data['username'] = $this->member['username'];
+        if (empty($check)) {
+            $data['prize_code'] = '';
+            $data['prize_level'] = '未中奖';
             if ($this->app->db->name('ActivityLuckdrawRecord')->insert($data) !== false) {
                 $this->success('抱歉没有抽到奖品哦!');
             }
         } else {
-            $_prize = $this->app->db->name('ActivityLuckdrawPrize')->where(['code' => $prize['prize_code']])->find();
-            $data = [
-                'mid'           => $this->member['id'],
-                'phone'         => $this->member['phone'],
-                'username'      => $this->member['username'],
-                'code'          => $this->code,
-                'prize_level'   => $prize['prize_level'],
-                'prize_code'    => $_prize['code'],
-                'prize_name'    => $_prize['name'],
-                'prize_cover'   => $_prize['cover'],
-                'prize_remark'  => $_prize['remark'],
-                'prize_express' => $_prize['express'],
-            ];
-            if ($this->app->db->name('ActivityLuckdrawRecord')->insert($data) !== false) {
-                $this->success('奖品抽取成功!', $data);
+            $map = ['code' => $check['prize_code'], 'deleted' => 0, 'status' => 1];
+            $prize = $this->app->db->name('ActivityLuckdrawPrize')->where($map)->find();
+            if (empty($prize)) {
+                $this->error('奖品已下架或被禁用!');
+            } else {
+                $data['prize_code'] = $prize['code'];
+                $data['prize_name'] = $prize['name'];
+                $data['prize_cover'] = $prize['cover'];
+                $data['prize_remark'] = $prize['remark'];
+                $data['prize_express'] = $prize['express'];
+                $data['prize_level'] = $check['prize_level'];
+                if ($this->app->db->name('ActivityLuckdrawRecord')->insert($data) !== false) {
+                    $this->success('奖品抽取成功!', $data);
+                }
             }
         }
         $this->error('抽奖失败,请稍候再试!');
@@ -189,10 +188,10 @@ class Luckdraw extends Controller
     public function express()
     {
         $data = $this->_vali([
-            'express_province.require#province' => '收货省份不能为空!',
             'express_city.require#city'         => '收货城市不能为空!',
             'express_area.require#area'         => '收货区域不能为空!',
             'express_address.require#address'   => '详细地址不能为空!',
+            'express_province.require#province' => '收货省份不能为空!',
         ]);
         $result = $this->app->db->name('ActivityLuckdrawRecord')->where(['id' => $this->record['id']])->update($data);
         $result !== false ? $this->success('提交收货地址成功!') : $this->error('提交收货地址失败,请稍候再试!');