/** * 操作预存款金额 * @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); }