Example #1
0
 /**
  * 操作预存款金额
  * @param string $opType increase:增加、reduce:扣除、freeze:冻结、unfreeze:解冻、reduce_freeze:扣除冻结金额
  * @param integer $memberId
  * @param float $balance
  * @param string $source
  * @param string $remarks
  * @param integer $creatorId
  * @return boolean
  */
 public function opBalance($opType, $memberId, $balance, $source, $remarks, $creatorId)
 {
     if ($opType !== 'increase' && $opType !== 'reduce' && $opType !== 'freeze' && $opType !== 'unfreeze' && $opType !== 'reduce_freeze') {
         return false;
     }
     if (($memberId = (int) $memberId) <= 0) {
         return false;
     }
     if (($balance = (double) $balance) <= 0) {
         return false;
     }
     if (($source = trim($source)) === '') {
         return false;
     }
     $tableName = $this->getTblprefix() . TableNames::getMembers();
     $logTblName = $this->getTblprefix() . TableNames::getBalanceLogs();
     $sql = 'SELECT `balance`, `balance_freeze` FROM `' . $tableName . '` WHERE `member_id` = ?';
     $row = $this->fetch($sql, $memberId);
     if (!$row || !is_array($row) || !isset($row['balance'])) {
         return false;
     }
     $beforeBalance = (double) $row['balance'];
     $beforeFreezeBalance = (double) $row['balance_freeze'];
     $freezeBalance = 0;
     if ($opType === 'freeze' || $opType === 'unfreeze' || $opType === 'reduce_freeze') {
         $freezeBalance = $balance;
         $balance = 0;
     }
     $afterFreezeBalance = $opType === 'freeze' ? $beforeFreezeBalance + $freezeBalance : $beforeFreezeBalance - $freezeBalance;
     switch (true) {
         case $opType === 'increase':
             $afterBalance = $beforeBalance + $balance;
             break;
         case $opType === 'reduce':
             $afterBalance = $beforeBalance - $balance;
             break;
         case $opType === 'freeze':
             $afterBalance = $beforeBalance - $freezeBalance;
             break;
         case $opType === 'unfreeze':
             $afterBalance = $beforeBalance + $freezeBalance;
             break;
         case $opType === 'reduce_freeze':
         default:
             $afterBalance = $beforeBalance;
             break;
     }
     if ($afterBalance < 0 || $afterBalance < 0) {
         return false;
     }
     $attributes = array('member_id' => $memberId, 'op_type' => $opType, 'before_balance' => $beforeBalance, 'after_balance' => $afterBalance, 'balance' => $balance, 'before_freeze_balance' => $beforeFreezeBalance, 'after_freeze_balance' => $afterFreezeBalance, 'freeze_balance' => $freezeBalance, 'source' => $source, 'remarks' => $remarks, 'creator_id' => (int) $creatorId, 'dt_created' => date('Y-m-d H:i:s'));
     $commands = array(array('sql' => 'UPDATE `' . $tableName . '` SET `balance` = ?, `balance_freeze` = ? WHERE `member_id` = ?', 'params' => array('balance' => $afterBalance, 'balance_freeze' => $afterFreezeBalance, 'member_id' => $memberId)), array('sql' => $this->getCommandBuilder()->createInsert($logTblName, array_keys($attributes)), 'params' => $attributes));
     return $this->doTransaction($commands);
 }