|
@@ -15,6 +15,7 @@ class RateMoney
|
|
|
{
|
|
|
const ASC = 1;
|
|
|
const DESC = 2;
|
|
|
+ const PRED_RATE = 30;
|
|
|
private $mRates;
|
|
|
private $mDirty;
|
|
|
|
|
@@ -33,6 +34,45 @@ class RateMoney
|
|
|
ksort($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(array_key_exists($rate,$this->mRates) == false) {
|
|
|
+ $this->mRates[$rate] = 0.00;
|
|
|
+ }
|
|
|
+ $this->mRates[$rate] += $bonus->remain_amount();
|
|
|
+ }
|
|
|
+ ksort($this->mRates);
|
|
|
+ }
|
|
|
+
|
|
|
+ public function balance($money)
|
|
|
+ {
|
|
|
+ $money = intval($money * 100 + 0.5);
|
|
|
+ $total = intval($this->total() * 100 + 0.5);
|
|
|
+
|
|
|
+ if($money > $total)
|
|
|
+ {
|
|
|
+ if(array_key_exists(self::PRED_RATE,$this->mRates) == false) {
|
|
|
+ $this->mRates[self::PRED_RATE] = 0.00;
|
|
|
+ }
|
|
|
+ $this->mRates[self::PRED_RATE] += ($money - $total) / 100;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public function resort()
|
|
|
+ {
|
|
|
+ ksort($this->mRates);
|
|
|
+ }
|
|
|
+
|
|
|
public function is_enough(&$rate,$amount)
|
|
|
{
|
|
|
$amount = intval($amount * 100 + 0.5);
|
|
@@ -83,10 +123,21 @@ class RateMoney
|
|
|
}
|
|
|
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;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
class predeposit_helper
|
|
@@ -96,6 +147,7 @@ class predeposit_helper
|
|
|
private $mTotal_value;
|
|
|
private $mFreeze_value;
|
|
|
private $mRates;
|
|
|
+ private $mBonusState;
|
|
|
private $mRateVersion; //用来记录,红包过期带来的红包变化
|
|
|
|
|
|
public function __construct($member_id)
|
|
@@ -106,49 +158,67 @@ class predeposit_helper
|
|
|
$pd_array = Model('member')->getMemberPdInfo($this->member_id);
|
|
|
$this->mTotal_value = $pd_array['available_predeposit']; // 当前预存款
|
|
|
$this->mFreeze_value = $pd_array['freeze_predeposit']; // 当前预存款冻结
|
|
|
+ $this->mRateVersion = $pd_array['rate_version'];
|
|
|
+ $this->init_rate();
|
|
|
+ }
|
|
|
|
|
|
- $available_bonus = $pd_array['available_bonus'];
|
|
|
- if (empty($available_bonus))
|
|
|
+ public function init_rate()
|
|
|
+ {
|
|
|
+ $fUpdate = false;
|
|
|
+ if(isset($_SESSION['bonus_rate_version']) == false) {
|
|
|
+ $fUpdate = true;
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
- $total = intval($this->mTotal_value * 100 + 0.5);
|
|
|
- if($total > 0) {
|
|
|
- $this->mRates = new RateMoney(array(30 => $this->mTotal_value));
|
|
|
- } else {
|
|
|
- $this->mRates = null;
|
|
|
+ $version = $_SESSION['bonus_rate_version'];
|
|
|
+ if($version != $this->mRateVersion) {
|
|
|
+ $fUpdate = true;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(isset($_SESSION['bonus_rate']) && isset($_SESSION['bonus_state'])) {
|
|
|
+ $this->mRates = new RateMoney($_SESSION['bonus_rate']);
|
|
|
+ $this->mBonusState = $_SESSION['bonus_state'];
|
|
|
+ } else {
|
|
|
+ $fUpdate = true;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- else {
|
|
|
- $this->mRates = new RateMoney(unserialize($available_bonus));
|
|
|
+
|
|
|
+ if($fUpdate)
|
|
|
+ {
|
|
|
+ $mod_bonus = Model('user_bonus');
|
|
|
+ $this->mRates = new RateMoney(array());
|
|
|
+ $items = $mod_bonus->getUsableBonus($this->member_id);
|
|
|
+ $this->mRates->add_bonuses($items);
|
|
|
+ $this->mRates->balance($this->mTotal_value);
|
|
|
+ $bonus_rate = $this->mRates->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,$bonus_rate);
|
|
|
+ $this->mRates->clean();
|
|
|
}
|
|
|
- $this->mRateVersion = $pd_array['rate_version'];
|
|
|
}
|
|
|
|
|
|
public function __destruct()
|
|
|
{
|
|
|
if($this->mRates != null && $this->mRates->dirty()) {
|
|
|
- $data = $this->mRates->format();
|
|
|
- $member = Model('member');
|
|
|
- $member->editMember(array('member_id' => $this->member_id),array('available_bonus' => serialize($data)));
|
|
|
+ $this->del_rates();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public function bonus_state()
|
|
|
- {
|
|
|
- $ret = $this->read_rates();
|
|
|
- if($ret != false) {
|
|
|
- return $ret;
|
|
|
- }
|
|
|
-
|
|
|
- $result = [];
|
|
|
- $mod_bonus = Model('user_bonus');
|
|
|
- $querys = array('usable','expiring','used','expired');
|
|
|
- foreach ($querys as $state) {
|
|
|
- $cond = $this->query_cond($state);
|
|
|
- $sum = $mod_bonus->getSum($cond);
|
|
|
- $result[$state] = doubleval($sum);
|
|
|
- }
|
|
|
- $this->write_rates($result);
|
|
|
- return $result;
|
|
|
+ public function bonus_state() {
|
|
|
+ return $this->mBonusState;
|
|
|
}
|
|
|
|
|
|
private function query_cond($query_state)
|
|
@@ -162,10 +232,14 @@ class predeposit_helper
|
|
|
{
|
|
|
if($query_state == 'usable') {
|
|
|
$cond['remain_amount'] = array('gt','0.00');
|
|
|
+ $cond['expired'] = 0;
|
|
|
} elseif ($query_state == 'expiring') {
|
|
|
$cond['usable_time'] = array('elt',time() + 5 * $day_secs);
|
|
|
+ $cond['remain_amount'] = array('gt','0.00');
|
|
|
+ $cond['expired'] = 0;
|
|
|
} elseif ($query_state == 'used') {
|
|
|
$cond['remain_amount'] = '0.00';
|
|
|
+ $cond['expired'] = 0;
|
|
|
} elseif ($query_state == 'expired') {
|
|
|
$cond['expired'] = 1;
|
|
|
} else {
|
|
@@ -175,47 +249,34 @@ class predeposit_helper
|
|
|
return $cond;
|
|
|
}
|
|
|
|
|
|
- private function read_rates()
|
|
|
- {
|
|
|
- if(isset($_SESSION['bonus_rate_version']) == false) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- $version = $_SESSION['bonus_rate_version'];
|
|
|
- if($version != $this->mRateVersion) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- if(isset($_SESSION['bonus_rate'])) {
|
|
|
- return $_SESSION['bonus_rate'];
|
|
|
- } else {
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private function write_rates($bonus_rate)
|
|
|
+ private function write_rates($bonus_state,$bonus_rate)
|
|
|
{
|
|
|
+ $_SESSION['bonus_state'] = $bonus_state;
|
|
|
$_SESSION['bonus_rate'] = $bonus_rate;
|
|
|
$_SESSION['bonus_rate_version'] = $this->mRateVersion;
|
|
|
}
|
|
|
|
|
|
private function del_rates()
|
|
|
{
|
|
|
+ if(array_key_exists('bonus_state',$_SESSION)) {
|
|
|
+ unset($_SESSION['bonus_state']);
|
|
|
+ }
|
|
|
if(array_key_exists('bonus_rate',$_SESSION)) {
|
|
|
unset($_SESSION['bonus_rate']);
|
|
|
}
|
|
|
+
|
|
|
if(array_key_exists('bonus_rate_version',$_SESSION)) {
|
|
|
unset($_SESSION['bonus_rate_version']);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
public function topup_bonus($mobile)
|
|
|
{
|
|
|
$bonuses = bonus_helper::topup_bonus($mobile);
|
|
|
if($bonuses != false) {
|
|
|
$this->del_rates();
|
|
|
- } else {
|
|
|
- //todo 此处增加红包
|
|
|
}
|
|
|
+
|
|
|
return $bonuses;
|
|
|
}
|
|
|
|