public function start() { $r = Yii::app()->db->createCommand('SELECT aid, name, type, tx, d_rq FROM dc_animal ORDER BY d_rq DESC')->queryAll(); $prev_rank = Yii::app()->cache->get('d_rq_rank_report'); if (isset($prev_rank)) { foreach ($r as $k => $v) { $rank[$v['aid']] = $k; if (isset($prev_rank[$v['aid']]) && $prev_rank[$v['aid']] > $k) { $r[$k]['change'] = 1; } else { if (isset($prev_rank[$v['aid']]) && $prev_rank[$v['aid']] < $k) { $r[$k]['change'] = -1; } else { $r[$k]['change'] = 0; } } } } else { foreach ($r as $k => $v) { $rank[$v['aid']] = $k; $r[$k]['change'] = 0; } } //奖励计算 $total_member = Yii::app()->db->createCommand('SELECT COUNT(*) FROM dc_user')->queryScalar(); $total_a = Yii::app()->db->createCommand('SELECT COUNT(aid), SUM(d_rq) FROM dc_animal')->queryRow(); $all_gold = $total_member * RANK_REWARD_E; $total_popularity = $total_a['SUM(d_rq)']; $reward_count = round($total_a['COUNT(aid)'] * 30 / 100); for ($i = 0; $i < $reward_count; $i++) { $aid = $r[$i]['aid']; $single_popularity = $r[$i]['d_rq']; $total_gold = $all_gold * $single_popularity / $total_popularity; if ($total_gold != 0) { $circles = Circle::model()->findAllByAttributes(array('aid' => $aid)); foreach ($circles as $circle) { $result_money = round($total_gold * $circle->d_contri / $single_popularity); $user = User::model()->findByPk($circle->usr_id); $user->gold += $result_money; $user->saveAttributes(array('gold')); $self_rank = $i + 1; $msg = "您的王国/家族在人气日排行榜中获得第" . $self_rank . "名,您获得" . $result_money . "金币奖励"; Talk::model()->sendMsg(NPC_SYSTEM_USRID, $user->usr_id, $msg); } } } Yii::app()->cache->set('d_rq_rank_report', $rank, 3600 * 24); Yii::app()->cache->set('d_rq_rank', $r, 3600 * 24); }
public function actionSendGiftApi($item_id, $aid, $img_id = NULL, $is_shake = FALSE) { $itemList = Util::loadConfig('items'); $item = $itemList[$item_id]; if (isset($item)) { $transaction = Yii::app()->db->beginTransaction(); try { $user = User::model()->findByPk($this->usr_id); $ex_gold = $user->gold; $ex_exp = $user->exp; $ex_lv = $user->lv; if (!$is_shake) { $items = unserialize($user->items); if (isset($items[$item_id]) && $items[$item_id] > 0) { $items[$item_id]--; $user->items = serialize($items); $user->saveAttributes(array('items')); } else { throw new PException('礼物数量不足'); } } $user->sendGift($is_shake); $circle = Circle::model()->findByPk(array('aid' => $aid, 'usr_id' => $this->usr_id)); if (isset($circle)) { $ex_rank = $circle->rank; $circle->t_contri += $item['rq']; $circle->m_contri += $item['rq']; $circle->w_contri += $item['rq']; $circle->d_contri += $item['rq']; $user->contributionChange($circle); $circle->saveAttributes(array('t_contri', 'm_contri', 'w_contri', 'd_contri')); } $animal = Animal::model()->findByPk($aid); $animal->d_rq += $item['rq']; $animal->m_rq += $item['rq']; $animal->w_rq += $item['rq']; $animal->t_rq += $item['rq']; if ($animal->d_rq < 0) { $animal->d_rq = 0; } if ($animal->m_rq < 0) { $animal->m_rq = 0; } if ($animal->w_rq < 0) { $animal->w_rq = 0; } if ($animal->t_rq < 0) { $animal->t_rq = 0; } $a_items = unserialize($animal->items); if (isset($a_items[$item_id])) { $a_items[$item_id]++; } else { $a_items[$item_id] = 1; } $animal->items = serialize($a_items); $animal->saveAttributes(array('d_rq', 'm_rq', 'w_rq', 't_rq', 'items')); if (isset($img_id)) { $image = Image::model()->findByPk($img_id); $image->gifts++; if (isset($image->senders) && $image->senders != '') { $image->senders = $this->usr_id . ',' . $image->senders; } else { $image->senders = $this->usr_id; } $image->saveAttributes(array('gifts', 'senders')); } if ($is_shake) { $session = Yii::app()->session; if (isset($session[$aid . '_shake_count'])) { $session[$aid . '_shake_count'] -= 1; } else { $session[$aid . '_shake_count'] = 3; } } $news = new News(); $news->aid = $aid; $news->type = $item['rq'] >= 0 ? 4 : 7; $news->create_time = time(); $news->content = serialize(array('usr_id' => $user->usr_id, 'u_name' => $user->name, 'rank' => isset($circle) ? $circle->rank : -1, 'item_id' => $item_id, 'rq' => $item['rq'])); $news->save(); $transaction->commit(); $this->echoJsonData(array('exp' => $user->exp - $ex_exp, 'gold' => $user->gold - $ex_gold, 'lv' => $user->lv - $ex_lv, 'rank' => isset($circle) ? $circle->rank - $ex_rank : -1)); } catch (Exception $e) { $transaction->rollback(); throw $e; } } else { throw new PException('礼物不存在'); } }