123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592 |
- <?php
- /**
- * 根据优惠券统计订单控制器
- * @author zhouxuchen 2015-10-13
- */
- class CouponsCountViewController extends AdminController {
- /**
- * 首页
- */
- public function actionIndex () {
- $status_option = Coupon::$status_option;
- $time_range = array(
- 'noSelect' => array('name' => '未选择'),
- 'Months' => array('name' => '最近半年'),
- 'Weeks' => array('name' => '最近一月'),
- 'Days' => array('name' => '最近一周')
- );
- $status_filter = CommonFn::getComboboxData($status_option, 1, true, 100);
- $time_filter = CommonFn::getComboboxData($time_range, 'noSelect', false, '');
- $data = array(
- 'status_filter' => $status_filter,
- 'time_filter' => $time_filter
- );
- $this->render('index', $data);
- }
- /**
- * 显示列表
- */
- public function actionList () {
- // echo json_encode(array());return;
- $date_start = Yii::app()->request->getParam('date_start', '');
- $date_end = Yii::app()->request->getParam('date_end', '');
- $status = intval(Yii::app()->request->getParam('status', 100));
- if (!empty($date_start) && !empty($date_end)) {
- $date_start = strtotime($date_start);
- $int_start_date = intval(date('Ymd',$date_start));
- $date_end = strtotime('+1 day', strtotime($date_end));
- $int_end_date = intval(date('Ymd',$date_end));
- } else {
- $date_start = 0;
- $int_start_date = intval(date('Ymd'));
- $date_end = 0;
- $int_end_date = intval(date('Ymd')) + 1;
- }
- $criteria = new EMongoCriteria();
- $criteria->date('>=',$int_start_date);
- $criteria->date('<',$int_end_date);
- $count_list = OfflineOrderCount::model()->findAll($criteria);
- $offline_order_sum['title'] = '线下推广用户完成首单数';
- $offline_order_sum['value'] = 0;
- foreach ($count_list as $offline_order_count) {
- $offline_order_sum['value'] += $offline_order_count->count;
- }
- $data = $this->getAll($date_start, $date_end, true, $status, true);
- $total = $data['total'];
- $data = $data['data'];
- $offline = array(array(
- 'price' => 0,
- 'final_price' => 0,
- 'count' => $offline_order_sum['value'],
- 'id' => '',
- 'name' => $offline_order_sum['title'],
- 'memo' => '',
- 'status' => 1,
- 'status_str' => '正常',
- 'alias_name' => '',
- ));
- $data = array_merge($offline,$data);
- echo CommonFn::composeDatagridData($data, $total);
- }
- /**
- * 返回数据生成柱状图
- */
- public function actionGetChartBar () {
- $time_filter = Yii::app()->request->getParam('time_filter', 'noSelect');
- $status_filter = intval(Yii::app()->request->getParam('status_filter', 100));
- $date_start = Yii::app()->request->getParam('date_start', '');
- $date_end = Yii::app()->request->getParam('date_end', '');
- if ($time_filter == 'noSelect') {
- $data = array();
- } else {
- // 默认查询一周数据
- if (empty($date_start) || empty($date_end)) {
- $date_range = $this->getDateRnage($time_filter);
- $date_start = $date_range['date_start'];
- $date_end = $date_range['date_end'];
- } else {
- $date_start = strtotime($date_start);
- $date_end = strtotime('+1 day', strtotime($date_end));
- }
- $data = $this->getBarData($status_filter, $time_filter, $date_start, $date_end);
- }
- echo json_encode($data);
- }
- /**
- * 返回数据生成饼状图
- */
- public function actionGetChartPie () {
- $time_filter = Yii::app()->request->getParam('time_filter', 'noSelect');
- $status_filter = intval(Yii::app()->request->getParam('status_filter', 100));
- $date_start = Yii::app()->request->getParam('date_start', '');
- $date_end = Yii::app()->request->getParam('date_end', '');
- // 时间范围处理
- // 检查是否填写了时间范围
- if (!empty($date_start) && !empty($date_end)) {
- $date_start = strtotime($date_start);
- $date_end = strtotime('+1 day', strtotime($date_end));
- // 否则挑选时间范围
- } else {
- // 获取时间点
- if ($time_filter != 'noSelect') {
- $date_range = $this->getDateRnage($time_filter);
- $date_start = $date_range['date_start'];
- $date_end = $date_range['date_end'];
- // 查询所有数据
- } else {
- $date_start = $date_end = 0;
- }
- }
- $data = $this->getPieData($status_filter, $date_start, $date_end);
- echo json_encode($data);
- }
- /**
- * 返回数据生成单个优惠券的柱状图及折线图
- */
- public function actionGetChartById () {
- $id = Yii::app()->request->getParam('id', '');
- $date_start = Yii::app()->request->getParam('date_start', '');
- $date_end = Yii::app()->request->getParam('date_end', '');
- $time_filter = Yii::app()->request->getParam('time_filter', 'noSelect');
- $filter_week = Yii::app()->request->getParam('filter_week', 0);
- if ($id == '' || $time_filter == 'noSelct') {
- echo json_encode(array());
- return false;
- }
- $coupon_id = new MongoId($id);
- // 检查是否选择了时间范围
- if ($time_filter != 'Days' || ($filter_week == 1 && $time_filter == 'Days')) {
- $date_range = $this->getDateRnage($time_filter);
- $date_start = $date_range['date_start'];
- $date_end = $date_range['date_end'];
- // 否则获取具体时间
- } else if (!empty($date_start) && !empty($date_end)) {
- $date_start = strtotime($date_start);
- $date_end = strtotime('+1 day', strtotime($date_end));
- } else {
- echo json_encode(array());
- return false;
- }
-
- $data = $this->getBarDataById($coupon_id, $time_filter, $date_start, $date_end);
- echo json_encode($data);
- }
- /**
- * ----------------------------------
- *
- * 私有方法,对数据进行整理
- *
- * ----------------------------------
- */
- /**
- * 获取所有数据的统计
- * @param timestamp $date_start : 开始的日期
- * @param timestamp $date_end : 结束的日期
- * @param boolean $empty_data : 是否加入空数据
- * @param number $status_filter : 状态筛选,默认查询所有状态
- * @param boolean $pageParam : 是否加入分页信息
- */
- private function getAll ($date_start = 0, $date_end = 0, $empty_data = false, $status_filter = 100, $pageParam = false) {
- $data = array();
- $coupons = $this->getCoupons($status_filter, $pageParam);
- if ($pageParam) {
- $data['total'] = $coupons['total'];
- $coupons = $coupons['rows'];
- if ($data['total'] == 0) {
- return array('total' => 0, 'data' => array());
- }
- }
- foreach ($coupons as $key => $value) {
- $alias_name = isset($value['alias_name']) ? $value['alias_name'] : '';
- $data_temp = array(
- 'price' => 0,
- 'final_price' => 0,
- 'count' => 0,
- 'id' => (string)$value['_id'],
- 'name' => $value['name'].'('.$alias_name.')',
- 'memo' => $value['memo'],
- 'status' => $value['status'],
- 'status_str' => $this->getStatusStr($value['status']),
- 'alias_name' => $alias_name
- );
- $orderRows = $this->getOrderRows($value['_id'], $date_start, $date_end);
- if (empty($orderRows)) {
- if ($empty_data) {
- $data['data'][] = $data_temp;
- }
- continue;
- }
- foreach ($orderRows as $k => $v) {
- $data_temp['price'] += $v['price'];
- $data_temp['final_price'] += $v['final_price'];
- }
- $data_temp['count'] = count($orderRows);
- $data['data'][] = $data_temp;
- }
- return $data;
- }
- /**
- * 根据状态获取优惠券数组
- * @param number $status : 状态码,默认为100(所有状态)
- * @param boolean $pageParam : 是否加入分页信息
- */
- private function getCoupons ($status_filter = 100, $pageParam = false) {
- $pageParams = CommonFn::getPageParams();
- $criteria = $pageParam ? new EMongoCriteria($pageParams) : new EMongoCriteria();
- if ($status_filter != 100) $criteria->status('==', $status_filter);
- $cursor = Coupon::model()->findAll($criteria);
- $rows = CommonFn::getRowsFromCursor($cursor);
- $total = count($cursor);
- if ($pageParam) {
- $rows['rows'] = $rows;
- $rows['total'] = $total;
- }
- return $rows;
- }
- /**
- * 根据优惠券ID获取使用该优惠券的所有订单
- * @param MongoID $coupon_id : 优惠券ID,来自于coupon表
- * @param timestamp $date_start : 开始的时间,默认为0(查询所有)
- * @param timestamp $date_end : 结束的时间,默认为0(查询所有)
- */
- private function getOrderRows ($coupon_id, $date_start = 0, $date_end = 0) {
- $criteria = new EMongoCriteria();
- $criteria->coupon('==', $coupon_id);
- $criteria->status('==', -1);
- $cursor = UserCoupon::model()->findAll($criteria);
- $rows = CommonFn::getRowsFromCursor($cursor);
- $userCoupons = array();
- foreach ($rows as $value) {
- $userCoupons[] = $value['_id'];
- }
- $criteria = new EMongoCriteria();
- $criteria->coupons('in', $userCoupons);
- $criteria->status('>=', 1);
- if ($date_start != 0 && $date_end != 0) {
- $criteria->order_time('>=', $date_start);
- $criteria->order_time('<', $date_end);
- }
- $criteria->sort('order_time', EMongoCriteria::SORT_ASC);
- $cursor = ROrder::model()->findAll($criteria);
- $rows = CommonFn::getRowsFromCursor($cursor);
- return $rows;
- }
- /**
- * 获取时间范围
- * @return array $date_range : 时间范围数组,包括查询开始及结束的时间
- */
- private function getDateRnage ($time_filter) {
- // ------ 最近一月的时间点 ------
- if ($time_filter == 'Weeks') {
- $date_end = strtotime('monday', time());
- if (strtotime(date('Y-m-d', time())) == $date_end) {
- $date_end = strtotime('+7 day', $date_end);
- }
- $date_start = strtotime('-35 day', $date_end);
- // ------ 最近半年的时间点 ------
- } else if ($time_filter == 'Months') {
- $date_end = strtotime(date('Y-m', strtotime('+1 month', time())));
- $date_start = strtotime(date('Y-m', strtotime('-5 month', time())));
- // ------ 最近一周的时间点 ------
- } else {
- $date_end = strtotime(date('Y-m-d', strtotime('+1 day', time())));
- $date_start = strtotime(date('Y-m-d', strtotime('-6 day', time())));
- }
- $date_range = array(
- 'date_start' => $date_start,
- 'date_end' => $date_end
- );
- return $date_range;
- }
- /**
- * 获取柱状图数据,默认显示近一周的数据
- */
- private function getBarData ($status_filter, $time_filter, $date_start, $date_end) {
- // 获取优惠券数组
- $coupons = $this->getCoupons($status_filter);
- // 整理函数的选取
- $parseMethod = 'parseDataBy'.$time_filter;
- $data = array();
- $coupons_arr = array();
- foreach ($coupons as $key => $value) {
- $orderRows = $this->getOrderRows($value['_id'], $date_start, $date_end);
- // parseDataByDays()/parseDataByWeeks()/parseDataByMonths()
- $data_temp = $this->$parseMethod($orderRows, $date_start, $date_end);
- $alias_name = isset($value['alias_name']) ? $value['alias_name'] : '';
- $data_temp['coupon'] = $value['name'].'('.$alias_name.')';
- $coupons_arr[] = $value['name'].'('.$alias_name.')';
- $data['content'][] = $data_temp;
- }
- $getDateArrMethod = 'get'.$time_filter.'Arr';
- $data['date_arr'] = $this->$getDateArrMethod($date_start, $date_end);
- $data['coupons'] = $coupons_arr;
- return $data;
- }
- /**
- * 获取饼图数据,默认显示所有数据
- */
- private function getPieData ($status_filter = 100, $date_start = 0, $date_end = 0) {
- $data = array();
- $price = array();
- $final_price = array();
- $count = array();
- $coupons = array();
- $data_all = $this->getAll($date_start, $date_end, true, $status_filter, false);
- $data_all = $data_all['data'];
- $data_temp = array();
- foreach ($data_all as $key => $value) {
- $data_temp['price'] = $value['price'];
- $data_temp['final_price'] = $value['final_price'];
- $data_temp['count'] = $value['count'];
- $data_temp['coupon'] = $value['name'];
- $coupons[] = $value['name'];
- $data['content'][] = $data_temp;
- }
- $data['coupons'] = $coupons;
- return $data;
- }
- /**
- * 获取单个优惠券类型的数据,默认显示近一周的数据
- */
- public function getBarDataById ($coupon_id, $time_filter, $date_start, $date_end) {
- // 整理函数的选取
- $parseMethod = 'parseDataBy'.$time_filter;
- $orderRows = $this->getOrderRows($coupon_id, $date_start, $date_end);
- // parseDataByDays()/parseDataByWeeks()/parseDataByMonths()
- $data['content'] = $this->$parseMethod($orderRows, $date_start, $date_end);
- $getDateArrMethod = 'get'.$time_filter.'Arr';
- $data['date_arr'] = $this->$getDateArrMethod($date_start, $date_end);
- return $data;
- }
- /**
- * 返回优惠券状态字符串
- * @param number $status : 状态码
- */
- private function getStatusStr ($status) {
- switch ($status) {
- case 0:
- return '暂停';
- break;
- case 1:
- return '正常';
- break;
- case -1:
- return '删除';
- break;
- default:
- break;
- }
- return '未知';
- }
- /**
- * 按照每天整理数据(一周数据)
- */
- private function parseDataByDays ($rows, $date_start, $date_end) {
- $data = array();
- $date_index = $date_start;
- $rows_count = count($rows);
- $rows_index = 0;
- $price_arr = array();
- $final_price_arr = array();
- $count_arr = array();
- while ($date_index < $date_end) {
- $data_temp = array(
- 'price' => 0,
- 'final_price' => 0,
- 'count' => 0
- );
- while ($rows_index < $rows_count) {
- if ($date_index <= $rows[$rows_index]['order_time']
- && $rows[$rows_index]['order_time'] < strtotime('+1 day', $date_index)) {
- $data_temp['price'] += $rows[$rows_index]['price'];
- $data_temp['final_price'] += $rows[$rows_index]['final_price'];
- $data_temp['count']++;
- } else {
- break;
- }
- $rows_index++;
- }
- $price_arr[] = $data_temp['price'];
- $final_price_arr[] = $data_temp['final_price'];
- $count_arr[] = $data_temp['count'];
- $date_index = strtotime('+1 day', $date_index);
- }
- $data['price'] = $price_arr;
- $data['final_price'] = $final_price_arr;
- $data['count'] = $count_arr;
- return $data;
- }
- /**
- * 按照每周整理数据(一月数据)
- */
- private function parseDataByWeeks ($rows, $date_start, $date_end) {
- $rows = $this->parseDataByDays($rows, $date_start, $date_end);
- $range = ($date_end - $date_start)/3600/24/7;
- $data = array();
- $rows_index = 0;
- $day_count = 1;
- $date_index = $date_start;
- $price_arr = array();
- $final_price_arr = array();
- $count_arr = array();
- for ($week_index = 0; $week_index < $range; $week_index++) {
- $data_temp = array(
- 'price' => 0,
- 'final_price' => 0,
- 'count' => 0,
- );
- while ($day_count%8 != 0) {
- $data_temp['price'] += $rows['price'][$rows_index];
- $data_temp['final_price'] += $rows['final_price'][$rows_index];
- $data_temp['count'] += $rows['count'][$rows_index];
- $rows_index++;
- $day_count++;
- }
- $price_arr[] = $data_temp['price'];
- $final_price_arr[] = $data_temp['final_price'];
- $count_arr[] = $data_temp['count'];
- $day_count = 1;
- }
- $data['price'] = $price_arr;
- $data['final_price'] = $final_price_arr;
- $data['count'] = $count_arr;
- return $data;
- }
- /**
- * 按照每月整理数据(半年数据)
- */
- private function parseDataByMonths ($rows, $date_start, $date_end) {
- $rows = $this->parseDataByDays($rows, $date_start, $date_end);
- $range = intval(date('m', $date_end)) - intval(date('m', $date_start));
- // 每月天数获取
- $num_of_days = array();
- for ($i = 0; $i < $range; $i++) {
- $num_of_days[$i] = (strtotime('+'.($i+1).' month', $date_start) - strtotime('+'.$i.' month', $date_start))/3600/24;
- }
- $data = array();
- $data_index = 0;
- $day_count = 0;
- $date_index = $date_start;
- $price_arr = array();
- $final_price_arr = array();
- $count_arr = array();
- foreach ($num_of_days as $key => $value) {
- $day_count += $value;
- $data_temp = array(
- 'price' => 0,
- 'final_price' => 0,
- 'count' => 0
- );
- while ($data_index < $day_count) {
- $data_temp['price'] += $rows['price'][$data_index];
- $data_temp['final_price'] += $rows['final_price'][$data_index];
- $data_temp['count'] += $rows['count'][$data_index];
- $data_index++;
- }
- $price_arr[] = $data_temp['price'];
- $final_price_arr[] = $data_temp['final_price'];
- $count_arr[] = $data_temp['count'];
- }
- $data['price'] = $price_arr;
- $data['final_price'] = $final_price_arr;
- $data['count'] = $count_arr;
- return $data;
- }
- /**
- * 获取时间点数组
- */
- private function getDaysArr ($date_start, $date_end) {
- $date_arr = array();
- $date_index = $date_start;
- while ($date_index < $date_end) {
- $date_arr[] = date('m-d', $date_index);
- $date_index = strtotime('+1 day', $date_index);
- }
- $data['date_arr'] = $date_arr;
- return $date_arr;
- }
- private function getWeeksArr ($date_start, $date_end) {
- $week_arr = array();
- $date_index = $date_start;
- do {
- $week_temp = date('m-d', $date_index);
- $date_index = strtotime('+7 day', $date_index);
- $week_temp .= '至'.date('m-d', strtotime('-1 day', $date_index));
- $week_arr[] = $week_temp;
- } while ($date_index < $date_end);
- return $week_arr;
- }
- private function getMonthsArr ($date_start, $date_end) {
- $month_arr = array();
- $date_index = $date_start;
- while ($date_index < $date_end) {
- $month_arr[] = intval(date('m', $date_index)).'月';
- $date_index = strtotime('+1 month', $date_index);
- }
- return $month_arr;
- }
- }
- ?>
|