|
- <?php
-
- namespace backend\modules\hotel\controllers;
-
- use backend\modules\hotel\models\OrderMain;
- use backend\modules\hotel\models\Report;
- use backend\modules\hotel\models\SaleReport;
- use backend\modules\hotel\models\User;
- use backend\modules\zzcs\models\OrderFinanceReparations;
- use common\components\zPhpExcel;
- use Yii;
- use yii\helpers\Json;
-
- /**
- * 报表 controller for the `Hotel` module
- */
- class ReportController extends HotelController
- {
- /**
- * User: wangxj
- *
- * 酒店销售统计
- *
- * @return string
- */
- public function actionSales()
- {
- $this->writeLog('hotelSales');
- $obj = new Report();
- if(Yii::$app->request->isPost)
- $obj->load(Yii::$app->request->post());
- else if(Yii::$app->request->isGet)
- $obj->load(Yii::$app->request->get());
- $data['data'] = $obj->getNewReport();
- $data['model'] = new OrderMain();
- $searchModel = $obj;
- $data['export_url'] = Yii::$app->urlManager->createUrl(['hotel/report/export-hotel-report', 'hotel_id' => $searchModel['hotel_id'], 'Report[org_sale_id]' => $searchModel['org_sale_id'], 'Report[start_date]' => $searchModel['start_date']
- , 'Report[end_date]' => $searchModel['end_date'], 'Report[date_type]' => $searchModel['date_type']]);
- if(Yii::$app->request->isAjax) {
- return $this->renderPartial('report', ['view' => '_hotelSales', 'searchModel' => $searchModel, 'data' => $data]);
- } else {
- return $this->render('report', ['view' => '_hotelSales', 'searchModel' => $searchModel, 'data' => $data]);
- }
- }
-
- /**
- * User: luocj
- *
- * 酒店销售统计订单钻取
- *
- * @return string
- */
- public function actionHotelSalesRoom()
- {
- $obj = new Report();
- if(Yii::$app->request->isPost)
- $obj->load(Yii::$app->request->post());
- else if(Yii::$app->request->isGet)
- $obj->load(Yii::$app->request->get());
- $data = $obj->getOrderList();
- $data['model'] = new OrderMain();
- $searchModel = $obj;
- $data['export_url'] = Yii::$app->urlManager->createUrl(['hotel/report/export-order-list',
- 'org_sale_id' => $searchModel['org_sale_id'],
- 'hotel_id' => $searchModel['hotel_id'],
- 'start_date' => $searchModel['start_date'],
- 'end_date' => $searchModel['end_date'],
- 'date_type' => $searchModel['date_type'],
- 'user_id' => $searchModel['user_id'],
- 'room_type' => $searchModel['room_type'],
- 'send_user_id' => $searchModel['send_user_id'],
- 'principal_id' => $searchModel['principal_id'],
- 'purchaser_id' => $searchModel['purchaser_id'],
- 'op' => $searchModel['op'],
- ]);
- if(Yii::$app->request->isAjax) {
- return $this->renderPartial('report', ['view' => '_hotelSalesRoom', 'searchModel' => $searchModel, 'data' => $data]);
- } else {
- return $this->render('report', ['view' => '_hotelSalesRoom', 'searchModel' => $searchModel, 'data' => $data]);
- }
- }
-
- /**
- * User: luocj
- *
- * 酒店销售统计二层渠道
- *
- * @return string
- */
- public function actionSalesChannel()
- {
- $obj = new Report();
- if(Yii::$app->request->isPost)
- $obj->load(Yii::$app->request->post());
- else if(Yii::$app->request->isGet)
- $obj->load(Yii::$app->request->get());
- $data['data'] = $obj->getNewReport();
- $data['model'] = new OrderMain();
- $searchModel = $obj;
- $data['export_url'] = Yii::$app->urlManager->createUrl(['hotel/report/export-hotel-report',
- 'Report[org_sale_id]' => $searchModel['org_sale_id'],
- 'Report[start_date]' => $searchModel['start_date'],
- 'Report[end_date]' => $searchModel['end_date'],
- 'Report[date_type]' => $searchModel['date_type'],
- 'op' => 'orgSale',
- 'hotel_id' => $searchModel['hotel_id']]);
-
- if(Yii::$app->request->isAjax) {
- return $this->renderPartial('report', ['view' => '_hotelSalesChannel', 'searchModel' => $searchModel, 'data' => $data]);
- } else {
- return $this->render('report', ['view' => '_hotelSalesChannel', 'searchModel' => $searchModel, 'data' => $data]);
- }
- }
-
- /**
- * User: luocj
- *
- * 酒店销售统计三层房型
- *
- * @return string
- */
- public function actionSalesChannelRoom()
- {
- $obj = new Report();
- if(Yii::$app->request->isPost)
- $obj->load(Yii::$app->request->post());
- else if(Yii::$app->request->isGet)
- $obj->load(Yii::$app->request->get());
- $data['data'] = $obj->getNewReport();
- $data['model'] = new OrderMain();
- $searchModel = $obj;
- $data['export_url'] = Yii::$app->urlManager->createUrl([
- 'hotel/report/export-hotel-report',
- 'Report[org_sale_id]' => $searchModel['org_sale_id'],
- 'Report[start_date]' => $searchModel['start_date'],
- 'room_type' => $searchModel['room_type'],
- 'Report[end_date]' => $searchModel['end_date'],
- 'Report[date_type]' => $searchModel['date_type'],
- 'hotel_id' => $searchModel['hotel_id'],
- 'org_sale_id' => $searchModel['org_sale_id'],
- 'op' => 'roomInfo']);
-
- if(Yii::$app->request->isAjax) {
- return $this->renderPartial('report', ['view' => '_hotelSalesChannelRoom', 'searchModel' => $searchModel, 'data' => $data]);
- } else {
- return $this->render('report', ['view' => '_hotelSalesChannelRoom', 'searchModel' => $searchModel, 'data' => $data]);
- }
- }
-
- /**
- * User: wangxj
- * 客服 采购 运营
- */
- public function actionCustomer()
- {
- $obj = new Report();
- if(Yii::$app->request->isPost)
- $obj->load(Yii::$app->request->post());
- else if(Yii::$app->request->isGet)
- $obj->load(Yii::$app->request->get());
- if($obj->op == 'getInfo') {
- $obj->op = 'cusService';
- }
-
- $data['data'] = $obj->getNewReport();
- $data['model'] = new OrderMain();
- $searchModel = $obj;
- $data['export_url'] = Yii::$app->urlManager->createUrl(['hotel/report/export-hotel-report',
- 'Report[org_sale_id]' => $searchModel['org_sale_id'],
- 'Report[start_date]' => $searchModel['start_date'],
- 'op' => $searchModel['op'],
- 'Report[hotel_id]' => $searchModel['hotel_id'],
- 'Report[end_date]' => $searchModel['end_date'],
- 'Report[date_type]' => $searchModel['date_type']]);
-
- if(Yii::$app->request->isAjax) {
- return $this->renderPartial('report', ['view' => '_allHotelSales', 'searchModel' => $searchModel, 'data' => $data]);
- } else {
- return $this->render('report', ['view' => '_allHotelSales', 'searchModel' => $searchModel, 'data' => $data]);
- }
- }
-
- /**
- * User: wangxj
- *
- * 采购业绩统计
- *
- */
- public function actionPurchase()
- {
- $this->writeLog('Purchase');
- $obj = new Report();
- $obj->load(Yii::$app->request->post());
- $obj->op = 'purchaser';
- $data = $obj->getReportInfo_new();
- if(Yii::$app->request->isAjax) {
- return true;
- } else {
- return $this->render('report', ['view' => '_hotelSales', 'data' => $data]);
- }
- }
-
- /**
- * User:Steven
- *
- * 销售渠道统计
- * @return string
- */
- public function actionSaleChannel()
- {
- $this->writeLog('SaleChannel');
- $obj = new Report();
- $obj->op = 'orgSale';
- if(Yii::$app->request->isPost)
- $obj->load(Yii::$app->request->post());
- else if(Yii::$app->request->isGet)
- $obj->load(Yii::$app->request->get());
- $data['data'] = $obj->getNewReport();
- $data['model'] = new OrderMain();
- $searchModel = $obj;
- $data['export_url'] = Yii::$app->urlManager->createUrl(['hotel/report/export-hotel-report',
- 'Report[org_sale_id]' => $searchModel['org_sale_id'],
- 'Report[start_date]' => $searchModel['start_date'],
- 'Report[end_date]' => $searchModel['end_date'],
- 'Report[date_type]' => $searchModel['date_type'],
- 'op' => 'orgSale',
- 'hotel_id' => $searchModel['hotel_id']]);
-
- if(Yii::$app->request->isAjax) {
- return $this->renderPartial('report', ['view' => '_hotelSalesChannel', 'searchModel' => $searchModel, 'data' => $data, 'url' => 'hotel/report/sales']);
- } else {
- return $this->render('report', ['view' => '_hotelSalesChannel', 'searchModel' => $searchModel, 'data' => $data, 'url' => 'hotel/report/sales']);
- }
- }
-
-
- /**
- * User:luocj
- * 酒店层面维度统计报表
- */
- public function actionExportHotelReport()
- {
- $obj = new Report();
- if(Yii::$app->request->isPost)
- $obj->load(Yii::$app->request->post());
- else if(Yii::$app->request->isGet)
- $obj->load(Yii::$app->request->get());
- $data_temp = $obj->getNewReport();
- if($obj->op == 'getInfo') {
- $tabel_name = '酒店销售统计';
- $first_name = '酒店';
- } elseif($obj->op == 'orgSale') {
- $tabel_name = '酒店销售渠道分布统计';
- $first_name = '渠道';
- } elseif($obj->op == 'roomInfo') {
- $tabel_name = '酒店渠道销售房型统计';
- $first_name = '房型';
- } elseif($obj->op == 'cusService') {
- $tabel_name = '酒店非直连订单客服跟单统计';
- $first_name = '跟单客服';
- } elseif($obj->op == 'purchaser') {
- $tabel_name = '酒店采购业绩统计';
- $first_name = '采购人';
- } elseif($obj->op == 'principal') {
- $tabel_name = '酒店运营业绩统计';
- $first_name = '运营人';
- } elseif($obj->op == 'cusServiceSend') {
- $tabel_name = '酒店直连订单发单工作业绩统计';
- $first_name = '姓名';
- }
-
- //改版后的
- $data['data']['all'][0] = [
- 'order_num' => $data_temp['total']['total_order_num'],
- 'room_count' => $data_temp['total']['total_room_num'],
- 'room_rate' => $data_temp['total']['total_mom_room_count'],
- 'sales_value' => $data_temp['total']['total_order_price'],
- 'sales_rate' => $data_temp['total']['total_mom_order_price'],
- 'cost_value' => $data_temp['total']['total_base_price'],
- 'commission_value' => $data_temp['total']['total_commission_total'],
- 'peiru_sum' => $data_temp['total']['total_compensate_in'],
- 'peichu_sum' => $data_temp['total']['total_compensate_out'],
- 'profit_value' => $data_temp['total']['total_order_profit'],
- 'profit_rate' => $data_temp['total']['total_mom_profit_value'],
- 'gross_rate' => $data_temp['total']['total_price_rate'],
-
- ];
- $data_title = array('序号', $first_name, '订单数', '间夜数', '间夜数月环比', '销售额', '销售额月环比', '采购成本', '渠道佣金', '赔入', '赔出', '毛利', '毛利月环比', '毛利率');
- $data['data']['list'] = [];
- foreach ($data_temp['order_info'] as $k => $v) {
- $data['data']['list'][$k]['num'] = $k + 1;
- if($obj->op == 'getInfo') {
- $data['data']['list'][$k]['channel_name'] = $v['PARENT_PROD_NAME'];
- } elseif($obj->op == 'orgSale') {
- $data['data']['list'][$k]['channel_name'] = $v['CHANNEL_NAME'];
- } elseif($obj->op == 'roomInfo') {
- $data['data']['list'][$k]['channel_name'] = $v['PROD_NAME'];
- } elseif($obj->op == 'cusService') {
- $data['data']['list'][$k]['channel_name'] = $v['user']['TRUE_NAME'];
- } elseif($obj->op == 'purchaser') {
- $data['data']['list'][$k]['channel_name'] = $v['PURCHASE_TRUE_NAME'];
- } elseif($obj->op == 'principal') {
- $data['data']['list'][$k]['principal'] = $v['PRINCIPAL_TRUE_NAME'];
- } elseif($obj->op == 'cusServiceSend') {
- $data['data']['list'][$k]['channel_name'] = $v['SEND_CREATE_USER'];
- }
- $data['data']['list'][$k]['order_count'] = $v['order_count'];
- $data['data']['list'][$k]['room_count'] = $v['room_count'];
- $data['data']['list'][$k]['room_rate'] = $v['room_count_mom'];
- $data['data']['list'][$k]['sales_value'] = $v['ORDER_PRICE'];
- $data['data']['list'][$k]['sales_rate'] = $v['order_price_mom'];
- $data['data']['list'][$k]['cost_value'] = $v['BASE_PRICE'];
- $data['data']['list'][$k]['commission_value'] = $v['TOTAL_COMMISSION'];
- $data['data']['list'][$k]['peiru'] = $v['compensate_in'];
- $data['data']['list'][$k]['peichu'] = $v['compensate_out'];
- $data['data']['list'][$k]['profit_value'] = $v['PROFIT_VALUE'];
- $data['data']['list'][$k]['profit_rate'] = $v['profit_value_mom'];
- $data['data']['list'][$k]['gross_rate'] = $v['price_rate'];
- //运营、采购负责人
- if($obj->op == 'getInfo') {
- $data['data']['list'][$k]['principal'] = $v['PRINCIPAL_TRUE_NAME'];
- $data['data']['list'][$k]['purchase'] = $v['PURCHASE_TRUE_NAME'];
- }
- }
-
- //如果是酒店纬度添加运营和采购
- if($obj->op == 'getInfo') {
- array_push($data_title, '运营负责人');
- array_push($data_title, '采购负责人');
- }
- $this->exportExcel($obj, $tabel_name, $data_title, $data['data']['all'], $data['data']['list']);
- }
-
- /**
- * User :Steven
- *
- * 生成统计报表的数据接口(定时任务维护(每天00:00执行一次))
- */
- public function actionUpdateStatisticsData()
- {
- $obj = new Report();
- $res = $obj->updateStatisticsData();
- $result = ['code' => 0, 'data' => $res];
-
- return Json::encode($result);
-
- }
-
-
- /**
- * User: wangxj
- *
- * 导出订单报表
- */
- public function actionExportOrderList()
- {
- $obj = new Report();
- $obj->load(Yii::$app->request->get());
- $data_title = array('预订时间', '订单编号', '订单渠道', '预订产品', '客人信息', '入住日期', '离店日期', '间夜数', '销售额', '采购成本', '渠道佣金', '毛利', '毛利率', '订单状态', '跟单客服', '运营负责人', '采购负责人', '赔出', '赔入');
- set_time_limit(1200);
- ini_set("memory_limit", "2048M");
- $data = $obj->getOrderList(); //订单列表
- $tmp = $data['data']['dataProvider'];
- $tmp->pagination = false;
- $tmp = $tmp->getModels();
- $data['all'] = [];
- $count = count($tmp);
- if($count > 0) {
- $data['list'] = [];
- foreach ($tmp as $key => $item) {
- $data['list'][$key]['CREATE_TIME'] = $item['CREATE_TIME'];
- $data['list'][$key]['ORDER_ID'] = $item['ORDER_ID'];
- $data['list'][$key]['SUPPLIER_NAME'] = $item['CHANNEL_NAME'];
- $data['list'][$key]['PROD_NAME'] = $item['PROD_NAME'];
- $data['list'][$key]['CUSTOMER_NAME'] = $item['CUSTOMER_NAME'] . ' ' . $item['CUSTOMER_MOBILE'];
- $data['list'][$key]['PROD_START_STATION_DATE'] = $item['PROD_START_STATION_DATE'];
- $data['list'][$key]['PROD_END_STATION_DATE'] = $item['PROD_END_STATION_DATE'];
- $data['list'][$key]['room_count'] = $item['room_count'];
- $data['list'][$key]['ORDER_PRICE'] = $item['ORDER_PRICE'];
- $data['list'][$key]['BASE_PRICE'] = $item['BASE_PRICE'];
- $data['list'][$key]['TOTAL_COMMISSION'] = $item['TOTAL_COMMISSION'];
- $data['list'][$key]['PROFIT'] = $item['ORDER_PRICE'] - $item['BASE_PRICE'] - $item['TOTAL_COMMISSION']+ $item['compensate_in'] - $item['compensate_out'];
- $item['ORDER_PRICE'] = $item['ORDER_PRICE'] + $item['compensate_in'] - $item['compensate_out'];
- $data['list'][$key]['PROFIT_RATE'] = $item['ORDER_PRICE'] == 0 ? "0%": number_format((($item['ORDER_PRICE'] - $item['BASE_PRICE'] - $item['TOTAL_COMMISSION']) / abs($item['ORDER_PRICE']) * 100), 2) . '%';
- $data['list'][$key]['ORDER_STATUS'] = $item['ORDER_STATUS_NAME'];
- $data['list'][$key]['TRUE_NAME'] = $item['INPUT_CREATE_USER'];
- $data['list'][$key]['PRINCIPAL'] = User::getPrincipal($item['PRINCIPAL_ID']);
- $data['list'][$key]['PURCHASE'] = $item['PURCHASE_TRUE_NAME'];
- $data['list'][$key]['COMPENSATE_OUT'] = $item['compensate_out'];
- $data['list'][$key]['COMPENSATE_IN'] = $item['compensate_in'];
- }
- }
-
- if($obj->op == 'getInfo') {
- $title = '酒店销售统计';
- } elseif($obj->op == 'orgSale') {
- $title = '酒店销售渠道分布统计';
- } elseif($obj->op == 'roomInfo') {
- $title = '酒店渠道销售房型统计';
- } elseif($obj->op == 'cusService') {
- $title = '酒店非直连订单客服跟单统计';
- } elseif($obj->op == 'purchaser') {
- $title = '酒店采购业绩统计';
- } elseif($obj->op == 'principal') {
- $title = '酒店运营业绩统计';
- } elseif($obj->op == 'cusServiceSend') {
- $title = '酒店直连订单发单工作业绩统计';
- } else {
- $title = '酒店订单统计';
- }
- $this->exportExcel($obj, $title, $data_title, [], $data['list']);
- }
-
- /**
- * User:Steven
- *
- * 导出Excel文件
- * @param $obj Report report对象
- * @param $file_name string 导出文件名称后缀
- * @param $data_title array 数据表头,title
- * @param $data_all array 合计数据列表
- * @param $data_list array 数据列表
- */
- public function exportExcel($obj, $file_name, $data_title, $data_all, $data_list)
- {
- // require Yii::getAlias('@backend') . "/common/PHPExcel/PHPExcel.php";
- $objPHPExcel = new zPhpExcel(); //实例化PHPExcel类
- $objSheet = $objPHPExcel->getActiveSheet(); //获取当前活动sheet的操作对象
- $sheet_title = $obj['start_date'] . '~' . $obj['end_date'] . ($obj['date_type'] == 1 ? '(预定时间)': ($obj['date_type'] == 2 ? '(入住时间)': '(离店日期)'));
- // $objSheet->setTitle($file_name); //给当前活动sheet的操作对象
- $objSheet->setTitle($sheet_title);
- $objPHPExcel->file_name = $file_name;
- $directory = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');
- $cell_num = count($data_title) - 1;
- $cell = $directory[$cell_num];
- $objSheet->mergeCells("A1:{$cell}1"); //合并单元格
- $objSheet->setCellValue('A1', $sheet_title . $file_name);
- $objSheet->getStyle("A1:{$cell}1")->getFont()->setName('微软雅黑')->setSize(15)->setBold(True);
- $objSheet->getStyle("A1:{$cell}1")->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER)->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);;
- $objSheet->getStyle("A1:{$cell}1")->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB('A6A6A6');
- $objSheet->getStyle("A2:{$cell}2")->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB('CCCCCC');
-
- foreach ($data_title as $k => $v) {
- $objSheet->setCellValue($directory[$k] . '2', $v);
- }
- $objSheet->setCellValue('A3', '-');
- $objSheet->setCellValue('B3', '合计');
- for ($i = 0; $i < count($data_all); $i++) {
- $list = array_values($data_all[$i]);
- foreach ($list as $k => $v) {
- $objSheet->setCellValue($directory[$k + 2] . '3', $v);
- }
- }
- for ($j = 0; $j < count($data_list); $j++) {
- $list = array_values($data_list[$j]);
- foreach ($list as $k => $v) {
- $objSheet->setCellValue($directory[$k] . ($j + 4), $v);
- $objSheet->getColumnDimension($directory[$k])->setWidth(10);
- }
- }
- $objPHPExcel->output();
- }
-
- /**
- * 导出到浏览器
- * @param $type
- * @param $fileName
- */
- private function browserExport($type, $fileName)
- {
- if($type == '05') { //输出xls文件
- header('Content-Type: application/vnd.ms-excel');
- } else { //输出xlsx文件
- header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
- }
- header('Content-Disposition: attachment;filename="' . $fileName . '"');
- header('Cache-Control: max-age=0');//禁止缓存
- }
-
- function writeLog($log)
- {
- $backtrace = debug_backtrace();
- array_shift($backtrace);
- $dir = __DIR__ . "/../Log/";
- if(!is_dir($dir)) {
- mkdir($dir);
- }
- $filename = $dir . Yii::$app->user->id . '_' . $log . ".log";
- $need_chmod = file_exists($filename);
- $log_str = '[' . date("Y-m-d H:i:s") . ']';
- file_put_contents($filename, $log_str . PHP_EOL, FILE_APPEND);
- if($need_chmod == false) {
- @chmod($filename, 0777);
- }
- }
-
- public function getClientIP()
- {
- global $ip;
- if(getenv("HTTP_CLIENT_IP"))
- $ip = getenv("HTTP_CLIENT_IP");
- else if(getenv("HTTP_X_FORWARDED_FOR"))
- $ip = getenv("HTTP_X_FORWARDED_FOR");
- else if(getenv("REMOTE_ADDR"))
- $ip = getenv("REMOTE_ADDR");
- else $ip = "Unknow";
-
- return $ip;
- }
-
-
- }
|