stanley-king 7 роки тому
батько
коміт
654447331f

+ 14 - 0
data/logic/queue.logic.php

@@ -817,4 +817,18 @@ class queueLogic
         }
         return callback(true);
     }
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    public function onAsyncBargain($param)
+    {
+        $type = $param['type'];
+        $bargain_id = intval($param['bargain_id']);
+
+        if(empty($type) || $bargain_id <= 0) {
+            return callback(false);
+        }
+        else {
+            account_helper::onAsyncBargain($type,$bargain_id);
+            return callback(true);
+        }
+    }
 }

+ 13 - 1
helper/account_helper.php

@@ -558,8 +558,18 @@ class account_helper
         }
     }
 
-    public static function onAsyncBargainComplete($bargain_id)
+    ////////////////////////////////////////Bargain/////////////////////////////////////////////////////////////////////
+    public static function onAsyncBargain($type,$bargain_id)
     {
+        try
+        {
+            $bargain = new async\bargain($bargain_id);
+            if($type == "close") {
+                $bargain->onClose();
+            }
+        } catch (Exception $ex) {
+            Log::record($ex->getMessage(),Log::ERR);
+        }
     }
 
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -572,4 +582,6 @@ class account_helper
     {
 
     }
+
+
 }

+ 0 - 1
helper/async/IAsync.php

@@ -32,7 +32,6 @@ abstract class IAsync
         $user = intval($user);
         if($user <=0) return false;
 
-
         try
         {
             $mod_member = Model('member');

+ 102 - 0
helper/async/bargain.php

@@ -0,0 +1,102 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: stanley-king
+ * Date: 2018/1/31
+ * Time: 下午4:56
+ */
+
+namespace async;
+
+use room;
+use trans_wapper;
+use Exception;
+use Log;
+use push_helper;
+use bonus;
+use bonus_helper;
+
+class bargain
+{
+    private $mBargain;
+    public function __construct($bargain_id)
+    {
+        $mod_bargain = Model('room_bargain');
+        $info = $mod_bargain->getBargainById($bargain_id);
+        $this->mBargain = new room\bargain($info);
+    }
+
+    public function onClose()
+    {
+        if($this->mBargain->closed()) {
+            $this->reward();
+        }
+        else
+        {
+            if($this->mBargain->has_over()) {
+                $this->close();
+                $this->reward();
+            }
+            else
+            {
+                $discount_cent = intval($this->mBargain->discount() * 100 + 0.5);
+                $dest = $this->mBargain->goods_price() - $this->mBargain->lowest_price();
+                $dest_cent = intval($dest * 100 + 0.5);
+                if($dest_cent <= $discount_cent) {
+                    $this->close();
+                    $this->reward();
+                }
+                else {
+                    return false;
+                }
+            }
+        }
+
+        return true;
+    }
+
+    private function close()
+    {
+        $mod_bargain = Model('room_bargain');
+        $mod_bargain->editBargain($this->mBargain->bargain_id(),['closed' => 1]);
+    }
+
+    private function reward()
+    {
+        if($this->mBargain->rewarded()) {
+            return false;
+        }
+        else {
+            try
+            {
+                $mod_bargain = Model('room_bargain');
+                $trans = new trans_wapper($mod_bargain);
+                $mod_bargain->editBargain($this->mBargain->bargain_id(),['rewarded' => 1]);
+                $trans->commit();
+                $this->send_bonus($this->mBargain->discount(),$this->mBargain->creator());
+            }
+            catch (Exception $ex) {
+                $trans->rollback();
+                Log::record($ex->getTraceAsString(),Log::ERR);
+            }
+        }
+    }
+
+    private function send_bonus($discount,$userid)
+    {
+        $params = bonus\parameters::user_reigster_fixed();
+        foreach ($params as $param) {
+            $type = bonus_helper::create_type_input($param);
+            $money = $type->getTotal_amount();
+            $ret = bonus_helper::make_bonus($param, $param['rate_money']);
+
+            if ($ret != false) {
+                $type_sn = $ret['type_sn'];
+                bonus_helper::send($type_sn, [$this->cur_user]);
+                push_helper::register_bonus($this->cur_user, $money, $type_sn);
+            } else {
+                return false;
+            }
+        }
+    }
+}

+ 49 - 7
helper/room/bargain_manager.php

@@ -8,6 +8,7 @@
 
 namespace room;
 
+use QueueClient;
 class room_extend
 {
     private $mParams;
@@ -86,13 +87,16 @@ class bargain_parameter
         return ($this->total_amount <= $this->discount);
     }
 
-    public function bargain($count)
+    public function bargain($count,&$completed)
     {
+        $completed = false;
         $value = $this->power($count);
         if($value === false) return false;
 
         if($this->discount + $value > $this->total_amount) {
             $value = $this->total_amount - $this->discount;
+            $completed = true;
+            $this->closed = true;
         }
 
         $this->discount += $value;
@@ -128,15 +132,23 @@ class bargain_parameter
     public function user_num() {
         return $this->user_num;
     }
+    public function close() {
+        $this->closed = 1;
+    }
 }
 
 class bargain_manager
 {
+    const unknown_state = 0;
+    const normal = 1;
+    const closing = 2;
+
     private $mDateId;
     private $mFriends;
     private $mParams;
     private $mBargainId;
     private $mRoomId;
+    private $mBargain;
 
     public function __construct($roomid)
     {
@@ -144,9 +156,9 @@ class bargain_manager
         $this->mDateId = strtotime(date('Y-m-d',time()));
         $mod_bargain = Model('room_bargain');
         $info = $mod_bargain->getBargainByRoom($roomid,true);
-        $bargain = new bargain($info);
-        $this->mBargainId = $bargain->bargain_id();
-        $this->mParams = new bargain_parameter($bargain);
+        $this->mBargain = new bargain($info);
+        $this->mBargainId = $this->mBargain->bargain_id();
+        $this->mParams = new bargain_parameter($this->mBargain);
 
         $this->mFriends = [];
         $mod_room = Model('room');
@@ -159,8 +171,9 @@ class bargain_manager
         }
     }
 
-    public function bargain($userid)
+    public function bargain($userid,&$state)
     {
+        $state = self::unknown_state;
         $value = $this->bargained($userid);
         if($value != false) {
             return ['value' => $value,'success' => false,'discount' => $this->mParams->discount(),'user_num' => $this->mParams->user_num()];
@@ -174,24 +187,53 @@ class bargain_manager
 
         $room_extend = new room_extend($info);
         $count = $room_extend->bargain_count($this->mDateId);
-        $value = $this->mParams->bargain($count);
+        $value = $this->mParams->bargain($count,$completed);
         if($value === false) {
             return false;
         }
         else
         {
+
             if(!$room_extend->date_empty($this->mDateId)) {
                 $mod_room->editExtend($userid,['bargain_count' => ['exp', 'bargain_count+1']]);
             } else {
                 $mod_room->addExtend($userid,['bargain_count' => 1,'dateid' => $this->mDateId]);
             }
+
             $mod_bargain = Model('room_bargain');
-            $mod_bargain->editBargain($this->mBargainId,['discount' => ['exp',"discount+{$value}"],'user_num' => ['exp',"user_num+1"]]);
+            if($completed) {
+                $mod_bargain->editBargain($this->mBargainId,['discount' => ['exp',"discount+{$value}"],'user_num' => ['exp',"user_num+1"],'closed' => 1]);
+                QueueClient::push('onAsyncBargain',['type' => "close", 'bargain_id' => $this->mBargainId]);
+                $state = self::closing;
+            }
+            else {
+                $mod_bargain->editBargain($this->mBargainId,['discount' => ['exp',"discount+{$value}"],'user_num' => ['exp',"user_num+1"]]);
+            }
+
             $mod_room->addRoomMsg(['room_id' => $this->mRoomId,'member_id' => $userid, 'type' => proto_type::msg_type_bargain,'msg' => json_encode(['value' => $value]),'add_time' => time()]);
             return ['value' => $value,'success' => true,'discount' => $this->mParams->discount(),'user_num' => $this->mParams->user_num()];
         }
     }
 
+    public function close($userid)
+    {
+        if($this->mBargain->creator() != $userid) {
+            return false;
+        }
+
+        if($this->mParams->overed()) {
+            return false;
+        }
+
+        $this->mParams->close();
+
+        $mod_bargain = Model('room_bargain');
+        $mod_bargain->editBargain($this->mBargainId,['closed' => 1]);
+        QueueClient::push('onAsyncBargain',['type' => "close", 'bargain_id' => $this->mBargainId]);
+
+        return true;
+    }
+
     private function bargained($userid)
     {
         if(array_key_exists($userid,$this->mFriends)) {

+ 35 - 4
helper/room/bargain_room.php

@@ -9,8 +9,6 @@
 namespace room;
 
 use url_helper;
-
-
 class bargain
 {
     private $mParams;
@@ -83,6 +81,9 @@ class bargain
     public function closed() {
         return intval($this->mParams['closed']) == 1;
     }
+    public function rewarded() {
+        return intval($this->mParams['rewarded']) == 1;
+    }
 }
 
 class bargain_room extends base_room
@@ -109,7 +110,7 @@ class bargain_room extends base_room
         if($userinfo == false) return false;
 
         $userid = $userinfo['userid'];
-        $result = $this->mManager->bargain($userid);
+        $result = $this->mManager->bargain($userid,$state);
 
         if($result !== false)
         {
@@ -118,9 +119,13 @@ class bargain_room extends base_room
             $discount = $result['discount'];
             $user_num = $result['user_num'];
 
-            if($success) {
+            if($success)
+            {
                 $this->add_return([$room_key],'ret_bargain',['from' => $userinfo,'value' => $value,'discount' => $discount,'user_num' => $user_num]);
                 $this->add_broad('bargain',['from' => $userinfo,'value' => $value,'discount' => $discount,'user_num' => $user_num]);
+                if($state == bargain_manager::closing) {
+                    $this->add_broad('bargain_close',['from' => $userinfo]);
+                }
             }
             else {
                 $this->add_return([$room_key],'ret_bargain',['from' => $userinfo,'value' => $value,'discount' => $discount,'user_num' => $user_num]);
@@ -132,4 +137,30 @@ class bargain_room extends base_room
             return false;
         }
     }
+
+    public function closeOp($input)
+    {
+        $this->clear();
+        $room_key = $input['room_key'];
+        if(empty($room_key)) {
+            return false;
+        }
+
+        $userinfo = $this->find($room_key);
+        if($userinfo == false) return false;
+
+        $userid = $userinfo['userid'];
+        $result = $this->mManager->close($userid);
+
+        if($result)
+        {
+            $this->add_return([$room_key],'ret_close',['from' => $userinfo]);
+            $this->add_broad('bargain_close',['from' => $userinfo]);
+            return true;
+        }
+        else
+        {
+            return false;
+        }
+    }
 }

+ 4 - 0
helper/room/factory.php

@@ -12,6 +12,7 @@ use Exception;
 use member_info;
 use Log;
 use goods_helper;
+use QueueClient;
 
 class factory
 {
@@ -89,6 +90,9 @@ class factory
 
         $summary = $summarys['summary'][0];
         $bargain_id = $mod_bargain->create($room_id,$creator,$good_id,$summary['goods_price'],$lowest_price,$usable_days,$type,$total_num);
+        if($bargain_id > 0) {
+            QueueClient::async_push('onAsyncBargain',['type' => "close", 'bargain_id' => $bargain_id],$usable_days * 86400);
+        }
 
         return ['bargain_id' => $bargain_id,'room' => $room_id,'creator' => $creator];
     }

+ 39 - 2
mobile/control/bargain.php

@@ -236,6 +236,7 @@ class tpl_bargain
     {
         $summary = $this->mSummary;
         $cur_price = $summary['goods_price'] - $this->mBargain->discount();
+        $lowest = $this->mBargain->lowest_price();
 
         $str = "<div class=\"goods\">
                     <div class=\"thumbnail\">
@@ -246,7 +247,7 @@ class tpl_bargain
                         <div class=\"price_describe\">
                             <div class=\"price_box\">
                                 <span class=\"current_price\" id=\"current_price\">现价¥{$cur_price}</span>
-                                <span class=\"floor_price\">可砍至180元</span>
+                                <span class=\"floor_price\">可砍至{$lowest}元</span>
                             </div>
                         </div>
                         <div class=\"count_down\">
@@ -355,7 +356,11 @@ class tpl_bargain
 
     public function left_time()
     {
-        return $this->mBargain->over_time() - time();
+        if($this->mBargain->closed()) {
+            return -1;
+        } else {
+            return $this->mBargain->over_time() - time();
+        }
     }
 
     public function show_creator()
@@ -380,6 +385,38 @@ class tpl_bargain
         }
     }
 
+    public function show_button()
+    {
+        if($this->mBargain->closed()) {
+           return "";
+        }
+
+        if(session_helper::memberid() == $this->mBargain->creator())
+        {
+            if($this->bargained()) {
+                $str = '<span class="just_buy" id="just_buy"></span>
+                        <span class="invite_btn join_btn" id="invite_btn"></span>';
+            }
+            else {
+                $str = '<span class="bargain_btn" id="bargain_btn"></span>
+                        <span class="join_btn hide" id="join_btn"></span>';
+            }
+        }
+        else
+        {
+            if($this->bargained()) {
+                $str = '<span class="join_btn" id="join_btn"></span>
+                        <span class="bargain_btn hide" id="bargain_btn"></span>';
+            }
+            else {
+                $str = '<span class="bargain_btn" id="bargain_btn"></span>
+                        <span class="join_btn hide" id="join_btn"></span>';
+            }
+        }
+
+        return $str;
+    }
+
     public function share_url()
     {
     }

+ 1 - 4
mobile/control/control.php

@@ -281,9 +281,6 @@ class mobileHomeControl extends mobileControl
     }
 }
 
-/**
- * Class mbMemberControl
- */
 class mbMemberControl extends mobileControl
 {
     public $err_code = errcode::Success;
@@ -300,7 +297,7 @@ class mbMemberControl extends mobileControl
 
 function bonus_version()
 {
-    return "v=20180131";
+    return "v=2018013101";
 }
 function shop_version()
 {

+ 1 - 14
mobile/templates/default/bargain/bargain.php

@@ -20,16 +20,7 @@
             </div>
 
             <div class="bargain_handle">
-                <?php if($output['tpl']->bargained()) { ?>
-                    <span class="join_btn" id="join_btn"></span>
-                    <span class="bargain_btn hide" id="bargain_btn"></span>
-                <?php } else { ?>
-                    <span class="bargain_btn" id="bargain_btn"></span>
-                    <span class="join_btn hide" id="join_btn"></span>
-                <?php }?>
-
-<!--                    <span class="just_buy" id="just_buy"></span>-->
-<!--                    <span class="invite_btn join_btn" id="invite_btn"></span>-->
+                <?php echo $output['tpl']->show_button(); ?>
             </div>
 
             <div class="bargain_users">
@@ -282,10 +273,6 @@
     var slideMsgs = new SlideMsgs($('#slide_list'));
     slideMsgs.init();
 
-    var random = function(){
-        return (Math.random()*10).toFixed(2);
-    };
-
     //价格变更
     var priceAnimated = false;
         function priceChange(nprice){