circle_exp.model.php 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. <?php
  2. /**
  3. * Circle Log
  4. *
  5. *
  6. *
  7. *
  8. */
  9. defined('InShopNC') or exit('Access Invalid!');
  10. class circle_expModel extends Model {
  11. public function __construct(){
  12. parent::__construct();
  13. }
  14. /**
  15. * Save Experience
  16. *
  17. * @param array $param
  18. */
  19. public function saveExp($param){
  20. switch ($param['type']){
  21. case 'release': // Release operations
  22. $this->relOperation($param);
  23. break;
  24. case 'reply': // Reply operations
  25. $this->relOperation($param);
  26. break;
  27. case 'replied': // Replied operations
  28. $this->repdOperation($param);
  29. break;
  30. case 'delRelease': // Delete operations for Release
  31. $this->delRelOperation($param);
  32. break;
  33. case 'delReplied': // Delete operations for Replied
  34. $this->delRepOperation($param);
  35. break;
  36. case 'master': // Master operations change experience
  37. $this->masOperation($param);
  38. break;
  39. }
  40. }
  41. /**
  42. * Release & Reply operations
  43. * @param array $param
  44. */
  45. private function relOperation($param){
  46. $exp = 0;
  47. $today = date('Y-m-d');
  48. $dexp = $param['type'] == 'release' ? intval(C('circle_exprelease')) : intval(C('circle_expreply'));
  49. if(intval(C('circle_expreleasemax')) != 0){
  50. $exp_info = $this->table('circle_expmember')->find($param['member_id']);
  51. if(!empty($exp_info) && $exp_info['em_time'] == $today){ // there are data
  52. $exp = ( $dexp > (intval(C('circle_expreleasemax'))-intval($exp_info['em_exp'])) ) ? (intval(C('circle_expreleasemax'))-intval($exp_info['em_exp'])) : $dexp;
  53. }else{ // There is no data
  54. $exp = ( $dexp > intval(C('circle_expreleasemax')) ) ? intval(C('circle_expreleasemax')) : $dexp ;
  55. }
  56. $insert = array();
  57. $insert['member_id'] = $param['member_id'];
  58. $insert['circle_id'] = $param['circle_id'];
  59. $insert['em_exp'] = empty($exp_info) || $today != $exp_info['em_time'] ? $exp : intval($exp_info['em_exp'])+$exp ;
  60. $insert['em_time'] = $today;
  61. $this->table('circle_expmember')->insert($insert, true);
  62. }else{
  63. $exp = $dexp;
  64. }
  65. if( $exp != 0 ){
  66. $param['exp'] = $exp;
  67. return $this->expOperation(1, $param);
  68. }
  69. }
  70. /**
  71. * Replied operations
  72. * @param array $param
  73. */
  74. private function repdOperation($param){
  75. $exp = 0; $today = date('Y-m-d');
  76. if(intval(C('circle_exprepliedmax')) != 0){
  77. $exp_info = $this->table('circle_exptheme')->find($param['theme_id']);
  78. if(!empty($exp_info) && $exp_info['et_time'] == $today){ // there are data
  79. $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'));
  80. }else{ // There is no data
  81. $exp = ( intval(C('circle_expreplied')) > (intval(C('circle_exprepliedmax'))) ) ? intval(C('circle_exprepliedmax')) : intval(C('circle_expreplied'));
  82. }
  83. $insert = array();
  84. $insert['theme_id'] = $param['theme_id'];
  85. $insert['et_exp'] = empty($exp_info) || $today != $exp_info['et_time'] ? $exp : intval($exp_info['et_exp'])+$exp;
  86. $insert['et_time'] = $today;
  87. $this->table('circle_exptheme')->insert($insert, true);
  88. }else{
  89. $exp = intval(C('circle_expelease'));
  90. }
  91. if($exp != 0){
  92. $param['exp'] = $exp;
  93. return $this->expOperation(1, $param);
  94. }
  95. }
  96. /**
  97. * Delete operations for Release
  98. * @param array $param
  99. */
  100. private function delRelOperation($param){
  101. return $this->expOperation(0, $param);
  102. }
  103. /**
  104. * Delete operations for Replied
  105. * @param array $param
  106. */
  107. private function delRepOperation($param){
  108. return $this->expOperation(0, $param);
  109. }
  110. /**
  111. * Master operations change experience
  112. * @param array $param
  113. */
  114. private function masOperation($param){
  115. return $this->expOperation(0, $param);
  116. }
  117. /**
  118. * Experience operations
  119. * @param int $type 1 increase, 0 decrease
  120. * @param array $param
  121. */
  122. private function expOperation($type, $param){
  123. $where = array();
  124. $where['member_id'] = $param['member_id'];
  125. $where['circle_id'] = $param['circle_id'];
  126. $cm_info = $this->table('circle_member')->where($where)->find();
  127. $update = array();
  128. if($type){
  129. $update['cm_exp'] = intval($cm_info['cm_exp'])+$param['exp'];
  130. // upgrade
  131. 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 ){
  132. $data = rkcache('circle_level', true);
  133. $ml_info = $this->table('circle_ml')->find($param['circle_id']);
  134. $update['cm_level'] = intval($cm_info['cm_level'])+1;
  135. $update['cm_levelname'] = empty($ml_info) ? $data[$update['cm_level']]['mld_name'] : $ml_info['ml_'.$update['cm_level']];
  136. $update['cm_nextexp'] = $update['cm_level'] == 16 ? 0 : $data[$update['cm_level']+1]['mld_exp'];
  137. }
  138. }else{
  139. $update['cm_exp'] = intval($cm_info['cm_exp'])-$param['exp'];
  140. $data = rkcache('circle_level', true);
  141. $level = 0;
  142. foreach ($data as $val){
  143. $level = intval($val['mld_id'])-1;
  144. if(intval($val['mld_exp']) > $update['cm_exp']) break;
  145. }
  146. // upgrade
  147. if($level != intval($cm_info['cm_exp'])){
  148. $ml_info = $this->table('circle_ml')->find($param['circle_id']);
  149. $update['cm_level'] = $level;
  150. $update['cm_levelname'] = empty($ml_info) ? $data[$level]['mld_name'] : $ml_info['ml_'.$level];
  151. $update['cm_nextexp'] = $update['cm_level'] == 16 ? 0 : $data[$level+1]['mld_exp'];
  152. }
  153. }
  154. $rs = $this->table('circle_member')->where($where)->update($update);
  155. if($rs){
  156. $this->recordsLog($type, $param);
  157. }else{
  158. return false;
  159. }
  160. }
  161. /**
  162. * Records experience log
  163. */
  164. private function recordsLog($type, $param){
  165. $insert = array();
  166. $insert['circle_id'] = $param['circle_id'];
  167. $insert['member_id'] = $param['member_id'];
  168. $insert['member_name'] = $param['member_name'];
  169. $insert['el_exp'] = $type ? $param['exp'] : -$param['exp'];
  170. $insert['el_time'] = time();
  171. $insert['el_itemid'] = $param['itemid'];
  172. switch ($param['type']){
  173. case 'release':
  174. $update = array();
  175. $update['theme_id'] = $param['itemid'];
  176. $update['theme_exp']= array('exp', 'theme_exp+'.$param['exp']);
  177. $this->table('circle_theme')->update($update);
  178. $insert['el_type'] = 2;
  179. $insert['el_desc'] = L('circle_exp_release_theme');
  180. break;
  181. case 'reply':
  182. $update = array();
  183. $update['reply_exp']= array('exp', 'reply_exp+'.$param['exp']);
  184. $where = array();
  185. list($where['theme_id'],$where['reply_id']) = explode(',', $param['itemid']);
  186. $this->table('circle_threply')->where($where)->update($update);
  187. $insert['el_type'] = 3;
  188. $insert['el_desc'] = L('circle_exp_reply');
  189. break;
  190. case 'replied':
  191. $update = array();
  192. $update['theme_id'] = $param['theme_id'];
  193. $update['theme_exp']= array('exp', 'theme_exp+'.$param['exp']);
  194. $this->table('circle_theme')->update($update);
  195. $insert['el_type'] = 4;
  196. $insert['el_desc'] = L('circle_exp_theme_replied');
  197. break;
  198. case 'delRelease':
  199. $insert['el_type'] = 5;
  200. $insert['el_desc'] = L('circle_exp_theme_delete');
  201. break;
  202. case 'delReplied':
  203. $insert['el_type'] = 6;
  204. $insert['el_desc'] = L('circle_exp_reply_delete');
  205. break;
  206. case 'master':
  207. $insert['el_type'] = 1;
  208. $insert['el_desc'] = $param['desc'];
  209. break;
  210. }
  211. $this->table('circle_explog')->insert($insert);
  212. }
  213. }