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.
 
 
 
 
 
 

942 lines
51 KiB

  1. <?php
  2. namespace backend\modules\hotel\models;
  3. use backend\modules\api\models\BaseSupplier;
  4. use backend\modules\hotel\models\search\searchOrderMain;
  5. use backend\modules\zzcs\models\BaseUser;
  6. use common\models\BaseUserAuth;
  7. use Yii;
  8. use yii\data\ActiveDataProvider;
  9. use yii\data\ArrayDataProvider;
  10. use yii\data\SqlDataProvider;
  11. use backend\modules\zzcs\models\OrderFinanceReparations;
  12. class Report extends HotelModel
  13. {
  14. private $dateArray = [
  15. 1 => 'create_date',
  16. 2 => 'checkin_date',
  17. 3 => 'checkout_date',
  18. ];
  19. public $date_type = 1; //预订时间1 ,入住时间2,离店时间3
  20. public $start_date;
  21. public $end_date;
  22. public $past_start_date;
  23. public $past_end_date;
  24. public $province = '';
  25. public $city = '';
  26. public $hotel_name = '';
  27. public $supplier_id = '';//供应商ID
  28. public $org_sale_id = '0';//渠道商ID
  29. public $hotel_id = '0';//酒店ID
  30. public $op = 'getInfo';
  31. public $user_id;
  32. public $room_type;
  33. public $send_user_id = 0;
  34. public $principal_id = 0;
  35. public $purchaser_id = 0;
  36. public $to_url = '';
  37. /**
  38. * @inheritdoc
  39. */
  40. public function rules()
  41. {
  42. return [
  43. [['date_type', 'start_date', 'end_date', 'op', 'org_sale_id', 'hotel_name', 'hotel_id'], 'safe'],
  44. ];
  45. }
  46. /**
  47. * @inheritdoc
  48. */
  49. public function attributeLabels()
  50. {
  51. return [
  52. 'ID' => 'ID',
  53. 'CANCEL_FLAG' => 'Cancel Flag',
  54. 'MAIN_CREATE_USER_ID' => 'Main Create User ID',
  55. 'CREATE_USER_ID' => 'Create User ID',
  56. 'CREATE_TIME' => 'Create Time',
  57. 'UPDATE_USER_ID' => 'Update User ID',
  58. 'UPDATE_TIME' => 'Update Time',
  59. 'SALE_ORG_ID' => 'Sale Org ID',
  60. 'SALE_TOP_ORG_ID' => 'Sale Top Org ID',
  61. 'PROD_TOP_ORG_ID' => 'Prod Top Org ID',
  62. 'ORDER_ID' => 'Order ID',
  63. 'ORDER_DESCRIPTION' => 'Order Description',
  64. 'OUTSIDE_ORDER_NO' => 'Outside Order No',
  65. 'ORDER_VALID_STATUS' => 'Order Valid Status',
  66. 'ORDER_BOOK_STATUS' => 'Order Book Status',
  67. 'ORDER_PAY_STATUS' => 'Order Pay Status',
  68. 'ORDER_PAY_MAIN_ID' => 'Order Pay Main ID',
  69. 'ORDER_PAY_USER_ID' => 'Order Pay User ID',
  70. 'ORDER_PAY_TIME' => 'Order Pay Time',
  71. 'ORDER_PRINT_TIMES' => 'Order Print Times',
  72. 'PARENT_ORDER_ID' => 'Parent Order ID',
  73. 'PROD_ID' => 'Prod ID',
  74. 'PARENT_PROD_ID' => 'Parent Prod ID',
  75. 'PROD_NAME' => 'Prod Name',
  76. 'PARENT_PROD_NAME' => 'Parent Prod Name',
  77. 'ORDER_PRICE' => 'Order Price',
  78. 'ORDER_PROD_TYPE' => 'Order Prod Type',
  79. 'PROD_SUPPLY_ORG_NAME' => 'Prod Supply Org Name',
  80. 'BASE_PRICE' => 'Base Price',
  81. 'MID_PRICE' => 'Mid Price',
  82. 'RUN_ID' => 'Run ID',
  83. 'RUN_DATE' => 'Run Date',
  84. 'RUN_DATE_NUM' => 'Run Date Num',
  85. 'RUN_TIME' => 'Run Time',
  86. 'RUN_TIME_MINUTES' => 'Run Time Minutes',
  87. 'RUN_BUS_ORDER_ID' => 'Run Bus Order ID',
  88. 'RUN_BUS_SEAT_TYPE' => 'Run Bus Seat Type',
  89. 'RUN_BUS_SEAT_SEQ_ID' => 'Run Bus Seat Seq ID',
  90. 'RUN_BUS_SEAT_ID' => 'Run Bus Seat ID',
  91. 'RUN_BUS_SEAT_NAME' => 'Run Bus Seat Name',
  92. 'PROD_START_STATION_RES_ID' => 'Prod Start Station Res ID',
  93. 'PROD_START_STATION_RES_NAME' => 'Prod Start Station Res Name',
  94. 'PROD_START_STATION_CHECKPORT_RES_ID' => 'Prod Start Station Checkport Res ID',
  95. 'PROD_START_STATION_CHECKPORT_RES_NAME' => 'Prod Start Station Checkport Res Name',
  96. 'PROD_START_STATION_SEQ_ID' => 'Prod Start Station Seq ID',
  97. 'PROD_START_STATION_DATE' => 'Prod Start Station Date',
  98. 'PROD_START_STATION_DATE_NUM' => 'Prod Start Station Date Num',
  99. 'PROD_START_STATION_TIME' => 'Prod Start Station Time',
  100. 'PROD_START_STATION_TIME_MINUTES' => 'Prod Start Station Time Minutes',
  101. 'PROD_START_STATION_AREA_ID' => 'Prod Start Station Area ID',
  102. 'PROD_START_STATION_AREA_NAME' => 'Prod Start Station Area Name',
  103. 'PROD_END_STATION_RES_ID' => 'Prod End Station Res ID',
  104. 'PROD_END_STATION_RES_NAME' => 'Prod End Station Res Name',
  105. 'PROD_END_STATION_SEQ_ID' => 'Prod End Station Seq ID',
  106. 'PROD_END_STATION_DATE' => 'Prod End Station Date',
  107. 'PROD_END_STATION_DATE_NUM' => 'Prod End Station Date Num',
  108. 'PROD_END_STATION_TIME' => 'Prod End Station Time',
  109. 'PROD_END_STATION_TIME_MINUTES' => 'Prod End Station Time Minutes',
  110. 'PROD_END_STATION_AREA_ID' => 'Prod End Station Area ID',
  111. 'PROD_END_STATION_AREA_NAME' => 'Prod End Station Area Name',
  112. 'CUSTOMER_NAME' => 'Customer Name',
  113. 'CUSTOMER_SEX' => 'Customer Sex',
  114. 'CUSTOMER_MOBILE' => 'Customer Mobile',
  115. 'CUSTOMER_ID_TYPE' => 'Customer Id Type',
  116. 'CUSTOMER_ID_NO' => 'Customer Id No',
  117. 'CUSTOMER_ADDRESS' => 'Customer Address',
  118. 'CUSTOMER_ADDRESS_AREA_ID' => 'Customer Address Area ID',
  119. 'CUSTOMER_POSTCODE' => 'Customer Postcode',
  120. 'CUSTOMER_MEMO' => 'Customer Memo',
  121. 'MEMBER_ID' => 'Member ID',
  122. 'MEMBER_SCORE_PAY' => 'Member Score Pay',
  123. 'MEMBER_SCORE_GET' => 'Member Score Get',
  124. 'ORDER_STATUS' => 'Order Status',
  125. 'ORDER_DISABLE_TYPE' => 'Order Disable Type',
  126. 'ORDER_DISABLE_USER_ID' => 'Order Disable User ID',
  127. 'ORDER_DISABLE_TIME' => 'Order Disable Time',
  128. 'ORDER_DISABLE_PERCENT' => 'Order Disable Percent',
  129. 'ORDER_DISABLE_FEE' => 'Order Disable Fee',
  130. 'ORDER_DISABLE_APPLY_USER_ID' => 'Order Disable Apply User ID',
  131. 'ORDER_DISABLE_APPLY_TIME' => 'Order Disable Apply Time',
  132. 'KEEP_END_TIME' => 'Keep End Time',
  133. 'KEEP_END_MINUTES' => 'Keep End Minutes',
  134. 'if_gift' => 'If Gift',
  135. 'reorder_times' => 'Reorder Times',
  136. 'IF_LAST_PROD' => 'If Last Prod',
  137. 'ORDER_LEVEL' => 'Order Level',
  138. 'ORDER_CONFIRM_CODE' => 'Order Confirm Code',
  139. 'OUTSIDE_SALE_ORG_ID' => 'Outside Sale Org ID',
  140. 'IS_UP' => 'Is Up',
  141. 'APPLY_ID' => 'Apply ID',
  142. 'SALES_MAN' => 'Sales Man',
  143. 'RECEIVE_VALUE' => 'Receive Value',
  144. 'REAL_PASSENGER_NUM' => 'Real Passenger Num',
  145. 'STOCK_TYPE' => 'Stock Type',
  146. 'REFUSE_FLAG' => 'Refuse Flag',
  147. 'PROFIT_VALUE' => 'Profit Value',
  148. 'TOTAL_COMMISSION' => 'Total Commission',
  149. ];
  150. }
  151. /**
  152. * User: wangxj
  153. *
  154. * 函数作用
  155. *
  156. * @params
  157. */
  158. public function load($post, $formName = null)
  159. {
  160. $this->start_date = isset($_REQUEST['Report']['start_date']) ? $_REQUEST['Report']['start_date'] : date('Y-m-01', time());
  161. $this->end_date = isset($_REQUEST['Report']['end_date']) ? $_REQUEST['Report']['end_date'] : date('Y-m-d', time());
  162. $this->op = isset($_REQUEST['op']) ? $_REQUEST['op'] : $this->op;
  163. $this->hotel_name = isset($_REQUEST['hotel_name']) ? $_REQUEST['hotel_name'] : $this->hotel_name;
  164. $this->org_sale_id = isset($_REQUEST['org_sale_id']) ? $_REQUEST['org_sale_id'] : $this->org_sale_id;
  165. $this->hotel_id = isset($_REQUEST['hotel_id']) ? $_REQUEST['hotel_id'] : $this->hotel_id;
  166. $this->to_url = isset($_REQUEST['to_url']) ? $_REQUEST['to_url'] : $this->to_url;
  167. $this->send_user_id = isset($_REQUEST['send_user_id']) ? $_REQUEST['send_user_id'] : $this->send_user_id;
  168. $this->principal_id = isset($_REQUEST['principal_id']) ? $_REQUEST['principal_id'] : $this->principal_id;
  169. $this->purchaser_id = isset($_REQUEST['purchaser_id']) ? $_REQUEST['purchaser_id'] : $this->purchaser_id;
  170. return parent::load($post);
  171. }
  172. //获取同比日期函数
  173. public function getBeforeDate($start_date, $end_date)
  174. {
  175. //判断所选日期是否为月头和月尾,如果是则比较上一整月,如果不是则减去当月月数-1拼上原来的天数。
  176. //当月月头
  177. $day_first = date("Y-m-01", strtotime("$start_date"));
  178. //当月月尾
  179. $day_last = date("Y-m-t", strtotime("$start_date"));
  180. if ($start_date == $day_first && $end_date == $day_last) {
  181. $timestamp = strtotime($start_date);
  182. $arr = getdate($timestamp);
  183. if ($arr['mon'] == 1) {
  184. $year = $arr['year'] - 1;
  185. $month = $arr['mon'] + 11;
  186. $firstday = $year . '-' . $month . '-01';
  187. $lastday = date('Y-m-d', strtotime("$firstday +1 month -1 day"));
  188. } else {
  189. $firstday = date('Y-m-01', strtotime(date('Y', $timestamp) . '-' . (date('m', $timestamp) - 1) . '-01'));
  190. $lastday = date('Y-m-d', strtotime("$firstday +1 month -1 day"));
  191. }
  192. } else {
  193. $start_arr = getdate(strtotime($start_date));
  194. $end_arr = getdate(strtotime($end_date));
  195. if ($start_arr['mon'] == 1) {
  196. $start_year = $start_arr['year'] - 1;
  197. $start_month = $start_arr['mon'] + 11;
  198. } else {
  199. $start_year = $start_arr['year'];
  200. $start_month = $start_arr['mon'] - 1;
  201. }
  202. if ($end_arr['mon'] == 1) {
  203. $end_year = $end_arr['year'] - 1;
  204. $end_month = $end_arr['mon'] + 11;
  205. } else {
  206. $end_year = $end_arr['year'];
  207. $end_month = $end_arr['mon'] - 1;
  208. }
  209. if ($start_month < 10)
  210. $start_month = '0' . $start_month;
  211. if ($end_month < 10)
  212. $end_month = '0' . $end_month;
  213. $firstday = $start_year . '-' . $start_month . '-' . date('d', strtotime("$start_date"));
  214. $lastday = $end_year . '-' . $end_month . '-' . date('d', strtotime("$end_date"));
  215. //判断日期是否合法,不合法则不计算同比;
  216. if (date('Y-m-d', strtotime($firstday)) == $firstday) {
  217. $result = true;
  218. if (date('Y-m-d', strtotime($lastday)) == $lastday) {
  219. $result = true;
  220. } else {
  221. $result = false;
  222. }
  223. } else {
  224. $result = false;
  225. }
  226. //判断end
  227. if ($result == false) {
  228. $firstday = '';
  229. $lastday = '';
  230. }
  231. }
  232. return array($firstday, $lastday);
  233. }
  234. /**
  235. * User:Steven
  236. * 生成报表数据
  237. *
  238. * @return array
  239. */
  240. public function updateStatisticsData()
  241. {
  242. $sql = "truncate table rep_daily_ht_order;
  243. insert into rep_daily_ht_order(create_date,checkin_date,checkout_date,create_user_id,create_user_name,purchase_id,purchase_name,top_area_id,parent_area_id,hotel_id,hotel_name,room_name,supplier_id,supplier_name,channel_id,channel_name,order_count,room_count,sales_value,cost_value,commission_value,profit_value)
  244. select substr(m.create_time,1,10) as create_date,
  245. m.prod_start_station_date as checkin_date,
  246. m.prod_end_station_date as checkout_date,
  247. m.create_user_id,
  248. u.user_name,
  249. p.id as purchase_id,
  250. p.purchaser_name,
  251. a.top_area_id,
  252. a.parent_area_id,
  253. m.parent_prod_id as hotel_id,
  254. m.parent_prod_name as hotel_name,
  255. m.prod_id as room_type,
  256. m.prod_name as room_name,
  257. m.prod_top_org_id as supplier_id,
  258. m.prod_supply_org_name as supplier_name,
  259. m.outside_sale_org_id as channel_id,
  260. (select supplier_name from base_supplier where id = m.outside_sale_org_id) as channel_name,
  261. count(m.id) as order_cnt,
  262. sum((select count(*) from order_main where parent_order_id = m.order_id and cancel_flag = 0 and order_valid_status = 1)) as room_cnt,
  263. sum(order_price) as order_price,
  264. sum(order_price-total_commission-profit_value) as order_cost,
  265. sum(total_commission) as order_commission,
  266. sum(profit_value) as order_profit
  267. from order_main m inner join
  268. opera_hotel h on m.parent_prod_id = h.hotel_id inner join
  269. base_area_view a on h.area_id = a.area_id inner join
  270. base_user u on m.create_user_id = u.id inner join
  271. base_supplier_purchase p on h.purchase_name = p.id
  272. where m.parent_order_id = 0 and m.cancel_flag = 0 and m.order_valid_status = 1 and m.order_prod_type = 25
  273. group by substr(m.create_time,1,10),m.prod_start_station_date,m.prod_end_station_date,
  274. m.create_user_id,u.user_name,p.id,p.purchaser_name,m.parent_prod_id,m.prod_id,m.prod_top_org_id,m.outside_sale_org_id";
  275. $conn = Yii::$app->db;
  276. $conn->createCommand($sql)->execute();
  277. return true;
  278. }
  279. public function getOrderList()
  280. {
  281. if (isset($_REQUEST['Report']))
  282. $_REQUEST = array_merge($_REQUEST, $_REQUEST['Report']);
  283. $this->setAttributes($_REQUEST, false);
  284. $order = new OrderMain();
  285. $data['dataProvider'] = $order->search($_REQUEST);
  286. return ['model' => $this, 'data' => $data];
  287. }
  288. /**
  289. * User:Redstop
  290. *
  291. * 日期维度来统计酒店销售数据
  292. * @return array
  293. */
  294. public function getDailyReportInfo($start_date, $end_date)
  295. {
  296. // $start_date = '2017-08-01';
  297. // $end_date = '2017-08-31';
  298. $date_type = 1;//预定时间
  299. $before_date = $this->getBeforeDate($start_date, $end_date);
  300. // 前月日期
  301. $before_start_date = "";
  302. $before_end_date = "";
  303. if ($before_date) {
  304. $before_start_date = $before_date[0];
  305. $before_end_date = $before_date[1];
  306. }
  307. //增加赔入赔出
  308. $models = OrderFinanceReparations::find()->select(['a.*', 'substring(a.create_time,1,10) as create_time1', 'a.send_user_id', 'sum( if(reparation_type=1,`reparations`,0) ) as peichu', 'sum( if(reparation_type=2,`reparations`,0) ) as peiru'])
  309. ->innerJoin('(select order_main.*,order_ht_status_log.create_user_id as send_user_id from order_main INNER JOIN `order_ht_status_log` ON parent_order_id=order_ht_status_log.order_id and order_ht_status_log.order_status=198 where parent_order_id in (select order_id from order_finance_reparations where cancel_flag = 0) and order_prod_type = 26 and order_main.cancel_flag = 0 group by parent_order_id) a', 'a.parent_order_id = order_finance_reparations.order_id')
  310. ->where(['and',
  311. ['=', 'order_finance_reparations.cancel_flag', 0],
  312. ]);
  313. $sql = $models->createCommand()->getSql();
  314. $models->andFilterWhere(['between', 'a.create_time', $start_date, $end_date]);
  315. // $models->groupBy("substring( `a.create_time` , 1 , 10 )");
  316. $models->groupBy("create_time1")->asArray();
  317. $sum_models = $models->all();
  318. $group_by = "group by substring(create_time,1,10)";
  319. $date_type_sql = "and substring(create_time,1,10) between'{$start_date}' and '{$end_date}'";
  320. $sql = "select substring(create_time,1,10) as date,
  321. count(distinct parent_order_id) as order_count,
  322. count(*) as jianye_count,
  323. sum(order_price) as order_price,
  324. sum(base_price) as base_price,
  325. sum(total_commission) as total_commission,
  326. sum(profit_value) as profit_value
  327. from order_main n
  328. where order_prod_type = 26
  329. and cancel_flag = 0
  330. and order_status in (198,314,147,313,382)
  331. and order_valid_status = 1
  332. $date_type_sql
  333. $group_by";
  334. $connection = Yii::$app->db;
  335. $data['rowset'] = $connection->createCommand($sql)->queryAll();
  336. //处理环比等数据
  337. foreach ($data['rowset'] as $k => $v) {
  338. //判断分母不为0
  339. $v['jianye_count'] = empty($v['jianye_count']) ? 0 : $v['jianye_count'];
  340. $v['order_price'] = empty($v['order_price']) ? 0 : $v['order_price'];
  341. $v['profit_value'] = empty($v['profit_value']) ? 0 : $v['profit_value'];
  342. foreach ($sum_models as $m => $model) {
  343. if ($model['create_time1'] == $v['date']) {
  344. $data['rowset'][$k]['profit_value'] += $model['peiru'] - $model['peichu'];
  345. $v['profit_value'] += $model['peiru'] - $model['peichu'];
  346. break;
  347. } else {
  348. continue;
  349. }
  350. }
  351. //毛利率
  352. if ($v['order_price'] != 0)
  353. $data['rowset'][$k]['profit_rate'] = sprintf('%.2f', round($v['profit_value'] * 100 / $v['order_price'], 2));
  354. else
  355. $data['rowset'][$k]['profit_rate'] = '-';
  356. //处理百分号
  357. // $data['rowset'][$k]['jianye_count_mom'] = '-';
  358. // $data['rowset'][$k]['order_price_mom'] = '-';
  359. // $data['rowset'][$k]['profit_value_mom'] = '-';
  360. // $data['rowset'][$k]['profit_rate'] = '-';
  361. $data['rowset'][$k]['jianye_count_mom'] = $data['rowset'][$k]['jianye_count_mom'] == '-' ? '-' : $data['rowset'][$k]['jianye_count_mom'] . '%';
  362. $data['rowset'][$k]['order_price_mom'] = $data['rowset'][$k]['order_price_mom'] == '-' ? '-' : $data['rowset'][$k]['order_price_mom'] . '%';
  363. $data['rowset'][$k]['profit_value_mom'] = $data['rowset'][$k]['profit_value_mom'] == '-' ? '-' : $data['rowset'][$k]['profit_value_mom'] . '%';
  364. $data['rowset'][$k]['profit_rate'] = $data['rowset'][$k]['profit_rate'] == '-' ? '-' : $data['rowset'][$k]['profit_rate'] . '%';
  365. }
  366. return $data['rowset'];
  367. }
  368. /**
  369. * @Author wanglg
  370. * @Desc 统计报表数据查询及处理
  371. * @return mixed
  372. */
  373. public function getNewReport()
  374. {
  375. $op = isset($_GET['op']) ? $_GET['op'] : $this->op;
  376. $past_date = $this->getBeforeDate($this->start_date, $this->end_date);
  377. $past_array = array('date_type' => $this->date_type, 'date_from' => $past_date[0], 'date_to' => $past_date[1], 'channel_id' => $this->org_sale_id,
  378. 'hotel_id' => $this->hotel_id, 'hotel_name' => $this->hotel_name);
  379. $searchParam = array('date_type' => $this->date_type, 'date_from' => $this->start_date, 'date_to' => $this->end_date, 'channel_id' => $this->org_sale_id,
  380. 'hotel_id' => $this->hotel_id, 'hotel_name' => $this->hotel_name);
  381. $params = array('searchOrderMain' => $searchParam);
  382. $past_params = array('searchOrderMain' => $past_array);
  383. $data['order_info'] = $this->getOrderList1($params, $op); // 基础数据
  384. $data['old_order_info'] = $this->getOrderList1($past_params, $op); //环比基础数据
  385. // 查询本月赔款信息
  386. $compensate_query = $this->getCompensateInOrOut($params['searchOrderMain'], $op);
  387. // 查询上月赔款信息
  388. $past_compensate_query = $this->getCompensateInOrOut($past_params['searchOrderMain'], $op);
  389. /*$compensate_info = $compensate_query->asArray()->all();
  390. $past_compensate_info = $past_compensate_query->asArray()->all();*/
  391. // 权限设置查询赔款信息:如果既是运营又是采购
  392. if (Yii::$app->user->identity['USER_ROLE'] == BaseUserAuth::HOTEL_OPERATOR) {
  393. $compensate_query->andFilterWhere(['b.PRINCIPAL_ID' => Yii::$app->user->id]);
  394. $past_compensate_query->andFilterWhere(['b.PRINCIPAL_ID' => Yii::$app->user->id]);
  395. $compensate_info = $compensate_query->asArray()->all();
  396. $past_compensate_info = $past_compensate_query->asArray()->all();
  397. } elseif (Yii::$app->user->identity['USER_ROLE'] == BaseUserAuth::HOTEL_PURCHASE) {
  398. $compensate_query->andFilterWhere(['b.SALES_MAN' => Yii::$app->user->id]);
  399. $past_compensate_query->andFilterWhere(['b.SALES_MAN' => Yii::$app->user->id]);
  400. $compensate_info = $compensate_query->asArray()->all();
  401. $past_compensate_info = $past_compensate_query->asArray()->all();
  402. } elseif (Yii::$app->user->identity['USER_ROLE'] == BaseUserAuth::HOTEL_ADMIN || Yii::$app->user->identity['USER_ROLE'] == BaseUserAuth::HOTEL_CUS_ADMIN
  403. || Yii::$app->user->identity['USER_ROLE'] == BaseUserAuth::SYS_CS || Yii::$app->user->identity['USER_ROLE'] == BaseUserAuth::SYS_ADMIN
  404. || Yii::$app->user->identity['USER_ROLE'] == BaseUserAuth::FINANCIAL_OFFICER) {
  405. // 酒店管理员、客服管理人员、系统管理员、财务可以查看所有数据
  406. $compensate_info = $compensate_query->asArray()->all();
  407. $past_compensate_info = $past_compensate_query->asArray()->all();
  408. } else {
  409. $compensate_info = [];
  410. $past_compensate_info = [];
  411. }
  412. $order_colum = '';
  413. $group_colum = '';
  414. $old_order_colum = '';
  415. if ($op == 'getInfo') // 酒店纬度
  416. {
  417. $old_order_colum = array_column($data['old_order_info'], 'PARENT_PROD_ID');
  418. $order_colum = array_column($data['order_info'], 'PARENT_PROD_ID');
  419. $group_colum = array_column($data['old_order_info'], 'PARENT_PROD_ID');
  420. } elseif ($op == 'orgSale') // 渠道纬度
  421. {
  422. $old_order_colum = array_column($data['old_order_info'], 'OUTSIDE_SALE_ORG_ID');
  423. $order_colum = array_column($data['order_info'], 'OUTSIDE_SALE_ORG_ID');
  424. $group_colum = array_column($data['old_order_info'], 'OUTSIDE_SALE_ORG_ID');
  425. } elseif ($op == 'cusService') // 客服录单
  426. {
  427. $old_order_colum = array_column($data['old_order_info'], 'CREATE_USER_ID');
  428. $order_colum = array_column($data['order_info'], 'CREATE_USER_ID');
  429. $group_colum = array_column($data['old_order_info'], 'CREATE_USER_ID');
  430. } elseif ($op == 'cusServiceSend') // 客服发单
  431. {
  432. $old_order_colum = array_column($data['old_order_info'], 'SEND_USER_ID');
  433. $order_colum = array_column($data['order_info'], 'SEND_USER_ID');
  434. $group_colum = array_column($data['old_order_info'], 'SEND_USER_ID');
  435. } elseif ($op == 'principal') // 运营
  436. {
  437. $old_order_colum = array_column($data['old_order_info'], 'PRINCIPAL_ID');
  438. $order_colum = array_column($data['order_info'], 'PRINCIPAL_ID');
  439. $group_colum = array_column($data['old_order_info'], 'PRINCIPAL_ID');
  440. } elseif ($op == 'purchaser') // 采购
  441. {
  442. $old_order_colum = array_column($data['old_order_info'], 'SALES_MAN');
  443. $order_colum = array_column($data['order_info'], 'SALES_MAN');
  444. $group_colum = array_column($data['old_order_info'], 'SALES_MAN');
  445. } elseif ($op == 'roomInfo') {
  446. $old_order_colum = array_column($data['old_order_info'], 'PROD_ID');
  447. $order_colum = array_column($data['order_info'], 'PROD_ID');
  448. $group_colum = array_column($data['old_order_info'], 'PROD_ID');
  449. }
  450. // 计算本月的赔入赔出
  451. foreach ($compensate_info as $compensate => $val) {
  452. // 查找不同纬度将不在数组中的压入数组,组合新数组
  453. if (
  454. ($op == 'getInfo' && !in_array($val['PARENT_PROD_ID'], $order_colum)) ||
  455. ($op == 'orgSale' && !in_array($val['OUTSIDE_SALE_ORG_ID'], $order_colum)) ||
  456. ($op == 'cusService' && !in_array($val['CREATE_USER_ID'], $order_colum)) ||
  457. ($op == 'cusServiceSend' && !in_array($val['SEND_USER_ID'], $order_colum)) ||
  458. ($op == 'principal' && !in_array($val['PRINCIPAL_ID'], $order_colum)) ||
  459. ($op == 'purchaser' && !in_array($val['SALES_MAN'], $order_colum)) ||
  460. ($op == 'roomInfo' && !in_array($val['PROD_ID'], $order_colum))
  461. ) {
  462. // $flag = empty($data['order_info']) ? true : false;
  463. $val['PROFIT_VALUE'] = $val['compensate_in'] - $val['compensate_out'];
  464. array_push($data['order_info'], $val);
  465. continue;
  466. }
  467. foreach ($data['order_info'] as $key => $item) {
  468. if (
  469. ($op == 'getInfo' && $val['PARENT_PROD_ID'] == $item['PARENT_PROD_ID']) ||
  470. ($op == 'orgSale' && $val['OUTSIDE_SALE_ORG_ID'] == $item['OUTSIDE_SALE_ORG_ID']) ||
  471. ($op == 'cusService' && $val['CREATE_USER_ID'] == $item['CREATE_USER_ID']) ||
  472. ($op == 'cusServiceSend' && $val['SEND_USER_ID'] == $item['SEND_USER_ID']) ||
  473. ($op == 'principal' && $val['PRINCIPAL_ID'] == $item['PRINCIPAL_ID']) ||
  474. ($op == 'purchaser' && $val['SALES_MAN'] == $item['SALES_MAN']) ||
  475. ($op == 'roomInfo' && $val['PROD_ID'] == $item['PROD_ID'])
  476. ) {
  477. $data['order_info'][$key]['order_count'] = $data['order_info'][$key]['order_count'] + $val['order_count'];
  478. $data['order_info'][$key]['compensate_out'] = $item['compensate_out'] + $val['compensate_out'];
  479. $data['order_info'][$key]['compensate_in'] = $item['compensate_in'] + $val['compensate_in'];
  480. $data['order_info'][$key]['PROFIT_VALUE'] = $data['order_info'][$key]['PROFIT_VALUE'] + $val['compensate_in'] - $val['compensate_out'];
  481. }
  482. }
  483. }
  484. // 处理上月的赔入赔出
  485. foreach ($past_compensate_info as $past_compensate => $val) {
  486. if (
  487. ($op == 'getInfo' && !in_array($val['PARENT_PROD_ID'], $old_order_colum)) ||
  488. ($op == 'orgSale' && !in_array($val['OUTSIDE_SALE_ORG_ID'], $old_order_colum)) ||
  489. ($op == 'cusService' && !in_array($val['CREATE_USER_ID'], $old_order_colum)) ||
  490. ($op == 'cusServiceSend' && !in_array($val['SEND_USER_ID'], $old_order_colum)) ||
  491. ($op == 'principal' && !in_array($val['PRINCIPAL_ID'], $old_order_colum)) ||
  492. ($op == 'purchaser' && !in_array($val['SALES_MAN'], $old_order_colum)) ||
  493. ($op == 'roomInfo' && !in_array($val['PROD_ID'], $old_order_colum))
  494. ) {
  495. $val['PROFIT_VALUE'] = $val['compensate_in'] - $val['compensate_out'];
  496. array_push($data['old_order_info'], $val);
  497. continue;
  498. }
  499. foreach ($data['old_order_info'] as $key => $item) {
  500. if (
  501. ($op == 'getInfo' && $val['PARENT_PROD_ID'] == $item['PARENT_PROD_ID']) ||
  502. ($op == 'orgSale' && $val['OUTSIDE_SALE_ORG_ID'] == $item['OUTSIDE_SALE_ORG_ID']) ||
  503. ($op == 'cusService' && $val['CREATE_USER_ID'] == $item['CREATE_USER_ID']) ||
  504. ($op == 'cusServiceSend' && $val['SEND_USER_ID'] == $item['SEND_USER_ID']) ||
  505. ($op == 'principal' && $val['PRINCIPAL_ID'] == $item['PRINCIPAL_ID']) ||
  506. ($op == 'purchaser' && $val['SALES_MAN'] == $item['SALES_MAN']) ||
  507. ($op == 'roomInfo' && $val['PROD_ID'] == $item['PROD_ID'])
  508. ) {
  509. $data['old_order_info'][$key]['order_count'] = $data['old_order_info'][$key]['order_count'] + $val['order_count'];
  510. $data['old_order_info'][$key]['compensate_out'] = $item['compensate_out'] + $val['compensate_out'];
  511. $data['old_order_info'][$key]['compensate_in'] = $item['compensate_in'] + $val['compensate_in'];
  512. $data['old_order_info'][$key]['PROFIT_VALUE'] = $data['old_order_info'][$key]['PROFIT_VALUE'] + $val['compensate_in'] - $val['compensate_out'];
  513. }
  514. }
  515. }
  516. $total_array = [];
  517. $old_total_array['total_order_num'] = array_sum(array_column($data['old_order_info'], 'order_count'));// 总订单数
  518. $old_total_array['total_room_num'] = array_sum(array_column($data['old_order_info'], 'room_count'));// 总间夜数
  519. $old_total_array['total_order_price'] = array_sum(array_column($data['old_order_info'], 'ORDER_PRICE'));// 总销售额
  520. $old_total_array['total_base_price'] = array_sum(array_column($data['old_order_info'], 'BASE_PRICE'));// 总销售额
  521. $old_total_array['total_commission_total'] = array_sum(array_column($data['old_order_info'], 'TOTAL_COMMISSION'));// 总渠道佣金
  522. $old_total_array['total_compensate_in'] = array_sum(array_column($data['old_order_info'], 'compensate_in'));// 总赔入
  523. $old_total_array['total_compensate_out'] = array_sum(array_column($data['old_order_info'], 'compensate_out'));// 总赔出
  524. $old_total_array['total_order_profit'] = array_sum(array_column($data['old_order_info'], 'PROFIT_VALUE'));// 订单总利润
  525. foreach ($data['order_info'] as $key => $order) {
  526. // 总利润
  527. $total_array['total_order_num'] += $order['order_count'];// 总订单数
  528. $total_array['total_room_num'] += $order['room_count'];// 总间夜数
  529. $total_array['total_order_price'] += round($order['ORDER_PRICE'], 2);// 总销售额
  530. $total_array['total_base_price'] += round($order['BASE_PRICE'], 2);// 总销售额
  531. $total_array['total_commission_total'] += round($order['TOTAL_COMMISSION'], 2);// 总渠道佣金
  532. $total_array['total_compensate_in'] += round($order['compensate_in'], 2);// 总赔入
  533. $total_array['total_compensate_out'] += round($order['compensate_out'], 2);// 总赔出
  534. $total_array['total_order_profit'] += round($order['PROFIT_VALUE'], 2);// 订单总利润
  535. //酒店纬度
  536. if (!in_array($order['PARENT_PROD_ID'], $group_colum) && $op == 'getInfo') {
  537. $data['old_order_info'][] = ['PARENT_PROD_ID' => $order['PARENT_PROD_ID'], 'room_count' => 0, 'ORDER_PRICE' => 0, 'BASE_PRICE' => 0, 'TOTAL_COMMISSION' => 0,
  538. 'PROFIT_VALUE' => 0, 'compensate_in' => 0, 'compensate_out' => 0];
  539. }
  540. // 渠道维度
  541. if (!in_array($order['OUTSIDE_SALE_ORG_ID'], $group_colum) && $op == 'orgSale') {
  542. $data['old_order_info'][] = ['OUTSIDE_SALE_ORG_ID' => $order['OUTSIDE_SALE_ORG_ID'], 'room_count' => 0, 'ORDER_PRICE' => 0, 'BASE_PRICE' => 0, 'TOTAL_COMMISSION' => 0,
  543. 'PROFIT_VALUE' => 0, 'compensate_in' => 0, 'compensate_out' => 0];
  544. }
  545. // 录单客服
  546. if (!in_array($order['CREATE_USER_ID'], $group_colum) && $op == 'cusService') {
  547. $data['old_order_info'][] = ['CREATE_USER_ID' => $order['CREATE_USER_ID'], 'room_count' => 0, 'ORDER_PRICE' => 0, 'BASE_PRICE' => 0, 'TOTAL_COMMISSION' => 0,
  548. 'PROFIT_VALUE' => 0, 'compensate_in' => 0, 'compensate_out' => 0];
  549. }
  550. // 发单客服
  551. if (!in_array($order['SEND_CREATE_USER'], $group_colum) && $op == 'cusServiceSend') {
  552. $data['old_order_info'][] = ['SEND_CREATE_USER' => $order['SEND_CREATE_USER'], 'room_count' => 0, 'ORDER_PRICE' => 0, 'BASE_PRICE' => 0, 'TOTAL_COMMISSION' => 0,
  553. 'PROFIT_VALUE' => 0, 'compensate_in' => 0, 'compensate_out' => 0];
  554. }
  555. // 运营维度
  556. if (!in_array($order['PRINCIPAL_ID'], $group_colum) && $op == 'principal') {
  557. $data['old_order_info'][] = ['PRINCIPAL_ID' => $order['PRINCIPAL_ID'], 'room_count' => 0, 'ORDER_PRICE' => 0, 'BASE_PRICE' => 0, 'TOTAL_COMMISSION' => 0,
  558. 'PROFIT_VALUE' => 0, 'compensate_in' => 0, 'compensate_out' => 0];
  559. }
  560. // 采购维度
  561. if (!in_array($order['PURCHASE_TRUE_NAME'], $group_colum) && $op == 'purchaser') {
  562. $data['old_order_info'][] = ['PURCHASE_TRUE_NAME' => $order['PURCHASE_TRUE_NAME'], 'room_count' => 0, 'ORDER_PRICE' => 0, 'BASE_PRICE' => 0, 'TOTAL_COMMISSION' => 0,
  563. 'PROFIT_VALUE' => 0, 'compensate_in' => 0, 'compensate_out' => 0];
  564. }
  565. // 房型维度
  566. if (!in_array($order['PROD_ID'], $group_colum) && $op == 'roomInfo') {
  567. $data['old_order_info'][] = ['PROD_ID' => $order['PROD_ID'], 'room_count' => 0, 'ORDER_PRICE' => 0, 'BASE_PRICE' => 0, 'TOTAL_COMMISSION' => 0,
  568. 'PROFIT_VALUE' => 0, 'compensate_in' => 0, 'compensate_out' => 0];
  569. }
  570. foreach ($data['old_order_info'] as $item => $old_order) {
  571. // 酒店纬度
  572. if (
  573. ($op == 'getInfo' && ($order['PARENT_PROD_ID'] == $old_order['PARENT_PROD_ID'] || $compensate_info['PARENT_PROD_ID'])) // 酒店纬度
  574. || ($op == 'orgSale' && $order['OUTSIDE_SALE_ORG_ID'] == $old_order['OUTSIDE_SALE_ORG_ID'])
  575. || ($op == 'cusService' && $order['CREATE_USER_ID'] == $old_order['CREATE_USER_ID'])
  576. || ($op == 'cusServiceSend' && $order['SEND_CREATE_USER'] == $old_order['SEND_CREATE_USER'])
  577. || ($op == 'principal' && $order['PRINCIPAL_ID'] == $old_order['PRINCIPAL_ID'])
  578. || ($op == 'purchaser' && $order['SALES_MAN'] == $old_order['SALES_MAN'])
  579. || ($op == 'roomInfo' && $order['PROD_ID'] == $old_order['PROD_ID'])
  580. ) {
  581. // 间夜月环比
  582. $data['order_info'][$key]['room_count_mom'] = (empty($old_order['room_count']) || $old_order['room_count'] == 0) ? '-' : round(($order['room_count'] - $old_order['room_count']) / $old_order['room_count'] * 100, 2) . '%';
  583. // 销售额月环比
  584. $data['order_info'][$key]['order_price_mom'] = (empty($old_order['ORDER_PRICE']) || $old_order['ORDER_PRICE'] == 0) ? '-' : round(($order['ORDER_PRICE'] - $old_order['ORDER_PRICE']) / $old_order['ORDER_PRICE'] * 100, 2) . '%';
  585. // 毛利月环比
  586. $data['order_info'][$key]['profit_value_mom'] = (empty($old_order['PROFIT_VALUE']) || $old_order['PROFIT_VALUE'] == 0) ? '-' : round(($order['PROFIT_VALUE'] - $old_order['PROFIT_VALUE']) / abs($old_order['PROFIT_VALUE']) * 100, 2) . '%';
  587. // 毛利率
  588. break;
  589. }
  590. }
  591. $data['order_info'][$key]['price_rate'] = (empty($order['ORDER_PRICE']) || $order['ORDER_PRICE'] == 0) ? '-' : round($order['PROFIT_VALUE'] / $order['ORDER_PRICE'], 4) * 100 . '%';
  592. }
  593. // 本期总利润
  594. $A = $total_array['total_order_profit'] - $total_array['compensate_out'] + $total_array['compensate_in'];
  595. // 上期总利润
  596. $B = $old_total_array['total_order_profit'] - $old_total_array['compensate_out'] + $old_total_array['compensate_in'];
  597. // 总环比计算
  598. $total_array['total_mom_room_count'] = empty($old_total_array['total_room_num']) ? '-' : round(($total_array['total_room_num'] - $old_total_array['total_room_num']) / $old_total_array['total_room_num'] * 100, 2) . '%';
  599. $total_array['total_mom_order_price'] = empty($old_total_array['total_order_price']) ? '-' : number_format(($total_array['total_order_price'] - $old_total_array['total_order_price']) / $old_total_array['total_order_price'] * 100, 2) . '%';
  600. $total_array['total_mom_profit_value'] = empty($B) ? '-' : number_format(($A - $B) / $B * 100, 2) . '%'; // 毛利月环比
  601. $total_array['total_price_rate'] = (empty($total_array['total_order_price']) || $total_array['total_order_price'] == 0) ? '-' : number_format($A / $total_array['total_order_price'] * 100, 2) . '%'; // 毛利率
  602. $data['total'] = $total_array;
  603. // 处理数据
  604. return $data;
  605. }
  606. /**
  607. * @Author wanglg
  608. * @Desc查询日期段内所有订单信息,根据查询维度查询
  609. * @param $params
  610. * @param $op
  611. * @return
  612. */
  613. public function getOrderList1($params, $op)
  614. {
  615. $model = new searchOrderMain();
  616. // 如果是运营,查询所运营的酒店信息,如果是非酒店运营,采购,管理人员,客服管理人员,返回空数组
  617. if (BaseUserAuth::HOTEL_OPERATOR == Yii::$app->user->identity['USER_ROLE']) {
  618. $where = ['order_main.PRINCIPAL_ID' => Yii::$app->user->id];
  619. $childWhere = ['PRINCIPAL_ID' => Yii::$app->user->id];
  620. } elseif (BaseUserAuth::HOTEL_PURCHASE == Yii::$app->user->identity['USER_ROLE']) {
  621. $where = ['order_main.SALES_MAN' => Yii::$app->user->id];
  622. $childWhere = ['SALES_MAN' => Yii::$app->user->id];
  623. } elseif (Yii::$app->user->identity['USER_ROLE'] == BaseUserAuth::HOTEL_ADMIN || Yii::$app->user->identity['USER_ROLE'] == BaseUserAuth::HOTEL_CUS_ADMIN
  624. || Yii::$app->user->identity['USER_ROLE'] == BaseUserAuth::SYS_CS || Yii::$app->user->identity['USER_ROLE'] == BaseUserAuth::SYS_ADMIN
  625. || Yii::$app->user->identity['USER_ROLE'] == BaseUserAuth::FINANCIAL_OFFICER) {
  626. // 酒店管理员、客服管理人员、后台管理人员和系统管理员可以查看所有数据
  627. $where = '';
  628. $childWhere = '';
  629. } else {
  630. return [];
  631. }
  632. // 查询本月数据
  633. $query = OrderMain::find()
  634. ->joinWith('user')
  635. ->joinWith('baseChannel')
  636. ->leftJoin('base_user as p', 'p.ID=order_main.PRINCIPAL_ID')
  637. ->leftJoin('base_user as pur', 'pur.ID=order_main.SALES_MAN')
  638. ->from('order_main');
  639. $model->load($params);
  640. $query->andFilterWhere([
  641. 'order_main.CANCEL_FLAG' => 0,
  642. 'order_main.ORDER_PROD_TYPE' => OrderMain::ORDER_PROD_TYPE_MAIN,
  643. 'order_main.ORDER_VALID_STATUS' => 1,
  644. ]);
  645. $query->addSelect(['order_main.OUTSIDE_SALE_ORG_ID', 'base_supplier.SUPPLIER_NAME as CHANNEL_NAME', 'order_main.PARENT_PROD_ID', 'order_main.CREATE_USER_ID', 'order_main.PROD_ID',
  646. 'order_main.PRINCIPAL_ID', 'order_main.SALES_MAN', 'p.TRUE_NAME as PRINCIPAL_TRUE_NAME', 'base_user.TRUE_NAME AS INPUT_CREATE_USER', 'order_main.PROD_NAME',
  647. 'pur.TRUE_NAME as PURCHASE_TRUE_NAME',
  648. 'COUNT(order_main.ORDER_ID) as order_count', 'order_main.PARENT_PROD_NAME', 'IF(0=0,0.00,0.00) as compensate_out', 'IF(0=0,0.00,0.00) as compensate_in']);
  649. if ($model->channel_id) {
  650. $query->andFilterWhere(['order_main.OUTSIDE_SALE_ORG_ID' => trim($model->channel_id)]);
  651. }
  652. if ($model->hotel_name) {
  653. $query->andFilterWhere(['like', 'order_main.PARENT_PROD_NAME', trim($model->hotel_name)]);
  654. }
  655. if ($model->hotel_id) {
  656. $query->andFilterWhere(['order_main.PARENT_PROD_ID' => trim($model->hotel_id)]);
  657. }
  658. if ($op != 'cusServiceSend') {
  659. $query->andFilterWhere(['order_main.ORDER_STATUS' =>// array(198, 314, 147, 313, 382),
  660. [OrderMain::ORDER_STATUS_WAITING_CONFIRM,
  661. OrderMain::ORDER_STATUS_CONFIRMED,
  662. OrderMain::ORDER_STATUS_FINISH,
  663. OrderMain::ORDER_STATUS_WAITING_SEND,
  664. OrderMain::ORDER_STATUS_CHANGING]]);
  665. }
  666. if ($op == 'getInfo') {
  667. $group_by = 'PARENT_PROD_ID';
  668. $order_by = ['room_count' => SORT_DESC, 'order_main.PARENT_PROD_ID' => SORT_ASC];
  669. } elseif ($op == 'orgSale') {
  670. $group_by = 'OUTSIDE_SALE_ORG_ID';
  671. $order_by = ['room_count' => SORT_DESC, 'order_main.OUTSIDE_SALE_ORG_ID' => SORT_ASC];
  672. } elseif ($op == 'cusService') // 客服录单
  673. {
  674. $group_by = 'CREATE_USER_ID';
  675. $order_by = ['room_count' => SORT_DESC, 'order_main.CREATE_USER_ID' => SORT_ASC];
  676. } elseif ($op == 'cusServiceSend') // 客服发单
  677. {
  678. $query->addSelect(['order_ht_status_log.CREATE_USER_ID AS SEND_USER_ID', 'lu.TRUE_NAME AS SEND_CREATE_USER']);
  679. $query->joinWith('orderHtStatusLog.user lu');
  680. $query->andFilterWhere(['order_main.DOCKING_TYPE' => OrderMain::ORDER_TYPE_CHANNEL, 'order_ht_status_log.ORDER_STATUS' => OrderMain::ORDER_STATUS_WAITING_CONFIRM,
  681. 'order_ht_status_log.BEFORE_STATUS' => OrderMain::ORDER_STATUS_WAITING_SEND]);
  682. $group_by = 'SEND_USER_ID';
  683. $order_by = ['room_count' => SORT_DESC, 'SEND_USER_ID' => SORT_ASC];
  684. } elseif ($op == 'principal') // 运营
  685. {
  686. $group_by = 'PRINCIPAL_ID';
  687. $order_by = ['room_count' => SORT_DESC, 'order_main.PRINCIPAL_ID' => SORT_ASC];
  688. } elseif ($op == 'purchaser') // 采购
  689. {
  690. $group_by = 'SALES_MAN';
  691. $order_by = ['room_count' => SORT_DESC, 'SALES_MAN' => SORT_ASC];
  692. } elseif ($op == 'roomInfo') // 采购
  693. {
  694. $group_by = 'PROD_ID';
  695. $order_by = ['room_count' => SORT_DESC, 'order_main.PROD_ID' => SORT_ASC];
  696. } else {
  697. $group_by = 'PARENT_PROD_ID';
  698. $order_by = ['room_count' => SORT_DESC, 'order_main.PARENT_PROD_ID' => SORT_ASC];
  699. }
  700. //预订时间
  701. $date_start = ' 00:00:00';
  702. $date_end = ' 23:59:59';
  703. // 入住日期
  704. if ($model->date_type == 2) {
  705. // 子查询需要查询的字段
  706. $query->addSelect(['vice_order.ORDER_PRICE ORDER_PRICE', 'vice_order.BASE_PRICE BASE_PRICE', 'vice_order.TOTAL_COMMISSION TOTAL_COMMISSION',
  707. 'vice_order.PROFIT_VALUE PROFIT_VALUE', 'vice_order.room_count room_count']);
  708. $check_in = OrderMain::find()
  709. ->select(['SUM(ORDER_PRICE) ORDER_PRICE', 'SUM(BASE_PRICE) BASE_PRICE', 'SUM(TOTAL_COMMISSION) TOTAL_COMMISSION', 'SUM(PROFIT_VALUE) PROFIT_VALUE',
  710. 'count(order_main.ORDER_ID) AS room_count'])
  711. ->from('order_main');
  712. $check_in->andFilterWhere(['ORDER_PROD_TYPE' => OrderMain::ORDER_PROD_TYPE_SUM, 'order_main.CANCEL_FLAG' => 0, 'ORDER_VALID_STATUS' => 1,
  713. 'order_main.ORDER_STATUS' =>
  714. [OrderMain::ORDER_STATUS_WAITING_CONFIRM,
  715. OrderMain::ORDER_STATUS_CONFIRMED,
  716. OrderMain::ORDER_STATUS_FINISH,
  717. OrderMain::ORDER_STATUS_WAITING_SEND,
  718. OrderMain::ORDER_STATUS_CHANGING],
  719. ]);
  720. $check_in->andFilterWhere(['between', 'PROD_START_STATION_DATE', $model->date_from, $model->date_to]);
  721. if ($childWhere) {
  722. $check_in->andFilterWhere($childWhere);
  723. }
  724. // 查询筛选条件
  725. if ($model->hotel_id) {
  726. $check_in->andFilterWhere(['PARENT_PROD_ID' => $model->hotel_id]);
  727. }
  728. if ($model->channel_id) {
  729. $check_in->andFilterWhere(['OUTSIDE_SALE_ORG_ID' => $model->channel_id]);
  730. }
  731. $check_in->groupBy($group_by);
  732. // 按照入住日期查询,因为一个订单可能有多个入住日期,但只统计筛选范围的子订单,需要通过子订单来查询,
  733. // 如果是发单维度,需要关联订单状态表查询发单客服
  734. if ($op == 'cusServiceSend') {
  735. $check_in->addSelect(["order_ht_status_log.CREATE_USER_ID AS {$group_by}"]);
  736. $check_in->leftJoin('order_ht_status_log', 'order_main.PARENT_ORDER_ID=order_ht_status_log.ORDER_ID AND order_ht_status_log.ORDER_STATUS=198
  737. AND order_ht_status_log.BEFORE_STATUS=313')
  738. ->leftJoin('base_user', 'order_ht_status_log.CREATE_USER_ID=base_user.ID');
  739. $check_in->andFilterWhere(['DOCKING_TYPE' => OrderMain::ORDER_TYPE_CHANNEL]);
  740. $check_in_sql = $check_in->createCommand()->getRawSql();
  741. $query->leftJoin("({$check_in_sql}) as vice_order", "vice_order.{$group_by}=order_ht_status_log.CREATE_USER_ID");
  742. } else {
  743. $check_in->addSelect([$group_by]);
  744. $check_in_sql = $check_in->createCommand()->getRawSql();
  745. $query->leftJoin("({$check_in_sql}) as vice_order", "vice_order.{$group_by}=order_main.{$group_by}");
  746. }
  747. // 主订单的日期筛选
  748. $query->andFilterWhere(['or', ['and', ['<=', 'order_main.PROD_START_STATION_DATE', $model->date_from], ['>', 'order_main.PROD_END_STATION_DATE', $model->date_from]],
  749. ['and', ['<=', 'order_main.PROD_START_STATION_DATE', $model->date_to], ['>', 'order_main.PROD_END_STATION_DATE', $model->date_to]],
  750. ['and', ['>=', 'order_main.PROD_START_STATION_DATE', $model->date_from], ['<=', 'order_main.PROD_END_STATION_DATE', $model->date_to]]]);
  751. } elseif ($model->date_type == 3) { // 离店
  752. $date_column = 'PROD_END_STATION_DATE';
  753. $query->addSelect(['SUM(order_main.ORDER_PRICE) as ORDER_PRICE', 'SUM(order_main.BASE_PRICE) as BASE_PRICE', 'SUM(order_main.TOTAL_COMMISSION) as TOTAL_COMMISSION', 'SUM(order_main.PROFIT_VALUE) as PROFIT_VALUE',
  754. 'SUM((SELECT COUNT(ORDER_ID) FROM order_main a WHERE PARENT_ORDER_ID=order_main.ORDER_ID AND a.CANCEL_FLAG=0 AND a.ORDER_PROD_TYPE=26)) as room_count',
  755. ]);
  756. $query->andFilterWhere(['between', $date_column, $model->date_from, $model->date_to]);
  757. } else { // 录单时间
  758. $query->addSelect(['SUM(order_main.ORDER_PRICE) as ORDER_PRICE', 'SUM(order_main.BASE_PRICE) as BASE_PRICE', 'SUM(order_main.TOTAL_COMMISSION) as TOTAL_COMMISSION', 'SUM(order_main.PROFIT_VALUE) as PROFIT_VALUE',
  759. 'SUM((SELECT COUNT(ORDER_ID) FROM order_main a WHERE PARENT_ORDER_ID=order_main.ORDER_ID AND a.CANCEL_FLAG=0 AND a.ORDER_PROD_TYPE=26)) as room_count',
  760. ]);
  761. $query->andFilterWhere(['between', 'order_main.CREATE_TIME', $model->date_from . $date_start, $model->date_to . $date_end]);
  762. }
  763. if ($where) {
  764. $query->andFilterWhere($where);
  765. }
  766. $query->orderBy($order_by);
  767. $query->groupBy($group_by);
  768. // $sql = $query->createCommand()->getRawSql();
  769. return $query->asArray()->all();
  770. }
  771. /**
  772. * @Author wanglg
  773. * @Desc 获取赔入赔出sql对象
  774. * @param $params查询维度详细参数
  775. * @param $op查询维度
  776. * @return object
  777. */
  778. public function getCompensateInOrOut($params, $op)
  779. {
  780. $from = $params['date_from'] . ' 00:00:00';
  781. $to = $params['date_to'] . ' 23:59:59';
  782. $info = OrderFinanceReparations::find()
  783. ->select(['b.CREATE_TIME', 'b.CREATE_USER_ID', 'b.SALES_MAN AS SALES_MAN', 'b.PRINCIPAL_ID', 'a.ORDER_ID', 'b.PARENT_PROD_ID', 'b.PROD_ID', 'b.CUSTOMER_NAME',
  784. 'b.CUSTOMER_MOBILE', 'b.PARENT_PROD_NAME', 'b.PROD_NAME', 'b.OUTSIDE_SALE_ORG_ID', 'b.PROD_START_STATION_DATE', 'b.PROD_END_STATION_DATE',
  785. 'IF(0=0, "0", "0") as ORDER_PRICE', 'IF(0=0, "0", "0") as BASE_PRICE', 'IF(0=0, "0", "0") as TOTAL_COMMISSION', 'IF(0=0, "0", "0") as PROFIT_VALUE', 'bs.SUPPLIER_NAME as CHANNEL_NAME',
  786. 'user2.TRUE_NAME as INPUT_CREATE_USER', 'user1.TRUE_NAME as PURCHASE_TRUE_NAME',
  787. 'IF(0=0, "-", "-") AS ORDER_STATUS_NAME'])
  788. ->leftJoin('order_main b', 'a.order_id=b.ORDER_ID')
  789. ->leftJoin('base_supplier bs', 'bs.ID=b.OUTSIDE_SALE_ORG_ID')
  790. ->leftJoin('base_user user2', 'user2.ID=b.CREATE_USER_ID')
  791. ->leftJoin('base_user user1', 'user1.ID=b.SALES_MAN')
  792. ->where(['and', 'a.cancel_flag=0', 'b.ORDER_PROD_TYPE=25', 'b.CANCEL_FLAG=0', "a.create_time between '{$from}' and '{$to}'"])
  793. ->from('order_finance_reparations a');
  794. // 如果是发单或录单则不统计赔入赔出
  795. if (in_array($op, ['cusServiceSend', 'cusService'])) {
  796. $info->addSelect(['IF(0=0, 0, 0) AS order_count', 'IF(0=0, 0, 0) as compensate_out', 'IF(0=0, 0, 0) as compensate_in',]);
  797. } else {
  798. $info->addSelect(['COUNT(a.order_id) as order_count', 'SUM(case reparation_type when 1 then reparations else 0.00 end) as compensate_out',
  799. 'SUM(case reparation_type when 2 then reparations else 0.00 end) as compensate_in',]);
  800. }
  801. // 查询发单相关信息
  802. if ($op == 'cusServiceSend') {
  803. $info->addSelect(['sl.CREATE_USER_ID as SEND_USER_ID', 'user.TRUE_NAME SEND_CREATE_USER']);
  804. $info->leftJoin('order_ht_status_log sl', 'sl.ORDER_ID=b.ORDER_ID and sl.ORDER_STATUS=198 and sl.BEFORE_STATUS=313')
  805. ->leftJoin('base_user user', 'sl.CREATE_USER_ID=user.ID');
  806. $info->andFilterWhere(['b.DOCKING_TYPE' => OrderMain::ORDER_TYPE_CHANNEL]);
  807. $info->groupBy('SEND_USER_ID');
  808. } else {
  809. $group_by = $this->selectGroupBy($op);
  810. $info->groupBy($group_by);
  811. }
  812. if (!empty($params['hotel_id'])) {
  813. $info->andFilterWhere(['b.PARENT_PROD_ID' => $params['hotel_id']]);
  814. }
  815. if (!empty($params['channel_id'])) {
  816. $info->andFilterWhere(['b.OUTSIDE_SALE_ORG_ID' => $params['channel_id']]);
  817. }
  818. if (!empty($params['principal_id'])) {
  819. $info->andFilterWhere(['b.PRINCIPAL_ID' => $params['principal_id']]);
  820. }
  821. if (!empty($params['purchaser_id'])) {
  822. $info->andFilterWhere(['b.SALES_MAN' => $params['purchaser_id']]);
  823. }
  824. if (!empty($params['user_id'])) {
  825. $info->andFilterWhere(['b.CREATE_USER_ID' => $params['user_id']]);
  826. }
  827. if (!empty($params['send_user_id'])) {
  828. $info->andFilterWhere(['sl.CREATE_USER_ID' => $params['send_user_id']]);
  829. }
  830. $info->addSelect(['IF(0=0, "-", "-") as room_count']);
  831. // 查询如果订单日期也在该范围内则room_count - 该数量
  832. return $info;
  833. }
  834. /**
  835. * @Author wanglg
  836. * @Desc 不同纬度分组
  837. * @param $op分组维度
  838. * @return array
  839. */
  840. public function selectGroupBy($op)
  841. {
  842. if ($op == 'getInfo') {
  843. $group_by = ['PARENT_PROD_ID'];// 酒店维度
  844. } elseif ($op == 'orgSale') {
  845. $group_by = ['OUTSIDE_SALE_ORG_ID'];
  846. } elseif ($op == 'cusService') // 客服录单
  847. {
  848. $group_by = ['CREATE_USER_ID'];
  849. } elseif ($op == 'principal') // 运营
  850. {
  851. $group_by = ['PRINCIPAL_ID'];
  852. } elseif ($op == 'purchaser') // 采购
  853. {
  854. $group_by = ['SALES_MAN'];
  855. } elseif ($op == 'roomInfo') // 房型
  856. {
  857. $group_by = ['PROD_ID'];
  858. } else {
  859. $group_by = ['PARENT_PROD_ID'];
  860. }
  861. return $group_by;
  862. }
  863. }