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.
 
 
 
 
 
 

1014 regels
43 KiB

  1. <?php
  2. namespace backend\modules\hotel\controllers;
  3. //use backend\modules\api\models\OperaHotelBaseRoom;
  4. use backend\modules\api\models\DictType;
  5. use backend\modules\hotel\models\BaseImg;
  6. use backend\modules\hotel\models\CtripHotelPrice;
  7. use backend\modules\hotel\models\OperaHotelBaseRoom;
  8. use backend\modules\hotel\models\OperaHotelGift;
  9. use backend\modules\hotel\models\OperaHotelLog;
  10. use backend\modules\hotel\models\OperaSort;
  11. use backend\modules\hotel\models\OrderMain;
  12. use backend\modules\hotel\models\RunHotel;
  13. use common\util\UploadPic;
  14. use Yii;
  15. use backend\modules\hotel\models\OperaHotel;
  16. use backend\modules\hotel\models\RunHotelDistrib;
  17. use yii\db\Exception;
  18. use yii\helpers\ArrayHelper;
  19. use yii\helpers\Url;
  20. use yii\imagine\BaseImage;
  21. use yii\imagine\Image;
  22. use yii\web\Controller;
  23. use backend\modules\hotel\models\Report;
  24. use backend\modules\hotel\models\RunHotelSubRoom;
  25. use backend\modules\hotel\models\OperaHotelRoom;
  26. use backend\modules\hotel\models\RoomRelation;
  27. use backend\modules\hotel\models\HotelRelation;
  28. use backend\modules\hotel\models\OrderHtExceptionList;
  29. use backend\modules\hotel\models\OrderChannelInfo;
  30. use common\components\zOfficeWechat;
  31. use backend\modules\zzcs\models\BaseAreaView;
  32. use yii\helpers\Json;
  33. use yii\web\NotFoundHttpException;
  34. use yii\web\UploadedFile;
  35. /**
  36. * Default controller for the `Hotel` module
  37. */
  38. class HotelController extends BaseController
  39. {
  40. // public $layout = "@backend/modules/motorcade/views/layouts/iframe_new";
  41. public $layout = '@backend/modules/zzcs/views/layouts/zzcs';
  42. public $enableCsrfValidation = false;
  43. public function actions()
  44. {
  45. return [
  46. 'upload' => [
  47. 'class' => 'kucha\ueditor\UEditorAction',
  48. 'config' => [
  49. 'imagePathFormat' => '/upload/hotel/{yyyy}{mm}{dd}/{time}{rand:6}',
  50. ],
  51. ]
  52. ];
  53. }
  54. /**
  55. * 酒店列表
  56. */
  57. public function actionIndex()
  58. {
  59. $this->layout = "@backend/modules/motorcade/views/layouts/iframe_new";
  60. $hotel = new OperaHotel();
  61. $hotel->HOTEL_STATUS = 1;
  62. $dataProvider = $hotel->getHotelist(Yii::$app->request->queryParams);
  63. return $this->render('index', [
  64. 'model' => $hotel,
  65. 'dataProvider' => $dataProvider,
  66. ]);
  67. }
  68. /**
  69. * @Author wanglg
  70. * @Desc添加酒店
  71. * @return string|\yii\web\Response
  72. */
  73. public function actionAddHotel()
  74. {
  75. $hotel = new OperaHotel(['scenario' => 'addHotel']);
  76. $base_room = new OperaHotelBaseRoom();
  77. $gift = new OperaHotelGift();
  78. $star_level = DictType::findAll(['PARENT_ID' => 30]);
  79. $data['base_room'][] = $base_room;
  80. $data['hotel'] = $hotel;
  81. $data['star_level'] = $star_level;
  82. $data['gift'][] = $gift;
  83. if(Yii::$app->request->isPost) {
  84. $request = Yii::$app->request->post();
  85. // 添加酒店缩略图begin
  86. @$hotel_thumb_img_url = $_FILES['OperaHotel']['name']['HOTEL_IMAGE'];
  87. if($hotel_thumb_img_url && $hotel_thumb_img_url != '' && $hotel_thumb_img_url != Yii::$app->params['motorcadeDefaultImage']) {
  88. $hotel_imags_arr = UploadedFile::getInstance($hotel, "HOTEL_IMAGE");
  89. $hotel_img_path = Yii::$app->basePath . '/web' . Yii::$app->params['hotelImagePath'];
  90. $hotel_img_name = OperaHotelBaseRoom::getImgName($hotel_img_path, '.' . $hotel_imags_arr->extension);
  91. $hotel_imags_arr->saveAs($hotel_img_path . $hotel_img_name);
  92. $hotel_thum = Image::thumbnail($hotel_img_path . $hotel_img_name, 370, 370);
  93. $hotel_thum->save($hotel_img_path . 'hotel_thumb_' . $hotel_img_name);
  94. $request['OperaHotel']['HOTEL_IMAGE'] = 'http://' . CS1_DOMAIN . Yii::$app->params['hotelImagePath'] . 'hotel_thumb_' . $hotel_img_name;
  95. $img_path = $hotel_img_path . 'hotel_thumb_' . $hotel_img_name;
  96. UploadPic::cutPic($img_path, $img_path . '.370x326.' . $hotel_imags_arr->extension, '370', '326');//生成官网展示图片 从中间剪切
  97. UploadPic::cutPic($img_path, $img_path . '.180x180.' . $hotel_imags_arr->extension, '180', '180');//生成小图 从中间剪切
  98. }
  99. // 添加酒店缩略图end
  100. $hotel_lable_str = '';
  101. if(!empty($request['hotel_label'])) {
  102. foreach ($request['hotel_label'] as $h_lable) {
  103. // 将标签用 , 隔开
  104. $hotel_lable_str .= $h_lable . ',';
  105. }
  106. }
  107. // 设置酒店标签
  108. $request['OperaHotel']['HOTEL_LABEL'] = trim($hotel_lable_str, ',');
  109. $sale_lable_str = '';
  110. if(!empty($request['sale_label'])) {
  111. foreach ($request['sale_label'] as $s_lable) {
  112. // 将标签用 , 隔开
  113. $sale_lable_str .= $s_lable . ',';
  114. }
  115. }
  116. // 售卖标签
  117. $request['OperaHotel']['SALE_LABEL'] = trim($sale_lable_str, ',');
  118. // 处理地区ID 1. 北京 18. 天津 791.上海 2237. 重庆
  119. if($request['OperaHotel']['province'] == 1 || $request['OperaHotel']['province'] == 18 || $request['OperaHotel']['province'] == 791 || $request['OperaHotel']['province'] == 2237) {
  120. $request['OperaHotel']['AREA_ID'] = $request['OperaHotel']['city'];
  121. } else {
  122. $request['OperaHotel']['AREA_ID'] = $request['OperaHotel']['country'];
  123. }
  124. unset($request['OperaHotel']['province']);
  125. unset($request['OperaHotel']['city']);
  126. unset($request['OperaHotel']['country']);
  127. $transaction = Yii::$app->db->beginTransaction();
  128. $request['OperaHotel']['PRINCIPAL'] = Yii::$app->user->id;
  129. // 插入基础房型
  130. try {
  131. $link_arr = array_values($request['OperaHotelBaseRoom']);
  132. if($hotel->load($request['OperaHotel'], '') && $hotel->validate()) {
  133. // 酒店信息保存
  134. if(!$hotel->save()) {
  135. throw new \Exception();
  136. }
  137. $opera_hotel_id = $hotel->HOTEL_ID;
  138. Yii::$app->session->set('new_hotel_id', $opera_hotel_id);
  139. } else {
  140. throw new \Exception();
  141. }
  142. // 添加礼盒信息
  143. foreach ($request['OperaHotelGift'] as $itme => $value) {
  144. $gift_model = empty($value['ID']) ? new OperaHotelGift(): OperaHotelGift::findOne($value['ID']);
  145. $value['HOTEL_ID'] = $opera_hotel_id;
  146. if($gift_model->load($value, '') && $gift_model->validate()) {
  147. if(!$gift_model->save()) {
  148. throw new \Exception('保存礼盒信息失败');
  149. }
  150. }
  151. }
  152. $room_type_all = '';
  153. $i = 0;
  154. // 添加基础房型
  155. foreach ($link_arr as $key => $value) {
  156. $i++;
  157. $link_arr[$key]['HOTEL_ID'] = $opera_hotel_id;
  158. $base_room_list = new OperaHotelBaseRoom();
  159. /******************图片上传BEGIN*********************/
  160. @$img_url = $_FILES['OperaHotelBaseRoom']['name'][$key]['ROOM_IMG'];
  161. if($img_url && $img_url != '' && $img_url != Yii::$app->params['motorcadeDefaultImage']) {
  162. $base_room_list->ROOM_IMG = UploadedFile::getInstance($base_room_list, "[$key]ROOM_IMG");
  163. $base_path = Yii::$app->basePath . '/web' . Yii::$app->params['hotelImagePath'];
  164. $img_name = OperaHotelBaseRoom::getImgName($base_path, '.' . $base_room_list->ROOM_IMG->extension);
  165. $base_room_list->ROOM_IMG->saveAs($base_path . $img_name);
  166. $thum_image = Image::thumbnail($base_path . $img_name, OperaHotelBaseRoom::ROOM_PIC_WIDTH, OperaHotelBaseRoom::ROOM_PIC_HEIGHT);
  167. $thum_image->save($base_path . 'thumb_' . $img_name); // 图片上传
  168. // 保存路径至数据库中
  169. $base_room_list->ROOM_IMG = 'http://' . CS1_DOMAIN . Yii::$app->params['hotelImagePath'] . 'thumb_' . $img_name;
  170. }
  171. /******************图片上传END*********************/
  172. $link_arr[$key]['BED_TYPE'] = implode(',', $value['BED_TYPE']);
  173. if(!($base_room_list->load($link_arr[$key], '') && $base_room_list->validate())) {
  174. throw new \Exception();
  175. }
  176. // 添加基础房型
  177. if(!$base_room_list->save()) {
  178. throw new \Exception();
  179. }
  180. $base_room_id = $base_room_list->MAIN_ID;
  181. $new_opera_sort = new OperaSort();
  182. $opera_sort_arr = array('hotel_id' => $opera_hotel_id, 'base_room_id' => $base_room_id, 'seq' => $i);
  183. if($new_opera_sort->load($opera_sort_arr, '') && $new_opera_sort->validate()) {
  184. if(!$new_opera_sort->save()) {
  185. throw new \Exception();
  186. }
  187. } else {
  188. throw new \Exception();
  189. }
  190. $room_type_all .= $base_room_id . ',';
  191. }
  192. $room_type_all = trim($room_type_all, ',');
  193. $uhotel = OperaHotel::findOne($opera_hotel_id);
  194. $uhotel->ROOM_TYPE_ALL = $room_type_all;
  195. $uhotel->ROOM_TYPE_SALE = $room_type_all;
  196. if(!$uhotel->update()) {
  197. throw new \Exception();
  198. }
  199. $transaction->commit();
  200. Yii::$app->session->setFlash('success', "添加成功!");
  201. return json_encode(array('code' => 0, 'msg' => 'success'));
  202. // return $this -> redirect('/hotel/hotel/index');
  203. } catch (\Exception $e) {
  204. Yii::$app->session->setFlash('error', "添加失败!");
  205. $transaction->rollBack();
  206. }
  207. }
  208. return $this->render('base', ['view' => 'addHotel', 'data' => $data]);
  209. }
  210. /**
  211. * 更新酒店信息
  212. */
  213. public function actionUpdateHotel($hotel_id)
  214. {
  215. $hotel = OperaHotel::findOne($hotel_id);
  216. $hotel->setScenario('addHotel');
  217. $base_room = new OperaHotelBaseRoom();
  218. $base_rooms = $base_room->getHotelBaseRoom($hotel_id);
  219. $gift = OperaHotelGift::findAll(['HOTEL_ID' => $hotel_id, 'CANCEL_FLAG' => 0]);
  220. $hotel_imgs = BaseImg::findAll(['PRODUCT_ID' => $hotel_id, 'IMG_TYPE' => 25, 'CANCEL_FLAG' => 0]);
  221. $str_hotel_imgs = '';
  222. foreach ($hotel_imgs as $item => $img) {
  223. $str_hotel_imgs .= $img['IMG_URL'] . ',';
  224. }
  225. $str_hotel_imgs = trim($str_hotel_imgs, ',');
  226. $paths = empty($hotel->HOTEL_IMAGE) ? ['/resource/img/default-thumbnail.png']: explode('||', $hotel->HOTEL_IMAGE);
  227. $area_id = $hotel->AREA_ID;
  228. // 基础房型
  229. empty($base_rooms) ? $data['base_room'][] = new OperaHotelBaseRoom(): $data['base_room'] = $base_rooms;
  230. // 礼盒信息
  231. empty($gift) ? $data['gift'][] = new OperaHotelGift(): $data['gift'] = $gift;
  232. $data['imgs'] = $paths;
  233. $data['hotel'] = $hotel;
  234. $data['json_imgs'] = $str_hotel_imgs;
  235. $data['op'] = 'modify';
  236. if(Yii::$app->request->isPost) {
  237. $request = Yii::$app->request->post();
  238. @$hotel_thumb_img_url = $_FILES['OperaHotel']['name']['HOTEL_IMAGE'];
  239. if($hotel_thumb_img_url && $hotel_thumb_img_url != '' && $hotel_thumb_img_url != Yii::$app->params['motorcadeDefaultImage']) // 上传不为空再上传图片
  240. {
  241. $hotel_imags_arr = UploadedFile::getInstance($hotel, "HOTEL_IMAGE");
  242. $hotel_img_path = Yii::$app->basePath . '/web' . Yii::$app->params['hotelImagePath'];
  243. $hotel_img_name = OperaHotelBaseRoom::getImgName($hotel_img_path, '.' . $hotel_imags_arr->extension);
  244. $hotel_imags_arr->saveAs($hotel_img_path . $hotel_img_name);
  245. $hotel_thum = Image::thumbnail($hotel_img_path . $hotel_img_name, 370, 370);
  246. $hotel_thum->save($hotel_img_path . 'hotel_thumb_' . $hotel_img_name);
  247. $request['OperaHotel']['HOTEL_IMAGE'] = 'http://' . CS1_DOMAIN . Yii::$app->params['hotelImagePath'] . 'hotel_thumb_' . $hotel_img_name;
  248. $img_path = $hotel_img_path . 'hotel_thumb_' . $hotel_img_name;
  249. UploadPic::cutPic($img_path, $img_path . '.370x326.' . $hotel_imags_arr->extension, '370', '326');//生成官网展示图片 从中间剪切
  250. UploadPic::cutPic($img_path, $img_path . '.180x180.' . $hotel_imags_arr->extension, '180', '180');//生成小图 从中间剪切
  251. }
  252. // 设置对象的Area_id
  253. empty($request['OperaHotel']['country']) ? $request['OperaHotel']['AREA_ID'] = $request['OperaHotel']['city']: $request['OperaHotel']['AREA_ID'] = $request['OperaHotel']['country'];
  254. $hotel_lable_str = '';
  255. if(!empty($request['hotel_label'])) {
  256. foreach ($request['hotel_label'] as $h_lable) {
  257. // 将标签用 , 隔开
  258. $hotel_lable_str .= $h_lable . ',';
  259. }
  260. }
  261. // 设置酒店标签
  262. $request['OperaHotel']['HOTEL_LABEL'] = trim($hotel_lable_str, ',');
  263. $sale_lable_str = '';
  264. if(!empty($request['sale_label'])) {
  265. foreach ($request['sale_label'] as $s_lable) {
  266. // 将标签用 , 隔开
  267. $sale_lable_str .= $s_lable . ',';
  268. }
  269. }
  270. $request['OperaHotel']['SALE_LABEL'] = trim($sale_lable_str, ',');
  271. // 经纬度
  272. unset($request['OperaHotel']['province']);
  273. unset($request['OperaHotel']['city']);
  274. unset($request['OperaHotel']['country']);
  275. $hotel->base_room = $request['OperaHotelBaseRoom'];
  276. $transaction = Yii::$app->db->beginTransaction();
  277. try {
  278. if($hotel->load($request) && $hotel->validate()) {
  279. if(!$hotel->save()) {
  280. throw new \Exception('修改酒店失败');
  281. }
  282. } else {
  283. throw new \Exception('修改酒店失败');
  284. }
  285. // 修改、添加礼盒信息
  286. foreach ($request['OperaHotelGift'] as $itme => $value) {
  287. $gift_model = empty($value['ID']) ? new OperaHotelGift(): OperaHotelGift::findOne($value['ID']);
  288. $value['HOTEL_ID'] = $hotel_id;
  289. if($gift_model->load($value, '') && $gift_model->validate()) {
  290. if(!$gift_model->save()) {
  291. throw new \Exception('保存礼盒信息失败');
  292. }
  293. }
  294. }
  295. // 修改基础房型信息
  296. $room_type_all = '';
  297. $i = 0;
  298. foreach ($request['OperaHotelBaseRoom'] as $key => $value) {
  299. $i++;
  300. $base_room = (isset($value['MAIN_ID']) && OperaHotelBaseRoom::findOne($value['MAIN_ID']) != null) ? OperaHotelBaseRoom::findOne($value['MAIN_ID']): new OperaHotelBaseRoom();
  301. $value['BED_TYPE'] = implode(',', $value['BED_TYPE']);
  302. /******************图片上传BEGIN*********************/
  303. @$img_url = $_FILES['OperaHotelBaseRoom']['name'][$key]['ROOM_IMG'];
  304. if($img_url && $img_url != '' && $img_url != Yii::$app->params['motorcadeDefaultImage']) {
  305. $base_room->ROOM_IMG = UploadedFile::getInstance($base_room, "[$key]ROOM_IMG");
  306. $base_path = Yii::$app->basePath . '/web' . Yii::$app->params['hotelImagePath'];
  307. $img_name = OperaHotelBaseRoom::getImgName($base_path, '.' . $base_room->ROOM_IMG->extension);
  308. $base_room->ROOM_IMG->saveAs($base_path . $img_name);
  309. $thum_image = Image::thumbnail($base_path . $img_name, OperaHotelBaseRoom::ROOM_PIC_WIDTH, OperaHotelBaseRoom::ROOM_PIC_HEIGHT);
  310. $thum_image->save($base_path . 'thumb_' . $img_name); // 图片上传
  311. // 保存路径至数据库中
  312. $base_room->ROOM_IMG = 'http://' . CS1_DOMAIN . Yii::$app->params['hotelImagePath'] . 'thumb_' . $img_name;
  313. }
  314. /******************图片上传END*********************/
  315. $base_room->HOTEL_ID = $hotel_id;
  316. $base_room->BASE_ROOM_NAME = $value['BASE_ROOM_NAME'];
  317. $rs = $base_room->load($value, '');
  318. if($rs && $base_room->validate()) {
  319. if(!$base_room->save()) {
  320. throw new \Exception('修改基础房型');
  321. }
  322. // 房型直连修改
  323. $room_relation = RoomRelation::findOne(['ChannelId' => Yii::$app->params['ali']['supplier_id'], 'RoomId' => $base_room->MAIN_ID]);
  324. if(!empty($room_relation)){
  325. Yii::$app->runAction('hotel/ali/room-update', ['params' => ['hotel_id' => $hotel_id, 'parent_room_type'=>$base_room->MAIN_ID]]);
  326. }
  327. }
  328. $opera_sort_arr = array('hotel_id' => $hotel_id, 'base_room_id' => $base_room->MAIN_ID, 'seq' => $i);
  329. $opera_sort = (isset($base_room['MAIN_ID']) && OperaSort::findOne(['base_room_id' => $base_room['MAIN_ID'], 'hotel_id' => $hotel_id]) != null) ? OperaSort::findOne(['base_room_id' => $base_room['MAIN_ID'], 'hotel_id' => $hotel_id]): new OperaSort();
  330. if($opera_sort->load($opera_sort_arr, '') && $opera_sort->validate()) {
  331. if(!$opera_sort->save()) {
  332. throw new \Exception('修改排序');
  333. }
  334. }
  335. $room_type_all .= $base_room->MAIN_ID . ',';
  336. }
  337. $room_type_all = trim($room_type_all, ',');
  338. if($room_type_all != $hotel->ROOM_TYPE_ALL || $room_type_all != $hotel->ROOM_TYPE_SALE) {
  339. $hotel->ROOM_TYPE_ALL = $room_type_all;
  340. $hotel->ROOM_TYPE_SALE = $room_type_all;
  341. if(!$hotel->update()) {
  342. throw new \Exception();
  343. }
  344. }
  345. $transaction->commit();
  346. Yii::$app->session->setFlash('success', "修改成功!");
  347. $already_connenct = HotelRelation::findOne(['HotelId' => $hotel_id, 'ChannelId' => Yii::$app->params['ali']['relation_supplier_id']]);
  348. if(!empty($already_connenct)) {
  349. Yii::$app->runAction('hotel/ali/add-hotel', ['hotel_id' => $hotel_id]);
  350. }
  351. return json_encode(array('code' => 0, 'msg' => 'success'));
  352. } catch (\Exception $e) {
  353. Yii::$app->session->setFlash('error', "修改失败!");
  354. $transaction->rollBack();
  355. return json_encode(array('code' => 1, 'msg' => 'error', 'hotel_id' => $hotel_id));
  356. }
  357. }
  358. // 根据地区编号判断AREA_LEVE
  359. $area = BaseAreaView::findOne(['AREA_ID' => $area_id]);
  360. if($area->AREA_LEVEL == 3) {
  361. $hotel->country = $area_id;
  362. $parent_area = $area->PARENT_AREA_ID_LIST;
  363. $parent_area = trim($parent_area, '{}');
  364. $parent_arr = explode('}{', $parent_area);
  365. $hotel->province = $parent_arr[0];
  366. $hotel->city = $parent_arr[1];
  367. } else {
  368. $hotel->country = 0;
  369. $hotel->city = $area_id;
  370. $parent_area = $area->PARENT_AREA_ID_LIST;
  371. $parent_area = trim($parent_area, '{}');
  372. $hotel->province = $parent_area;
  373. }
  374. return $this->render('base', ['view' => 'addHotel', 'data' => $data, 'op' => 'modify']);
  375. }
  376. /**
  377. * @Author wanglg
  378. * @Desc 酒店大图多图上传
  379. * @return string
  380. */
  381. public function actionUploadeMulity()
  382. {
  383. $hotel_id = empty(Yii::$app->request->get('hotel_id')) ? Yii::$app->session->get('new_hotel_id'): Yii::$app->request->get('hotel_id');
  384. if(empty($hotel_id) || empty($_FILES['file'])) {
  385. return '缺少必要信息';
  386. }
  387. // 上传文件之前查询文件是否存在
  388. $keys = array('name', 'type', 'tmp_name', 'error', 'size');
  389. $imgSeq = BaseImg::find()->select(['MAX(SEQ_ID) as seq'])->where(['IMG_TYPE' => 25, 'PRODUCT_ID' => $hotel_id])->asArray()->one();
  390. $files_arr = array();
  391. for ($i = 0; $i < count($_FILES['file']['name']); $i++) {
  392. $file = array_column($_FILES['file'], $i);
  393. $files_arr[$i] = array_combine($keys, $file);
  394. }
  395. $tran = Yii::$app->db->beginTransaction();
  396. foreach ($files_arr as $key => $file) {
  397. $newModel = new BaseImg();
  398. $name = $file['name']; // 获取文件名称
  399. $imgType = strtolower(substr(strrchr($name, '.'), 1)); // 获取文件后缀
  400. $hotel_img_path = Yii::$app->basePath . '/web' . Yii::$app->params['hotelImagePath']; // 图片路径
  401. $hotel_img_name = OperaHotelBaseRoom::getImgName($hotel_img_path, '.' . $imgType); // 生成文件名称
  402. $uploadfile = $hotel_img_path . $hotel_img_name; // 组合上传路径
  403. list($orgWidth, $orgHeight) = getimagesize($file['tmp_name']);
  404. $typeArr = array("jpg", "png", "gif");
  405. if(!in_array($imgType, $typeArr)) {
  406. return '请检查上传文件格式';
  407. }
  408. // 图片等比缩放
  409. $newImg = imagecreatetruecolor(750, 340);
  410. switch ($imgType) {
  411. case 'jpg':
  412. $img = imagecreatefromjpeg($file['tmp_name']);
  413. break;
  414. case 'png':
  415. $img = imagecreatefrompng($file['tmp_name']);
  416. break;
  417. case 'gif':
  418. $img = imagecreatefromgif($file['tmp_name']);
  419. break;
  420. default:
  421. // return json_encode(array('code' => 2, 'msg' => '创建图片失败'));
  422. return '创建图片失败';
  423. }
  424. imagecopyresized($newImg, $img, 0, 0, 0, 0, 750, 340, $orgWidth, $orgHeight);
  425. // 组合创建文件的函数名称
  426. $createImgFunName = 'image' . (($imgType == 'jpg') ? 'jpeg': $imgType);
  427. $createImgFunName($newImg, $uploadfile);
  428. imagedestroy($newImg);
  429. imagedestroy($img);
  430. $imgSeq['seq']++;
  431. $insert_arr = array('SEQ_ID' => $imgSeq['seq'], 'IMG_TYPE' => 25, 'PRODUCT_ID' => $hotel_id, 'IMG_URL' => 'http://' . CS1_DOMAIN . Yii::$app->params['hotelImagePath'] . $hotel_img_name, 'IMG_NAME' => $name);
  432. // 保存数据再base_img表中
  433. if($newModel->load($insert_arr, '') && $newModel->validate()) {
  434. if(!$newModel->save()) {
  435. $tran->rollBack();
  436. return '上传失败';
  437. }
  438. }
  439. }
  440. // 记录操作日志信息
  441. $log_model = new OperaHotelLog();
  442. $log_model->LOG_TYPE = 1;
  443. $log_model->HOTEL_ID = $hotel_id;
  444. $log_model->LOG_DESC = '图片上传:上传图片数量' . count($files_arr);
  445. $log_model->save();
  446. $tran->commit();
  447. return '上传成功';
  448. }
  449. /**
  450. * @Author wanglg
  451. * @Desc 酒店图片删除(多图上传)
  452. * @return bool|string
  453. */
  454. public function actionDelHotelImg()
  455. {
  456. $request = Yii::$app->request->post();
  457. $model = BaseImg::findOne(['IMG_URL' => $request['src'], 'PRODUCT_ID' => $request['hotel_id'], 'CANCEL_FLAG' => 0, 'IMG_TYPE' => 25]);
  458. if(!empty($model)) {
  459. $model->CANCEL_FLAG = 1;
  460. if(!$model->save()) {
  461. return false;
  462. }
  463. }
  464. $name = pathinfo($request['src'])['basename'];
  465. $path = Yii::$app->basePath . '/web' . Yii::$app->params['hotelImagePath'] . $name;
  466. unlink($path);
  467. $log_model = new OperaHotelLog();
  468. $log_model->LOG_TYPE = 1;
  469. $log_model->HOTEL_ID = $request['hotel_id'];
  470. $log_model->LOG_DESC = '删除图片:图片路径:' . $request['src'];
  471. $log_model->save();
  472. return true;
  473. }
  474. /**
  475. * User:Steven
  476. * Desc:发送消息到企业微信
  477. * @return bool
  478. */
  479. public function actionSendMsg()
  480. {
  481. $data = file_get_contents("php://input");
  482. $arr = json_decode($data, true);
  483. zOfficeWechat::sendMsg($arr);
  484. return true;
  485. }
  486. // 省市联动
  487. public function actionProvincecity()
  488. {
  489. $area_id = $area_id = isset($_REQUEST['area_id']) ? $_REQUEST['area_id']: "0"; //默认为0
  490. if(empty($area_id)) {
  491. $area_id = "0";
  492. }
  493. $obj = new Report();
  494. $data = $obj->getProvinceCity($area_id);
  495. echo json_encode($data);
  496. }
  497. public function beforeAction($action)
  498. {
  499. $obj = new Report();
  500. $supp = $obj->getSuppList();
  501. $sale = $obj->getSaleList();
  502. $hotel = $obj->getHotelList();
  503. $this->view->params['supp'] = $supp;
  504. array_unshift($sale, ['id' => '0', 'sale_org_name' => '请选择']);
  505. $this->view->params['sale'] = $sale;
  506. array_unshift($hotel, ['hotel_id' => '0', 'hotel_name' => '请选择']);
  507. $this->view->params['hotel'] = $hotel;
  508. return parent::beforeAction($action);
  509. }
  510. /**
  511. * User:Steven
  512. * Desc: 酒店价格预警 渠道的分销价(零售价)低于酒店的结算价时进行报警提醒酒店的运营负责人
  513. */
  514. public function actionPriceWarning()
  515. {
  516. $query = OperaHotel::find()
  517. ->innerJoinWith("hotelRelation b", false)
  518. ->leftJoin('base_user c', 'a.PRINCIPAL=c.ID')
  519. ->from('opera_hotel a')->where(['a.CANCEL_FLAG' => 0, 'a.HOTEL_STATUS' => 1]);
  520. $query->select(['a.HOTEL_ID', 'a.HOTEL_NAME', 'a.SUPPLIER_ID', 'a.ROOM_TYPE_SALE', 'a.PRINCIPAL', 'c.USER_NAME']);
  521. $res = $query->asArray()->all();
  522. foreach ($res as $val) {
  523. $rs = array();
  524. $base_room_arr = explode(',', $val['ROOM_TYPE_SALE']);
  525. foreach ($base_room_arr as $base_room) {
  526. //先查询当前酒店当前房型的所有子房型
  527. $sub_room = OperaHotelRoom::find()->innerJoinWith('roomRelation b')->from('opera_hotel_room a')
  528. ->where(['a.HOTEL_ID' => $val['HOTEL_ID'], 'a.PARENT_ROOM_TYPE' => $base_room, 'b.ChannelId' => Yii::$app->params['ctrip']['relation_supplier_id'], 'a.CANCEL_FLAG' => 0]);
  529. $sub_room->select(['a.ROOM_TYPE', 'a.ROOM_NAME', 'a.INNER_IDENTIFY']);
  530. $sub_room = $sub_room->asArray()->all();
  531. foreach ($sub_room as $s_r) {
  532. $run_hotel_sub_room = RunHotelSubRoom::find()->joinWith('operaHotelRoom b')->from('run_hotel_sub_room a')
  533. ->where(['a.HOTEL_ID' => $val['HOTEL_ID'], 'a.BASE_ROOM_TYPE' => $base_room, 'a.ROOM_TYPE' => $s_r['ROOM_TYPE'], 'a.IS_ONSALE' => 1]);
  534. $run_hotel_sub_room->select(['a.HOTEL_ID', 'a.BASE_ROOM_TYPE', 'a.ROOM_TYPE', 'a.RUN_DATE', 'a.BASE_PRICE_BUYOUT', 'a.BASE_PRICE_RESERVE',
  535. 'a.BASE_PRICE_INQUIRY', 'b.ROOM_NAME', 'b.INNER_IDENTIFY', 'a.IS_ONSALE', 'a.RUN_STATUS']);
  536. $run_hotel_sub_room->andFilterWhere([
  537. 'between', 'RUN_DATE', date('Y-m-d', time()), date('Y-m-d', strtotime("+30 days")),
  538. ]);
  539. $rs[] = $run_hotel_sub_room->asArray()->all();
  540. }
  541. }
  542. foreach ($rs as $value) {
  543. $date_str = '';
  544. $room_name = '';
  545. $res_dis = '';
  546. foreach ($value as $item) {
  547. //获取该房型下渠道为携程某段日期的房态、房量等信息
  548. $room_name = $item['ROOM_NAME'] . $item['INNER_IDENTIFY'];
  549. $run_hotel_distrib = RunHotelDistrib::find()
  550. ->joinWith('baseSupplier b')->joinWith('baseSupplierSale c')
  551. ->leftJoin('opera_room_distrib d', 'd.DISTRIB_ID=a.DISTRIB_ID and d.ROOM_ID=' . $item['operaHotelRoom']['ID'])
  552. ->from('run_hotel_distrib a')
  553. ->where(['a.HOTEL_ID' => $item['HOTEL_ID'], 'a.BASE_ROOM_TYPE' => $item['BASE_ROOM_TYPE'], 'a.ROOM_TYPE' => $item['ROOM_TYPE'], 'a.RUN_DATE' => $item['RUN_DATE'], 'c.PARENT_TYPE' => 25, 'a.DISTRIB_ID' => Yii::$app->params['ctrip']['supplier_id']]);
  554. $run_hotel_distrib->select(['a.DISTRIB_ID', 'a.PROD_PRICE', 'a.CUS_PRICE', 'c.SALE_TYPE', 'b.SUPPLIER_NAME', 'a.RUN_STATUS', 'd.AUTHORITY_STATUS']);
  555. $res_dis = $run_hotel_distrib->asArray()->all();
  556. $price = $item['BASE_PRICE_BUYOUT'] > 0 ? $item['BASE_PRICE_BUYOUT']: ($item['BASE_PRICE_RESERVE'] > 0 ? $item['BASE_PRICE_RESERVE']: ($item['BASE_PRICE_INQUIRY'] > 0 ? $item['BASE_PRICE_INQUIRY']: 0));
  557. //(分销177、直营312、代理277)
  558. $distribe_price = $res_dis[0]['SALE_TYPE'] == 177 ? $res_dis[0]['PROD_PRICE']: $res_dis[0]['CUS_PRICE'];
  559. if($item['IS_ONSALE'] == 1 && $item['RUN_STATUS'] == 1 && $res_dis[0]['RUN_STATUS'] != 329 && $res_dis[0]['AUTHORITY_STATUS'] == 1 && $distribe_price != '' && $price > $distribe_price + 0.1) {
  560. //检查是否直连
  561. $user = $val['USER_NAME'];
  562. $date_str .= $item['RUN_DATE'] . "【$distribe_price" . "/" . $price . "】\n";
  563. }
  564. }
  565. if($date_str != '') {
  566. $msg = '酒店名称:' . $val['HOTEL_NAME'] . "\n房型名称:" . $room_name . "\n渠道商名称:" . $res_dis[0]['SUPPLIER_NAME'] . "\n异常日期:日期(渠道结算/酒店结算)\n" . $date_str . "\n原因:渠道分销价(或零售价)小于酒店结算价";
  567. $arr = array(
  568. "agentid" => 1000002,
  569. "title" => '酒店价格预警:',
  570. "msg" => $msg,
  571. "touser" => $user,
  572. );
  573. zOfficeWechat::sendMsg($arr);
  574. }
  575. }
  576. }
  577. }
  578. /**
  579. * User:Steven
  580. * Desc:(携程直连)添加需要特殊处理的订单
  581. */
  582. public function actionAddExceptionOrder()
  583. {
  584. $exception_order = new OrderHtExceptionList();
  585. $exception_order->status = 1;
  586. if($exception_order->load(Yii::$app->request->post())) {
  587. $transaction = Yii::$app->db->beginTransaction();
  588. try {
  589. if(!$exception_order->save()) {
  590. throw new \Exception();
  591. }
  592. $transaction->commit();
  593. return "<script>alert('添加成功!')</script>";
  594. } catch (\Exception $e) {
  595. $transaction->rollBack();
  596. return "<script>alert('添加失败!')</script>";
  597. }
  598. }
  599. $data['exceptionOrder'] = $exception_order;
  600. return $this->render('base', ['view' => 'addExceptionOrder', 'data' => $data]);
  601. }
  602. /**
  603. * User:Steven
  604. * Desc:(携程直连)我们系统下单失败,但是不希望客人改订,需要在新订失败后返回状态码为1(待确认)
  605. */
  606. public function actionUpdateOrderLost()
  607. {
  608. $flag = false;
  609. $orderChannelInfo = new OrderChannelInfo(['scenario' => 'error_order']);
  610. if(Yii::$app->request->post()) {
  611. $param = Yii::$app->request->post('OrderChannelInfo');
  612. $outside_order_id = trim($param['channel_order_id']);
  613. $order_id = trim($param['ORDER_ID']);
  614. $effect_count = OrderChannelInfo::updateAll([
  615. 'ORDER_ID' => $order_id,
  616. ], "CANCEL_FLAG=0 and channel_order_id=$outside_order_id");
  617. OrderMain::updateAll([
  618. 'DOCKING_TYPE' => 556,
  619. 'CHANNEL_ORDER_STATUS' => 550,
  620. ], "ORDER_ID=$order_id or PARENT_ORDER_ID=$order_id");
  621. $flag = true;
  622. }
  623. $data['orderChannelInfo'] = $orderChannelInfo;
  624. $data['flag'] = $flag;
  625. return $this->render('base', ['view' => 'updateOrderLost', 'data' => $data]);
  626. }
  627. /**
  628. * User:Steven
  629. * Desc:部分酒店基础房型库存预警
  630. *
  631. */
  632. public function actionRoomCountWarning()
  633. {
  634. $run_hotel = new RunHotel();
  635. $room_arr = array(
  636. 9797,//上海花园饭店 高级房
  637. 150077,//上海花园饭店 豪华房
  638. /* 100324,//舟山希尔顿 海景房
  639. 150024, //舟山希尔顿 湖景房*/ //合并房型已拆分
  640. 100074,//舟山希尔顿 豪华湖景大床房
  641. 100075, //舟山希尔顿 豪华湖景双床房
  642. 150101,//昆山皇冠假日酒店 皇冠高级房
  643. 150152,//昆山皇冠假日酒店 皇冠豪华房
  644. 150088,//浦西万怡 豪华房
  645. 9752, //舟山希尔顿 湖景双床房
  646. 100073,//舟山希尔顿 湖景大床房
  647. 150139,//舟山希尔顿 海景大床房
  648. 150140,//舟山希尔顿 海景双床房
  649. 9931,//上海虹桥元一希尔顿酒店 希尔顿客房(双床)(双早)
  650. 150468,//千岛湖滨江希尔顿度假酒店 希尔顿客房大床
  651. 150469,//千岛湖滨江希尔顿度假酒店 希尔顿客房双床
  652. );
  653. foreach ($room_arr as $base_room_id) {
  654. $res = $run_hotel->getRunHotelCount($base_room_id);
  655. $date_str = '';
  656. foreach ($res as $item) {
  657. if($item['buyout'] < 5) {
  658. $date_str .= $item['run_date'] . "【买断余量:" . $item['buyout'] . "】\n";
  659. }
  660. }
  661. $user = $item['USER_NAME'];
  662. if($date_str != '') {
  663. $msg = '酒店名称:' . $item['hotel_name'] . "\n基础房型名称:" . $item['base_room_name'] . "\n" . $date_str . "\n原因:该房型基础房型买断库存数量小于5,请及时关注。";
  664. $arr = array(
  665. "agentid" => 1000002,
  666. "title" => '酒店基础房型买断库存预警:',
  667. "msg" => $msg,
  668. "touser" => $user,
  669. );
  670. zOfficeWechat::sendMsg($arr);
  671. }
  672. }
  673. }
  674. /**
  675. * User:Steven
  676. * Desc:(徐安)上海花园饭店 合并房型及拆分房型已售数量统计
  677. * @return string
  678. */
  679. public function actionRoomSaledCount()
  680. {
  681. $runHotel = new RunHotel();
  682. $res = $runHotel->getRoomSaledCount();
  683. return $this->render('base', ['view' => 'roomSaledCount', 'data' => $res]);
  684. }
  685. /**
  686. * User:Steven
  687. * Desc:按发单维度订单数据统计 需要按照发单人统计订单,服务于客服的绩效分析
  688. */
  689. public function actionGetTemOrder()
  690. {
  691. $order_main = new OrderMain();
  692. $res = $order_main->getTemOrder();
  693. return $this->render('base', ['view' => 'temOrderAnalysis', 'data' => $res]);
  694. }
  695. /**
  696. * User:Steven
  697. * Desc:酒店房型排序
  698. * @return string
  699. */
  700. public function actionHotelRoomOrder()
  701. {
  702. $operaSort = new OperaSort();
  703. $hotel_list = $operaSort->getDirectHotel();
  704. if(Yii::$app->request->isPost || Yii::$app->request->isGet) {
  705. $HOTEL_ID = is_null(Yii::$app->request->post('HOTEL_ID')) ? Yii::$app->request->get('HOTEL_ID'): Yii::$app->request->post('HOTEL_ID');
  706. }
  707. is_null($HOTEL_ID) ? $HOTEL_ID = $hotel_list[0]['HOTEL_ID']: $HOTEL_ID;
  708. $baseRoomData = $operaSort->getBaseRoomData($HOTEL_ID);
  709. $roomData = $operaSort->getRoomData($HOTEL_ID);
  710. foreach ($baseRoomData as $item) {
  711. $arr[$item['parent_room_type']] = array(
  712. 'hotel_id' => $item['hotel_id'],
  713. 'parent_room_name' => $item['base_room_name'],
  714. 'seq' => $item['seq'],
  715. );
  716. }
  717. foreach ($roomData as $value) {
  718. $arr[$value['parent_room_type']]['list'][$value['room_type']] = array(
  719. 'room_name' => $value['room_name'],
  720. 'inner_identify' => $value['inner_identify'],
  721. 'seq' => $value['seq'],
  722. );
  723. }
  724. $data['roomData'] = $arr;
  725. $data['hotel_list'] = $hotel_list;
  726. return $this->render('base', ['view' => 'hotelRoomOrder', 'data' => $data]);
  727. }
  728. /**
  729. * 更新房型顺序
  730. */
  731. public function actionUpdateRoomOrder()
  732. {
  733. if(Yii::$app->request->isPost) {
  734. $request = Yii::$app->request->post();
  735. if($request['type'] == 1) {//修改基础房型
  736. OperaSort::updateAll(['seq' => $request['seq']],
  737. ['hotel_id' => $request['hotel_id'], 'base_room_id' => $request['parent_roon_type'], 'room_id' => 0, 'channel_id' => 0]);
  738. } elseif($request['type'] == 2) { //修改子房型
  739. OperaSort::updateAll(['seq' => $request['seq']],
  740. ['hotel_id' => $request['hotel_id'], 'base_room_id' => $request['parent_roon_type'], 'room_id' => $request['room_type'], 'channel_id' => 0]);
  741. }
  742. }
  743. }
  744. /**
  745. * 生成房型排序
  746. * @return bool
  747. */
  748. /*public function actionCreate()
  749. {
  750. $res = OperaHotelBaseRoom::find()->select(['HOTEL_ID', 'MAIN_ID'])->where([])->orderBy(['HOTEL_ID' => SORT_ASC, 'MAIN_ID' => SORT_DESC])->asArray()->all();
  751. foreach ($res as $item) {
  752. $arr[$item['HOTEL_ID']][] = $item['MAIN_ID'];
  753. }
  754. foreach ($arr as $key => $val) {
  755. $i = 0;
  756. foreach ($val as $v) {
  757. $i++;
  758. $model = new OperaSort();
  759. $model->base_room_id = $v;
  760. $model->channel_id = 0;
  761. $model->hotel_id = $key;
  762. $model->room_id = 0;
  763. $model->seq = $i;
  764. $rs=$model->save();
  765. }
  766. }
  767. $res = OperaHotelRoom::find()->select(['HOTEL_ID', 'PARENT_ROOM_TYPE', 'ROOM_TYPE'])
  768. ->orderBy(['HOTEL_ID' => SORT_ASC, 'PARENT_ROOM_TYPE' => SORT_ASC, 'ROOM_TYPE' => SORT_ASC])
  769. ->asArray()->all();
  770. foreach ($res as $item) {
  771. $arr[$item['HOTEL_ID']][$item['PARENT_ROOM_TYPE']][] = $item['ROOM_TYPE'];
  772. }
  773. foreach ($arr as $key => $value) {
  774. foreach ($value as $k => $v) {
  775. $i = 0;
  776. foreach ($v as $v1) {
  777. $i++;
  778. $model = new OperaSort();
  779. $model->base_room_id = $k;
  780. $model->channel_id = 0;
  781. $model->hotel_id = $key;
  782. $model->room_id = $v1;
  783. $model->seq = $i;
  784. $rs = $model->save();
  785. }
  786. }
  787. }
  788. return true;
  789. }*/
  790. /**
  791. * User: wanglg
  792. *
  793. * 前端选择省市联动返回数据
  794. *
  795. * @params integer $pid 父ID
  796. *
  797. * @return mixed
  798. */
  799. public function actionAreaView()
  800. {
  801. if(Yii::$app->request->isAjax) {
  802. $baseArea = BaseAreaView::getBaseArea(Yii::$app->request->post('pid'));
  803. return Json::encode($baseArea);
  804. } else {
  805. throw new NotFoundHttpException('页面未找到!');
  806. }
  807. }
  808. public function action_province()
  809. {
  810. $id = $_REQUEST['id'];
  811. $baseArea = BaseAreaView::findOne(['AREA_ID' => $id]);
  812. $model = new OperaHotel();
  813. if($baseArea != null) {
  814. //选择省
  815. if($baseArea->PARENT_AREA_ID == 0) {
  816. $pid['id1'] = 0;
  817. $pid['id2'] = $id;
  818. $tmp = BaseAreaView::findOne(['PARENT_AREA_ID' => $id]);
  819. if($tmp != null) {
  820. $pid['id3'] = $tmp->AREA_ID;
  821. } else {
  822. $pid['id3'] = '';
  823. }
  824. $model->province = $id;
  825. }
  826. //选择市
  827. if($baseArea->PARENT_AREA_ID != 0 && $baseArea->AREA_LEVEL == 2) {
  828. $pid['id1'] = 0;
  829. $pid['id2'] = $baseArea->PARENT_AREA_ID;
  830. $pid['id3'] = $baseArea->AREA_ID;
  831. $model->province = $baseArea->PARENT_AREA_ID;
  832. $model->city = $id;
  833. }
  834. }
  835. return $this->renderPartial('_province', ['model' => $model, 'pid' => $pid]);
  836. }
  837. /**
  838. * Author:Steven
  839. * Desc:获取酒店内存中的数据
  840. */
  841. public function actionGetMem()
  842. {
  843. $this->layout = "@backend/modules/motorcade/views/layouts/iframe_new";
  844. $cache = Yii::$app->cacheCS;
  845. $cache->encrypt = false;
  846. $newOrder = $cache->get('hotel_newOrder');
  847. return $this->render('base', ['view' => 'hotelMemData', 'data' => $newOrder]);
  848. }
  849. /**
  850. * @Author wanglg
  851. * @Desc 比较内存中的订单状态与数据库订单状态是否一致,不一致手动清除缓存中的订单
  852. * @return string
  853. */
  854. public function actionDiffOrder()
  855. {
  856. $cache = Yii::$app->cacheCS;
  857. $cache->encrypt = false;
  858. $newOrder = $cache->get('hotel_newOrder');
  859. $order_arr = array();
  860. foreach ($newOrder as $key => $supplier) {
  861. foreach ($supplier as $order) {
  862. if($order['order_id'] == '1942584' || $order['order_id'] == '1914846') {
  863. continue;
  864. }
  865. $order_id = $order['order_id'];
  866. $status = $order['type'];
  867. $order_info = OrderMain::findOne(['CANCEL_FLAG' => 0, 'ORDER_PROD_TYPE' => 25, 'ORDER_ID' => $order_id]);
  868. if($status != $order_info->ORDER_STATUS && !empty($order_info)) {
  869. $order_arr[] = $order_id;
  870. }
  871. }
  872. }
  873. if(!empty($order_arr)) {
  874. $orders = implode(',', $order_arr);
  875. zOfficeWechat::sendMsg([
  876. 'agentid' => zOfficeWechat::SEND_HOTEL,
  877. "title" => '【缓存订单状态不一致通知】检查缓存订单:',
  878. "msg" => "订单列表:\n" . $orders,
  879. "touser" => 'wanglg',]);
  880. return 1;
  881. }
  882. return false;
  883. }
  884. /**
  885. * Author:Steven
  886. * Desc:移除内存中个别订单
  887. * @param $order_id
  888. * @return string
  889. */
  890. public function actionRemoveMem($order_id)
  891. {
  892. OrderMain::resetMemcache($order_id);
  893. return \GuzzleHttp\json_encode(['code' => 0]);
  894. }
  895. public function actionSetOrderSupp($id)
  896. {
  897. $cache = Yii::$app->cacheCS;
  898. $cache->encrypt = false;
  899. $newOrder = $cache->get('hotel_newOrder');
  900. $order_arr = array();
  901. foreach ($newOrder as $key => $supplier) {
  902. $tmp[$id] = $supplier;
  903. $cache->set('hotel_newOrder', $tmp, 0, 0);
  904. }
  905. }
  906. }
  907. ?>