You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

514 lines
22 KiB

  1. <?php
  2. namespace backend\modules\hotel\controllers;
  3. use backend\modules\hotel\models\OrderMain;
  4. use backend\modules\hotel\models\Report;
  5. use backend\modules\hotel\models\SaleReport;
  6. use backend\modules\hotel\models\User;
  7. use backend\modules\zzcs\models\OrderFinanceReparations;
  8. use common\components\zPhpExcel;
  9. use Yii;
  10. use yii\helpers\Json;
  11. /**
  12. * 报表 controller for the `Hotel` module
  13. */
  14. class ReportController extends HotelController
  15. {
  16. /**
  17. * User: wangxj
  18. *
  19. * 酒店销售统计
  20. *
  21. * @return string
  22. */
  23. public function actionSales()
  24. {
  25. $this->writeLog('hotelSales');
  26. $obj = new Report();
  27. if(Yii::$app->request->isPost)
  28. $obj->load(Yii::$app->request->post());
  29. else if(Yii::$app->request->isGet)
  30. $obj->load(Yii::$app->request->get());
  31. $data['data'] = $obj->getNewReport();
  32. $data['model'] = new OrderMain();
  33. $searchModel = $obj;
  34. $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']
  35. , 'Report[end_date]' => $searchModel['end_date'], 'Report[date_type]' => $searchModel['date_type']]);
  36. if(Yii::$app->request->isAjax) {
  37. return $this->renderPartial('report', ['view' => '_hotelSales', 'searchModel' => $searchModel, 'data' => $data]);
  38. } else {
  39. return $this->render('report', ['view' => '_hotelSales', 'searchModel' => $searchModel, 'data' => $data]);
  40. }
  41. }
  42. /**
  43. * User: luocj
  44. *
  45. * 酒店销售统计订单钻取
  46. *
  47. * @return string
  48. */
  49. public function actionHotelSalesRoom()
  50. {
  51. $obj = new Report();
  52. if(Yii::$app->request->isPost)
  53. $obj->load(Yii::$app->request->post());
  54. else if(Yii::$app->request->isGet)
  55. $obj->load(Yii::$app->request->get());
  56. $data = $obj->getOrderList();
  57. $data['model'] = new OrderMain();
  58. $searchModel = $obj;
  59. $data['export_url'] = Yii::$app->urlManager->createUrl(['hotel/report/export-order-list',
  60. 'org_sale_id' => $searchModel['org_sale_id'],
  61. 'hotel_id' => $searchModel['hotel_id'],
  62. 'start_date' => $searchModel['start_date'],
  63. 'end_date' => $searchModel['end_date'],
  64. 'date_type' => $searchModel['date_type'],
  65. 'user_id' => $searchModel['user_id'],
  66. 'room_type' => $searchModel['room_type'],
  67. 'send_user_id' => $searchModel['send_user_id'],
  68. 'principal_id' => $searchModel['principal_id'],
  69. 'purchaser_id' => $searchModel['purchaser_id'],
  70. 'op' => $searchModel['op'],
  71. ]);
  72. if(Yii::$app->request->isAjax) {
  73. return $this->renderPartial('report', ['view' => '_hotelSalesRoom', 'searchModel' => $searchModel, 'data' => $data]);
  74. } else {
  75. return $this->render('report', ['view' => '_hotelSalesRoom', 'searchModel' => $searchModel, 'data' => $data]);
  76. }
  77. }
  78. /**
  79. * User: luocj
  80. *
  81. * 酒店销售统计二层渠道
  82. *
  83. * @return string
  84. */
  85. public function actionSalesChannel()
  86. {
  87. $obj = new Report();
  88. if(Yii::$app->request->isPost)
  89. $obj->load(Yii::$app->request->post());
  90. else if(Yii::$app->request->isGet)
  91. $obj->load(Yii::$app->request->get());
  92. $data['data'] = $obj->getNewReport();
  93. $data['model'] = new OrderMain();
  94. $searchModel = $obj;
  95. $data['export_url'] = Yii::$app->urlManager->createUrl(['hotel/report/export-hotel-report',
  96. 'Report[org_sale_id]' => $searchModel['org_sale_id'],
  97. 'Report[start_date]' => $searchModel['start_date'],
  98. 'Report[end_date]' => $searchModel['end_date'],
  99. 'Report[date_type]' => $searchModel['date_type'],
  100. 'op' => 'orgSale',
  101. 'hotel_id' => $searchModel['hotel_id']]);
  102. if(Yii::$app->request->isAjax) {
  103. return $this->renderPartial('report', ['view' => '_hotelSalesChannel', 'searchModel' => $searchModel, 'data' => $data]);
  104. } else {
  105. return $this->render('report', ['view' => '_hotelSalesChannel', 'searchModel' => $searchModel, 'data' => $data]);
  106. }
  107. }
  108. /**
  109. * User: luocj
  110. *
  111. * 酒店销售统计三层房型
  112. *
  113. * @return string
  114. */
  115. public function actionSalesChannelRoom()
  116. {
  117. $obj = new Report();
  118. if(Yii::$app->request->isPost)
  119. $obj->load(Yii::$app->request->post());
  120. else if(Yii::$app->request->isGet)
  121. $obj->load(Yii::$app->request->get());
  122. $data['data'] = $obj->getNewReport();
  123. $data['model'] = new OrderMain();
  124. $searchModel = $obj;
  125. $data['export_url'] = Yii::$app->urlManager->createUrl([
  126. 'hotel/report/export-hotel-report',
  127. 'Report[org_sale_id]' => $searchModel['org_sale_id'],
  128. 'Report[start_date]' => $searchModel['start_date'],
  129. 'room_type' => $searchModel['room_type'],
  130. 'Report[end_date]' => $searchModel['end_date'],
  131. 'Report[date_type]' => $searchModel['date_type'],
  132. 'hotel_id' => $searchModel['hotel_id'],
  133. 'org_sale_id' => $searchModel['org_sale_id'],
  134. 'op' => 'roomInfo']);
  135. if(Yii::$app->request->isAjax) {
  136. return $this->renderPartial('report', ['view' => '_hotelSalesChannelRoom', 'searchModel' => $searchModel, 'data' => $data]);
  137. } else {
  138. return $this->render('report', ['view' => '_hotelSalesChannelRoom', 'searchModel' => $searchModel, 'data' => $data]);
  139. }
  140. }
  141. /**
  142. * User: wangxj
  143. * 客服 采购 运营
  144. */
  145. public function actionCustomer()
  146. {
  147. $obj = new Report();
  148. if(Yii::$app->request->isPost)
  149. $obj->load(Yii::$app->request->post());
  150. else if(Yii::$app->request->isGet)
  151. $obj->load(Yii::$app->request->get());
  152. if($obj->op == 'getInfo') {
  153. $obj->op = 'cusService';
  154. }
  155. $data['data'] = $obj->getNewReport();
  156. $data['model'] = new OrderMain();
  157. $searchModel = $obj;
  158. $data['export_url'] = Yii::$app->urlManager->createUrl(['hotel/report/export-hotel-report',
  159. 'Report[org_sale_id]' => $searchModel['org_sale_id'],
  160. 'Report[start_date]' => $searchModel['start_date'],
  161. 'op' => $searchModel['op'],
  162. 'Report[hotel_id]' => $searchModel['hotel_id'],
  163. 'Report[end_date]' => $searchModel['end_date'],
  164. 'Report[date_type]' => $searchModel['date_type']]);
  165. if(Yii::$app->request->isAjax) {
  166. return $this->renderPartial('report', ['view' => '_allHotelSales', 'searchModel' => $searchModel, 'data' => $data]);
  167. } else {
  168. return $this->render('report', ['view' => '_allHotelSales', 'searchModel' => $searchModel, 'data' => $data]);
  169. }
  170. }
  171. /**
  172. * User: wangxj
  173. *
  174. * 采购业绩统计
  175. *
  176. */
  177. public function actionPurchase()
  178. {
  179. $this->writeLog('Purchase');
  180. $obj = new Report();
  181. $obj->load(Yii::$app->request->post());
  182. $obj->op = 'purchaser';
  183. $data = $obj->getReportInfo_new();
  184. if(Yii::$app->request->isAjax) {
  185. return true;
  186. } else {
  187. return $this->render('report', ['view' => '_hotelSales', 'data' => $data]);
  188. }
  189. }
  190. /**
  191. * User:Steven
  192. *
  193. * 销售渠道统计
  194. * @return string
  195. */
  196. public function actionSaleChannel()
  197. {
  198. $this->writeLog('SaleChannel');
  199. $obj = new Report();
  200. $obj->op = 'orgSale';
  201. if(Yii::$app->request->isPost)
  202. $obj->load(Yii::$app->request->post());
  203. else if(Yii::$app->request->isGet)
  204. $obj->load(Yii::$app->request->get());
  205. $data['data'] = $obj->getNewReport();
  206. $data['model'] = new OrderMain();
  207. $searchModel = $obj;
  208. $data['export_url'] = Yii::$app->urlManager->createUrl(['hotel/report/export-hotel-report',
  209. 'Report[org_sale_id]' => $searchModel['org_sale_id'],
  210. 'Report[start_date]' => $searchModel['start_date'],
  211. 'Report[end_date]' => $searchModel['end_date'],
  212. 'Report[date_type]' => $searchModel['date_type'],
  213. 'op' => 'orgSale',
  214. 'hotel_id' => $searchModel['hotel_id']]);
  215. if(Yii::$app->request->isAjax) {
  216. return $this->renderPartial('report', ['view' => '_hotelSalesChannel', 'searchModel' => $searchModel, 'data' => $data, 'url' => 'hotel/report/sales']);
  217. } else {
  218. return $this->render('report', ['view' => '_hotelSalesChannel', 'searchModel' => $searchModel, 'data' => $data, 'url' => 'hotel/report/sales']);
  219. }
  220. }
  221. /**
  222. * User:luocj
  223. * 酒店层面维度统计报表
  224. */
  225. public function actionExportHotelReport()
  226. {
  227. $obj = new Report();
  228. if(Yii::$app->request->isPost)
  229. $obj->load(Yii::$app->request->post());
  230. else if(Yii::$app->request->isGet)
  231. $obj->load(Yii::$app->request->get());
  232. $data_temp = $obj->getNewReport();
  233. if($obj->op == 'getInfo') {
  234. $tabel_name = '酒店销售统计';
  235. $first_name = '酒店';
  236. } elseif($obj->op == 'orgSale') {
  237. $tabel_name = '酒店销售渠道分布统计';
  238. $first_name = '渠道';
  239. } elseif($obj->op == 'roomInfo') {
  240. $tabel_name = '酒店渠道销售房型统计';
  241. $first_name = '房型';
  242. } elseif($obj->op == 'cusService') {
  243. $tabel_name = '酒店非直连订单客服跟单统计';
  244. $first_name = '跟单客服';
  245. } elseif($obj->op == 'purchaser') {
  246. $tabel_name = '酒店采购业绩统计';
  247. $first_name = '采购人';
  248. } elseif($obj->op == 'principal') {
  249. $tabel_name = '酒店运营业绩统计';
  250. $first_name = '运营人';
  251. } elseif($obj->op == 'cusServiceSend') {
  252. $tabel_name = '酒店直连订单发单工作业绩统计';
  253. $first_name = '姓名';
  254. }
  255. //改版后的
  256. $data['data']['all'][0] = [
  257. 'order_num' => $data_temp['total']['total_order_num'],
  258. 'room_count' => $data_temp['total']['total_room_num'],
  259. 'room_rate' => $data_temp['total']['total_mom_room_count'],
  260. 'sales_value' => $data_temp['total']['total_order_price'],
  261. 'sales_rate' => $data_temp['total']['total_mom_order_price'],
  262. 'cost_value' => $data_temp['total']['total_base_price'],
  263. 'commission_value' => $data_temp['total']['total_commission_total'],
  264. 'peiru_sum' => $data_temp['total']['total_compensate_in'],
  265. 'peichu_sum' => $data_temp['total']['total_compensate_out'],
  266. 'profit_value' => $data_temp['total']['total_order_profit'],
  267. 'profit_rate' => $data_temp['total']['total_mom_profit_value'],
  268. 'gross_rate' => $data_temp['total']['total_price_rate'],
  269. ];
  270. $data_title = array('序号', $first_name, '订单数', '间夜数', '间夜数月环比', '销售额', '销售额月环比', '采购成本', '渠道佣金', '赔入', '赔出', '毛利', '毛利月环比', '毛利率');
  271. $data['data']['list'] = [];
  272. foreach ($data_temp['order_info'] as $k => $v) {
  273. $data['data']['list'][$k]['num'] = $k + 1;
  274. if($obj->op == 'getInfo') {
  275. $data['data']['list'][$k]['channel_name'] = $v['PARENT_PROD_NAME'];
  276. } elseif($obj->op == 'orgSale') {
  277. $data['data']['list'][$k]['channel_name'] = $v['CHANNEL_NAME'];
  278. } elseif($obj->op == 'roomInfo') {
  279. $data['data']['list'][$k]['channel_name'] = $v['PROD_NAME'];
  280. } elseif($obj->op == 'cusService') {
  281. $data['data']['list'][$k]['channel_name'] = $v['user']['TRUE_NAME'];
  282. } elseif($obj->op == 'purchaser') {
  283. $data['data']['list'][$k]['channel_name'] = $v['PURCHASE_TRUE_NAME'];
  284. } elseif($obj->op == 'principal') {
  285. $data['data']['list'][$k]['principal'] = $v['PRINCIPAL_TRUE_NAME'];
  286. } elseif($obj->op == 'cusServiceSend') {
  287. $data['data']['list'][$k]['channel_name'] = $v['SEND_CREATE_USER'];
  288. }
  289. $data['data']['list'][$k]['order_count'] = $v['order_count'];
  290. $data['data']['list'][$k]['room_count'] = $v['room_count'];
  291. $data['data']['list'][$k]['room_rate'] = $v['room_count_mom'];
  292. $data['data']['list'][$k]['sales_value'] = $v['ORDER_PRICE'];
  293. $data['data']['list'][$k]['sales_rate'] = $v['order_price_mom'];
  294. $data['data']['list'][$k]['cost_value'] = $v['BASE_PRICE'];
  295. $data['data']['list'][$k]['commission_value'] = $v['TOTAL_COMMISSION'];
  296. $data['data']['list'][$k]['peiru'] = $v['compensate_in'];
  297. $data['data']['list'][$k]['peichu'] = $v['compensate_out'];
  298. $data['data']['list'][$k]['profit_value'] = $v['PROFIT_VALUE'];
  299. $data['data']['list'][$k]['profit_rate'] = $v['profit_value_mom'];
  300. $data['data']['list'][$k]['gross_rate'] = $v['price_rate'];
  301. //运营、采购负责人
  302. if($obj->op == 'getInfo') {
  303. $data['data']['list'][$k]['principal'] = $v['PRINCIPAL_TRUE_NAME'];
  304. $data['data']['list'][$k]['purchase'] = $v['PURCHASE_TRUE_NAME'];
  305. }
  306. }
  307. //如果是酒店纬度添加运营和采购
  308. if($obj->op == 'getInfo') {
  309. array_push($data_title, '运营负责人');
  310. array_push($data_title, '采购负责人');
  311. }
  312. $this->exportExcel($obj, $tabel_name, $data_title, $data['data']['all'], $data['data']['list']);
  313. }
  314. /**
  315. * User :Steven
  316. *
  317. * 生成统计报表的数据接口(定时任务维护(每天00:00执行一次))
  318. */
  319. public function actionUpdateStatisticsData()
  320. {
  321. $obj = new Report();
  322. $res = $obj->updateStatisticsData();
  323. $result = ['code' => 0, 'data' => $res];
  324. return Json::encode($result);
  325. }
  326. /**
  327. * User: wangxj
  328. *
  329. * 导出订单报表
  330. */
  331. public function actionExportOrderList()
  332. {
  333. $obj = new Report();
  334. $obj->load(Yii::$app->request->get());
  335. $data_title = array('预订时间', '订单编号', '订单渠道', '预订产品', '客人信息', '入住日期', '离店日期', '间夜数', '销售额', '采购成本', '渠道佣金', '毛利', '毛利率', '订单状态', '跟单客服', '运营负责人', '采购负责人', '赔出', '赔入');
  336. set_time_limit(1200);
  337. ini_set("memory_limit", "2048M");
  338. $data = $obj->getOrderList(); //订单列表
  339. $tmp = $data['data']['dataProvider'];
  340. $tmp->pagination = false;
  341. $tmp = $tmp->getModels();
  342. $data['all'] = [];
  343. $count = count($tmp);
  344. if($count > 0) {
  345. $data['list'] = [];
  346. foreach ($tmp as $key => $item) {
  347. $data['list'][$key]['CREATE_TIME'] = $item['CREATE_TIME'];
  348. $data['list'][$key]['ORDER_ID'] = $item['ORDER_ID'];
  349. $data['list'][$key]['SUPPLIER_NAME'] = $item['CHANNEL_NAME'];
  350. $data['list'][$key]['PROD_NAME'] = $item['PROD_NAME'];
  351. $data['list'][$key]['CUSTOMER_NAME'] = $item['CUSTOMER_NAME'] . ' ' . $item['CUSTOMER_MOBILE'];
  352. $data['list'][$key]['PROD_START_STATION_DATE'] = $item['PROD_START_STATION_DATE'];
  353. $data['list'][$key]['PROD_END_STATION_DATE'] = $item['PROD_END_STATION_DATE'];
  354. $data['list'][$key]['room_count'] = $item['room_count'];
  355. $data['list'][$key]['ORDER_PRICE'] = $item['ORDER_PRICE'];
  356. $data['list'][$key]['BASE_PRICE'] = $item['BASE_PRICE'];
  357. $data['list'][$key]['TOTAL_COMMISSION'] = $item['TOTAL_COMMISSION'];
  358. $data['list'][$key]['PROFIT'] = $item['ORDER_PRICE'] - $item['BASE_PRICE'] - $item['TOTAL_COMMISSION']+ $item['compensate_in'] - $item['compensate_out'];
  359. $item['ORDER_PRICE'] = $item['ORDER_PRICE'] + $item['compensate_in'] - $item['compensate_out'];
  360. $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) . '%';
  361. $data['list'][$key]['ORDER_STATUS'] = $item['ORDER_STATUS_NAME'];
  362. $data['list'][$key]['TRUE_NAME'] = $item['INPUT_CREATE_USER'];
  363. $data['list'][$key]['PRINCIPAL'] = User::getPrincipal($item['PRINCIPAL_ID']);
  364. $data['list'][$key]['PURCHASE'] = $item['PURCHASE_TRUE_NAME'];
  365. $data['list'][$key]['COMPENSATE_OUT'] = $item['compensate_out'];
  366. $data['list'][$key]['COMPENSATE_IN'] = $item['compensate_in'];
  367. }
  368. }
  369. if($obj->op == 'getInfo') {
  370. $title = '酒店销售统计';
  371. } elseif($obj->op == 'orgSale') {
  372. $title = '酒店销售渠道分布统计';
  373. } elseif($obj->op == 'roomInfo') {
  374. $title = '酒店渠道销售房型统计';
  375. } elseif($obj->op == 'cusService') {
  376. $title = '酒店非直连订单客服跟单统计';
  377. } elseif($obj->op == 'purchaser') {
  378. $title = '酒店采购业绩统计';
  379. } elseif($obj->op == 'principal') {
  380. $title = '酒店运营业绩统计';
  381. } elseif($obj->op == 'cusServiceSend') {
  382. $title = '酒店直连订单发单工作业绩统计';
  383. } else {
  384. $title = '酒店订单统计';
  385. }
  386. $this->exportExcel($obj, $title, $data_title, [], $data['list']);
  387. }
  388. /**
  389. * User:Steven
  390. *
  391. * 导出Excel文件
  392. * @param $obj Report report对象
  393. * @param $file_name string 导出文件名称后缀
  394. * @param $data_title array 数据表头,title
  395. * @param $data_all array 合计数据列表
  396. * @param $data_list array 数据列表
  397. */
  398. public function exportExcel($obj, $file_name, $data_title, $data_all, $data_list)
  399. {
  400. // require Yii::getAlias('@backend') . "/common/PHPExcel/PHPExcel.php";
  401. $objPHPExcel = new zPhpExcel(); //实例化PHPExcel类
  402. $objSheet = $objPHPExcel->getActiveSheet(); //获取当前活动sheet的操作对象
  403. $sheet_title = $obj['start_date'] . '~' . $obj['end_date'] . ($obj['date_type'] == 1 ? '(预定时间)': ($obj['date_type'] == 2 ? '(入住时间)': '(离店日期)'));
  404. // $objSheet->setTitle($file_name); //给当前活动sheet的操作对象
  405. $objSheet->setTitle($sheet_title);
  406. $objPHPExcel->file_name = $file_name;
  407. $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');
  408. $cell_num = count($data_title) - 1;
  409. $cell = $directory[$cell_num];
  410. $objSheet->mergeCells("A1:{$cell}1"); //合并单元格
  411. $objSheet->setCellValue('A1', $sheet_title . $file_name);
  412. $objSheet->getStyle("A1:{$cell}1")->getFont()->setName('微软雅黑')->setSize(15)->setBold(True);
  413. $objSheet->getStyle("A1:{$cell}1")->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER)->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);;
  414. $objSheet->getStyle("A1:{$cell}1")->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB('A6A6A6');
  415. $objSheet->getStyle("A2:{$cell}2")->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB('CCCCCC');
  416. foreach ($data_title as $k => $v) {
  417. $objSheet->setCellValue($directory[$k] . '2', $v);
  418. }
  419. $objSheet->setCellValue('A3', '-');
  420. $objSheet->setCellValue('B3', '合计');
  421. for ($i = 0; $i < count($data_all); $i++) {
  422. $list = array_values($data_all[$i]);
  423. foreach ($list as $k => $v) {
  424. $objSheet->setCellValue($directory[$k + 2] . '3', $v);
  425. }
  426. }
  427. for ($j = 0; $j < count($data_list); $j++) {
  428. $list = array_values($data_list[$j]);
  429. foreach ($list as $k => $v) {
  430. $objSheet->setCellValue($directory[$k] . ($j + 4), $v);
  431. $objSheet->getColumnDimension($directory[$k])->setWidth(10);
  432. }
  433. }
  434. $objPHPExcel->output();
  435. }
  436. /**
  437. * 导出到浏览器
  438. * @param $type
  439. * @param $fileName
  440. */
  441. private function browserExport($type, $fileName)
  442. {
  443. if($type == '05') { //输出xls文件
  444. header('Content-Type: application/vnd.ms-excel');
  445. } else { //输出xlsx文件
  446. header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  447. }
  448. header('Content-Disposition: attachment;filename="' . $fileName . '"');
  449. header('Cache-Control: max-age=0');//禁止缓存
  450. }
  451. function writeLog($log)
  452. {
  453. $backtrace = debug_backtrace();
  454. array_shift($backtrace);
  455. $dir = __DIR__ . "/../Log/";
  456. if(!is_dir($dir)) {
  457. mkdir($dir);
  458. }
  459. $filename = $dir . Yii::$app->user->id . '_' . $log . ".log";
  460. $need_chmod = file_exists($filename);
  461. $log_str = '[' . date("Y-m-d H:i:s") . ']';
  462. file_put_contents($filename, $log_str . PHP_EOL, FILE_APPEND);
  463. if($need_chmod == false) {
  464. @chmod($filename, 0777);
  465. }
  466. }
  467. public function getClientIP()
  468. {
  469. global $ip;
  470. if(getenv("HTTP_CLIENT_IP"))
  471. $ip = getenv("HTTP_CLIENT_IP");
  472. else if(getenv("HTTP_X_FORWARDED_FOR"))
  473. $ip = getenv("HTTP_X_FORWARDED_FOR");
  474. else if(getenv("REMOTE_ADDR"))
  475. $ip = getenv("REMOTE_ADDR");
  476. else $ip = "Unknow";
  477. return $ip;
  478. }
  479. }