Browse Source

add divert account

stanley-king 3 năm trước cách đây
mục cha
commit
fbc7660297

+ 7 - 3
admin/control/merchant.php

@@ -213,7 +213,9 @@ class merchantControl extends SystemControl
         $data['admin_name'] = $admininfo['name'];
         $data['pdr_sn'] = '';
         $data['lg_desc'] = $bz;
-        $model_pd->changePd($admin_act, $data);
+
+        $isRefill = $model_pd->isRefill($data['member_id']);
+        $model_pd->changePd($admin_act, $data,$isRefill);
 
         $this->log($log_msg, 1);
         return [true, 'success'];
@@ -365,7 +367,7 @@ class merchantControl extends SystemControl
                     continue;
                 }
                 if (in_array($card_type, [mtopcard\ChinaMobileCard, mtopcard\ChinaUnicomCard, mtopcard\ChinaTelecomCard])) {
-                    if ($quality == \refill\Quality::Quick) {
+                    if ($quality == refill\Quality::Quick) {
                         $specs = array_merge($config['refill_phone_small_specs'], $specs);
                     }
                 }
@@ -733,7 +735,9 @@ class merchantControl extends SystemControl
             $data['admin_name'] = $admininfo['name'];
             $data['pdr_sn'] = $order_sn;
             $data['lg_desc'] = $memo;
-            $model_pd->changePd($admin_act, $data);
+
+            $isRefill = $model_pd->isRefill($data['member_id']);
+            $model_pd->changePd($admin_act, $data,$isRefill);
             $after_available = ncPriceFormat($available_predeposit + $evidence_info['amount']);
             $model_merchant->editRefillEvidence(
                 ['apply_id' => $apply_id],

+ 15 - 5
admin/control/predeposit.php

@@ -104,7 +104,9 @@ class predepositControl extends SystemControl{
 		    $data['amount'] = $info['pdr_amount'];
 		    $data['pdr_sn'] = $info['pdr_sn'];
 		    $data['admin_name'] = $this->admin_info['name'];
-		    $model_pd->changePd('recharge',$data);
+
+            $isRefill = $model_pd->isRefill($data['member_id']);
+		    $model_pd->changePd('recharge',$data,$isRefill);
             $trans->commit();
 		    $this->log($log_msg,1);
 		    showMessage(Language::get('admin_predeposit_recharge_edit_success'),'index.php?act=predeposit&op=predeposit');
@@ -245,7 +247,9 @@ class predepositControl extends SystemControl{
 		    $data['amount'] = $info['pdc_amount'];
 		    $data['order_sn'] = $info['pdc_sn'];
 		    $data['admin_name'] = $admininfo['name'];
-		    $model_pd->changePd('cash_del',$data);
+
+            $isRefill = $model_pd->isRefill($data['member_id']);
+            $model_pd->changePd('cash_del',$data,$isRefill);
 		    $model_pd->commit();
 			showMessage(Language::get('admin_predeposit_cash_del_success'),'index.php?act=predeposit&op=pd_cash_list');
 
@@ -296,7 +300,9 @@ class predepositControl extends SystemControl{
             $data['amount'] = $info['pdc_amount'];
             $data['order_sn'] = $info['pdc_sn'];
             $data['admin_name'] = $admininfo['name'];
-            $model_pd->changePd('cash_pay',$data);
+
+            $isRefill = $model_pd->isRefill($data['member_id']);
+            $model_pd->changePd('cash_pay',$data,$isRefill);
             $trans->commit();
             $this->log($log_msg,1);
             showMessage(Language::get('admin_predeposit_cash_edit_success'),'index.php?act=predeposit&op=pd_cash_list');
@@ -701,7 +707,9 @@ class predepositControl extends SystemControl{
             $data['admin_name'] = $admininfo['name'];
             $data['pdr_sn'] = $order_sn;
             $data['lg_desc'] = $memo;
-            $model_pd->changePd($admin_act,$data);
+
+            $isRefill = $model_pd->isRefill($data['member_id']);
+            $model_pd->changePd($admin_act,$data,$isRefill);
             $trans->commit();
             $this->log($log_msg,1);
             showMessage('操作成功','index.php?act=predeposit&op=pd_log_list');
@@ -766,7 +774,9 @@ class predepositControl extends SystemControl{
                         $data['admin_name'] = $admininfo['name'];
                         $data['pdr_sn'] = $order_sn;
                         $data['lg_desc'] = trim($_POST['pointsdesc']);
-                        $model_pd->changePd("sys_add_money",$data);
+
+                        $isRefill = $model_pd->isRefill($data['member_id']);
+                        $model_pd->changePd("sys_add_money",$data,$isRefill);
                         $trans->commit();
                         $this->log($log_msg,1);
 

+ 3 - 1
admin/control/provider_info.php

@@ -341,7 +341,9 @@ class provider_infoControl extends SystemControl
         $data['admin_name'] = $admininfo['name'];
         $data['pdr_sn'] = '';
         $data['lg_desc'] = '管理员上传通道充值申请,更改通道对应会员余额。';
-        $res = $model_pd->changePd($admin_act, $data);
+
+        $isRefill = $model_pd->isRefill($data['member_id']);
+        $res = $model_pd->changePd($admin_act, $data,$isRefill);
 
         $this->log($log_msg, 1);
         return $res;

+ 2 - 2
data/logic/buy_1.logic.php

@@ -614,7 +614,7 @@ class buy_1Logic
             if ($available_pd_amount >= $order_amount)
             {
                 //预存款立即支付,订单支付完成
-                $model_pd->changePd('order_pay',$data_pd);
+                $model_pd->changePd('order_pay',$data_pd,false);
                 $available_pd_amount -= $order_amount;
 
                 //支付被冻结的充值卡
@@ -658,7 +658,7 @@ class buy_1Logic
             }
             elseif ($available_pd_amount > 0) { //暂冻结预存款,后面还需要 API彻底完成支付
                 $data_pd['amount'] = $available_pd_amount;
-                $model_pd->changePd('order_freeze',$data_pd);
+                $model_pd->changePd('order_freeze',$data_pd,false);
                 //预存款支付金额保存到订单
                 $data_order = array();
                 $data_order['pd_amount'] = $available_pd_amount;

+ 1 - 0
data/logic/buy_virtual.logic.php

@@ -147,6 +147,7 @@ class buy_virtualLogic
             else {
                 Log::record('',Log::DEBUG);
             }
+
             if($use_trans) {
                 $trans->commit();
             }

+ 2 - 2
data/logic/order.logic.php

@@ -62,7 +62,7 @@ class orderLogic
                     $data_pd['amount'] = $pd_amount;
                     $data_pd['order_sn'] = $order_info['order_sn'];
 
-                    $model_pd->changePd('order_cancel',$data_pd);
+                    $model_pd->changePd('order_cancel',$data_pd,false);
                 }
 
                 $bonus_amount = unserialize($order_info['bonus_amount']);
@@ -380,7 +380,7 @@ class orderLogic
                     $data_pd['member_name'] = $order_info['buyer_name'];
                     $data_pd['amount'] = $pd_amount;
                     $data_pd['order_sn'] = $order_info['order_sn'];
-                    $model_pd->changePd('order_comb_pay',$data_pd);
+                    $model_pd->changePd('order_comb_pay',$data_pd,false);
                 }
             }
 

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

@@ -207,7 +207,9 @@ class paymentLogic
             $data['member_name'] = $recharge_info['pdr_member_name'];
             $data['amount'] = $recharge_info['pdr_amount'];
             $data['pdr_sn'] = $recharge_info['pdr_sn'];
-            $model_pd->changePd('recharge', $data);
+
+            $isRefill = $model_pd->isRefill($data['member_id']);
+            $model_pd->changePd('recharge', $data, $isRefill);
             $trans->commit();
 
             return callback(true);

+ 3 - 1
data/logic/vr_order.logic.php

@@ -115,7 +115,9 @@ class vr_orderLogic
                 $data_pd['member_name'] = $order_info['buyer_name'];
                 $data_pd['amount'] = $pd_amount;
                 $data_pd['order_sn'] = $order_info['order_sn'];
-                $model_pd->changePd('order_comb_pay', $data_pd);
+
+                $isRefill = $model_pd->isRefill($data_pd['member_id']);
+                $model_pd->changePd('order_comb_pay', $data_pd,$isRefill);
             }
 
             //更新订单状态

+ 173 - 0
data/model/account_divert.model.php

@@ -0,0 +1,173 @@
+<?php
+
+defined('InShopNC') or exit('Access Invalid!');
+
+class account_divertModel extends Model
+{
+    const MAX_SLOTS = 200;
+
+    public function __construct() {
+        parent::__construct();
+    }
+
+    public function max_slots() {
+        return self::MAX_SLOTS;
+    }
+
+    public function create_member($member_id)
+    {
+        if ($member_id <= 0) return false;
+        for ($slot = 1; $slot <= self::MAX_SLOTS; $slot++) {
+            $ret = $this->table('pd_divert')->insert(['member_id' => $member_id, 'slot' => $slot]);
+        }
+
+        return true;
+    }
+
+    public function stat_member($member_id)
+    {
+        $item = $this->table('pd_divert')
+            ->field('count(*) as slots, sum(available_predeposit) as available_amounts, sum(freeze_predeposit) as freeze_amounts')
+            ->where(['member_id' => $member_id])
+            ->find();
+
+        if (empty($item)) {
+            return [false, 0, 0];
+        } else {
+            $available_amounts = $item['available_amounts'];
+            $freeze_amounts = $item['freeze_amounts'];
+            return [true, $available_amounts, $freeze_amounts];
+        }
+    }
+
+    public function check_member($member_id)
+    {
+        $items = $this->table('pd_divert')
+            ->field('count(*) as slots, sum(available_predeposit) as available_amounts, sum(freeze_predeposit) as freeze_amounts')
+            ->where(['member_id' => $member_id])
+            ->find();
+
+        if(empty($items)) {
+            return [false, 0, 0];
+        }
+        else {
+            $slots = $items['slots'];
+            $available_amounts = $items['available_amounts'];
+            $freeze_amounts = $items['freeze_amounts'];
+
+            $succ = ($slots == self::max_slots());
+            return [$succ,$available_amounts,$freeze_amounts];
+        }
+    }
+
+    public function free_membr($member_id) {
+        return $this->table('pd_divert')->where(['member_id' => $member_id])->delete();
+    }
+
+    public function divert_member($member_id,$available_amounts,$freeze_amounts)
+    {
+        $slots = self::MAX_SLOTS;
+        $divrter = function ($amount) use ($slots)
+        {
+            $result = [];
+
+            $number = floor($amount);
+            $avg = intval(floor($number / $slots));
+            if($avg >= 1)
+            {
+                $left = $amount;
+                for ($i = 0; $i < $slots; $i++) {
+                    $result[] = $avg;
+                    $left -= $avg;
+                }
+                $result[0] += round($left,4);
+            }
+            else {
+                $result[] = $amount;
+            }
+            return $result;
+        };
+
+        $modifier = function ($member_id,$field,$amounts)
+        {
+            $slot = 1;
+            foreach ($amounts as $amount) {
+                $update[$field] = ['exp', "{$field} + {$amount}"];
+                $this->table('pd_divert')->where(['member_id' => $member_id, 'slot' => $slot])->update($update);
+                $slot++;
+            }
+        };
+
+        $avaliables = $divrter($available_amounts);
+        $freezes = $divrter($freeze_amounts);
+
+        $modifier($member_id,'available_predeposit',$avaliables);
+        $modifier($member_id,'freeze_predeposit',$freezes);
+    }
+
+    public function edit_member($member_id,$datas,$amount)
+    {
+        if($amount > 10000)
+        {
+            $available_amounts = 0.00;
+            $freeze_amounts = 0.00;
+            foreach ($datas as $field => $op_amount)
+            {
+                foreach ($op_amount as $op => $amount)
+                {
+                    if($op =='add')
+                    {
+                        if($field == 'available_predeposit') {
+                            $available_amounts = $amount;
+                        }
+                        else {
+                            $freeze_amounts = $amount;
+                        }
+                    }
+                    elseif($op == 'reduce')
+                    {
+                        if($field == 'available_predeposit') {
+                            $available_amounts = -$amount;
+                        }
+                        else {
+                            $freeze_amounts = -$amount;
+                        }
+                    }
+                    else {
+                        Log::record(__METHOD__ . " canot parse {$op} opertion.",Log::ERR);
+                        return false;
+                    }
+                }
+
+                return $this->divert_member($member_id,$available_amounts,$freeze_amounts);
+            }
+        }
+        else
+        {
+            foreach ($datas as $field => $op_amount)
+            {
+                foreach ($op_amount as $op => $amount)
+                {
+                    if($op =='add') {
+                        $data_pd[$field] = ['exp',"{$field}+{$amount}"];
+                    }
+                    elseif($op == 'reduce') {
+                        $data_pd[$field] = ['exp',"{$field}-{$amount}"];
+                    }
+                    else {
+                        Log::record(__METHOD__ . " canot parse {$op} opertion.",Log::ERR);
+                        return false;
+                    }
+                }
+            }
+
+            $slot = mt_rand(1,self::MAX_SLOTS);
+            return $this->table('pd_divert')->where(['member_id' => $member_id,'slot' => $slot])->update($datas);
+        }
+    }
+
+    public function edit_provider($provider_id,$datas)
+    {
+    }
+
+}

+ 4 - 2
data/model/buy.model.php

@@ -656,7 +656,8 @@ class buyModel {
             if ($available_pd_amount >= $order_amount)
             {
                 //预存款立即支付,订单支付完成
-                $model_pd->changePd('order_pay',$data_pd);
+                $isRefill = $model_pd->isRefill($data_pd['member_id']);
+                $model_pd->changePd('order_pay',$data_pd,$isRefill);
                 $available_pd_amount -= $order_amount;
 
                 //记录订单日志(已付款)
@@ -692,7 +693,8 @@ class buyModel {
             elseif ($available_pd_amount > 0) {
                 //暂冻结预存款,后面还需要 API彻底完成支付
                 $data_pd['amount'] = $available_pd_amount;
-                $model_pd->changePd('order_freeze',$data_pd);
+                $isRefill = $model_pd->isRefill($data_pd['member_id']);
+                $model_pd->changePd('order_freeze',$data_pd,$isRefill);
                 //预存款支付金额保存到订单
                 $data_order = array();
                 $data_order['pd_amount'] = $available_pd_amount;

+ 50 - 8
data/model/predeposit.model.php

@@ -245,9 +245,11 @@ class predepositModel extends Model {
      */
     public function changePd($change_type,$data = [],$fRefill = false) {
         $data_log = [];
-        $data_pd = [];
         $data_msg = [];
 
+        $data_pd = [];
+        $dive_pd = [];
+
         $data_log['lg_member_id'] = $data['member_id'];
         $data_log['lg_member_name'] = $data['member_name'];
         $data_log['lg_add_time'] = time();
@@ -257,12 +259,15 @@ class predepositModel extends Model {
         $data_msg['time'] = date('Y-m-d H:i:s');
         $data_msg['pd_url'] = urlShop('predeposit', 'pd_log_list');
 
+
         switch ($change_type)
         {
             case 'order_pay':
                 $data_log['lg_av_amount'] = -$data['amount'];
                 $data_log['lg_desc'] = '下单,支付预存款,订单号: '.$data['order_sn'];
+
                 $data_pd['available_predeposit'] = ['exp','available_predeposit-'.$data['amount']];
+                $dive_pd['available_predeposit'] = ['reduce' => $data['amount']];
 
                 $data_msg['av_amount'] = -$data['amount'];
                 $data_msg['freeze_amount'] = 0;
@@ -272,8 +277,12 @@ class predepositModel extends Model {
                 $data_log['lg_av_amount'] = -$data['amount'];
                 $data_log['lg_freeze_amount'] = $data['amount'];
                 $data_log['lg_desc'] = '下单,冻结预存款,订单号: '.$data['order_sn'];
-                $data_pd['freeze_predeposit'] = ['exp','freeze_predeposit+'.$data['amount']];
+
                 $data_pd['available_predeposit'] = ['exp','available_predeposit-'.$data['amount']];
+                $data_pd['freeze_predeposit'] = ['exp','freeze_predeposit+'.$data['amount']];
+
+                $dive_pd['available_predeposit'] = ['reduce' => $data['amount']];
+                $dive_pd['freeze_predeposit'] = ['add' => $data['amount']];
 
                 $data_msg['av_amount'] = -$data['amount'];
                 $data_msg['freeze_amount'] = $data['amount'];
@@ -284,8 +293,12 @@ class predepositModel extends Model {
                 $data_log['lg_freeze_amount'] = -$data['amount'];
 
                 $data_log['lg_desc'] = '取消订单,解冻预存款,订单号: '.$data['order_sn'];
-                $data_pd['freeze_predeposit'] = ['exp','freeze_predeposit-'.$data['amount']];
+
                 $data_pd['available_predeposit'] = ['exp','available_predeposit+'.$data['amount']];
+                $data_pd['freeze_predeposit'] = ['exp','freeze_predeposit-'.$data['amount']];
+
+                $dive_pd['available_predeposit'] = ['add' => $data['amount']];
+                $dive_pd['freeze_predeposit'] = ['reduce' => $data['amount']];
 
                 $data_msg['av_amount'] = $data['amount'];
                 $data_msg['freeze_amount'] = -$data['amount'];
@@ -294,7 +307,9 @@ class predepositModel extends Model {
             case 'order_comb_pay':
                 $data_log['lg_freeze_amount'] = -$data['amount'];
                 $data_log['lg_desc'] = '下单,支付被冻结的预存款,订单号: '.$data['order_sn'];
+
                 $data_pd['freeze_predeposit'] = ['exp','freeze_predeposit-'.$data['amount']];
+                $dive_pd['freeze_predeposit'] = ['reduce' => $data['amount']];
 
                 $data_msg['av_amount'] = 0;
                 $data_msg['freeze_amount'] = $data['amount'];
@@ -304,7 +319,9 @@ class predepositModel extends Model {
                 $data_log['lg_av_amount'] = $data['amount'];
                 $data_log['lg_desc'] = '充值,充值单号: '.$data['pdr_sn'];
                 $data_log['lg_admin_name'] = $data['admin_name'];
+
                 $data_pd['available_predeposit'] = ['exp','available_predeposit+'.$data['amount']];
+                $dive_pd['available_predeposit'] = ['add' => $data['amount']];
 
                 $data_msg['av_amount'] = $data['amount'];
                 $data_msg['freeze_amount'] = 0;
@@ -315,6 +332,7 @@ class predepositModel extends Model {
                 $data_log['lg_av_amount'] = $data['amount'];
                 $data_log['lg_desc'] = '确认退款,订单号: '.$data['order_sn'];
                 $data_pd['available_predeposit'] = ['exp','available_predeposit+'.$data['amount']];
+                $dive_pd['available_predeposit'] = ['add' => $data['amount']];
 
                 $data_msg['av_amount'] = $data['amount'];
                 $data_msg['freeze_amount'] = 0;
@@ -324,6 +342,7 @@ class predepositModel extends Model {
                 $data_log['lg_av_amount'] = $data['amount'];
                 $data_log['lg_desc'] = '虚拟兑码退款成功,订单号: '.$data['order_sn'];
                 $data_pd['available_predeposit'] = ['exp','available_predeposit+'.$data['amount']];
+                $dive_pd['available_predeposit'] = ['add' => $data['amount']];
 
                 $data_msg['av_amount'] = $data['amount'];
                 $data_msg['freeze_amount'] = 0;
@@ -333,9 +352,13 @@ class predepositModel extends Model {
                 $data_log['lg_av_amount'] = -$data['amount'];
                 $data_log['lg_freeze_amount'] = $data['amount'];
                 $data_log['lg_desc'] = '申请提现,冻结预存款,提现单号: '.$data['order_sn'];
+
                 $data_pd['available_predeposit'] = ['exp','available_predeposit-'.$data['amount']];
                 $data_pd['freeze_predeposit'] = ['exp','freeze_predeposit+'.$data['amount']];
 
+                $dive_pd['available_predeposit'] = ['reduce' => $data['amount']];
+                $dive_pd['freeze_predeposit'] = ['add' => $data['amount']];
+
                 $data_msg['av_amount'] = -$data['amount'];
                 $data_msg['freeze_amount'] = $data['amount'];
                 $data_msg['desc'] = $data_log['lg_desc'];
@@ -345,6 +368,7 @@ class predepositModel extends Model {
                 $data_log['lg_desc'] = '提现成功,提现单号: '.$data['order_sn'];
                 $data_log['lg_admin_name'] = $data['admin_name'];
                 $data_pd['freeze_predeposit'] = ['exp','freeze_predeposit-'.$data['amount']];
+                $dive_pd['freeze_predeposit'] = ['reduce' => $data['amount']];
 
                 $data_msg['av_amount'] = 0;
                 $data_msg['freeze_amount'] = -$data['amount'];
@@ -355,8 +379,11 @@ class predepositModel extends Model {
                 $data_log['lg_freeze_amount'] = -$data['amount'];
                 $data_log['lg_desc'] = '取消提现申请,解冻预存款,提现单号: '.$data['order_sn'];
                 $data_log['lg_admin_name'] = $data['admin_name'];
+
                 $data_pd['available_predeposit'] = ['exp','available_predeposit+'.$data['amount']];
                 $data_pd['freeze_predeposit'] = ['exp','freeze_predeposit-'.$data['amount']];
+                $dive_pd['available_predeposit'] = ['add' => $data['amount']];
+                $dive_pd['freeze_predeposit'] = ['reduce' => $data['amount']];
 
                 $data_msg['av_amount'] = $data['amount'];
                 $data_msg['freeze_amount'] = -$data['amount'];
@@ -368,6 +395,7 @@ class predepositModel extends Model {
                 $data_log['lg_desc'] = '管理员调节预存款【增加】,充值单号: '.$data['pdr_sn'];
                 $data_log['lg_admin_name'] = $data['admin_name'];
                 $data_pd['available_predeposit'] = ['exp','available_predeposit+'.$data['amount']];
+                $dive_pd['available_predeposit'] = ['add' => $data['amount']];
 
                 $data_msg['av_amount'] = $data['amount'];
                 $data_msg['freeze_amount'] = 0;
@@ -378,6 +406,7 @@ class predepositModel extends Model {
                 $data_log['lg_desc'] = '管理员调节预存款【减少】,充值单号: '.$data['pdr_sn'];
                 $data_log['lg_admin_name'] = $data['admin_name'];
                 $data_pd['available_predeposit'] = ['exp','available_predeposit-'.$data['amount']];
+                $dive_pd['available_predeposit'] = ['reduce' => $data['amount']];
 
                 $data_msg['av_amount'] = -$data['amount'];
                 $data_msg['freeze_amount'] = 0;
@@ -387,9 +416,13 @@ class predepositModel extends Model {
                 $data_log['lg_av_amount'] = -$data['amount'];
                 $data_log['lg_freeze_amount'] = $data['amount'];
                 $data_log['lg_desc'] = '管理员调节预存款【冻结】,充值单号: '.$data['pdr_sn'];
+
                 $data_pd['available_predeposit'] = ['exp','available_predeposit-'.$data['amount']];
                 $data_pd['freeze_predeposit'] = ['exp','freeze_predeposit+'.$data['amount']];
 
+                $dive_pd['available_predeposit'] = ['reduce' => $data['amount']];
+                $dive_pd['freeze_predeposit'] = ['add' => $data['amount']];
+
                 $data_msg['av_amount'] = -$data['amount'];
                 $data_msg['freeze_amount'] = $data['amount'];
                 $data_msg['desc'] = $data_log['lg_desc'];
@@ -399,9 +432,13 @@ class predepositModel extends Model {
                 $data_log['lg_freeze_amount'] = -$data['amount'];
                 $data_log['lg_desc'] = '管理员调节预存款【解冻】,充值单号: '.$data['pdr_sn'];
                 $data_log['lg_admin_name'] = $data['admin_name'];
+
                 $data_pd['available_predeposit'] = ['exp','available_predeposit+'.$data['amount']];
                 $data_pd['freeze_predeposit'] = ['exp','freeze_predeposit-'.$data['amount']];
 
+                $dive_pd['available_predeposit'] = ['add' => $data['amount']];
+                $dive_pd['freeze_predeposit'] = ['reduce' => $data['amount']];
+
                 $data_msg['av_amount'] = $data['amount'];
                 $data_msg['freeze_amount'] = -$data['amount'];
                 $data_msg['desc'] = $data_log['lg_desc'];
@@ -416,11 +453,10 @@ class predepositModel extends Model {
         $mem_info = Model('member')->getMemberInfo(['member_id' => $data['member_id']], '*', true);
         $data_log['lg_available'] = $mem_info['available_predeposit'];
 
-        if($fRefill) {
-            $update = Model('member')->editMember(['member_id'=>$data['member_id']],$data_pd);
-        }
-        else {
-            $update = Model('member')->editMember(['member_id'=>$data['member_id']],$data_pd);
+        if ($fRefill) {
+            $update = Model('account_divert')->edit_member($data['member_id'], $dive_pd,$data['amount']);
+        } else {
+            $update = Model('member')->editMember(['member_id' => $data['member_id']], $data_pd);
         }
 
         if (!$update) {
@@ -685,4 +721,10 @@ class predepositModel extends Model {
     public function delPdCash($condition) {
         return $this->table('pd_cash')->where($condition)->delete();
     }
+
+    public function isRefill($member_id)
+    {
+        $items = $this->table('merchant')->where(['admin_id' => $member_id])->select();
+        return !empty($items);
+    }
 }

+ 3 - 1
data/model/refund_return.model.php

@@ -182,7 +182,9 @@ class refund_returnModel extends Model
                         $log_array['amount'] = $predeposit_amount;
                     }
                     $log_array['refund_id'] = $refund_id;
-                    $state = $model_predeposit->changePd('refund', $log_array);//增加买家可用预存款金额
+
+                    $isRefill = $model_predeposit->isRefill($log_array['member_id']);
+                    $state = $model_predeposit->changePd('refund', $log_array,$isRefill);//增加买家可用预存款金额
                 }
 
                 $order_state = $order['order_state'];

+ 3 - 1
data/model/vr_refund.model.php

@@ -95,7 +95,9 @@ class vr_refundModel extends Model{
     	            if ($refund['refund_amount'] > $predeposit_amount) {
     	                $log_array['amount'] = $predeposit_amount;
     	            }
-                    $state = $model_predeposit->changePd('refund', $log_array);//增加买家可用预存款金额
+
+                    $isRefill = $model_predeposit->isRefill($log_array['member_id']);
+                    $state = $model_predeposit->changePd('refund', $log_array,$isRefill);//增加买家可用预存款金额
                 }
     			if ($state) {
     			    $order_array = array();

+ 2 - 2
helper/bonus/recorder.php

@@ -116,7 +116,7 @@ class recorder
         $data['admin_name'] = '平台管理员';
         $data['pdr_sn'] = $order_sn;
         $data['lg_desc'] = '版本升级,余额迁移.';
-        $this->model_pd->changePd("sys_add_money", $data);
+//        $this->model_pd->changePd("sys_add_money", $data);
     }
 
     public function bonus_add_money($amount, $bonus_sn, $sender_name, $info, $make_type = 0)
@@ -132,7 +132,7 @@ class recorder
         $data['pdr_sn'] = $bonus_sn;
         $data['lg_desc'] = $info;
         $this->mDirty = true;
-        $this->model_pd->changePd("bonus_add_money", $data);
+//        $this->model_pd->changePd("bonus_add_money", $data);
     }
 
     private function filter_sn($lg_desc)

+ 5 - 1
helper/model/member_info.php

@@ -34,8 +34,12 @@ class member_info
         }
     }
     public function available_predeposit() {
-        return round($this->member_info['available_predeposit'],2);
+        return round($this->member_info['available_predeposit'],4);
     }
+    public function freeze_predeposit() {
+        return round($this->member_info['freeze_predeposit'],4);
+    }
+
     public function member_id()
     {
         return $this->member_id;

+ 181 - 0
helper/refill/divert_account.php

@@ -0,0 +1,181 @@
+<?php
+
+namespace refill;
+
+use Exception;
+use Log;
+use trans_wapper;
+use member_info;
+
+class divert_account
+{
+    #初始化用户离散账号
+    public function init_member($member_id)
+    {
+        $trans = null;
+        try {
+            $minfo = new member_info($member_id);
+            $mod_divert = Model('account_divert');
+            $trans = new trans_wapper($mod_divert,__METHOD__);
+            $mod_divert->free_membr($member_id);
+            $mod_divert->create_member($member_id);
+            $mod_divert->divert_member($member_id,$minfo->available_predeposit(), $minfo->freeze_predeposit());
+            $trans->commit();
+
+            [$succ, $available_amounts, $freeze_amounts] = $mod_divert->stat_member($member_id);
+
+            if (round($available_amounts - $minfo->available_predeposit(), 4) == 0.0000) {
+                Log::record("available_predeposit = {$available_amounts} is ok",Log::DEBUG);
+            } else {
+                Log::record("available_predeposit = {$available_amounts} is fail",Log::ERR);
+            }
+
+            if (round($freeze_amounts - $minfo->freeze_predeposit(), 4) == 0.0000) {
+                Log::record("freeze_predeposit = {$freeze_amounts} is ok",Log::DEBUG);
+            } else {
+                Log::record("freeze_predeposit = {$freeze_amounts} is fail",Log::ERR);
+            }
+
+            return true;
+        }
+        catch (Exception $ex)
+        {
+            $trans->rollback();
+            Log::record($ex->getMessage(), Log::ERR);
+            return false;
+        }
+    }
+
+    #重设离散账号维度
+    public function resize_member($member_id)
+    {
+        $trans = null;
+        try {
+            $mod_divert = Model('account_divert');
+            $trans = new trans_wapper($mod_divert,__METHOD__);
+            [$succ,$available_amounts,$freeze_amounts] = $mod_divert->check_member($member_id);
+
+            if(!$succ) {
+                $mod_divert->free_membr($member_id);
+                $mod_divert->create_member($member_id);
+                $mod_divert->divert_member($member_id,$available_amounts,$freeze_amounts);
+            }
+
+            $trans->commit();
+            return true;
+        }
+        catch (Exception $ex)
+        {
+            $trans->rollback();
+            Log::record($ex->getMessage(), Log::ERR);
+            return false;
+        }
+    }
+
+    #加款
+    public function add_member($member_id, $available_amounts, $freeze_amounts = 0.00)
+    {
+        $trans = null;
+        try {
+            $mod_divert = Model('account_divert');
+            $trans = new trans_wapper($mod_divert,__METHOD__);
+            $mod_divert->divert_member($member_id,$available_amounts,$freeze_amounts);
+            $trans->commit();
+            return true;
+        }
+        catch (Exception $ex)
+        {
+            $trans->rollback();
+            Log::record($ex->getMessage(), Log::ERR);
+            return false;
+        }
+    }
+
+    #减款
+    public function reduce_member($member_id, $available_amounts, $freeze_amounts = 0.00)
+    {
+        $trans = null;
+        try {
+            $mod_divert = Model('account_divert');
+            $trans = new trans_wapper($mod_divert,__METHOD__);
+            $mod_divert->divert_member($member_id,-$available_amounts,$freeze_amounts);
+            $trans->commit();
+            return true;
+        }
+        catch (Exception $ex)
+        {
+            $trans->rollback();
+            Log::record($ex->getMessage(), Log::ERR);
+            return false;
+        }
+    }
+
+    public function init_merchant($mchid)
+    {
+        $trans = null;
+        try {
+            $mchinfo = Model('merchant')->getMerchantInfo(['mchid' => $mchid]);
+            $member_id = intval($mchinfo['admin_id']);
+
+            $mod_divert = Model('account_divert');
+            $minfo = new member_info($member_id);
+
+            $trans = new trans_wapper($mod_divert, __METHOD__);
+            $mod_divert->free_membr($member_id);
+            $mod_divert->create_member($member_id);
+            $mod_divert->divert_member($member_id, $minfo->available_predeposit(), $minfo->freeze_predeposit());
+            $trans->commit();
+            return true;
+        } catch (Exception $ex) {
+            $trans->rollback();
+            Log::record($ex->getMessage(), Log::ERR);
+            return false;
+        }
+    }
+
+    public function init_merchants()
+    {
+        $mids = $this->unique_mids();
+        foreach ($mids as $mid) {
+            $ret = $this->init_member($mid);
+            Log::record("init_merchants {$mid}:" . $ret ? 'true' : 'false', Log::DEBUG);
+
+        }
+    }
+
+    private function unique_mids()
+    {
+        $mids = [];
+
+        $i = 0;
+        while (true)
+        {
+            $start = $i * 100;
+            $items = Model('')->table('merchant')->field('admin_id')->where(['mchid' => ['gt',0]])->order('mchid asc')->limit("{$start},100")->select();
+            if(empty($items)) {
+                break;
+            }
+
+            $i++;
+            foreach ($items as $item) {
+                $mids[] = intval($item['admin_id']);
+            }
+        }
+        $mids = array_unique($mids);
+        return $mids;
+    }
+
+
+    public function update_merchants()
+    {
+        $mod_divert = Model('account_divert');
+        $mids = $this->unique_mids();
+        foreach ($mids as $mid)
+        {
+            [$succ, $available_amounts, $freeze_amounts] = $mod_divert->stat_member($mid);
+            if($succ) {
+                $update = Model('member')->where(['member_id' => $mid])->update(['available_predeposit' => $available_amounts,'freeze_predeposit' => $freeze_amounts]);
+            }
+        }
+    }
+}

+ 2 - 1
shop/control/member_live.php

@@ -137,7 +137,8 @@ class member_liveControl extends BaseMemberControl {
 					$data['member_id'] = $_SESSION['member_id'];
 					$data['member_name'] = $_SESSION['member_name'];
 
-					$model_predeposit->changePd($change_type,$data);
+                    $isRefill = $model_predeposit->isRefill($data['member_id']);
+					$model_predeposit->changePd($change_type,$data,$isRefill);
 				}
 				showDialog('操作成功','reload','succ','');
 			}else{

+ 2 - 2
shop/control/payment.php

@@ -293,9 +293,9 @@ class paymentControl extends BaseHomeControl{
             //更改订单支付状态
 		    if ($order_type == 'real_order') {
 		        $result = $logic_payment->updateRealOrder($out_trade_no, $payment_info['payment_code'], $order_list, $trade_no);
-		    } else if($order_type == 'vr_order') {
+		    } elseif($order_type == 'vr_order') {
 		        $result = $logic_payment->updateVrOrder($out_trade_no, $payment_info['payment_code'], $order_pay_info, $trade_no);
-		    } else if ($order_type == 'pd_order') {
+		    } elseif ($order_type == 'pd_order') {
 		        $result = $logic_payment->updatePdOrder($out_trade_no, $trade_no, $payment_info, $order_pay_info);
 		    }
 		    if (!$result['state']) {

+ 3 - 1
shop/control/predeposit.php

@@ -218,7 +218,9 @@ class predepositControl extends BaseMemberControl {
     			$data['member_name'] = $member_info['member_name'];
     			$data['amount'] = $pdc_amount;
     			$data['order_sn'] = $pdc_sn;
-    			$model_pd->changePd('cash_apply',$data);
+
+                $isRefill = $model_pd->isRefill($data['member_id']);
+    			$model_pd->changePd('cash_apply',$data,$isRefill);
                 $trans->commit();
     			showDialog(Language::get('predeposit_cash_add_success'),'index.php?act=predeposit&op=pd_cash_list','succ','CUR_DIALOG.close()');
 			} catch (Exception $e) {

+ 4 - 2
shop/control/show_live_groupbuy.php

@@ -444,7 +444,8 @@ class show_live_groupbuyControl extends BaseHomeControl {
 					$data['member_name'] = $_SESSION['member_name'];
 
 					$model_predeposit = Model('predeposit');
-					$res = $model_predeposit->changePd($change_type,$data);
+                    $isRefill = $model_predeposit->isRefill($data['member_id']);
+					$res = $model_predeposit->changePd($change_type,$data,$isRefill);
 
 					if(!$res){
 						showMessage('订单支付失败','index.php?act=member_live','html','error');
@@ -510,7 +511,8 @@ class show_live_groupbuyControl extends BaseHomeControl {
 				$data['member_name'] = $_SESSION['member_name'];
 
 				$model_predeposit = Model('predeposit');
-				$res2 = $model_predeposit->changePd($change_type,$data);
+                $isRefill = $model_predeposit->isRefill($data['member_id']);
+                $res2 = $model_predeposit->changePd($change_type,$data,$isRefill);
 
 				$groupbuy_params = array();
 				$groupbuy_params['buyer_count'] = array('exp','buyer_count-'.$order_info['number']);

+ 2 - 1
shop/control/store_liveorder.php

@@ -127,7 +127,8 @@ class store_liveorderControl extends BaseSellerControl {
 					$data['member_id'] = $member['member_id'];
 					$data['member_name'] = $member['member_name'];
 
-					$model_predeposit->changePd($change_type,$data);
+                    $isRefill = $model_predeposit->isRefill($data['member_id']);
+					$model_predeposit->changePd($change_type,$data,$isRefill);
 				}
 
 				showDialog('操作成功','reload','succ','');

+ 37 - 0
test/TestAccountDivert.php

@@ -0,0 +1,37 @@
+<?php
+
+
+use PHPUnit\Framework\TestCase;
+
+define('APP_ID', 'test');
+define('BASE_ROOT_PATH', str_replace('/test', '', dirname(__FILE__)));
+
+require_once(BASE_ROOT_PATH . '/global.php');
+require_once(BASE_CORE_PATH . '/lrlz.php');
+require_once(BASE_ROOT_PATH . '/fooder.php');
+require_once(BASE_HELPER_PATH . '/refill/divert_account.php');
+
+class TestAccountDivert extends TestCase
+{
+    public static function setUpBeforeClass(): void
+    {
+        Base::run_util();
+    }
+
+    public function testInitMember()
+    {
+        $helper = new refill\divert_account();
+        $helper->init_member(65999);
+    }
+    public function testInitMerchants()
+    {
+        $helper = new refill\divert_account();
+        $helper->init_merchants();
+    }
+
+    public function testDivertMember()
+    {
+        $helper = new refill\divert_account();
+        $helper->add_member(60221,-100);
+    }
+}