Browse Source

modify pay

stanley-king 6 years ago
parent
commit
53bb5eb0b6
56 changed files with 1826 additions and 1426 deletions
  1. 3 1
      admin/control/person_bonus.php
  2. 5 6
      core/framework/function/core.php
  3. 1 1
      core/lrlz.php
  4. 0 1
      crontab/control/command.php
  5. 4 2
      crontab/control/date.php
  6. 148 80
      data/logic/buy.logic.php
  7. 94 0
      data/logic/buy_1.logic.php
  8. 5 3
      data/logic/payment.logic.php
  9. 0 1
      fcgi_run.php
  10. 7 7
      helper/account_helper.php
  11. 2 2
      helper/async/broadcast/filter.php
  12. 105 0
      helper/bonus/BonusAmount.php
  13. 19 0
      helper/bonus/IMoneyCalc.php
  14. 203 0
      helper/bonus/RateMoney.php
  15. 851 0
      helper/bonus/account.php
  16. 15 0
      helper/bonus/bonus_log.php
  17. 4 4
      helper/bonus/factory.php
  18. 2 2
      helper/bonus/thief_vilator.php
  19. 6 49
      helper/bonus_helper.php
  20. 106 19
      helper/buy_first.php
  21. 9 0
      helper/exceptionex.php
  22. 11 13
      helper/goods_helper.php
  23. 24 12
      helper/model/goods_summary.php
  24. 5 3
      helper/notify_helper.php
  25. 0 1118
      helper/predeposit_helper.php
  26. 2 2
      helper/room/factory.php
  27. 1 1
      helper/room/room_info.php
  28. 21 0
      helper/room_helper.php
  29. 5 2
      helper/shaker_helper.php
  30. 2 2
      helper/ugc/setting.php
  31. 0 1
      helper/ugc_helper.php
  32. 16 15
      mobile/control/activity.php
  33. 5 3
      mobile/control/admin_oper.php
  34. 1 1
      mobile/control/app_pay.php
  35. 8 6
      mobile/control/bargain.php
  36. 19 11
      mobile/control/bonusex.php
  37. 7 5
      mobile/control/cart.php
  38. 14 0
      mobile/control/control.php
  39. 2 1
      mobile/control/festval.php
  40. 1 1
      mobile/control/goods_common.php
  41. 3 1
      mobile/control/index.php
  42. 24 21
      mobile/control/member_bonus.php
  43. 7 6
      mobile/control/member_buy.php
  44. 1 1
      mobile/control/member_favorites.php
  45. 1 1
      mobile/control/member_fcode.php
  46. 1 1
      mobile/control/member_notice.php
  47. 3 1
      mobile/control/member_ugc.php
  48. 4 2
      mobile/control/mshop.php
  49. 6 6
      mobile/control/search.php
  50. 2 2
      mobile/control/special.php
  51. 5 3
      mobile/control/webpush.php
  52. 2 0
      mobile/util/errcode.php
  53. 2 3
      shop/control/buy.php
  54. 24 0
      test/TestGoods.php
  55. 3 1
      test/TestMember.php
  56. 5 2
      test/TestPredeposit.php

+ 3 - 1
admin/control/person_bonus.php

@@ -4,6 +4,8 @@
  *
  ***/
 
+use bonus\account;
+
 defined('InShopNC') or exit('Access Invalid!');
 
 require_once(BASE_ROOT_PATH . '/helper/algorithm.php');
@@ -106,7 +108,7 @@ class activity_bonus
 
         $result = array_merge($param,$result);
 
-        $ret = predeposit_helper::admin_make_bonus($result,$rate_moneys);
+        $ret = account::admin_make_bonus($result,$rate_moneys);
         if($ret === false) {
             return false;
         }

+ 5 - 6
core/framework/function/core.php

@@ -431,14 +431,14 @@ function getIp(){
  * 数据库模型实例化入口
  *
  * @param string $model 模型名称
- * @return obj 对象形式的返回结果
+ * @return Model 对象形式的返回结果
+ * @throws
  */
 function Model($model = null, $base_path = null)
 {
     if(is_mobile())
     {
-        static $name_cache = array();
-
+        static $name_cache = [];
         $base_path = $base_path == null ? BASE_DATA_PATH : $base_path;
         $file_name = $base_path.'/model/'.$model.'.model.php';
         $class_name = $model.'Model';
@@ -467,7 +467,7 @@ function Model($model = null, $base_path = null)
     }
     else
     {
-        static $_cache = array();
+        static $_cache = [];
         $cache_key = $model.'.'.$base_path;
         if (!is_null($model) && isset($_cache[$cache_key]))
         {
@@ -495,9 +495,7 @@ function Model($model = null, $base_path = null)
                 return $_cache[$cache_key] = new $class_name();
             }
         }
-
     }
-
 }
 
 /**
@@ -505,6 +503,7 @@ function Model($model = null, $base_path = null)
  *
  * @param string $model 模型名称
  * @return obj 对象形式的返回结果
+ * @throws
  */
 function Logic($model = null, $base_path = null)
 {

+ 1 - 1
core/lrlz.php

@@ -111,7 +111,7 @@ function isBonusExpiryDate()
 {
     return (defined('BONUS_EXPIRY_DATE') && BONUS_EXPIRY_DATE == true);
 }
-function isUseBonusRate() {
+function usedBonusRate() {
     return (defined('USE_BONUS_RATE') && USE_BONUS_RATE == true);
 }
 function noBonusRate() {

+ 0 - 1
crontab/control/command.php

@@ -10,7 +10,6 @@ defined('InShopNC') or exit('Access Invalid!');
 
 require_once(BASE_ROOT_PATH . '/helper/notify_helper.php');
 require_once(BASE_ROOT_PATH . '/helper/stat_helper.php');
-require_once(BASE_ROOT_PATH . '/helper/predeposit_helper.php');
 require_once(BASE_DATA_PATH . '/mobile/omsid.php');
 require_once(BASE_ROOT_PATH . '/helper/bonus_helper.php');
 require_once(BASE_ROOT_PATH . '/helper/bonus/witholder.php');

+ 4 - 2
crontab/control/date.php

@@ -7,11 +7,13 @@
  *
  */
 
+use bonus\account;
+
 defined('InShopNC') or exit('Access Invalid!');
 
 require_once(BASE_ROOT_PATH . '/helper/notify_helper.php');
 require_once(BASE_ROOT_PATH . '/helper/stat_helper.php');
-require_once(BASE_ROOT_PATH . '/helper/predeposit_helper.php');
+require_once(BASE_ROOT_PATH . '/helper/bonus_helper.php');
 require_once(BASE_DATA_PATH . '/mobile/omsid.php');
 
 
@@ -236,7 +238,7 @@ class dateControl extends BaseCronControl
             foreach ($items as $item)
             {
                 $member_id = $item['member_id'];
-                $pred = new predeposit_helper($member_id);
+                $pred = new account($member_id);
                 $amount = $pred->total_bonus();
                 $mod_member->editMember(['member_id' => $member_id],['available_bonus' => $amount]);
             }

+ 148 - 80
data/logic/buy.logic.php

@@ -7,6 +7,9 @@
  *
  * by abc  www.abc.com 开发ls
  */
+
+use bonus\account;
+
 defined('InShopNC') or exit('Access Invalid!');
 require_once (BASE_ROOT_PATH . '/helper/goods/commonid_helper.php');
 
@@ -227,13 +230,13 @@ class buyLogic
         $result['inv_info'] = $inv_info;
 
         $buyer_info	= Model('member')->getMemberInfoByID($member_id);
-        $pred_helper = new predeposit_helper($member_id);
-        $result['available_predeposit'] = $pred_helper->total_bonus();
-
-//        if (floatval($buyer_info['available_predeposit']) > 0) {
-//            $result['available_predeposit'] = $buyer_info['available_predeposit'];
-//        }
 
+        if (floatval($buyer_info['available_predeposit']) > 0) {
+            $result['available_predeposit'] = $buyer_info['available_predeposit'];
+        }
+        if (floatval($buyer_info['available_bonus']) > 0) {
+            $result['available_bonus'] = $buyer_info['available_bonus'];
+        }
         if (floatval($buyer_info['available_rc_balance']) > 0) {
             $result['available_rc_balance'] = $buyer_info['available_rc_balance'];
         }
@@ -252,15 +255,16 @@ class buyLogic
      */
     public function buyStep2($post, $member_id, $member_name, $member_email,$use_bonus)
     {
-        
-        $this->_member_info['member_id'] = $member_id;
-        $this->_member_info['member_name'] = $member_name;
+        $this->_member_info['member_id']    = $member_id;
+        $this->_member_info['member_name']  = $member_name;
         $this->_member_info['member_email'] = $member_email;
         $this->_post_data = $post;
 
         try
         {
             $model = Model('order');
+
+            $account = new bonus\account($member_id,false);
             $trans = new trans_wapper($model,__METHOD__);
             //第1步 表单验证
             $this->_createOrderStep1();
@@ -269,7 +273,7 @@ class buyLogic
             //第3步 得到购买相关金额计算等信息
             $this->_createOrderStep3();
             //第4步 生成订单
-            $this->_createOrderStep4($use_bonus);
+            $this->_createOrderStep4($use_bonus,$account);
             //第5步 处理预存款
             $this->_createOrderStep5();
             $trans->commit();
@@ -597,7 +601,7 @@ class buyLogic
      * @throws Exception
      * @return array array(支付单sn,订单列表)
      */
-    private function _createOrderStep4($use_bonus)
+    private function _createOrderStep4($use_bonus,bonus\IPriceCalculate $priceCalculate)
     {
         // extract() 函数从数组中将变量导入到当前的符号表。
         extract($this->_order_data);
@@ -666,14 +670,17 @@ class buyLogic
             $order['order_amount'] = $store_final_order_total[$store_id];
             $order['shipping_fee'] = $store_freight_total[$store_id];
             $order['goods_amount'] = $order['order_amount'] - $order['shipping_fee'];
+            $order['pd_amount'] = 0;
 
             if($use_bonus)
             {
-                $bonusable_goods_amount = $this->bonusable_goods_amount($goods_list,$optional_goods[$store_id]);
-                $bonus_amount = $this->bonus_amount($order['goods_amount'],$bonusable_goods_amount,$store_id);
-                $order['pd_amount'] = $bonus_amount;
+                $calcer = $this->calc_goods($goods_list,$optional_goods[$store_id]);
+                $bonusable_goods_amount = $calcer['bonusable_goods_amount'];
+                $lowest_price_amount = $calcer['lowest_price_amount'];
+                $bonus_amount = $priceCalculate->bonus_amount($bonusable_goods_amount,$lowest_price_amount);
+                $order['bonus_amount'] = $bonus_amount;
             } else {
-                $order['pd_amount'] = 0;
+                $order['bonus_amount'] = 0;
             }
 
             $order['order_from'] = $order_from;
@@ -717,12 +724,14 @@ class buyLogic
     
             //生成order_goods订单商品数据
             $i = 0;
-            foreach ($goods_list as $goods_info) {
+            foreach ($goods_list as $goods_info)
+            {
                 if (!$goods_info['state'] || !$goods_info['storage_state']) {
                     throw new Exception('部分商品已经下架或库存不足,请重新选择');
                 }
-                if (!intval($goods_info['bl_id'])) {
-                    //如果不是优惠套装
+
+                if (!intval($goods_info['bl_id']))
+                {//如果不是优惠套装
                     $order_goods[$i]['order_id'] = $order_id;
                     $order_goods[$i]['goods_id'] = $goods_info['goods_id'];
                     $order_goods[$i]['store_id'] = $store_id;
@@ -742,9 +751,7 @@ class buyLogic
                         $order_goods[$i]['goods_type'] = 1;
                     }
                     $order_goods[$i]['promotions_id'] = $goods_info['promotions_id'] ? $goods_info['promotions_id'] : 0;
-					//zmr>>>
                     $order_goods[$i]['commis_rate'] =floatval($store_gc_id_commis_rate_list[$store_id][$goods_info['gc_id']]);
-					//zmr<<<
                     $order_goods[$i]['gc_id'] = $goods_info['gc_id'];
                     //计算商品金额
                     $goods_total = $goods_info['goods_price'] * $goods_info['goods_num'];
@@ -763,10 +770,10 @@ class buyLogic
                         $notice_list['goods_storage_alarm'][$goods_info['store_id']] = $param;
                     }
                 }
-                elseif (!empty($goods_info['bl_goods_list']) && is_array($goods_info['bl_goods_list'])) {
-
-                    //优惠套装
-                    foreach ($goods_info['bl_goods_list'] as $bl_goods_info) {
+                elseif (!empty($goods_info['bl_goods_list']) && is_array($goods_info['bl_goods_list']))
+                {//优惠套装
+                    foreach ($goods_info['bl_goods_list'] as $bl_goods_info)
+                    {
                         $order_goods[$i]['order_id'] = $order_id;
                         $order_goods[$i]['goods_id'] = $bl_goods_info['goods_id'];
                         $order_goods[$i]['store_id'] = $store_id;
@@ -815,7 +822,6 @@ class buyLogic
             if (!$insert) {
                 throw new Exception('订单保存失败[未生成商品数据]');
             }
-    
             //存储商家发货提醒数据
             if ($store_pay_type_list[$store_id] == 'offline') {
                 $notice_list['new_order'][$order['store_id']] = array('order_sn' => $order['order_sn']);
@@ -829,101 +835,161 @@ class buyLogic
         $this->_order_data['ifgroupbuy'] = $ifgroupbuy;
     }
 
+    //下边两个函数用来计算有折扣率的红包。
+//    private function bonus_amount($total_goods_amount, $bonusable_goods_amount,$store_id)
+//    {
+//        $rule_list = $this->_post_data['store_mansong_rule_list'];
+//        if(empty($rule_list)) {
+//            $full_discount = 0;
+//        }
+//        else
+//        {
+//            if(empty($rule_list[$store_id])) {
+//                $full_discount = 0;
+//            } else {
+//                $full_discount = doubleval($rule_list[$store_id]['discount']);
+//            }
+//        }
+//        $full = intval($full_discount * 100 + 0.5);
+//
+//        $pred_amound = $bonusable_goods_amount;
+//        $pred_cent = intval($pred_amound * 100 + 0.5);
+//
+//        if($pred_cent > 0)
+//        {
+//            if($full > 0) {
+//                $pred_amound = $pred_amound - ($pred_amound / $total_goods_amount) * $full_discount;
+//            }
+//
+//            $pred_amound = $pred_amound - account::order_cash($pred_amound,$rates);
+//            return $pred_amound;
+//        }
+//        else
+//        {
+//            return 0;
+//        }
+//    }
+//
+//    private function bonusable_goods_amount($cart_list,$opgoods)
+//    {
+//        $goods_amount = 0.00;
+//        foreach ($cart_list as $cart)
+//        {
+//            $goods_total = $cart['goods_total'];
+//            if(intval($cart['bl_id']) > 0) {
+//            }
+//            elseif(!empty($cart['groupbuy_info'])) {
+//            }
+//            elseif(!empty($cart['xianshi_info'])) {
+//            }
+//            else
+//            {
+//                if(empty($opgoods)) {
+//                    $goods_amount += $goods_total;
+//                }
+//                else
+//                {
+//                    $goods_id    = intval($cart['goods_id']);
+//                    if(array_key_exists($goods_id,$opgoods['goods_nums']))
+//                    {
+//                        $goods_price = $cart['goods_price'];
+//                        $goods_num = intval($cart['goods_num']);
+//                        $opnum = $opgoods['goods_nums'][$goods_id];
+//                        if($goods_num > $opnum) {
+//                            $goods_amount += $goods_price * ($goods_num - $opnum);
+//                        }
+//                    }
+//                    else {
+//                        $goods_amount += $goods_total;
+//                    }
+//                }
+//            }
+//        }
+//        return $goods_amount;
+//    }
 
-    private function bonus_amount($total_goods_amount, $bonusable_goods_amount,$store_id)
+    private function calc_goods($cart_list,$opgoods)
     {
-        $rule_list = $this->_post_data['store_mansong_rule_list'];
-        if(empty($rule_list)) {
-            $full_discount = 0;
-        }
-        else
-        {
-            if(empty($rule_list[$store_id])) {
-                $full_discount = 0;
-            } else {
-                $full_discount = doubleval($rule_list[$store_id]['discount']);
-            }
-        }
-        $full = intval($full_discount * 100 + 0.5);
-
-        $pred_amound = $bonusable_goods_amount;
-        $pred_cent = intval($pred_amound * 100 + 0.5);
+        $bonus_amount = 0.00;
+        $goods_amount = 0.00;
+        $lowest_amount = 0.00;
 
-        if($pred_cent > 0)
+        foreach ($cart_list as $cart)
         {
-            if($full > 0) {
-                $pred_amound = $pred_amound - ($pred_amound / $total_goods_amount) * $full_discount;
-            }
+            $goods_price  = $cart['goods_price'];
+            $lowest_price = $cart['goods_lowest_price'];
+            $goods_num    = intval($cart['goods_num']);
 
-            $pred_amound = $pred_amound - predeposit_helper::order_cash($pred_amound,$rates);
-            return $pred_amound;
-        }
-        else
-        {
-            return 0;
-        }
-    }
+            $bonus_total  = $goods_num * ($goods_price - $lowest_price);
+            $goods_total  = $goods_num * $goods_price;
+            $lowest_total = $goods_num * $lowest_price;
 
-    private function bonusable_goods_amount($cart_list,$opgoods)
-    {
-        $goods_amount = 0.00;
-        foreach ($cart_list as $cart)
-        {
-            $goods_total = $cart['goods_total'];
             if(intval($cart['bl_id']) > 0) {
             }
             elseif(!empty($cart['groupbuy_info'])) {
+
             }
             elseif(!empty($cart['xianshi_info'])) {
+
             }
             else
             {
                 if(empty($opgoods)) {
+                    $bonus_amount += $bonus_total;
                     $goods_amount += $goods_total;
+                    $lowest_amount += $lowest_total;
                 }
                 else
                 {
-                    $goods_id    = intval($cart['goods_id']);
+                    $goods_id = intval($cart['goods_id']);
                     if(array_key_exists($goods_id,$opgoods['goods_nums']))
                     {
                         $goods_price = $cart['goods_price'];
                         $goods_num = intval($cart['goods_num']);
                         $opnum = $opgoods['goods_nums'][$goods_id];
+
                         if($goods_num > $opnum) {
-                            $goods_amount += $goods_price * ($goods_num - $opnum);
+                            $bonus_amount  += ($goods_price - $lowest_price) * ($goods_num - $opnum);
+                            $goods_amount  += $goods_price  * ($goods_num - $opnum);
+                            $lowest_amount += $lowest_price * ($goods_num - $opnum);
                         }
                     }
                     else {
+                        $bonus_amount += $bonus_total;
                         $goods_amount += $goods_total;
+                        $lowest_amount += $lowest_total;
                     }
                 }
             }
         }
-        return $goods_amount;
+
+        $bonus_amount  = intval($bonus_amount * 100 + 0.5) / 100;
+        $goods_amount  = intval($goods_amount * 100 + 0.5) / 100;
+        $lowest_amount = intval($lowest_amount * 100 + 0.5) / 100;
+
+        return ['bonusable_goods_amount' => $goods_amount, 'max_bonus_amount' => $bonus_amount,'lowest_price_amount' => $lowest_amount];
     }
 
     /**
-     * 充值卡、预存款支付
+     * 充值卡、预存款、红包支付
      *
      */
     private function _createOrderStep5()
     {
-//        if (empty($this->_post_data['password'])) return ;
-//        $buyer_info	= Model('member')->getMemberInfoByID($this->_member_info['member_id']);
-//        if ($buyer_info['member_paypwd'] == '' || $buyer_info['member_paypwd'] != md5($this->_post_data['password'])) return ;
-//
-//        //delete by stanley
-//        //$order_list = $this->_post_data;
-//
-//        //使用充值卡支付
-//        if (!empty($this->_post_data['rcb_pay'])) {
-//            $order_list = $this->_logic_buy_1->rcbPay($this->_order_data['order_list'], $this->_post_data, $buyer_info);
-//        }
-//
-//        //使用预存款支付
-//        if (!empty($this->_post_data['pd_pay'])) {
-//            $this->_logic_buy_1->pdPay($order_list ? $order_list :$this->_order_data['order_list'], $this->_post_data, $buyer_info);
-//        }
+        $buyer_info	= Model('member')->getMemberInfoByID($this->_member_info['member_id']);
+
+        if (empty($this->_post_data['password'])) return;
+        if ($buyer_info['member_paypwd'] == '' || $buyer_info['member_paypwd'] != md5($this->_post_data['password'])) return ;
+
+        //使用充值卡支付
+        if (!empty($this->_post_data['rcb_pay'])) {
+            $order_list = $this->_logic_buy_1->rcbPay($this->_order_data['order_list'], $this->_post_data, $buyer_info);
+        }
+
+        //使用预存款支付
+        if (!empty($this->_post_data['pd_pay'])) {
+            $this->_logic_buy_1->pdPay($order_list ? $order_list :$this->_order_data['order_list'], $this->_post_data, $buyer_info);
+        }
     }
 
     /**
@@ -1066,6 +1132,7 @@ class buyLogic
                 $goods_list[$i]['gc_id'] = $cart['gc_id'];
                 $goods_list[$i]['goods_name'] = $cart['goods_name'];
                 $goods_list[$i]['goods_price'] = $cart['goods_price'];
+                $goods_list[$i]['goods_lowest_price'] = $cart['goods_lowest_price'];
                 $goods_list[$i]['store_name'] = $cart['store_name'];
                 $goods_list[$i]['goods_image'] = $cart['goods_image'];
                 $goods_list[$i]['transport_id'] = $cart['transport_id'];
@@ -1083,6 +1150,7 @@ class buyLogic
                     $goods_list[$i]['gc_id'] = $bl_goods['gc_id'];
                     $goods_list[$i]['goods_name'] = $bl_goods['goods_name'];
                     $goods_list[$i]['goods_price'] = $bl_goods['goods_price'];
+                    $goods_list[$i]['goods_lowest_price'] = $cart['goods_lowest_price'];
                     $goods_list[$i]['store_name'] = $bl_goods['store_name'];
                     $goods_list[$i]['goods_image'] = $bl_goods['goods_image'];
                     $goods_list[$i]['transport_id'] = $bl_goods['transport_id'];

+ 94 - 0
data/logic/buy_1.logic.php

@@ -583,6 +583,99 @@ class buy_1Logic
      * 预存款支付,依次循环每个订单
      * 如果预存款足够就单独支付了该订单,如果不足就暂时冻结,等API支付成功了再彻底扣除
      */
+    public function bonusPay($order_list, $input, $buyer_info)
+    {
+        $member_id = $buyer_info['member_id'];
+        $member_name = $buyer_info['member_name'];
+
+        $available_pd_amount = floatval($buyer_info['available_predeposit']);
+        if ($available_pd_amount <= 0) return;
+
+        $model_order = Model('order');
+        $model_pd = Model('predeposit');
+        foreach ($order_list as $order_info)
+        {
+            //货到付款的订单、已经充值卡支付的订单跳过
+            if ($order_info['payment_code'] == 'offline') continue;
+            if ($order_info['order_state'] == ORDER_STATE_PAY) continue;
+
+            $order_amount = floatval($order_info['order_amount']) - floatval($order_info['rcb_amount']);
+            $data_pd = array();
+            $data_pd['member_id'] = $member_id;
+            $data_pd['member_name'] = $member_name;
+            $data_pd['amount'] = $order_amount;
+            $data_pd['order_sn'] = $order_info['order_sn'];
+
+            if ($available_pd_amount >= $order_amount)
+            {
+                //预存款立即支付,订单支付完成
+                $model_pd->changePd('order_pay',$data_pd);
+                $available_pd_amount -= $order_amount;
+
+                //支付被冻结的充值卡
+                $rcb_amount = floatval($order_info['rcb_amount']);
+                if ($rcb_amount > 0) {
+                    $data_pd = array();
+                    $data_pd['member_id'] = $member_id;
+                    $data_pd['member_name'] = $member_name;
+                    $data_pd['amount'] = $rcb_amount;
+                    $data_pd['order_sn'] = $order_info['order_sn'];
+                    $model_pd->changeRcb('order_comb_pay',$data_pd);
+                }
+
+                //记录订单日志(已付款)
+                $data = array();
+                $data['order_id'] = $order_info['order_id'];
+                $data['log_role'] = 'buyer';
+                $data['log_msg'] = L('order_log_pay');
+                $data['log_orderstate'] = ORDER_STATE_PAY;
+                $insert = $model_order->addOrderLog($data);
+                if (!$insert) {
+                    throw new Exception('记录订单预存款支付日志出现错误');
+                }
+
+                //订单状态 置为已支付
+                $data_order = array();
+                $data_order['order_state'] = ORDER_STATE_PAY;
+                $data_order['payment_time'] = time();
+                $data_order['payment_code'] = 'predeposit';
+                $data_order['pd_amount'] = $order_amount;
+                $result = $model_order->editOrder($data_order,array('order_id'=>$order_info['order_id']));
+                if (!$result) {
+                    throw new Exception('订单更新失败');
+                }
+                // 发送商家提醒
+                $param = array();
+                $param['code'] = 'new_order';
+                $param['store_id'] = $order_info['store_id'];
+                $param['param'] = array(
+                    'order_sn' => $order_info['order_sn']
+                );
+                QueueClient::push('sendStoreMsg', $param);
+            }
+            else
+            {
+                //暂冻结预存款,后面还需要 API彻底完成支付
+                if ($available_pd_amount > 0) {
+                    $data_pd['amount'] = $available_pd_amount;
+                    $model_pd->changePd('order_freeze',$data_pd);
+                    //预存款支付金额保存到订单
+                    $data_order = array();
+                    $data_order['pd_amount'] = $available_pd_amount;
+                    $result = $model_order->editOrder($data_order,array('order_id'=>$order_info['order_id']));
+                    $available_pd_amount = 0;
+                    if (!$result) {
+                        throw new Exception('订单更新失败');
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 预存款支付,依次循环每个订单
+     * 如果预存款足够就单独支付了该订单,如果不足就暂时冻结,等API支付成功了再彻底扣除
+     */
     public function pdPay($order_list, $input, $buyer_info)
     {
         $member_id = $buyer_info['member_id'];
@@ -988,6 +1081,7 @@ class buy_1Logic
                 $cart_list[$key]['gc_id'] = $goods_online_info['gc_id'];
                 $cart_list[$key]['goods_image'] = $goods_online_info['goods_image'];
                 $cart_list[$key]['goods_price'] = $goods_online_info['goods_price'];
+                $cart_list[$key]['goods_lowest_price'] = $goods_online_info['goods_lowest_price'];
                 $cart_list[$key]['transport_id'] = $goods_online_info['transport_id'];
                 $cart_list[$key]['goods_freight'] = $goods_online_info['goods_freight'];
                 $cart_list[$key]['goods_vat'] = $goods_online_info['goods_vat'];

+ 5 - 3
data/logic/payment.logic.php

@@ -4,8 +4,10 @@
  *
  */
 
+use bonus\account;
+
 defined('InShopNC') or exit('Access Invalid!');
-require_once (BASE_ROOT_PATH . '/helper/predeposit_helper.php');
+require_once (BASE_ROOT_PATH . '/helper/bonus_helper.php');
 
 class paymentLogic
 {
@@ -24,7 +26,7 @@ class paymentLogic
         $avail_pred = $pd_amount;
 
         $order_list = $model_order->getNormalOrderList(array('pay_sn' => $pay_sn));
-        $pred_helper = new predeposit_helper($member_id);
+        $pred_helper = new account($member_id);
         $pd_amount = intval($pd_amount * 100 + 0.5);
 
         $used_pred = intval(0);
@@ -62,7 +64,7 @@ class paymentLogic
         $order_list = $model_order->getNormalOrderListEx(['pay_sn' => $pay_sn],true);
 
         $model_pd = Model('predeposit');
-        $pred = new predeposit_helper($member_id,true);
+        $pred = new account($member_id,true);
 
         $pd_amount = intval($pd_amount * 100 + 0.5);
         foreach ($order_list as $order_info)

+ 0 - 1
fcgi_run.php

@@ -14,7 +14,6 @@ require_once(BASE_ROOT_PATH . '/helper/message/msgutil.php');
 require_once(BASE_ROOT_PATH . '/helper/message/subscriber.php');
 require_once(BASE_ROOT_PATH . '/helper/index_tab.php');
 require_once(BASE_ROOT_PATH . '/helper/bonus_helper.php');
-require_once(BASE_ROOT_PATH . '/helper/predeposit_helper.php');
 require_once(BASE_ROOT_PATH . '/helper/session_helper.php');
 require_once(BASE_ROOT_PATH . '/helper/sms_helper.php');
 require_once(BASE_ROOT_PATH . '/helper/model_helper.php');

+ 7 - 7
helper/account_helper.php

@@ -7,6 +7,8 @@
  * Time: 下午2:46
  */
 
+use bonus\account;
+
 require_once(BASE_ROOT_PATH . '/helper/bonus_helper.php');
 require_once(BASE_ROOT_PATH . '/helper/model_helper.php');
 require_once(BASE_ROOT_PATH . '/helper/push_helper.php');
@@ -89,7 +91,7 @@ class account_helper
 
     public static function gain_bonus($from_id,$to_id,$amount)
     {
-        $pred_from = new predeposit_helper($from_id);
+        $pred_from = new account($from_id);
         $bonus_rate = $pred_from->find_share_bonus($amount);
         if($bonus_rate == false || $bonus_rate['rate'] > 30) {
             return false;
@@ -117,7 +119,7 @@ class account_helper
 
     public static function lost_bonus($from_id,$to_id,$amount)
     {
-        $pred_from = new predeposit_helper($from_id);
+        $pred_from = new account($from_id);
         $bonus_rate = $pred_from->find_share_bonus($amount);
         if($bonus_rate == false) {
             return false;
@@ -171,7 +173,7 @@ class account_helper
             $bonus_rate = unserialize($bonus_rate);
         }
 
-        $pred = new predeposit_helper($member_id);
+        $pred = new account($member_id);
         $pred->pay_bonus($bonus_rate);
     }
 
@@ -236,7 +238,7 @@ class account_helper
     public static function appreciate($sender_id,$rate,$amount,$toid,$bless)
     {
         $param = bonus\parameters::appreciate($sender_id,intval($rate),$amount,$bless);
-        $pred = new predeposit_helper($sender_id);
+        $pred = new account($sender_id);
 
         $rate_moneys[] = ['rate' => $rate,'num' => 1,'amount' => $amount,'hold_amount' => $amount];
         $ret = $pred->make_bonus($param,$rate_moneys);
@@ -252,7 +254,7 @@ class account_helper
         $rates = [intval($rate) => doubleval($amount)];
         $ret = bonus_helper::withold($member_id,$rates,bonus_helper::pay_order_withold);
         if($ret) {
-            $pred = new predeposit_helper($member_id);
+            $pred = new account($member_id);
             $pred->reduce_pred($amount);
         } else {
             Log::record('扣除预存款失败',Log::ERR);
@@ -587,6 +589,4 @@ class account_helper
     {
 
     }
-
-
 }

+ 2 - 2
helper/async/broadcast/filter.php

@@ -9,7 +9,7 @@
 namespace async;
 
 use member_info;
-use predeposit_helper;
+use bonus\account;
 
 abstract class filter
 {
@@ -61,7 +61,7 @@ abstract class filter
 
     protected function usable_bonus($member_id)
     {
-        $pred = new predeposit_helper($member_id);
+        $pred = new account($member_id);
         return $pred->total_bonus();
     }
 }

+ 105 - 0
helper/bonus/BonusAmount.php

@@ -0,0 +1,105 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: stanley-king
+ * Date: 2018/8/24
+ * Time: 下午6:35
+ */
+
+namespace bonus;
+
+use UnImplementsException;
+
+class BonusAmount implements IMoneyCalc
+{
+    private $mDirty;
+    private $mAmount;
+
+    public function __construct($rates)
+    {
+        $this->mDirty = false;
+        $this->mAmount = 0.00;
+
+        $amount = 0.0;
+        foreach ($rates as $key => $val) {
+            $amount += $val;
+        }
+        $this->mAmount = intval(100 * $amount + 0.5) / 100;
+    }
+
+    public function add_bonuses($items)
+    {
+        foreach ($items as $item) {
+            $bonus = \bonus\user_bonus::create_by_param($item);
+            $amount = intval($bonus->remain_amount() * 100 + 0.5) / 100;
+
+            if ($amount <= 0) continue;
+            $this->mAmount += intval(100 * $amount + 0.5) / 100;
+            $this->mDirty = true;
+        }
+    }
+
+    public function is_enough(&$rate, $amount)
+    {
+        $rate = defaultBonusRate();
+        $amount = intval($amount * 100 + 0.5);
+        $tmp = intval($this->mAmount * 100 + 0.5);
+        return $tmp >= $amount;
+    }
+
+    public function with_hold($rate, $amount)
+    {
+        $this->mAmount -= ($amount * 100 + 0.5) / 100;
+        $this->mDirty = true;
+    }
+
+    public function find_rate($amount)
+    {
+        if ($this->is_enough($rate, $amount)) {
+            return ['rate' => defaultBonusRate(), 'amount' => intval($this->mAmount * 100 + 0.5) / 100];
+        } else {
+            $amount = intval($amount * 100 + 0.5);
+            return ['rate' => $rate, 'amount' => $amount / 100];
+        }
+    }
+
+    public function format()
+    {
+        return [defaultBonusRate() => intval($this->mAmount * 100 + 0.5) / 100];
+    }
+
+    public function total()
+    {
+        return $this->mAmount;
+    }
+
+    public function dirty()
+    {
+        return $this->mDirty;
+    }
+
+    public function clean()
+    {
+        $this->mDirty = false;
+    }
+
+    public function calc_rates($amount)
+    {
+        throw new UnImplementsException(__METHOD__);
+    }
+
+    public function calc_money($price, &$rates)
+    {
+        throw new UnImplementsException(__METHOD__);
+    }
+
+    public function calc_price($price, &$rates)
+    {
+        throw new UnImplementsException(__METHOD__);
+    }
+
+    static function scale()
+    {
+        return (100 - self::PRED_RATE) / 100;
+    }
+}

+ 19 - 0
helper/bonus/IMoneyCalc.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: stanley-king
+ * Date: 2018/8/24
+ * Time: 下午6:34
+ */
+
+namespace bonus;
+
+interface IMoneyCalc
+{
+    public function add_bonuses($items);
+    public function is_enough(&$rate, $amount);
+    public function with_hold($rate, $amount);
+    public function find_rate($amount);
+    public function format();
+    public function total();
+}

+ 203 - 0
helper/bonus/RateMoney.php

@@ -0,0 +1,203 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: stanley-king
+ * Date: 2018/8/24
+ * Time: 下午6:35
+ */
+
+namespace bonus;
+
+class RateMoney implements IMoneyCalc
+{
+    const ASC = 1;
+    const DESC = 2;
+    const PRED_RATE = 30;
+    private $mRates;
+    private $mDirty;
+
+    public function __construct($rates)
+    {
+        $this->mDirty = false;
+
+        $this->mRates = [];
+        foreach ($rates as $key => $val) {
+            $val = intval(100 * $val + 0.5);
+            if ($val > 0) {
+                $this->mRates[$key] = $val / 100;
+            }
+        }
+        krsort($this->mRates);
+    }
+
+    public function add_bonuses($items)
+    {
+        foreach ($items as $item) {
+            $bonus = \bonus\user_bonus::create_by_param($item);
+            $rate = $bonus->bonus_rate();
+            $amount = intval($bonus->remain_amount() * 100 + 0.5);
+
+            if ($amount <= 0) continue;
+
+            $this->mDirty = true;
+            if (isset($this->mRates[$rate]) == false) {
+                $this->mRates[$rate] = 0.00;
+            }
+            $this->mRates[$rate] += $bonus->remain_amount();
+        }
+        krsort($this->mRates);
+    }
+
+    public function resort()
+    {
+        krsort($this->mRates);
+    }
+
+    public function is_enough(&$rate, $amount)
+    {
+        $amount = intval($amount * 100 + 0.5);
+        foreach ($this->mRates as $key => $val) {
+            $val = intval($val * 100 + 0.5);
+            if ($rate == -1) {
+                if ($val >= $amount) {
+                    $rate = $key;
+                    return true;
+                }
+            } else {
+                if ($rate == $key) {
+                    $rate = $key;
+                    if ($val >= $amount) {
+                        return true;
+                    } else {
+                        return false;
+                    }
+                }
+            }
+        }
+
+        return false;
+    }
+
+    public function with_hold($rate, $amount)
+    {
+        if (isset($this->mRates[$rate])) {
+            $this->mDirty = true;
+            $this->mRates[$rate] = $this->mRates[$rate] - $amount;
+        }
+    }
+
+    public function find_rate($amount)
+    {
+        if (empty($this->mRates)) return false;
+
+        $rates = $this->mRates;
+        ksort($rates);
+        foreach ($rates as $rate => $money) {
+            $money = intval($money * 100 + 0.5);
+            $amount = intval($amount * 100 + 0.5);
+            if ($amount >= $money) {
+                return ['rate' => $rate, 'amount' => $money / 100];
+            } else {
+                return ['rate' => $rate, 'amount' => $amount / 100];
+            }
+        }
+
+        return false;
+    }
+
+    public function format()
+    {
+        $result = [];
+        foreach ($this->mRates as $key => $val) {
+            $val = intval($val * 100 + 0.5);
+            if ($val > 0) {
+                $result[$key] = $val / 100;
+            }
+        }
+        return $result;
+    }
+
+    public function total()
+    {
+        $total = 0.00;
+        foreach ($this->mRates as $key => $amount) {
+            $total += $amount;
+        }
+        return $total;
+    }
+
+    public function dirty()
+    {
+        return $this->mDirty;
+    }
+
+    public function clean()
+    {
+        $this->mDirty = false;
+    }
+
+    public function calc_rates($amount)
+    {
+        $rates = [];
+
+        $left = intval($amount * 100 + 0.5);
+        foreach ($this->mRates as $rate => $total) {
+            if ($left <= 0) break;
+            if ($rate > 100) continue;
+
+            $total = intval($total * 100 + 0.5);
+            if ($total <= 0) {
+                continue;
+            } else {
+                if ($total >= $left) {
+                    $rates[$rate] = $left / 100;
+                    $left = 0;
+                } else {
+                    $rates[$rate] = $total / 100;
+                    $left -= $total;
+                }
+            }
+        }
+        return $rates;
+    }
+
+    public function calc_money($price, &$rates)
+    {
+        $rates = [];
+        $disc = 0;
+        $left = intval($price * 100 + 0.5);
+        foreach ($this->mRates as $rate => $total) {
+            if ($left <= 0) break;
+            if ($rate > 100) continue;
+
+            $total = intval($total * 100 + 0.5);
+            if ($total <= 0) {
+                continue;
+            } else {
+                $max_rate = intval($left * $rate / 100 + 0.5);
+                if ($total >= $max_rate) {
+                    $disc += $max_rate;
+                    $left = 0;
+                    $rates[$rate] = $max_rate / 100;
+                } else {
+                    $disc += $total;
+                    $left -= intval($total * 100 / $rate + 0.5);
+                    $rates[$rate] = $total / 100;
+                }
+            }
+        }
+        $cur_price = intval($price * 100 + 0.5) - $disc;
+        return $cur_price / 100;
+    }
+
+    public function calc_price($price, &$rates)
+    {
+        $cur_price = intval($this->calc_money($price, $rates) * 100 + 0.5);
+        return $cur_price / 100;
+    }
+
+    static function scale()
+    {
+        return (100 - self::PRED_RATE) / 100;
+    }
+}

+ 851 - 0
helper/bonus/account.php

@@ -0,0 +1,851 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: stanley-king
+ * Date: 16/4/12
+ * Time: 下午4:57
+ */
+
+
+namespace bonus;
+
+use bonus;
+use bonus_helper;
+use Exception;
+use Log;
+use member_info;
+use QueueClient;
+use ranklist_helper;
+use room_helper;
+use session_helper;
+
+require_once(BASE_ROOT_PATH . '/helper/model_helper.php');
+require_once(BASE_ROOT_PATH . '/helper/bonus_helper.php');
+require_once(BASE_ROOT_PATH . '/helper/account_helper.php');
+require_once(BASE_ROOT_PATH . '/helper/room_helper.php');
+
+interface IPriceCalculate
+{
+    public function bonus_price($goods_price, $goods_lowest_price);
+    public function order_cash($goods_price, $goods_lowest_price);
+    public function discount_gap($bonus_price, $goods_lowest_price);
+    public function bonus_amount($goods_amount,$goods_lowest_amount);
+}
+
+class normal_calc implements IPriceCalculate
+{
+    public function bonus_price($goods_price, $goods_lowest_price) {
+        return $goods_price;
+    }
+    public function discount_gap($bonus_price, $goods_lowest_price) {
+        $bonus_cent  = intval($bonus_price * 100 + 0.5);
+        $lowest_cent = intval($goods_lowest_price * 100 + 0.5);
+
+        if($bonus_cent >= $lowest_cent) {
+            return ($bonus_cent - $lowest_cent) / 100;
+        } else {
+            return false;
+        }
+    }
+    public function order_cash($goods_price, $goods_lowest_price)
+    {
+        return $goods_price;
+    }
+    public function bonus_amount($goods_amount,$goods_lowest_amount)
+    {
+        return 0.00;
+    }
+}
+
+class account implements IPriceCalculate
+{
+    private $model_pd;
+    private $member_id;
+    private $mPayRates;
+    private $mShareRates;
+    private $mBonusState;
+    private $mRateVersion; //用来记录,红包过期带来的红包变化
+    private $mFromSession;
+    private $mRoomBonus;
+    private $mRoomAmount;
+    private $mDirty;
+
+    public function __construct($member_id, $from_session = false)
+    {
+        $this->mDirty = false;
+        $this->model_pd = Model('predeposit');
+        $this->member_id = $member_id;
+        $this->mFromSession = $from_session;
+
+        $pd_array = Model('member')->getMemberPdInfo($this->member_id);
+        $this->mRateVersion = intval($pd_array['rate_version']);
+        $this->init_rate();
+        $this->init_roombonus();
+    }
+
+    public function __destruct()
+    {
+        if ($this->mDirty) {
+            if ($this->mFromSession) {
+                $this->del_rates();
+            }
+            $this->inc_rate_version();
+        }
+    }
+
+    public function room_bonus()
+    {
+        return $this->mRoomBonus;
+    }
+
+    private function init_roombonus()
+    {
+        $this->mRoomBonus = [];
+        $this->mRoomAmount = 0.0;
+        $this->mRoomBonus = room_helper::user_rooms($this->member_id);
+
+        $amount = 0;
+        foreach ($this->mRoomBonus as $bonus) {
+            $amount += $bonus['shared_bonus'];
+        }
+        $this->mRoomAmount = intval($amount * 100 + 0.5) / 100;
+    }
+
+    public function member_id()
+    {
+        return $this->member_id;
+    }
+
+    private function init_rate()
+    {
+        if ($this->mFromSession)
+        {
+            $fUpdate = false;
+            if (!isset($_SESSION['bonus_rate_version'])) {
+                $fUpdate = true;
+            }
+            else
+            {
+                $version = $_SESSION['bonus_rate_version'];
+                if ($version != $this->mRateVersion) {
+                    $fUpdate = true;
+                }
+                else
+                {
+                    if (isset($_SESSION['bonus_rate']) && isset($_SESSION['bonus_state']) && isset($_SESSION['share_bonus_rate'])) {
+                        $this->mPayRates = self::create_moneycalc($_SESSION['bonus_rate']);
+                        $this->mShareRates = self::create_moneycalc($_SESSION['share_bonus_rate']);
+                        $this->mBonusState = $_SESSION['bonus_state'];
+                    } else {
+                        $fUpdate = true;
+                    }
+                }
+            }
+        } else {
+            $fUpdate = true;
+        }
+
+        if ($fUpdate || $this->need_update())
+        {
+            $mod_bonus = Model('user_bonus');
+            $this->mPayRates = self::create_moneycalc(array());
+            $pay_items = $mod_bonus->getUsableBonus($this->member_id);
+            $this->mPayRates->add_bonuses($pay_items);
+            $pay_bonus_rate = $this->mPayRates->format();
+
+            $this->mShareRates = self::create_moneycalc(array());
+            $share_items = $mod_bonus->getShareableBonus($this->member_id);
+            $this->mShareRates->add_bonuses($share_items);
+            $share_bonus_rate = $this->mShareRates->format();
+
+            $this->mBonusState = [];
+            $querys = array('usable', 'expiring', 'used', 'expired');
+            foreach ($querys as $state)
+            {
+                $cond = $this->query_cond($state);
+                if ($state == 'used') {
+                    $sum = $mod_bonus->getSum($cond, 'bonus_value');
+                } else {
+                    $sum = $mod_bonus->getSum($cond);
+                }
+                $this->mBonusState[$state] = doubleval($sum);
+            }
+
+            $this->write_rates($this->mBonusState, $pay_bonus_rate, $share_bonus_rate);
+            $this->mPayRates->clean();
+            $this->mShareRates->clean();
+
+            if ($this->mFromSession) {
+                $_SESSION['bonus_update_time'] = time();
+            }
+        }
+    }
+
+    private function need_update()
+    {
+        if ($this->mFromSession) {
+            if (!isset($_SESSION['bonus_update_time'])) return true;
+
+            $time = intval($_SESSION['bonus_update_time']);
+            if (time() - $time > 86400) {
+                return true;
+            } else {
+                return false;
+            }
+        } else {
+            return true;
+        }
+    }
+
+    public function pay_bonus_rates()
+    {
+        return $this->mPayRates;
+    }
+
+    public function total_bonus()
+    {
+        return $this->mPayRates->total();
+    }
+
+    public function usable_bonus()
+    {
+        return ($this->mRoomAmount + $this->total_bonus());
+    }
+
+    public function share_bonus_rates()
+    {
+        return $this->mShareRates;
+    }
+
+    public function share_total_bonus()
+    {
+        return $this->mShareRates->total();
+    }
+
+    public function bonus_state()
+    {
+        return $this->mBonusState;
+    }
+
+    private function query_cond($query_state)
+    {
+        static $stQuerys = ['usable', 'expiring', 'used', 'expired'];
+        static $day_secs = 24 * 3600;
+
+        $cond = ['user_id' => $this->member_id, 'bonus_status' => 3];
+        if (!empty($query_state) && in_array($query_state, $stQuerys)) {
+            if ($query_state == 'usable') {
+                $cond['remain_amount'] = ['gt', '0.00'];
+                $cond['usable_time'] = ['gt', time()];
+                $cond['expired'] = 0;
+            } elseif ($query_state == 'expiring') {
+                $cond['usable_time&usable_time'] = ['_multi' => true, ['gt', time()], ['elt', time() + 5 * $day_secs]];
+                $cond['remain_amount'] = ['gt', '0.00'];
+                $cond['expired'] = 0;
+            } elseif ($query_state == 'used') {
+                $cond['remain_amount'] = '0.00';
+                $cond['expired'] = 0;
+            } elseif ($query_state == 'expired') {
+                $cond['usable_time'] = ['lt', time()];
+                $cond['expired'] = 1;
+                $cond['remain_amount'] = ['gt', '0.00'];
+            } else {
+
+            }
+        }
+
+        return $cond;
+    }
+
+    private function write_rates($bonus_state, $pay_bonus_rate, $share_bonus_rate)
+    {
+        if ($this->mFromSession) {
+            $_SESSION['bonus_state'] = $bonus_state;
+            $_SESSION['bonus_rate'] = $pay_bonus_rate;
+            $_SESSION['share_bonus_rate'] = $share_bonus_rate;
+            $_SESSION['bonus_rate_version'] = $this->mRateVersion;
+        }
+    }
+
+    private function del_rates()
+    {
+        if ($this->mFromSession) {
+            if (isset($_SESSION['bonus_state'])) {
+                unset($_SESSION['bonus_state']);
+            }
+            if (isset($_SESSION['bonus_rate'])) {
+                unset($_SESSION['bonus_rate']);
+            }
+            if (isset($_SESSION['share_bonus_rate'])) {
+                unset($_SESSION['share_bonus_rate']);
+            }
+            if (isset($_SESSION['bonus_rate_version'])) {
+                unset($_SESSION['bonus_rate_version']);
+            }
+        }
+    }
+
+    public function topup_bonus($mobile)
+    {
+        $mod_bonus = Model('user_bonus');
+        $items = $mod_bonus->getBinded($this->member_id(), $mobile);
+
+        if (empty($items)) return false;
+
+        $bonuses = [];
+        $manager = new bonus\manager();
+        foreach ($items as $val)
+        {
+            try {
+                $type_id = $val['type_id'];
+                $type = bonus\type::create_by_id($type_id);
+                $bonus = bonus\user_bonus::create_by_param($val);
+
+                if ($manager->topup($type, $mod_bonus, $val) == true) {
+                    $bonuses[] = $val;
+                    ranklist_helper::add_money($this->member_id(), $bonus->bonus_value());
+                    $this->add_bonus($bonus, $type);
+                }
+            } catch (Exception $ex) {
+                Log::record(__METHOD__ . " {$ex->getMessage()}", Log::ERR);
+            }
+        }
+
+        if (empty($bonuses)) {
+            return false;
+        } else {
+            $this->mDirty = true;
+            return $bonuses;
+        }
+    }
+
+    public function is_enough($money)
+    {
+        return intval($this->total_bonus() * 100) >= intval($money * 100);
+    }
+
+    public function share_enough($money, &$bonus_rate)
+    {
+        if ($this->mPayRates == null) return false;
+        return $this->mShareRates->is_enough($bonus_rate, $money);
+    }
+
+    public function rates()
+    {
+        return $this->mPayRates == null ? false : $this->mPayRates;
+    }
+
+    public function makeby_bonus($param, $rate_moneys, $bonus_sn)
+    {
+        $result = bonus_helper::make_bonus($param, $rate_moneys);
+        if ($result == false) return false;
+
+        $this->mDirty = true;
+        foreach ($rate_moneys as $item) {
+            $rate = intval($item['rate']);
+            $val = $item['hold_amount'];
+            bonus_helper::withold_bonus($this->member_id, $bonus_sn, $rate, $val, bonus_helper::send_bonus_withold);
+        }
+
+        $type_sn = $result['type_sn'];
+        $money = $result['money'];
+        $this->handout_bonus($money, $type_sn, session_helper::nickname(), "发送了{$money}元的红包.", \bonus\type::MakeSendType);
+
+        foreach ($rate_moneys as $item) {
+            $this->mPayRates->with_hold($item['rate'], $item['amount']);
+        }
+
+        return $result;
+    }
+
+    public function make_bonus($param, $rate_moneys)
+    {
+        $result = bonus_helper::make_bonus($param, $rate_moneys);
+        if ($result == false) return false;
+
+        $this->mDirty = true;
+        $rates = [];
+        foreach ($rate_moneys as $item) {
+            $rate = intval($item['rate']);
+            $val = $item['hold_amount'];
+            $rates[$rate] = $val;
+        }
+        bonus_helper::withold($this->member_id, $rates, bonus_helper::send_bonus_withold);
+
+        $type_sn = $result['type_sn'];
+        $money = $result['money'];
+        $this->handout_bonus($money, $type_sn, session_helper::nickname(), "发送了{$money}元的红包.", \bonus\type::MakeSendType);
+
+        foreach ($rate_moneys as $item) {
+            $this->mPayRates->with_hold($item['rate'], $item['amount']);
+        }
+
+        return $result;
+    }
+
+    public function make_vote_type($param, $rate_moneys)
+    {
+        $result = bonus_helper::make_vote_type($param, $rate_moneys);
+        if ($result == false) return false;
+
+        $this->mDirty = true;
+        $rates = [];
+        foreach ($rate_moneys as $item) {
+            $rate = intval($item['rate']);
+            $val = $item['hold_amount'];
+            $rates[$rate] = $val;
+        }
+        bonus_helper::withold($this->member_id, $rates, bonus_helper::send_bonus_withold);
+
+        $type_sn = $result['type_sn'];
+        $money = $result['money'];
+        $this->handout_bonus($money, $type_sn, session_helper::nickname(), "发送了{$money}元的红包.", \bonus\type::MakeSendType);
+
+        foreach ($rate_moneys as $item) {
+            $this->mPayRates->with_hold($item['rate'], $item['amount']);
+        }
+
+        return $result;
+    }
+
+    private function base_param($amount, $total_num)
+    {
+        $param = array();
+        $param['total_amount'] = $amount;
+        $param['total_num'] = $total_num;
+        $param['send_type'] = 1;
+
+        return $param;
+    }
+
+    public function share_bonus($bonus_sn, &$msg)
+    {
+        $bonus = bonus\user_bonus::create_by_sn($bonus_sn);
+        if ($bonus->spend_over()) {
+            $msg = "该红包现金已经花光了~";
+            return false;
+        }
+
+        $amount = $bonus->remain_amount();
+        $param = $this->base_param($amount, 1);
+
+        $minfo = new member_info($this->member_id);
+        $param['sender_id'] = $this->member_id;
+        $param['sender_mobile'] = $minfo->mobile();
+        $param['sender_name'] = $minfo->nickname();
+        $param['make_type'] = \bonus\type::MakeSendType;
+        $name = $minfo->nickname();
+        $param['type_name'] = "{$name}";
+
+        $type = \bonus\type::create_by_input($param);
+
+        $rate_moneys = [];
+        $item['amount'] = $type->getTotal_amount();
+        $item['num'] = $type->getTotal_num();
+        $item['rate'] = $bonus->bonus_rate();
+        $rate_moneys[] = $item;
+
+        $result = bonus_helper::make_bonus($param, $rate_moneys);
+        if ($result == false) {
+            return false;
+        } else {
+            $this->mDirty = true;
+            if (bonus_helper::withold_bonus($this->member_id, $bonus->bonus_rate(), $bonus_sn, $type->getTotal_amount(), bonus_helper::send_bonus_withold)) {
+                $type_sn = $result['type_sn'];
+                $money = $result['money'];
+                $this->handout_bonus($money, $type_sn, session_helper::nickname(), "发送了{$money}元的红包.", \bonus\type::MakeSendType);
+            }
+            return $result;
+        }
+    }
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    public function bonus_expire($bouns)
+    {
+        try {
+            $bonus_obj = bonus\user_bonus::create_by_param($bouns);
+            if ($bonus_obj->spend_over()) {
+                return false;
+            }
+            $this->mDirty = true;
+            $minfo = new member_info($this->member_id);
+            $data = array();
+            $data['member_id'] = $this->member_id;
+            $data['member_name'] = $minfo->nickname();
+            $data['amount'] = $bonus_obj->remain_amount();
+            $data['order_sn'] = $bonus_obj->bonus_sn();
+            $data['admin_name'] = "熊猫美妆";
+            $data['pdr_sn'] = $bonus_obj->bonus_sn();
+            $data['lg_desc'] = "红包过期扣款";
+            $this->model_pd->changePd("bonus_expire", $data);
+            return true;
+        } catch (Exception $ex) {
+            return false;
+        }
+    }
+
+    public function transform_money($member_id, $name, $amount)
+    {
+        $data = array();
+        $data['member_id'] = $member_id;
+        $data['member_name'] = is_null($name) ? '' : $name;
+        $data['amount'] = $amount;
+        $order_sn = $this->model_pd->makeSn();
+        $this->mDirty = true;
+
+        $data['order_sn'] = $order_sn;
+        $data['admin_name'] = '平台管理员';
+        $data['pdr_sn'] = $order_sn;
+        $data['lg_desc'] = '版本升级,余额迁移.';
+        $this->model_pd->changePd("sys_add_money", $data);
+    }
+
+    public function bonus_add_money($amount, $bonus_sn, $sender_name, $info, $make_type = 0)
+    {
+        $minfo = new member_info($this->member_id);
+
+        $data = array();
+        $data['member_id'] = $this->member_id;
+        $data['member_name'] = $minfo->nickname();
+        $data['amount'] = $amount;
+        $data['order_sn'] = $bonus_sn;
+        $data['admin_name'] = $sender_name;
+        $data['pdr_sn'] = $bonus_sn;
+        $data['lg_desc'] = $info;
+        $this->mDirty = true;
+        $this->model_pd->changePd("bonus_add_money", $data);
+    }
+
+    private function send_name($sender_name, $relay_id)
+    {
+        if ($relay_id > 0) {
+            $info = new member_info($relay_id);
+            $nick = $info->nickname();
+            if (!empty($nick)) return $nick;
+        }
+        return $sender_name;
+    }
+
+    public function add_bonus(bonus\user_bonus $bonus, bonus\type $type)
+    {
+        $minfo = new member_info($this->member_id);
+        $data = array();
+        $data['member_id'] = $this->member_id;
+        $data['member_name'] = $minfo->nickname();
+        $data['amount'] = $bonus->bonus_value();
+        $data['order_sn'] = $bonus->bonus_sn();
+        $data['admin_name'] = $this->send_name($type->sender_name(), $type->relayer_id());
+        $data['pdr_sn'] = $bonus->bonus_sn();
+        $data['lg_desc'] = "";
+        $data['make_type'] = $type->make_type();
+        $this->model_pd->changePd("bonus_add_money", $data);
+        $this->mDirty = true;
+    }
+
+    public function reduce_pred($amount)
+    {
+        $minfo = new member_info($this->member_id);
+        $data = array();
+        $data['member_id'] = $this->member_id;
+        $data['member_name'] = $minfo->nickname();
+        $data['amount'] = $amount;
+        $data['pdr_sn'] = '';
+        $data['lg_desc'] = "";
+        $this->model_pd->changePd("sys_del_money", $data);
+        $this->mDirty = true;
+    }
+
+    public function handout_bonus($amount, $type_sn, $sender_name, $info, $make_type = 0)
+    {
+        $this->mDirty = true;
+        $minfo = new member_info($this->member_id);
+        $data = array();
+        $data['member_id'] = $this->member_id;
+        $data['member_name'] = $minfo->nickname();
+        $data['amount'] = $amount;
+        $data['order_sn'] = $type_sn;
+        $data['admin_name'] = $sender_name;
+        $data['pdr_sn'] = $type_sn;
+        $data['lg_desc'] = $info;
+        $data['make_type'] = $make_type;
+        $this->model_pd->changePd("hand_out_bonus", $data);
+    }
+
+    private function filter_sn($lg_desc)
+    {
+        $pos = mb_strpos($lg_desc, ':');
+        if ($pos != false) {
+            return mb_substr($lg_desc, $pos + 1);
+        }
+        return '';
+    }
+
+    private function filter_make_type($lg_desc)
+    {
+        $reg = '/make_type=(\d+)/i';
+        $ret = preg_match($reg, $lg_desc, $arr);
+        if ($ret > 0) {
+            return intval($arr[1]);
+        } else {
+            return 0;
+        }
+    }
+
+    private function gen_send_title($sender_name, $make_type)
+    {
+        switch ($make_type) {
+            case bonus\type::MakeSendType:
+                return "发出红包";
+            case bonus\type::MakeShakeGainType:
+                return "被{$sender_name}摇走的红包";
+            case bonus\type::MakeShakeLostType:
+                return "摇飞红包到{$sender_name}";
+            default:
+                return "";
+        }
+    }
+
+    private function gen_gain_title($sender_name, $make_type)
+    {
+        switch ($make_type) {
+            case bonus\type::MakeSendType:
+                return "{$sender_name}的红包";
+            case bonus\type::MakeInviteType:
+                return "{$sender_name}发出的邀请红包";
+            case bonus\type::MakeBonusRefundType:
+                return "未领红包退款";
+            case bonus\type::MakeShakeGainType:
+                return "摇到{$sender_name}的红包";
+            case bonus\type::MakeShakeLostType:
+                return "{$sender_name}摇到你这儿的红包";
+            case bonus\type::MakePayRefundType:
+                return "购物退款红包";
+            case bonus\type::MakePayType:
+                return "购物分享红包";
+            case bonus\type::MakeOrderCancelType:
+                return "订单取消退款";
+            case bonus\type::MakeRegisterType:
+                return "新人福利";
+            case bonus\type::MakeEvaluateType:
+                return "评论奖励红包";
+            case bonus\type::MakeInviteRewardType:
+                return "邀请好友,奖励红包";
+            case bonus\type::MakeVoteType:
+                return "投票或答题红包";
+            case bonus\type::MakePayRewardInviterType:
+                return "粉丝购物,奖励红包";
+            case bonus\type::MakePayRewardInviteeType:
+                return "雨露均沾红包";
+            case bonus\type::MakeAllowanceType:
+                return "购物津贴红包";
+
+            default:
+                return "";
+        }
+    }
+
+    public function filter_pd_log($items)
+    {
+        $pdlogs = [];
+        foreach ($items as $val)
+        {
+            $item = [];
+            $av_amount = $val['lg_av_amount'];
+            $freeze_amount = $val['lg_freeze_amount'];
+            $admin_name = $val['lg_admin_name'];
+            $add_time = $val['lg_add_time'];
+            $type = $val['lg_type'];
+            $sn = $this->filter_sn($val['lg_desc']);
+
+            $item['av_amount'] = $av_amount;
+            $item['freeze_amount'] = $freeze_amount;
+            $item['add_time'] = $add_time;
+
+            $fAdd = true;
+            if ($type == 'order_pay') {
+                $item['title'] = "支付订单";
+                $item['sn'] = "订单号:{$sn}";
+            } else if ($type == 'order_freeze') {
+                $item['title'] = "下单扣除红包";
+                $item['sn'] = "订单号:{$sn}";
+            } else if ($type == 'order_cancel') {
+                $item['title'] = "取消订单,解冻红包";
+                $item['sn'] = "订单号:{$sn}";
+            } else if ($type == 'order_comb_pay') {
+                $item['title'] = "下单,支付被冻结的红包";
+                $item['sn'] = "订单号:{$sn}";
+                $item['av_amount'] = $freeze_amount;
+            } else if ($type == 'recharge') {
+                $item['title'] = "充值";
+                $item['sn'] = "充值单号:{$sn}";
+            } else if ($type == 'refund') {
+                $item['title'] = "确认退款";
+            } else if ($type == 'vr_refund') {
+                $item['title'] = "虚拟兑码退款成功";
+            } else if ($type == 'hand_out_bonus') {
+                $make_type = $this->filter_make_type($val['lg_desc']);
+                $item['title'] = $this->gen_send_title($admin_name, $make_type);
+                $item['sn'] = '';
+            } else if ($type == 'bonus_refund') {
+                $item['title'] = "红包退款";
+                $item['sn'] = '';
+            } else if ($type == 'bonus_add_money') {
+                $make_type = $this->filter_make_type($val['lg_desc']);
+                $item['title'] = $this->gen_gain_title($admin_name, $make_type);
+                $item['sn'] = '';
+            } else if ($type == 'bonus_expire') {
+                $item['title'] = "红包过期扣款";
+                $item['sn'] = '';
+            } else if ($type == 'sys_add_money') {
+                $item['title'] = "管理员调节预存款";
+                $item['sn'] = '';
+            } else if ($type == 'sys_del_money') {
+                $item['title'] = "管理员调节预存款";
+                $item['sn'] = '';
+            } else if ($type == 'sys_freeze_money') {
+                $item['title'] = "管理员冻结预存款";
+                $item['sn'] = "充值单号:{$sn}";
+            } else if ($type == 'sys_unfreeze_money') {
+                $item['title'] = "管理员解冻预存款";
+                $item['sn'] = "充值单号:{$sn}";
+            } else {
+                $fAdd = false;
+            }
+
+            if ($fAdd) {
+                $pdlogs[] = $item;
+            }
+        }
+
+        return $pdlogs;
+    }
+
+    public function calc_rates($order_pd_amount)
+    {
+        $rates = $this->mPayRates->calc_rates($order_pd_amount);
+        return $rates;
+    }
+
+    public function calc_pred($order_info, $pd_amount, &$no_cash, &$rates)
+    {
+        $order_id = intval($order_info['order_id']);
+        $mod_order = Model('order');
+
+        $pred_amount = 0.00;
+        $goods_list = $mod_order->getOrderGoodsList(array('order_id' => $order_id));
+        foreach ($goods_list as $goods) {
+            $goods_type = intval($goods['goods_type']);
+            if ($goods_type == 1) {
+                $pred_amount += doubleval($goods['goods_pay_price']);
+            }
+        }
+
+        $pred_amount = $pred_amount - $this->mPayRates->calc_money($pred_amount, $rates);
+        $cur_used = intval($pred_amount * 100 + 0.5);
+        $cur_used = $cur_used > $pd_amount ? $pd_amount : $cur_used;
+
+        $order_amount = intval($order_info['order_amount'] * 100 + 0.5);
+        $order_pd_amount = intval($order_info['pd_amount'] * 100 + 0.5);
+
+        if ($order_amount == $cur_used) {
+            $no_cash = true;
+        } else {
+            $no_cash = false;
+        }
+
+        return $cur_used - $order_pd_amount;
+    }
+
+    public function pay_bonus($rates)
+    {
+        $ret = bonus_helper::withold($this->member_id, $rates, bonus_helper::pay_order_withold);
+        foreach ($rates as $rate => $amount) {
+            $this->mPayRates->with_hold($rate, $amount);
+        }
+        $this->mDirty = true;
+
+        return $ret;
+    }
+
+    public function find_share_bonus($amount)
+    {
+        $bonus_rate = $this->share_bonus_rates();
+        return $bonus_rate->find_rate($amount);
+    }
+
+    private function inc_rate_version()
+    {
+        $mod_member = Model('member');
+        $mod_member->editMember(['member_id' => $this->member_id], ['rate_version' => ['exp', "rate_version+1"]]);
+    }
+
+    public function bonus_price($goods_price, $lowest_price)
+    {
+        $can_use = $goods_price - $lowest_price;
+        $can_use_cent = intval($can_use * 100 + 0.5);
+        $usable_cent = intval($this->usable_bonus() * 100 + 0.5);
+
+        if ($usable_cent >= $can_use_cent) {
+            return $lowest_price;
+        } else {
+            return intval($goods_price * 100 - $usable_cent + 0.5) / 100;
+        }
+    }
+    public function order_cash($goods_amount, $lowest_amount)
+    {
+        return $this->bonus_price($goods_amount,$lowest_amount);
+    }
+
+    public function discount_gap($bonus_price, $goods_lowest_price)
+    {
+        $bonus_cent  = intval($bonus_price * 100 + 0.5);
+        $lowest_cent = intval($goods_lowest_price * 100 + 0.5);
+
+        if($bonus_cent >= $lowest_cent) {
+            return ($bonus_cent - $lowest_cent) / 100;
+        } else {
+            return false;
+        }
+    }
+    public function bonus_amount($goods_amount,$goods_lowest_amount)
+    {
+        $can_use = $goods_amount - $goods_lowest_amount;
+        $can_use_cent = intval($can_use * 100 + 0.5);
+        $usable_cent = intval($this->usable_bonus() * 100 + 0.5);
+
+        if ($usable_cent >= $can_use_cent) {
+            return ($can_use_cent / 100);
+        } else {
+            return $usable_cent/ 100;
+        }
+    }
+
+    static public function admin_make_bonus($param, $rate_moneys)
+    {
+        return bonus_helper::make_bonus($param, $rate_moneys);
+    }
+//    static public function order_cash($goods_amount, &$rates)
+//    {
+//        if (isset($_SESSION['bonus_rate']) == false) {
+//            $pred = new account($_SESSION['member_id'], true);
+//            $bonus_rate = $pred->pay_bonus_rates();
+//        } else {
+//            $bonus_rate = self::create_moneycalc($_SESSION['bonus_rate']);
+//        }
+//
+//        return $bonus_rate->calc_money($goods_amount, $rates);
+//    }
+
+    static public function bonus_refund($bonus_type)
+    {
+        $types = bonus\type::create_by_paramer($bonus_type);
+        QueueClient::push('onPredeposit', array('change_type' => 'bonus_refund', 'buyer_id' => $types->sender_id(), 'order_sn' => $types->getType_sn()));
+    }
+    static private function create_moneycalc($rate_moneys)
+    {
+        if (noBonusRate()) {
+            return new bonus\BonusAmount($rate_moneys);
+        } else {
+            return new bonus\RateMoney($rate_moneys);
+        }
+    }
+}

+ 15 - 0
helper/bonus/bonus_log.php

@@ -0,0 +1,15 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: stanley-king
+ * Date: 2018/8/24
+ * Time: 下午11:36
+ */
+
+namespace bonus;
+
+
+class bonus_log
+{
+
+}

+ 4 - 4
helper/bonus/factory.php

@@ -20,7 +20,7 @@ class factory
             $iGen->make_type();
 
             $money = $type->getTotal_amount();
-            return array('type_sn' => $type->getType_sn(),'money' => $money);
+            return ['type_sn' => $type->getType_sn(),'money' => $money];
         }
         catch (Exception $ex) {
             return false;
@@ -36,12 +36,12 @@ class factory
             $iGen->make_type();
 
             if(!$ret = $iGen->make_bonus($rate_moneys)) {
-                Model('bonus_type')->delete(array('type_id' => $type->getType_id()));
-                Model('user_bonus')->delete(array('type_id' => $type->getType_id()));
+                Model('bonus_type')->delete(['type_id' => $type->getType_id()]);
+                Model('user_bonus')->delete(['type_id' => $type->getType_id()]);
                 return false;
             }
             $money = $type->getTotal_amount();
-            return array('type_sn' => $type->getType_sn(),'money' => $money);
+            return ['type_sn' => $type->getType_sn(),'money' => $money];
         }
         catch (Exception $ex) {
             return false;

+ 2 - 2
helper/bonus/thief_vilator.php

@@ -10,7 +10,7 @@ namespace bonus;
 
 use algorithm;
 use errcode;
-use predeposit_helper;
+use bonus\account;
 use gain_policy;
 
 class thief_vilator
@@ -34,7 +34,7 @@ class thief_vilator
             return false;
         }
 
-        $pred = new predeposit_helper($this->mFromID);
+        $pred = new account($this->mFromID);
         $usable_amount = $pred->share_total_bonus();
         $cents = intval($usable_amount * 100 + 0.5);
         if($cents == 0) {

+ 6 - 49
helper/bonus_helper.php

@@ -7,7 +7,6 @@
  */
 
 require_once (BASE_ROOT_PATH . '/helper/field_helper.php');
-require_once (BASE_ROOT_PATH . '/helper/predeposit_helper.php');
 require_once (BASE_ROOT_PATH . '/helper/ranklist_helper.php');
 require_once (BASE_ROOT_PATH . '/helper/text_filter.php');
 
@@ -27,6 +26,11 @@ require_once (BASE_ROOT_PATH . '/helper/bonus/open_sharer.php');
 require_once (BASE_ROOT_PATH . '/helper/bonus/scaler.php');
 require_once (BASE_ROOT_PATH . '/helper/bonus/thief_vilator.php');
 
+require_once (BASE_ROOT_PATH . '/helper/bonus/IMoneyCalc.php');
+require_once (BASE_ROOT_PATH . '/helper/bonus/RateMoney.php');
+require_once (BASE_ROOT_PATH . '/helper/bonus/BonusAmount.php');
+require_once (BASE_ROOT_PATH . '/helper/bonus/account.php');
+
 
 class bonus_helper
 {
@@ -59,7 +63,6 @@ class bonus_helper
 
         return $ret;
     }
-
     static public function filter_bonus($bonus_info)
     {
         if(empty($bonus_info['user_name'])) {
@@ -67,14 +70,12 @@ class bonus_helper
         }
         return $bonus_info;
     }
-
     static public function isFixed($send_type) {
         return ($send_type == bonus\type::SendType_Fixed);
     }
     static public function isRandom($send_type) {
         return ($send_type == bonus\type::SendType_Random);
     }
-
     static public function create_type_input($param) {
         return bonus\type::create_by_input($param);
     }
@@ -84,7 +85,6 @@ class bonus_helper
     static public function create_type_sn($type_sn) {
         return bonus\type::create_by_sn($type_sn);
     }
-
     static public function make_bonus($param, $rate_moneys)
     {
         $ret = bonus\factory::make_bonus($param,$rate_moneys);
@@ -95,7 +95,6 @@ class bonus_helper
         $ret = bonus\factory::make_vote_type($param,$rate_moneys);
         return $ret;
     }
-
     static public function last_invite_type($member_id)
     {
         $mod = Model('bonus_type');
@@ -106,29 +105,24 @@ class bonus_helper
             return $items[0];
         }
     }
-
     static public function get_typeinfo($type_sn)
     {
         $manager = new bonus\manager();
         return $manager->get_typeinfo($type_sn);
     }
-
     static public function get_mine_by_typesn($type_sn) {
         $manager = new bonus\manager();
         return $manager->get_mine_by_typesn($type_sn);
     }
-
     static public function get_mine_by_bonussn($bonus_sn) {
         $manager = new bonus\manager();
         return $manager->get_mine_by_bonussn($bonus_sn);
     }
-
     static public function grab_bonus($type_sn)
     {
         $manager = new bonus\manager();
         return $manager->grab_bonus($type_sn);
     }
-
     static public function onBinded($bonus_sn,$mobile,$userid)
     {
         try
@@ -161,7 +155,6 @@ class bonus_helper
             Log::record(__METHOD__ . " " . $ex->getMessage(),Log::ERR);
         }
     }
-
     static public function bind_bonus($bonus_sn,$session_id,$mobile,$userid,&$new_bonus_sn)
     {
         try
@@ -179,7 +172,6 @@ class bonus_helper
         $manager = new bonus\manager();
         return $manager->shake($bonus_sn,$strength,$direction);
     }
-
     static public function comment($bonus_sn,$comment)
     {
         try
@@ -190,41 +182,6 @@ class bonus_helper
             return false;
         }
     }
-
-    static public function topup_bonus(predeposit_helper $pred,$mobile)
-    {
-        $mod_bonus = Model('user_bonus');
-        $bind_bonus = $mod_bonus->getBinded($pred->member_id(),$mobile);
-        if(empty($bind_bonus)) {
-            return false;
-        }
-
-        $manager = new bonus\manager();
-        $bonusex = array();
-        foreach($bind_bonus as $val)
-        {
-            $type_id = $val['type_id'];
-            $type  = bonus\type::create_by_id($type_id);
-            $bonus = bonus\user_bonus::create_by_param($val);
-
-            try
-            {
-                if($manager->topup($type,$mod_bonus,$val) == true) {
-                    array_push($bonusex,$val);
-                    ranklist_helper::add_money($pred->member_id(),$bonus->bonus_value());
-                    $pred->add_bonus($bonus,$type);
-                }
-            } catch (Exception $ex) {
-            }
-        }
-
-        if(empty($bonusex)) {
-            return false;
-        } else {
-            return $bonusex;
-        }
-    }
-
     static public function direct_asc() {
         return bonus\shaker::direct_asc;
     }
@@ -413,7 +370,7 @@ class bonus_helper
     }
     static private function create_holder($member_id,$used_type)
     {
-        if(isUseBonusRate()) {
+        if(usedBonusRate()) {
             return new bonus\witholder($member_id,$used_type);
         } else {
             return new bonus\norate_holder($member_id,$used_type);

+ 106 - 19
helper/buy_first.php

@@ -6,21 +6,26 @@
  * Time: 下午6:48
  */
 
+use bonus\account;
+
 require_once(BASE_ROOT_PATH . '/helper/activity_helper.php');
 require_once(BASE_ROOT_PATH . '/helper/goods_helper.php');
 require_once(BASE_ROOT_PATH . '/helper/pay_helper.php');
-require_once(BASE_ROOT_PATH . '/helper/predeposit_helper.php');
+require_once(BASE_ROOT_PATH . '/helper/bonus_helper.php');
 
 class buy_first
 {
     private $mLogicOut;
     private $mUserFcode;
+    private $mPriceCalculate;
 
-    public function __construct($logic_out)
+    public function __construct($logic_out,bonus\IPriceCalculate $priceCalculate)
     {
+        $this->mPriceCalculate = $priceCalculate;
         $this->mLogicOut = $logic_out;
         $this->mUserFcode = null;
     }
+
     //商品金额相关信息
     private function payinfo()
     {
@@ -59,29 +64,41 @@ class buy_first
         $result['freight_hash'] = $this->mLogicOut['freight_list'];
 
         //红包信息
-        $result['total_pred'] = doubleval($this->mLogicOut['available_predeposit']);
+        $result['total_pred']  = doubleval($this->mLogicOut['available_predeposit']);
+        $result['total_bonus'] = doubleval($this->mLogicOut['available_bonus']);
         $result['opgoods_discount'] = $this->optional_goods();
         $result['opgoods_desc'] = 'N元任选优惠';
-        $result['available_pred']  = $this->available_pred($goods_amount,$full_discount,$result['total_pred'],$rates,$discount_gap,$gap_show);
-        $result['discount_gap'] = $discount_gap;
-        $result['bonus_rates'] = $this->formate_rates($rates);
-        $result['gap_show'] = $gap_show;
 
-        global $config;
-        if($gap_show == true)
+        $calcer = $this->calc_goods();
+        $bonusable_goods_amount = $calcer['bonusable_goods_amount'];
+        $max_bonus_amount = $calcer['max_bonus_amount'];
+        $lowest_price_amount = $calcer['lowest_price_amount'];
+
+        $result['available_pred'] = $this->mPriceCalculate->bonus_amount($bonusable_goods_amount,$lowest_price_amount);
+        $result['available_bonus'] = $this->mPriceCalculate->bonus_amount($bonusable_goods_amount,$lowest_price_amount);
+        $order_cash = $this->mPriceCalculate->order_cash($bonusable_goods_amount,$lowest_price_amount);
+        $discount_gap = $this->mPriceCalculate->discount_gap($order_cash,$lowest_price_amount);
+        if($discount_gap == false) {
+            $result['gap_show'] = false;
+            $result['gap_desc'] = "";
+            $result['discount_gap'] = 0.00;
+        }
+        else
         {
+            global $config;
             if(intval($discount_gap * 100 + 0.5) == 0) {
                 $result['gap_desc'] = $config['bonus_gap']['no_gap'];
             } else {
                 $result['gap_desc'] = sprintf($config['bonus_gap']['have_gap'],$discount_gap);
             }
-        } else {
-            $result['gap_desc'] = "";
+            $result['discount_gap'] = $discount_gap;
         }
+        $result['bonus_rates'] = $this->formate_rates([ 30 => $result['available_bonus'] ]);
+
         $result['earn_bonus'] = $config['bonus_gap']['earn_bonus'];
 
         $result['usable_pred'] = true;
-        $result['pay_cash_pred'] = $result['goods_amount'] + $result['freight'] - $result['full_discount'] - $result['available_pred'] - $result['opgoods_discount'];
+        $result['pay_cash_pred']   = $result['goods_amount'] + $result['freight'] - $result['full_discount'] - $result['available_pred'] - $result['opgoods_discount'];
         $result['pay_cash_nopred'] = $result['goods_amount'] + $result['freight'] - $result['full_discount'] - $result['opgoods_discount'];
 
         //购物车显示应付现金
@@ -264,7 +281,7 @@ class buy_first
     {
         $goods_ids = $this->goods_ids();
 
-        $helper = new goods_helper();
+        $helper = new goods_helper($this->mPriceCalculate);
         $summaries = $helper->online_summary($goods_ids,$related_goods);
         $summary_list = $summaries['summary'];
         if(!empty($related_goods)) {
@@ -303,12 +320,79 @@ class buy_first
 
         return $goods_list;
     }
-
     private function invoice()
     {
         return $this->mLogicOut['inv_info'];
     }
 
+    //计算购物车中所有商品,最多能用多少红包
+    private function calc_goods()
+    {
+        $bonus_amount = 0.00;
+        $goods_amount = 0.00;
+        $lowest_amount = 0.00;
+
+        $store_cart_list = $this->mLogicOut['store_cart_list'];
+        foreach ($store_cart_list as $store_id => $cart_list)
+        {
+            $opgoods = $this->mLogicOut['optional_goods'][$store_id];
+            foreach ($cart_list as $cart)
+            {
+                $goods_price  = $cart['goods_price'];
+                $lowest_price = $cart['goods_lowest_price'];
+                $goods_num    = intval($cart['goods_num']);
+
+                $bonus_total  = $goods_num * ($goods_price - $lowest_price);
+                $goods_total  = $goods_num * $goods_price;
+                $lowest_total = $goods_num * $lowest_price;
+
+                if(intval($cart['bl_id']) > 0) {
+                }
+                elseif(!empty($cart['groupbuy_info'])) {
+
+                }
+                elseif(!empty($cart['xianshi_info'])) {
+
+                }
+                else
+                {
+                    if(empty($opgoods)) {
+                        $bonus_amount += $bonus_total;
+                        $goods_amount += $goods_total;
+                        $lowest_amount += $lowest_total;
+                    }
+                    else
+                    {
+                        $goods_id = intval($cart['goods_id']);
+                        if(array_key_exists($goods_id,$opgoods['goods_nums']))
+                        {
+                            $goods_price = $cart['goods_price'];
+                            $goods_num = intval($cart['goods_num']);
+                            $opnum = $opgoods['goods_nums'][$goods_id];
+
+                            if($goods_num > $opnum) {
+                                $bonus_amount  += ($goods_price - $lowest_price) * ($goods_num - $opnum);
+                                $goods_amount  += $goods_price  * ($goods_num - $opnum);
+                                $lowest_amount += $lowest_price * ($goods_num - $opnum);
+                            }
+                        }
+                        else {
+                            $bonus_amount += $bonus_total;
+                            $goods_amount += $goods_total;
+                            $lowest_amount += $lowest_total;
+                        }
+                    }
+                }
+            }
+        }
+
+        $bonus_amount  = intval($bonus_amount * 100 + 0.5) / 100;
+        $goods_amount  = intval($goods_amount * 100 + 0.5) / 100;
+        $lowest_amount = intval($lowest_amount * 100 + 0.5) / 100;
+
+        return ['bonusable_goods_amount' => $goods_amount, 'max_bonus_amount' => $bonus_amount,'lowest_price_amount' => $lowest_amount];
+    }
+
     private function available_pred($goods_amount,$full_discount,$pd_total,&$rates,&$discount_gap,&$gap_show)
     {
         $full = intval($full_discount * 100 + 0.5);
@@ -321,13 +405,13 @@ class buy_first
                 $pred_amound = $pred_amound - ($pred_amound / $goods_amount) * $full_discount;
             }
             $bonus_goods_amount = $pred_amound;
-            $pred_amound = $pred_amound - predeposit_helper::order_cash($pred_amound,$rates);
+            $pred_amound = $pred_amound - account::order_cash($pred_amound,$rates);
 
             $pred_cend = intval($pred_amound * 100 + 0.5);
             $pd_total  = intval($pd_total * 100 + 0.5);
 
             $ret = ($pred_cend > $pd_total) ? ($pd_total / 100) : ($pred_cend / 100);
-            $discount_gap = predeposit_helper::discount_gap($bonus_goods_amount - $ret,$bonus_goods_amount);
+            $discount_gap = $this->mPriceCalculate->discount_gap($bonus_goods_amount - $ret,$bonus_goods_amount);
 
             return $ret;
         }
@@ -341,6 +425,7 @@ class buy_first
         }
     }
 
+
     private function pred_goods_amount()
     {
         $pred_amount = 0.00;
@@ -365,7 +450,7 @@ class buy_first
                     }
                     else
                     {
-                        $goods_id    = intval($cart['goods_id']);
+                        $goods_id = intval($cart['goods_id']);
                         if(array_key_exists($goods_id,$opgoods['goods_nums']))
                         {
                             $goods_price = $cart['goods_price'];
@@ -471,9 +556,11 @@ class buy_first
 class buyv_first
 {
     private $mLogicOut;
+    private $mPriceCalculate;
 
-    public function __construct($logic_out)
+    public function __construct($logic_out,bonus\IPriceCalculate $priceCalculate)
     {
+        $this->mPriceCalculate = $priceCalculate;
         $this->mLogicOut = $logic_out;
     }
 
@@ -510,7 +597,7 @@ class buyv_first
         $goods_id = intval($goods_info['goods_id']);
         $goods_ids = [$goods_id];
 
-        $helper = new goods_helper();
+        $helper = new goods_helper($this->mPriceCalculate);
         $summaries = $helper->online_summary($goods_ids,$related_goods);
         $summary_list = $summaries['summary'];
         if(!empty($related_goods)) {

+ 9 - 0
helper/exceptionex.php

@@ -26,4 +26,13 @@ class UnloginException extends Exception
 
         parent::__construct($message, $code, null);
     }
+}
+
+class UnImplementsException extends Exception
+{
+    public function __construct($method)
+    {
+        $code = errcode::ErrUnImplements;
+        parent::__construct($method . ":功能未实现", $code, null);
+    }
 }

+ 11 - 13
helper/goods_helper.php

@@ -9,37 +9,37 @@ require_once (BASE_ROOT_PATH . '/helper/field_helper.php');
 require_once (BASE_ROOT_PATH . '/helper/model_helper.php');
 require_once (BASE_ROOT_PATH . '/helper/activity_helper.php');
 require_once (BASE_ROOT_PATH . '/helper/goods/commonid_helper.php');
-require_once (BASE_ROOT_PATH . '/helper/predeposit_helper.php');
+require_once (BASE_ROOT_PATH . '/helper/bonus_helper.php');
 require_once (BASE_ROOT_PATH . '/helper/brand_helper.php');
 require_once (BASE_ROOT_PATH . '/helper/user_session/favorite.php');
 require_once (BASE_ROOT_PATH . '/helper/user_session/anotice.php');
 
 class goods_helper
 {
-    const fieldstr = 'goods_id,goods_commonid,goods_state,store_id,brand_id,gc_id,goods_name,goods_price,goods_marketprice,goods_promotion_price,goods_jingle,
-                  goods_image,goods_salenum,evaluation_good_star,evaluation_count,goods_storage,goods_storage_alarm,is_virtual,is_presell,
-                  is_fcode,have_gift,goods_mobile_name,goods_spec,goods_collect,
-                  goods_addtime,goods_edittime';
+    const fieldstr = 'goods_id,goods_commonid,goods_state,store_id,brand_id,gc_id,goods_name,
+    goods_price,goods_lowest_price,goods_marketprice,goods_promotion_price,
+    goods_jingle,goods_image,goods_salenum,evaluation_good_star,evaluation_count,goods_storage,goods_storage_alarm,is_virtual,is_presell,
+    is_fcode,have_gift,goods_mobile_name,goods_spec,goods_collect,goods_addtime,goods_edittime';
 
     private $mUseMainPage;
-    public function __construct($main_page = true) {
+    private $mPriceCalcer;
+
+    public function __construct(bonus\IPriceCalculate $price_calcer,$main_page = true) {
+        $this->mPriceCalcer = $price_calcer;
         $this->mUseMainPage = $main_page;
     }
-
     public function get_distinct($goods_commonids)
     {
         $goods_list = Model('goods')->cls()->getGoodsListByColorDistinct(array('goods_commonid' => array('in', $goods_commonids)),self::fieldstr);
         $goods_list = $this->goods_list_extend($goods_list);
         return $goods_list;
     }
-
     public function get_infos($goods_ids)
     {
         $goods_list = Model('goods')->cls()->getGoodsOnlineList(array('goods_id' => array('in', $goods_ids)),self::fieldstr);
         $goods_list = $this->goods_list_extend($goods_list);
         return $goods_list;
     }
-
     //show_gid => 显示这个sku的详情
     public function get_spu($common_id,$show_gid,&$err)
     {
@@ -90,7 +90,6 @@ class goods_helper
 
         return $ret;
     }
-
     public function common_summary($common_ids, &$goods_ids, &$related_goods)
     {
         $mod = Model('goods');
@@ -103,7 +102,6 @@ class goods_helper
 
         return $this->summary($goods_list,$related_goods);
     }
-
     public function online_summary(&$goods_ids, &$related_goods)
     {
         $goods_list = Model('goods')->cls()->getGoodsOnlineList(array('goods_id' => array('in', $goods_ids)),self::fieldstr);
@@ -117,7 +115,6 @@ class goods_helper
 
         return $ret;
     }
-
     public function cart_summary($goods_ids,&$related_goods)
     {
         $goods_list = Model('goods')->cls()->getGoodsList(array('goods_id' => array('in', $goods_ids)),self::fieldstr);
@@ -134,7 +131,7 @@ class goods_helper
         $anotice  = new user_session\anotice();
         foreach ($goods_list as $goods)
         {
-            $summary = new goods_summary($goods);
+            $summary = new goods_summary($this->mPriceCalcer,$goods);
             $info = $summary->format($act_type,$act_id,$favorate,$anotice,$this->mUseMainPage);
             $goods_id = intval($goods['goods_id']);
             $sort_summarys[$goods_id] = $info;
@@ -231,6 +228,7 @@ class goods_helper
 
         return $ret;
     }
+
     private function bargains($summary_list)
     {
         if(!session_helper::logined()) return [];

+ 24 - 12
helper/model/goods_summary.php

@@ -6,6 +6,7 @@
  * Date: 16/8/19
  * Time: 上午10:13
  */
+
 require_once (BASE_ROOT_PATH . '/helper/user_session/fcode.php');
 
 class goods_summary
@@ -14,11 +15,15 @@ class goods_summary
     private $goods_commonid;
     private $goods_info;
     private $bundles;
+    private $mPriceCalcer;
     const new_goods_speriod = 10 * 3600 * 24;
 
-
-    public function __construct($param)
+    /**
+     * @throws
+     */
+    public function __construct(bonus\IPriceCalculate $price_calcer,$param)
     {
+        $this->mPriceCalcer = $price_calcer;
         if(is_array($param)) {
             $this->goods_info = $param;
             $this->goods_id = intval($this->goods_info['goods_id']);
@@ -100,6 +105,7 @@ class goods_summary
         $summary['goods_price'] = $this->goods_info['goods_price'];
         $summary['goods_marketprice'] = $this->goods_info['goods_marketprice'];
         $summary['goods_promotion_price'] = $this->goods_info['goods_promotion_price'];
+        $summary['goods_lowest_price'] = $this->goods_info['goods_lowest_price'];
 
         if($main_page)
         {
@@ -168,18 +174,24 @@ class goods_summary
         global $config;
         if($act_id == false)
         {
-            if($is_virtual) {
+            if($is_virtual)
+            {
                 $summary['bonus_price']  = $this->goods_info['goods_price'];
-            } else {
-                $summary['bonus_price']  = predeposit_helper::login_bonus_price($this->goods_info['goods_price'],$rates);
+                $summary['discount_gap'] = 0.00;
+                $summary['gap_show'] = false;
+                $summary['gap_desc'] = "";
             }
-            $gap = predeposit_helper::discount_gap($summary['bonus_price'],$this->goods_info['goods_price']);
-            $summary['discount_gap'] = $gap;
-            $summary['gap_show'] = true;
-            if(intval($gap * 100 + 0.5) == 0) {
-                $summary['gap_desc'] = $config['bonus_gap']['no_gap'];
-            } else {
-                $summary['gap_desc'] = sprintf($config['bonus_gap']['have_gap'],$gap);
+            else
+            {
+                $summary['bonus_price']  = $this->mPriceCalcer->bonus_price($this->goods_info['goods_price'],$this->goods_info['goods_lowest_price']);
+                $gap = $this->mPriceCalcer->discount_gap($summary['bonus_price'],$this->goods_info['goods_price']);
+                $summary['discount_gap'] = $gap;
+                $summary['gap_show'] = true;
+                if(intval($gap * 100 + 0.5) == 0) {
+                    $summary['gap_desc'] = $config['bonus_gap']['no_gap'];
+                } else {
+                    $summary['gap_desc'] = sprintf($config['bonus_gap']['have_gap'],$gap);
+                }
             }
         }
         else {

+ 5 - 3
helper/notify_helper.php

@@ -6,8 +6,10 @@
  * Date: 16/6/26
  * Time: 下午9:30
  */
+
+use bonus\account;
+
 require_once (BASE_ROOT_PATH . '/helper/account_helper.php');
-require_once (BASE_ROOT_PATH . '/helper/predeposit_helper.php');
 require_once (BASE_ROOT_PATH . '/helper/bonus_helper.php');
 require_once (BASE_ROOT_PATH . '/helper/push_helper.php');
 
@@ -70,7 +72,7 @@ class notify_helper
             $user_id = $bonus->user_id();
             $amount  = $bonus->remain_amount();
 
-            $pred = new predeposit_helper($user_id);
+            $pred = new account($user_id);
             $pred->bonus_expire($val);
             $ids[] = $bonus->bonus_id();
 
@@ -115,7 +117,7 @@ class notify_helper
                     $sresult = implode(',',$type);
                     Log::record("bonus refund 更新状态失败,result:{$sresult}.");
                 } else {
-                    predeposit_helper::bonus_refund($type);
+                    account::bonus_refund($type);
                     $condition = array('type_id' =>$type['type_id'],'bonus_status' => array('in','0,1'));
                     Model('user_bonus')->where($condition)->delete();
                 }

File diff suppressed because it is too large
+ 0 - 1118
helper/predeposit_helper.php


+ 2 - 2
helper/room/factory.php

@@ -13,6 +13,7 @@ use member_info;
 use Log;
 use goods_helper;
 use QueueClient;
+use bonus;
 
 class factory
 {
@@ -61,7 +62,6 @@ class factory
         }
     }
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
     private function create_bargain($params)
     {
         $creator = intval($params['creator']);
@@ -83,7 +83,7 @@ class factory
         $room_id = $this->create_room(proto_type::room_bargain,"bargain",$minfo);
         if($room_id === false) return false;
 
-        $helper = new goods_helper();
+        $helper = new goods_helper(new bonus\account($creator,false));
         $summarys = $helper->summary([$good_id],$related_goods);
         if(empty($summarys) || empty($summarys['summary'])) return false;
 

+ 1 - 1
helper/room/room_info.php

@@ -117,7 +117,7 @@ class room_info
         $ret['users']  = $this->user_count();
         $ret['level']  = $this->level();
 
-        $ret['shared_bonus']    = $this->shared_bonus();
+        $ret['shared_bonus'] = $this->shared_bonus();
         $ret['notice']    = $this->notice();
 
         return $ret;

+ 21 - 0
helper/room_helper.php

@@ -127,4 +127,25 @@ class room_helper
 
         return $result;
     }
+
+    public static function user_rooms($user)
+    {
+        $mod_room = Model('room');
+        $items = $mod_room->getRoomParts(['member_id' => $user,'state' => 0],'room_id');
+
+        $roomids = [];
+        foreach ($items as $item) {
+            $roomids[] = intval($item['room_id']);
+        }
+
+        $result = [];
+        if(empty($roomids)) return $result;
+
+        $items = $mod_room->getRooms(['room_id' => ['in',$roomids]]);
+        foreach ($items as $item) {
+            $room = new room\room_info($item);
+            $result[] = $room->format();
+        }
+        return $result;
+    }
 }

+ 5 - 2
helper/shaker_helper.php

@@ -6,8 +6,11 @@
  * Date: 16/6/28
  * Time: 上午11:33
  */
+
+use bonus\account;
+
 require_once (BASE_ROOT_PATH . '/helper/account_helper.php');
-require_once (BASE_ROOT_PATH . '/helper/predeposit_helper.php');
+require_once (BASE_ROOT_PATH . '/helper/bonus_helper.php');
 
 class friend
 {
@@ -171,7 +174,7 @@ class shaker_helper
 
     private function lost(&$err)
     {
-        $pred = new predeposit_helper($_SESSION['member_id']);
+        $pred = new account($_SESSION['member_id']);
         $total_amount = $pred->total_bonus();
 
         if(intval($total_amount * 100 + 0.5) <= 0) {

+ 2 - 2
helper/ugc/setting.php

@@ -12,7 +12,7 @@ namespace ugc;
 use bonus\type;
 use session_helper;
 use bonus_helper;
-use predeposit_helper;
+use bonus\account;
 
 class bonus_builder
 {
@@ -57,7 +57,7 @@ class bonus_builder
     {
         $param = $this->fill_param();
         $type = bonus_helper::create_type_input($param);
-        $pred = new predeposit_helper($_SESSION['member_id']);
+        $pred = new account($_SESSION['member_id']);
 
         if(!$pred->share_enough($type->getTotal_amount(),$this->rate)) {
             return false;

+ 0 - 1
helper/ugc_helper.php

@@ -17,7 +17,6 @@ require_once(BASE_ROOT_PATH . '/helper/ugc/setting.php');
 require_once(BASE_ROOT_PATH . '/helper/ugc/category.php');
 require_once(BASE_ROOT_PATH . '/helper/search/tcp_client.php');
 require_once(BASE_ROOT_PATH . '/helper/bonus_helper.php');
-require_once(BASE_ROOT_PATH . '/helper/predeposit_helper.php');
 require_once(BASE_ROOT_PATH . '/helper/relation_helper.php');
 require_once(BASE_ROOT_PATH . '/helper/tools/fast_image.php');
 

+ 16 - 15
mobile/control/activity.php

@@ -21,7 +21,7 @@ class act_formater
         $this->mGoodsActContainer = [];
     }
 
-    public function format_acting()
+    public function format_acting(bonus\IPriceCalculate $price_calc)
     {
         $specials = [];
         $goods_ids = [];
@@ -76,7 +76,7 @@ class act_formater
         $goods_ids = array_unique($goods_ids);
         if(!empty($goods_ids))
         {
-            $helper = new goods_helper();
+            $helper = new goods_helper($price_calc);
             $ret = $helper->online_summary($goods_ids,$related);
 
             return array('special_list' => $specials,
@@ -96,7 +96,7 @@ class act_formater
         }
     }
 
-    public function format_unstart()
+    public function format_unstart(bonus\IPriceCalculate $price_calc)
     {
         $specials = [];
         $goods_ids = [];
@@ -155,7 +155,7 @@ class act_formater
         $goods_ids = array_unique($goods_ids);
         if(!empty($goods_ids))
         {
-            $helper = new goods_helper();
+            $helper = new goods_helper($price_calc);
             $ret = $helper->online_summary($goods_ids,$related);
 
             $summarys = $ret['summary'];
@@ -307,13 +307,13 @@ class limit_outer
         $this->mType = $type;
     }
 
-    public function format()
+    public function format(bonus\IPriceCalculate $price_calc)
     {
         if(array_key_exists('xianshi_id',$this->mAct)) {
-            $result = $this->format_limit();
+            $result = $this->format_limit($price_calc);
         }
         elseif(array_key_exists('groupbuy_id',$this->mAct)) {
-            $result = $this->format_group();
+            $result = $this->format_group($price_calc);
         }
         else {
             $result = false;
@@ -321,7 +321,7 @@ class limit_outer
 
         return $result;
     }
-    private function format_limit()
+    private function format_limit(bonus\IPriceCalculate $price_calc)
     {
         $result = [];
 
@@ -332,7 +332,7 @@ class limit_outer
         if(empty($gids)) return false;
 
         $goods_ids = array($gids[0]);
-        $helper = new goods_helper();
+        $helper = new goods_helper($price_calc);
         $ret = $helper->online_summary($goods_ids,$related);
 
         if(!empty($ret['summary']))
@@ -357,7 +357,7 @@ class limit_outer
         }
 
     }
-    private function format_group()
+    private function format_group(bonus\IPriceCalculate $price_calc)
     {
         $result = [];
 
@@ -367,7 +367,7 @@ class limit_outer
         if(empty($gids)) return false;
 
         $goods_ids = array($gids[0]);
-        $helper = new goods_helper();
+        $helper = new goods_helper($price_calc);
         $ret = $helper->online_summary($goods_ids,$related);
 
         if(!empty($ret['summary']))
@@ -405,7 +405,7 @@ class activityControl extends mobileControl
         $actings = activity_helper::acting();
 
         $formater = new act_formater($actings);
-        $result = $formater->format_acting();
+        $result = $formater->format_acting($this->price_calcer());
 
         return self::outsuccess($result);
     }
@@ -413,7 +413,7 @@ class activityControl extends mobileControl
     {
         $actings = activity_helper::unstart();
         $formater = new act_formater($actings);
-        $result = $formater->format_unstart();
+        $result = $formater->format_unstart($this->price_calcer());
 
         return self::outsuccess($result);
     }
@@ -423,10 +423,11 @@ class activityControl extends mobileControl
         $_SESSION['client_type'] = "wap";
 
         $acts = activity_helper::acting();
+        $price_calcer = $this->price_calcer();
         if(!empty($acts)) {
             $act = $acts[0];
             $outer = new limit_outer(limit_outer::WAIT_END,$act);
-            $result = $outer->format();
+            $result = $outer->format($price_calcer);
             if($result != false) {
                 return self::outsuccess($result,"activity/limit_entra");
             }
@@ -436,7 +437,7 @@ class activityControl extends mobileControl
         if(!empty($unstarts)) {
             $act = $unstarts[0];
             $outer = new limit_outer(limit_outer::WAIT_START,$act);
-            $result = $outer->format();
+            $result = $outer->format($price_calcer);
             if($result != false) {
                 return self::outsuccess($result,"activity/limit_entra");
             }

+ 5 - 3
mobile/control/admin_oper.php

@@ -1,9 +1,11 @@
 <?php
 
+use bonus\account;
+
 defined('InShopNC') or exit('Access Invalid!');
 
 require_once(BASE_ROOT_PATH . "/helper/kdn_helper.php");
-require_once(BASE_ROOT_PATH . "/helper/predeposit_helper.php");
+require_once(BASE_ROOT_PATH . "/helper/bonus_helper.php");
 require_once(BASE_ROOT_PATH . "/helper/pay_helper.php");
 require_once(BASE_ROOT_PATH . "/helper/bonus/witholder.php");
 require_once(BASE_ROOT_PATH . '/helper/relation_helper.php');
@@ -103,7 +105,7 @@ class admin_operControl extends mbMemberControl
         $param = array_merge($param,$_GET);
         $this->add_system($param);
 
-        $ret = predeposit_helper::admin_make_bonus($param,$rate_moneys);
+        $ret = account::admin_make_bonus($param,$rate_moneys);
         if($ret === false) {
             return self::outerr(errcode::ErrBonus,"生成红包失败.");
         } else {
@@ -128,7 +130,7 @@ class admin_operControl extends mbMemberControl
 
         $param = $_GET;
         $this->add_system($param);
-        $ret = predeposit_helper::admin_make_bonus($param,$rate_moneys);
+        $ret = account::admin_make_bonus($param,$rate_moneys);
 
         if($ret === false) {
             return self::outerr(errcode::ErrBonus,"生成红包失败.");

+ 1 - 1
mobile/control/app_pay.php

@@ -13,7 +13,7 @@ require_once(WXPAY_PATH . '/lib/OpenWxPay.Config.php');
 require_once(WXPAY_PATH . '/lib/OpenWxPay.Data.php');
 require_once(WXPAY_PATH . '/lib/OpenWxPay.Exception.php');
 require_once(WXPAY_PATH . '/lib/OpenWxPay.Notify.php');
-require_once(BASE_ROOT_PATH . '/helper/predeposit_helper.php');
+require_once(BASE_ROOT_PATH . '/helper/bonus_helper.php');
 
 
 class app_payControl extends mbMemberControl

+ 8 - 6
mobile/control/bargain.php

@@ -91,7 +91,7 @@ class bargainControl extends mobileControl
         }
         else
         {
-            $tpl = new tpl_bargain($bargain_id);
+            $tpl = new tpl_bargain($bargain_id,$this->price_calcer());
             $ret = room\factory_client::instance()->invite($tpl->room(),session_helper::memberid());
             if($ret != false) {
                 $ret['addr'] = $this->mAccAddr;
@@ -111,12 +111,12 @@ class bargainControl extends mobileControl
             return self::outerr(errcode::ErrParamter);
         }
         else {
-            $tpl = new tpl_bargain($bargain_id);
+            $tpl = new tpl_bargain($bargain_id,$this->price_calcer());
             $ret = room\factory_client::instance()->invite($tpl->room(),session_helper::memberid());
             if($ret != false) {
                 $ret['addr'] = $this->mAccAddr;
             }
-            return self::outsuccess(['tpl' => new tpl_bargain($bargain_id),'room' => $ret],'bargain/bargain');
+            return self::outsuccess(['tpl' => new tpl_bargain($bargain_id,$this->price_calcer()),'room' => $ret],'bargain/bargain');
         }
     }
 
@@ -158,7 +158,7 @@ class bargainControl extends mobileControl
         }
         else
         {
-            $helper = new goods_helper();
+            $helper = new goods_helper($this->price_calcer());
             $ret = $helper->online_summary($gids,$related_goods);
             $block = special_formater::format_bargain($bargains,'我的砍价');
             $blocks[] = $block;
@@ -216,14 +216,16 @@ class tpl_bargain
 {
     private $mBargain;
     private $mSummary;
+    private $mPriceCalculate;
 
-    public function __construct($bargain_id)
+    public function __construct($bargain_id,bonus\IPriceCalculate $priceCalculate)
     {
+        $this->mPriceCalculate = $priceCalculate;
         $mod_bargain = Model('room_bargain');
         $info = $mod_bargain->getBargainById($bargain_id);
         $this->mBargain = new room\bargain($info);
         $goods_id = $this->mBargain->goods_id();
-        $helper = new goods_helper();
+        $helper = new goods_helper($this->mPriceCalculate);
         $ret = $helper->summary([$goods_id],$related_goods);
         $this->mSummary = $ret['summary'][0];
     }

+ 19 - 11
mobile/control/bonusex.php

@@ -10,7 +10,6 @@
 defined('InShopNC') or exit('Access Invalid!');
 
 require_once(BASE_ROOT_PATH . '/helper/bonus_helper.php');
-require_once(BASE_ROOT_PATH . '/helper/predeposit_helper.php');
 require_once(BASE_ROOT_PATH . '/helper/session_helper.php');
 require_once(BASE_ROOT_PATH . '/helper/sms_helper.php');
 require_once(BASE_ROOT_PATH . '/helper/model_helper.php');
@@ -108,7 +107,8 @@ class bonusexControl extends mobileControl
                 'mine_bonus' => $mine_bonus,
                 'binded_info' => $binded_info,
                 'avatars' => $avatars,
-                'summarys' => $summarys);
+                'summarys' => $summarys,
+                'pricecalc_obj' => $this->price_calcer());
             if($bonus->isBinded() || $isMineType) {
                 return self::outsuccess($data,"bonus/detail");
             }
@@ -145,7 +145,8 @@ class bonusexControl extends mobileControl
                     return self::outsuccess(array('type_info' => $type_info,
                         'binded_info' => $binded_info,
                         'avatars' => $avatars,
-                        'summarys' => $summarys),
+                        'summarys' => $summarys,
+                        'pricecalc_obj' => $this->price_calcer()),
                         'bonus/detail');
                 }
                 else {
@@ -183,7 +184,8 @@ class bonusexControl extends mobileControl
             'mine_bonus' => $mine_bonus,
             'binded_info' => $binded_info,
             'avatars' => $avatars,
-            'summarys' => $summarys),
+            'summarys' => $summarys,
+            'pricecalc_obj' => $this->price_calcer()),
             'bonus/detail');
     }
 
@@ -218,7 +220,8 @@ class bonusexControl extends mobileControl
                     'mine_bonus' => $mine_bonus,
                     'binded_info' => $binded_info,
                     'avatars' => $avatars,
-                    'summarys' => $summarys),
+                    'summarys' => $summarys,
+                    'pricecalc_obj' => $this->price_calcer()),
                     "bonus/detail");
             }
             elseif($type->isEnd()) {
@@ -240,7 +243,8 @@ class bonusexControl extends mobileControl
                             'mine_bonus' => $mine_bonus,
                             'binded_info' => $binded_info,
                             'avatars' => $avatars,
-                            'summarys' => $summarys),
+                            'summarys' => $summarys,
+                            'pricecalc_obj' => $this->price_calcer()),
                             "bonus/detail");
                     } else {
                         return self::outsuccess(array('type_info' => $type_info,
@@ -288,7 +292,8 @@ class bonusexControl extends mobileControl
                             'mine_bonus' => $mine_bonus,
                             'binded_info' => $binded_info,
                             'avatars' => $avatars,
-                            'summarys' => $summarys);
+                            'summarys' => $summarys,
+                            'pricecalc_obj' => $this->price_calcer());
                         return self::outsuccess($data,"bonus/detail");
                     } else {
                         $data = array('type_info' => $type_info, 'mine_bonus' => $mine_bonus,'binded_info' => $binded_info,'avatars' => $avatars);
@@ -321,7 +326,8 @@ class bonusexControl extends mobileControl
                 'mine_bonus' => $mine_bonus,
                 'binded_info' => $binded_info,
                 'avatars' => $avatars,
-                'summarys' => $summarys),
+                'summarys' => $summarys,
+                'pricecalc_obj' => $this->price_calcer()),
                 "bonus/detail");
         }
 
@@ -442,7 +448,8 @@ class bonusexControl extends mobileControl
                         'mine_bonus' => $bonus,
                         'binded_info' => $binded_info,
                         'avatars' => $avatars,
-                        'summarys' => $summarys),
+                        'summarys' => $summarys,
+                        'pricecalc_obj' => $this->price_calcer()),
                         "bonus/detail");
                 } else {
                     return self::outsuccess(errcode::ErrBonus,"只有拼收起红包才可以摇哦~");
@@ -528,7 +535,7 @@ class bonusexControl extends mobileControl
                 }
             }
 
-            $helper = new goods_helper();
+            $helper = new goods_helper($this->price_calcer());
             $ret = $helper->summary($goods_list,$related_goods);
 
             return $ret['summary'];
@@ -536,6 +543,7 @@ class bonusexControl extends mobileControl
     }
 }
 
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 function bonus_output_unstart($output)
 {
     $type_info = $output['type_info'];
@@ -690,7 +698,7 @@ function bonus_output_present($output)
     $items = $model_goods->getGoodsListByColorDistinct(array('goods_commonid' => $common_id),goods_helper::fieldstr,'','');
     if(empty($items)) return;
 
-    $helper = new goods_helper();
+    $helper = new goods_helper($output['pricecalc_obj']);
     $ret = $helper->summary($items,$related_goods);
     $summary = $ret['summary'][0];
 

+ 7 - 5
mobile/control/cart.php

@@ -3,12 +3,14 @@
  * 购物车
  */
 
+use bonus\account;
+
 defined('InShopNC') or exit('Access Invalid!');
 
 require_once(BASE_ROOT_PATH . '/helper/goods_helper.php');
 require_once(BASE_ROOT_PATH . '/helper/activity_helper.php');
 require_once(BASE_ROOT_PATH . '/helper/algorithm.php');
-require_once(BASE_ROOT_PATH . '/helper/predeposit_helper.php');
+require_once(BASE_ROOT_PATH . '/helper/bonus_helper.php');
 require_once (BASE_ROOT_PATH . '/helper/user_session/fcode.php');
 require_once (BASE_ROOT_PATH . '/helper/special_helper.php');
 
@@ -69,7 +71,7 @@ class cartControl extends mobileControl
     {
         if($_SESSION['is_login'] == 1)
         {
-            $pred = new predeposit_helper($_SESSION['member_id'],true);
+            $pred = new account($_SESSION['member_id'],true);
             $bonus_rate = $pred->pay_bonus_rates();
 
             if($bonus_rate != null)
@@ -142,7 +144,7 @@ class cartControl extends mobileControl
             $cart_infos[] = $cart_item;
         }
 
-        $helper = new goods_helper(false);
+        $helper = new goods_helper($this->price_calcer(),false);
         $summaries = $helper->cart_summary($goods_ids,$related_goods);
         $summary_list = $summaries['summary'];
         if(!empty($related_goods)) {
@@ -236,7 +238,7 @@ class cartControl extends mobileControl
                 $blocks = $this->format($fcodes);
             }
 
-            $helper = new goods_helper(false);
+            $helper = new goods_helper($this->price_calcer(),false);
             $ret = $helper->cart_summary($gids,$related_goods);
 
             return self::outsuccess(array('special_list' => $blocks,
@@ -364,7 +366,7 @@ class cartControl extends mobileControl
             }
             else
             {
-                $helper = new goods_helper(false);
+                $helper = new goods_helper($this->price_calcer(),false);
                 $summaries = $helper->cart_summary($gids,$related_goods);
                 $summary_list = $summaries['summary'];
                 if(!empty($related_goods)) {

+ 14 - 0
mobile/control/control.php

@@ -10,6 +10,8 @@
 defined('InShopNC') or exit('Access Invalid!');
 
 require_once (BASE_ROOT_PATH . "/helper/statistics_helper.php");
+require_once (BASE_ROOT_PATH . "/helper/session_helper.php");
+require_once (BASE_ROOT_PATH . "/helper/bonus_helper.php");
 
 /********************************** 前台control父类 **********************************************/
 class mobileControl
@@ -67,6 +69,15 @@ class mobileControl
         pagecmd('setnowpage', $cur_page);
     }
 
+    protected function price_calcer()
+    {
+        if(session_helper::logined()) {
+            return new bonus\account(session_helper::memberid(),true);
+        } else {
+            return new bonus\normal_calc();
+        }
+    }
+
     public function __destruct()
     {
     }
@@ -91,6 +102,9 @@ class mobileControl
         return intval($count / $this->page_size()) + ($count % $this->page_size() == 0 ? 0 : 1);
     }
 
+    /**
+     * @throws UnloginException
+     */
     protected function need_login()
     {
         if ($_SESSION['is_login'] != 1) {

+ 2 - 1
mobile/control/festval.php

@@ -9,6 +9,7 @@ defined( 'InShopNC' ) or exit( 'Access Invalid!' );
 
 require_once(BASE_ROOT_PATH . '/helper/session_helper.php');
 
+use bonus\account;
 use user_session\storage;
 
 class festvalControl extends mobileControl
@@ -162,7 +163,7 @@ class festvalControl extends mobileControl
     private function topup()
     {
         if(session_helper::logined()) {
-            $pred = new predeposit_helper($_SESSION['member_id'],true);
+            $pred = new account($_SESSION['member_id'],true);
             $pred->topup_bonus($_SESSION['member_mobile']);
         }
     }

+ 1 - 1
mobile/control/goods_common.php

@@ -37,7 +37,7 @@ class goods_commonControl extends mobileControl
                 Model('goods_browse')->addViewedGoods($goods_id,$_SESSION['member_id'],$_SESSION['store_id']);
             }
 
-            $helper = new goods_helper(false);
+            $helper = new goods_helper($this->price_calcer(),false);
             $ret = $helper->get_spu($common_id,$goods_id,$err);
             if($ret == false) {
                 return self::outerr($err['code'],$err['msg']);

+ 3 - 1
mobile/control/index.php

@@ -6,6 +6,8 @@
  *
  */
 
+use bonus\account;
+
 defined('InShopNC') or exit('Access Invalid!');
 
 require_once(BASE_ROOT_PATH . '/helper/goods_helper.php');
@@ -173,7 +175,7 @@ class tpl_member
         $this->mInfo = $this->mOutput['info'];
         $this->mIsFriend = $this->mOutput['is_friend'];
         $userid = $this->mInfo->member_id();
-        $this->mPred = new predeposit_helper($userid);
+        $this->mPred = new account($userid);
     }
 
     public function output_group()

+ 24 - 21
mobile/control/member_bonus.php

@@ -6,6 +6,8 @@
  * Time: 下午6:08
  */
 
+use bonus\account;
+
 require_once(BASE_ROOT_PATH . '/helper/bonus_helper.php');
 require_once(BASE_ROOT_PATH . '/helper/session_helper.php');
 require_once(BASE_ROOT_PATH . '/helper/text_filter.php');
@@ -27,19 +29,19 @@ class member_bonusControl extends mbMemberControl
 {
     const sampler_goods = 30;
     const msg_malice_bonus = '为避免恶意欺诈,只有下单后的用户才能发送红包给好友.';
-    private $mPred;
+    private $mUserAccount;
 
     public function __construct() {
         parent::__construct();
-        $this->mPred = new predeposit_helper($_SESSION['member_id'],true);
+        $this->mUserAccount = $this->price_calcer();
     }
 
     public function predepositexOp()
     {
         $result = [];
-        $result['bonus_total']  = $this->mPred->total_bonus();
+        $result['bonus_total']  = $this->mUserAccount->total_bonus();
 
-        $bonus_state = $this->mPred->bonus_state();
+        $bonus_state = $this->mUserAccount->bonus_state();
         $expiring = $bonus_state['expiring'];
         $expiring = intval($expiring * 100 + 0.5);
         if($expiring > 0) {
@@ -48,8 +50,9 @@ class member_bonusControl extends mbMemberControl
         }
 
         $result = array_merge($result,$bonus_state);
-        $result['bonus_rate'] = $this->format_rates($this->mPred->pay_bonus_rates());
-        $result['share_bonus_rate'] = $this->format_rates($this->mPred->share_bonus_rates());
+        $result['bonus_rate'] = $this->format_rates($this->mUserAccount->pay_bonus_rates());
+        $result['share_bonus_rate'] = $this->format_rates($this->mUserAccount->share_bonus_rates());
+        $result['room_bonus'] = $this->mUserAccount->room_bonus();
 
         $result['send_bless'] = $this->cur_bless();
         $result['avatar'] = session_helper::avatar();
@@ -131,14 +134,14 @@ class member_bonusControl extends mbMemberControl
     public function predepositOp()
     {
         $result = [];
-        $result['predeposit_total']  = $this->mPred->total_bonus();
+        $result['predeposit_total']  = $this->mUserAccount->total_bonus();
         $result['predeposit_freeze'] = 0;
 
-        $bonus_state = $this->mPred->bonus_state();
+        $bonus_state = $this->mUserAccount->bonus_state();
         $result = array_merge($result,$bonus_state);
 
-        $result['bonus_rate'] = $this->format_rates($this->mPred->pay_bonus_rates());
-        $result['share_bonus_rate'] = $this->format_rates($this->mPred->share_bonus_rates());
+        $result['bonus_rate'] = $this->format_rates($this->mUserAccount->pay_bonus_rates());
+        $result['share_bonus_rate'] = $this->format_rates($this->mUserAccount->share_bonus_rates());
 
         $result['avatar'] = session_helper::avatar();
         $result['sub_titles'] = ['shake' => '偷点地主家的余粮','invite' => '赚百分百红包','friends' => ''];
@@ -169,7 +172,7 @@ class member_bonusControl extends mbMemberControl
             return self::outerr(errcode::ErrBonus,self::msg_malice_bonus);
         }
 
-        if(isUseBonusRate())
+        if(usedBonusRate())
         {
             if (intval($_GET['bonus_rate']) > 0) {
                 $bonus_rate = intval($_GET['bonus_rate']);
@@ -184,7 +187,7 @@ class member_bonusControl extends mbMemberControl
         $param = $this->fill_param($_GET,$bonus_rate);
         $type = bonus_helper::create_type_input($param);
 
-        if(!$this->mPred->share_enough($type->getTotal_amount(),$bonus_rate)) {
+        if(!$this->mUserAccount->share_enough($type->getTotal_amount(),$bonus_rate)) {
             return self::outerr(errcode::ErrBonusNotEnough,'余额不够发送红包');
         }
 
@@ -199,7 +202,7 @@ class member_bonusControl extends mbMemberControl
         $item['rate'] = $bonus_rate;
         $rate_moneys[] = $item;
 
-        $ret = $this->mPred->make_bonus($type->get_param(),$rate_moneys);
+        $ret = $this->mUserAccount->make_bonus($type->get_param(),$rate_moneys);
         if($ret === false) {
             return self::outerr(errcode::ErrBonus,"生成红包失败.");
         }
@@ -315,7 +318,7 @@ class member_bonusControl extends mbMemberControl
                 $goods_ids[] = $goods_id;
             }
 
-            $helper = new goods_helper();
+            $helper = new goods_helper($this->mUserAccount);
             $ret = $helper->summary($goods_list,$related_goods);
             $block = special_formater::format_goods($goods_ids,"",$ret['sort_summary']);
 
@@ -337,7 +340,7 @@ class member_bonusControl extends mbMemberControl
 
     public function match_goodsOp()
     {
-        $bonus_rate = $this->mPred->pay_bonus_rates();
+        $bonus_rate = $this->mUserAccount->pay_bonus_rates();
         $rate_moneys = $bonus_rate->format();
         $price = bonus_helper::match_price($rate_moneys);
 
@@ -399,7 +402,7 @@ class member_bonusControl extends mbMemberControl
                     $goods_ids[] = $goods_id;
                 }
 
-                $helper = new goods_helper();
+                $helper = new goods_helper($this->mUserAccount);
                 $ret = $helper->summary($goods_list,$related_goods);
 
                 $blocks = [];
@@ -464,7 +467,7 @@ class member_bonusControl extends mbMemberControl
         $item['rate'] = $bonus->bonus_rate();
         $rate_moneys[] = $item;
 
-        $ret = $this->mPred->makeby_bonus($type->get_param(),$rate_moneys,$bonus->bonus_sn());
+        $ret = $this->mUserAccount->makeby_bonus($type->get_param(),$rate_moneys,$bonus->bonus_sn());
         if($ret === false) {
             return self::outerr(errcode::ErrBonus,"生成红包失败.");
         }
@@ -655,7 +658,7 @@ class member_bonusControl extends mbMemberControl
 
     public function topupOp()
     {
-        $items = $this->mPred->topup_bonus($_SESSION['member_mobile']);
+        $items = $this->mUserAccount->topup_bonus($_SESSION['member_mobile']);
         $this->async_topup();
         if($items === false) {
             return self::outsuccess(array("count" => 0,'total_amount' => 0.00));
@@ -743,7 +746,7 @@ class member_bonusControl extends mbMemberControl
 
     public function topupexOp()
     {
-        $items = $this->mPred->topup_bonus($_SESSION['member_mobile']);
+        $items = $this->mUserAccount->topup_bonus($_SESSION['member_mobile']);
         $this->async_topup();
 
         if($items === false) {
@@ -1009,7 +1012,7 @@ class member_bonusControl extends mbMemberControl
         if(empty($items)) {
             return self::outsuccess(array('pd_logs' => array(),'mobile_page' => mobile_page(0)));
         }
-        $pd_logs = $this->mPred->filter_pd_log($items);
+        $pd_logs = $this->mUserAccount->filter_pd_log($items);
 
         $pages = $this->pages($count);
 
@@ -1159,7 +1162,7 @@ class member_bonusControl extends mbMemberControl
             return self::outerr(errcode::ErrParamter,"需要红包序列号.");
         }
         $bonus_sn = $_GET['bonus_sn'];
-        $ret = $this->mPred->share_bonus($bonus_sn,$msg);
+        $ret = $this->mUserAccount->share_bonus($bonus_sn,$msg);
         if($ret === false) {
             return self::outerr(errcode::ErrBonus,empty($msg) ? "生成红包失败." : $msg);
         } else {

+ 7 - 6
mobile/control/member_buy.php

@@ -12,7 +12,7 @@
 
 defined('InShopNC') or exit('Access Invalid!');
 
-require_once (BASE_ROOT_PATH . '/helper/predeposit_helper.php');
+require_once (BASE_ROOT_PATH . '/helper/bonus_helper.php');
 require_once (BASE_ROOT_PATH . '/helper/buy_first.php');
 require_once (BASE_ROOT_PATH . '/helper/pay_helper.php');
 require_once (BASE_ROOT_PATH . '/helper/fcode/operator.php');
@@ -47,7 +47,7 @@ class member_buyControl extends mbMemberControl
             $result = $result['data'];
         }
 
-        $buy_helper = new buy_first($result);
+        $buy_helper = new buy_first($result,$this->price_calcer());
         if($buy_helper->check_fcode($error) == false) {
             return self::outerr(errcode::ErrPayment,$error);
         }
@@ -87,9 +87,9 @@ class member_buyControl extends mbMemberControl
         }
 
         if($fVirual) {
-            $buy_helper = new buyv_first($result);
+            $buy_helper = new buyv_first($result,$this->price_calcer());
         } else {
-            $buy_helper = new buy_first($result);
+            $buy_helper = new buy_first($result,$this->price_calcer());
         }
 
         if($buy_helper->check_fcode($error) == false) {
@@ -139,7 +139,7 @@ class member_buyControl extends mbMemberControl
             return self::outerr(errcode::ErrParamter);
         }
 
-        $param = array();
+        $param = [];
         $param['ifcart'] = $_POST['ifcart'];
         $param['cart_id'] = $this->pay_goods($cart_ids);
         $param['address_id'] = $_POST['address_id'];
@@ -158,6 +158,7 @@ class member_buyControl extends mbMemberControl
         $param['fcode'] = "";
         $param['order_from'] = 2; //从手机来
         $param['pay_name'] = "online";
+
         $usebonus = $_POST['usebonus'];
 
         $logic_buy = logic('buy');
@@ -286,7 +287,7 @@ class member_buyControl extends mbMemberControl
                         $blocks[] = $fblock;
                     }
 
-                    $helper = new goods_helper(false);
+                    $helper = new goods_helper($this->price_calcer(),false);
                     $ret = $helper->cart_summary($gids,$related_goods);
 
                     return self::outsuccess(array('special_list' => $blocks,

+ 1 - 1
mobile/control/member_favorites.php

@@ -55,7 +55,7 @@ class member_favoritesControl extends mbMemberControl
                 'mobile_page' => mobile_page($page_count)));
         }
 
-        $helper = new goods_helper();
+        $helper = new goods_helper($this->price_calcer());
         $ret = $helper->online_summary($gids,$related_goods);
         $block = special_formater::format_goods($gids,'我的商品',$ret['sort_summary']);
         $blocks[] = $block;

+ 1 - 1
mobile/control/member_fcode.php

@@ -72,7 +72,7 @@ class member_fcodeControl extends mbMemberControl
                 $blocks = $this->format($fcodes);
             }
 
-            $helper = new goods_helper(false);
+            $helper = new goods_helper($this->price_calcer(),false);
             $ret = $helper->cart_summary($gids,$related_goods);
 
             return self::outsuccess(array('special_list' => $blocks,

+ 1 - 1
mobile/control/member_notice.php

@@ -35,7 +35,7 @@ class member_noticeControl extends mbMemberControl
             $goods_list = $model_goods->getGoodsListByColorDistinct(array('goods_id' => array('in',$gids)),goods_helper::fieldstr);
             $page_count = $mod_anotice->gettotalpage();
 
-            $helper = new goods_helper();
+            $helper = new goods_helper($this->price_calcer());
             $ret = $helper->summary($goods_list,$related_goods);
 
             $block = special_formater::format_goods($gids,"",$ret['sort_summary']);

+ 3 - 1
mobile/control/member_ugc.php

@@ -7,6 +7,8 @@
  * Time: 下午4:02
  */
 
+use bonus\account;
+
 require_once(BASE_ROOT_PATH . '/mobile/control/special.php');
 require_once(BASE_ROOT_PATH . '/helper/ugc_helper.php');
 require_once(BASE_ROOT_PATH . '/helper/search/tcp_client.php');
@@ -519,7 +521,7 @@ class member_ugcControl extends specialControl
     public function mine_bonusOp()
     {
         $this->need_login();
-        $pred = new predeposit_helper($_SESSION['member_id'],true);
+        $pred = new account($_SESSION['member_id'],true);
         $bonus_rate = $pred->pay_bonus_rates();
 
         if($bonus_rate != null)

+ 4 - 2
mobile/control/mshop.php

@@ -6,6 +6,8 @@
  * Time: 下午3:51
  */
 
+use bonus\account;
+
 defined('InShopNC') or exit('Access Invalid!');
 
 require_once(BASE_ROOT_PATH . '/helper/goods_helper.php');
@@ -17,7 +19,7 @@ require_once(BASE_ROOT_PATH . '/mobile/control/special.php');
 require_once(BASE_ROOT_PATH . '/helper/third_author/wxauthor.php');
 require_once(BASE_ROOT_PATH . '/helper/session_helper.php');
 require_once(BASE_ROOT_PATH . '/helper/third_author/signaturer.php');
-require_once(BASE_ROOT_PATH . '/helper/predeposit_helper.php');
+require_once(BASE_ROOT_PATH . '/helper/bonus_helper.php');
 require_once(BASE_ROOT_PATH . '/helper/url_helper.php');
 
 class mshopControl extends specialControl
@@ -243,7 +245,7 @@ class mshopControl extends specialControl
     private function topup()
     {
         if(session_helper::logined()) {
-            $pred = new predeposit_helper($_SESSION['member_id'],true);
+            $pred = new account($_SESSION['member_id'],true);
             $pred->topup_bonus($_SESSION['member_mobile']);
         }
     }

+ 6 - 6
mobile/control/search.php

@@ -24,8 +24,8 @@ define('MOBILE_SERVER',true);
 class searchControl extends mobileHomeControl
 {
     const def_history_divider = '/mobile/defimg/history_divider.png';
-    const def_hot_divider = '/mobile/defimg/hot_divider.png';
-    const def_guess_divider = '/mobile/defimg/guess_like.png';
+    const def_hot_divider     = '/mobile/defimg/hot_divider.png';
+    const def_guess_divider   = '/mobile/defimg/guess_like.png';
 
     public function __construct()
     {
@@ -129,7 +129,7 @@ class searchControl extends mobileHomeControl
                 $goods_ids[] = $goods_id;
             }
 
-            $helper = new goods_helper();
+            $helper = new goods_helper($this->price_calcer());
             $ret = $helper->summary($goods_list,$related_goods);
 
             $block = special_formater::format_goods($goods_ids,"",$ret['sort_summary']);
@@ -293,7 +293,7 @@ class searchControl extends mobileHomeControl
                 $goods_ids[] = $goods_id;
             }
 
-            $helper = new goods_helper();
+            $helper = new goods_helper($this->price_calcer());
             $ret = $helper->summary($goods_list,$related_goods);
 
             $blocks = special_formater::format_ugc_goods($goods_ids,"",$ret['sort_summary']);
@@ -444,7 +444,7 @@ class searchControl extends mobileHomeControl
                 }
             }
 
-            $helper = new goods_helper();
+            $helper = new goods_helper($this->price_calcer());
             $ret = $helper->online_summary($gids,$related_goods);
             $block = special_formater::format_goods($gids,"猜你喜欢",$ret['sort_summary']);
 
@@ -509,7 +509,7 @@ class searchControl extends mobileHomeControl
             array_push($goods_ids,$val['goods_id']);
         }
 
-        $helper = new goods_helper();
+        $helper = new goods_helper($this->price_calcer());
         $goods_list = $helper->get_infos($goods_ids);
 
         self::outsuccess(array('goods_list' => $goods_list, 'mobile_page' => mobile_page($page_count)));

+ 2 - 2
mobile/control/special.php

@@ -107,7 +107,7 @@ class specialControl extends mobileHomeControl
         $specials = special_manager::instance()->special($special_id,$goods_ids,true);
         if (!empty($goods_ids))
         {
-            $helper = new goods_helper();
+            $helper = new goods_helper($this->price_calcer());
             $goodsex = $helper->online_summary($goods_ids, $related_goods);
 
             return array('special_list' => $specials,
@@ -135,7 +135,7 @@ class specialControl extends mobileHomeControl
         $result = special_manager::instance()->special($special_id,$goods_ids,false);
         if (!empty($goods_ids))
         {
-            $helper = new goods_helper();
+            $helper = new goods_helper($this->price_calcer());
             $goodsex = $helper->online_summary($goods_ids, $related_goods);
 
             return array('special_list' => $result['specials'],

+ 5 - 3
mobile/control/webpush.php

@@ -21,7 +21,7 @@ class webpushControl extends mobileHomeControl
     public function fcodeOp()
     {
         $fc_id = intval($_GET['fc_id']);
-        return self::outsuccess(['tpl' => new tpl_wpush_fcode($fc_id)],"webpush/fcode",'wap');
+        return self::outsuccess(['tpl' => new tpl_wpush_fcode($fc_id,$this->price_calcer())],"webpush/fcode",'wap');
     }
     public function updateOp()
     {
@@ -37,8 +37,10 @@ class webpushControl extends mobileHomeControl
 class tpl_wpush_fcode
 {
     private $mFcode;
-    public function __construct($fc_id)
+    private $mPriceCalcer;
+    public function __construct($fc_id,bonus\IPriceCalculate $price_calcer)
     {
+        $this->mPriceCalcer = $price_calcer;
         $mod_fcode = Model('goods_fcode');
         $this->mFcode = $mod_fcode->getGoodsFCode(['fc_id' => $fc_id],true);
     }
@@ -55,7 +57,7 @@ class tpl_wpush_fcode
     private function summary()
     {
         $common_id = intval($this->mFcode['goods_commonid']);
-        $helper = new goods_helper(false);
+        $helper = new goods_helper($this->mPriceCalcer,false);
         $gids = commonid_helper::instance()->goods_ids($common_id);
         $ret = $helper->get_spu($common_id,$gids[0],$err);
 

+ 2 - 0
mobile/util/errcode.php

@@ -28,6 +28,8 @@ class errcode extends SplEnum
 
     const ErrFrequentlyRequest = 10017;//请求频繁
     const ErrUploadFileFailed = 10018; //上传文件失败
+    const ErrUnImplements = 10019;
+
     const ErrSpecial = 10100;
 
     // 购物车模块(10200-10299)

+ 2 - 3
shop/control/buy.php

@@ -96,10 +96,9 @@ class buyControl extends BaseBuyControl {
      * 生成订单
      *
      */
-    public function buy_step2Op() {
-		
+    public function buy_step2Op()
+    {
         $logic_buy = logic('buy');
-
         $result = $logic_buy->buyStep2($_POST, $_SESSION['member_id'], $_SESSION['member_name'], $_SESSION['member_email']);
         if(!$result['state']) {
             showMessage($result['msg'], 'index.php?act=cart', 'html', 'error');

+ 24 - 0
test/TestGoods.php

@@ -73,4 +73,28 @@ class TestGoods extends PHPUnit_Framework_TestCase
             }
         }
     }
+    public function testSetLowprice()
+    {
+        $mod = Model('goods');
+        $i = 0;
+        while (true)
+        {
+            $start = $i * 1000;
+            $items = $mod->field('goods_id,goods_price')->order('goods_id asc')->limit("{$start},1000")->select();
+            if(empty($items)) {
+                return;
+            }
+            $i++;
+
+            foreach ($items as $item)
+            {
+                $gid = intval($item['goods_id']);
+                if($gid <= 0) continue;
+                $price_cent = intval(doubleval($item['goods_price']) * 100 + 0.5);
+                $lowest_price = intval($price_cent / 2) / 100;
+
+                $mod->editGoods(['goods_lowest_price' => $lowest_price],['goods_id' => $gid]);
+            }
+        }
+    }
 }

+ 3 - 1
test/TestMember.php

@@ -6,6 +6,8 @@
  * Time: 上午11:20
  */
 
+use bonus\account;
+
 define('BASE_ROOT_PATH',str_replace('/test','',dirname(__FILE__)));
 require_once(BASE_ROOT_PATH . '/fooder.php');
 class TestMember extends PHPUnit_Framework_TestCase
@@ -107,7 +109,7 @@ class TestMember extends PHPUnit_Framework_TestCase
             foreach ($items as $item)
             {
                 $member_id = $item['member_id'];
-                $pred = new predeposit_helper($member_id);
+                $pred = new account($member_id);
                 $amount = $pred->total_bonus();
                 $mod_member->editMember(['member_id' => $member_id],['available_bonus' => $amount]);
             }

+ 5 - 2
test/TestPredeposit.php

@@ -6,10 +6,13 @@
  * Date: 16/7/12
  * Time: 上午10:59
  */
+
+use bonus\account;
+
 define('BASE_ROOT_PATH',str_replace('/test','',dirname(__FILE__)));
 
 require_once(BASE_ROOT_PATH . '/fooder.php');
-require_once(BASE_ROOT_PATH . '/helper/predeposit_helper.php');
+require_once(BASE_ROOT_PATH . '/helper/bonus_helper.php');
 
 class TestPredeposit extends PHPUnit_Framework_TestCase
 {
@@ -20,7 +23,7 @@ class TestPredeposit extends PHPUnit_Framework_TestCase
 
     public function testHandoutBonus()
     {
-        $pred = new predeposit_helper(36490);
+        $pred = new account(36490);
         $pred->handout_bonus(0.0099,'220521636196731504','stanley','xxx');
     }