123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 |
- <?php
- /**
- * Circle Log
- *
- *
- *
- *
-
- */
- defined('InShopNC') or exit('Access Invalid!');
- class circle_expModel extends Model {
- public function __construct(){
- parent::__construct();
- }
- /**
- * Save Experience
- *
- * @param array $param
- */
- public function saveExp($param){
- switch ($param['type']){
- case 'release': // Release operations
- $this->relOperation($param);
- break;
- case 'reply': // Reply operations
- $this->relOperation($param);
- break;
- case 'replied': // Replied operations
- $this->repdOperation($param);
- break;
- case 'delRelease': // Delete operations for Release
- $this->delRelOperation($param);
- break;
- case 'delReplied': // Delete operations for Replied
- $this->delRepOperation($param);
- break;
- case 'master': // Master operations change experience
- $this->masOperation($param);
- break;
- }
- }
- /**
- * Release & Reply operations
- * @param array $param
- */
- private function relOperation($param){
- $exp = 0;
- $today = date('Y-m-d');
- $dexp = $param['type'] == 'release' ? intval(C('circle_exprelease')) : intval(C('circle_expreply'));
- if(intval(C('circle_expreleasemax')) != 0){
- $exp_info = $this->table('circle_expmember')->find($param['member_id']);
- if(!empty($exp_info) && $exp_info['em_time'] == $today){ // there are data
- $exp = ( $dexp > (intval(C('circle_expreleasemax'))-intval($exp_info['em_exp'])) ) ? (intval(C('circle_expreleasemax'))-intval($exp_info['em_exp'])) : $dexp;
- }else{ // There is no data
- $exp = ( $dexp > intval(C('circle_expreleasemax')) ) ? intval(C('circle_expreleasemax')) : $dexp ;
- }
- $insert = array();
- $insert['member_id'] = $param['member_id'];
- $insert['circle_id'] = $param['circle_id'];
- $insert['em_exp'] = empty($exp_info) || $today != $exp_info['em_time'] ? $exp : intval($exp_info['em_exp'])+$exp ;
- $insert['em_time'] = $today;
- $this->table('circle_expmember')->insert($insert, true);
- }else{
- $exp = $dexp;
- }
- if( $exp != 0 ){
- $param['exp'] = $exp;
- return $this->expOperation(1, $param);
- }
- }
- /**
- * Replied operations
- * @param array $param
- */
- private function repdOperation($param){
- $exp = 0; $today = date('Y-m-d');
- if(intval(C('circle_exprepliedmax')) != 0){
- $exp_info = $this->table('circle_exptheme')->find($param['theme_id']);
- if(!empty($exp_info) && $exp_info['et_time'] == $today){ // there are data
- $exp = ( intval(C('circle_expreplied')) > (intval(C('circle_exprepliedmax'))-intval($exp_info['et_exp'])) ) ? (intval(C('circle_exprepliedmax'))-intval($exp_info['et_exp'])) : intval(C('circle_expreplied'));
- }else{ // There is no data
- $exp = ( intval(C('circle_expreplied')) > (intval(C('circle_exprepliedmax'))) ) ? intval(C('circle_exprepliedmax')) : intval(C('circle_expreplied'));
- }
- $insert = array();
- $insert['theme_id'] = $param['theme_id'];
- $insert['et_exp'] = empty($exp_info) || $today != $exp_info['et_time'] ? $exp : intval($exp_info['et_exp'])+$exp;
- $insert['et_time'] = $today;
- $this->table('circle_exptheme')->insert($insert, true);
- }else{
- $exp = intval(C('circle_expelease'));
- }
- if($exp != 0){
- $param['exp'] = $exp;
- return $this->expOperation(1, $param);
- }
- }
- /**
- * Delete operations for Release
- * @param array $param
- */
- private function delRelOperation($param){
- return $this->expOperation(0, $param);
- }
- /**
- * Delete operations for Replied
- * @param array $param
- */
- private function delRepOperation($param){
- return $this->expOperation(0, $param);
- }
- /**
- * Master operations change experience
- * @param array $param
- */
- private function masOperation($param){
- return $this->expOperation(0, $param);
- }
- /**
- * Experience operations
- * @param int $type 1 increase, 0 decrease
- * @param array $param
- */
- private function expOperation($type, $param){
- $where = array();
- $where['member_id'] = $param['member_id'];
- $where['circle_id'] = $param['circle_id'];
- $cm_info = $this->table('circle_member')->where($where)->find();
- $update = array();
- if($type){
- $update['cm_exp'] = intval($cm_info['cm_exp'])+$param['exp'];
- // upgrade
- if( intval($cm_info['cm_nextexp']) != 0 && (intval($cm_info['cm_exp'])+$param['exp']) >= intval($cm_info['cm_nextexp']) && intval($cm_info['cm_level']) != 16 ){
- $data = rkcache('circle_level', true);
- $ml_info = $this->table('circle_ml')->find($param['circle_id']);
- $update['cm_level'] = intval($cm_info['cm_level'])+1;
- $update['cm_levelname'] = empty($ml_info) ? $data[$update['cm_level']]['mld_name'] : $ml_info['ml_'.$update['cm_level']];
- $update['cm_nextexp'] = $update['cm_level'] == 16 ? 0 : $data[$update['cm_level']+1]['mld_exp'];
- }
- }else{
- $update['cm_exp'] = intval($cm_info['cm_exp'])-$param['exp'];
- $data = rkcache('circle_level', true);
- $level = 0;
- foreach ($data as $val){
- $level = intval($val['mld_id'])-1;
- if(intval($val['mld_exp']) > $update['cm_exp']) break;
- }
- // upgrade
- if($level != intval($cm_info['cm_exp'])){
- $ml_info = $this->table('circle_ml')->find($param['circle_id']);
- $update['cm_level'] = $level;
- $update['cm_levelname'] = empty($ml_info) ? $data[$level]['mld_name'] : $ml_info['ml_'.$level];
- $update['cm_nextexp'] = $update['cm_level'] == 16 ? 0 : $data[$level+1]['mld_exp'];
- }
- }
- $rs = $this->table('circle_member')->where($where)->update($update);
- if($rs){
- $this->recordsLog($type, $param);
- }else{
- return false;
- }
- }
- /**
- * Records experience log
- */
- private function recordsLog($type, $param){
- $insert = array();
- $insert['circle_id'] = $param['circle_id'];
- $insert['member_id'] = $param['member_id'];
- $insert['member_name'] = $param['member_name'];
- $insert['el_exp'] = $type ? $param['exp'] : -$param['exp'];
- $insert['el_time'] = time();
- $insert['el_itemid'] = $param['itemid'];
- switch ($param['type']){
- case 'release':
- $update = array();
- $update['theme_id'] = $param['itemid'];
- $update['theme_exp']= array('exp', 'theme_exp+'.$param['exp']);
- $this->table('circle_theme')->update($update);
- $insert['el_type'] = 2;
- $insert['el_desc'] = L('circle_exp_release_theme');
- break;
- case 'reply':
- $update = array();
- $update['reply_exp']= array('exp', 'reply_exp+'.$param['exp']);
- $where = array();
- list($where['theme_id'],$where['reply_id']) = explode(',', $param['itemid']);
- $this->table('circle_threply')->where($where)->update($update);
- $insert['el_type'] = 3;
- $insert['el_desc'] = L('circle_exp_reply');
- break;
- case 'replied':
- $update = array();
- $update['theme_id'] = $param['theme_id'];
- $update['theme_exp']= array('exp', 'theme_exp+'.$param['exp']);
- $this->table('circle_theme')->update($update);
- $insert['el_type'] = 4;
- $insert['el_desc'] = L('circle_exp_theme_replied');
- break;
- case 'delRelease':
- $insert['el_type'] = 5;
- $insert['el_desc'] = L('circle_exp_theme_delete');
- break;
- case 'delReplied':
- $insert['el_type'] = 6;
- $insert['el_desc'] = L('circle_exp_reply_delete');
- break;
- case 'master':
- $insert['el_type'] = 1;
- $insert['el_desc'] = $param['desc'];
- break;
- }
- $this->table('circle_explog')->insert($insert);
- }
- }
|