Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
 
 
 
 
 
 

419 рядки
16 KiB

  1. <?php
  2. /**
  3. *
  4. * ============================================================================
  5. * * 版权所有 蜘蛛出行 * *
  6. * 网站地址: http://www.zhizhuchuxing.com
  7. * ----------------------------------------------------------------------------
  8. * 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和
  9. * 使用;不允许对程序代码以任何形式任何目的的再发布。
  10. * ============================================================================
  11. * Author By: 倪宗锋
  12. * PhpStorm MappingService.php
  13. * Create By 2018/5/2 16:05 $
  14. */
  15. namespace backend\modules\hotel\service;
  16. use backend\modules\api\util\Util;
  17. use backend\modules\hotel\models\ChannelBaseRoomMapping;
  18. use backend\modules\hotel\models\ChannelHotelMapping;
  19. use backend\modules\hotel\models\CtripSwitch;
  20. use backend\modules\hotel\models\OperaHotelBaseRoom;
  21. use backend\modules\hotel\models\OperaHotelRoom;
  22. use backend\modules\hotel\models\OperaRoomDistrib;
  23. class MappingService
  24. {
  25. #住宿人数对应 值
  26. public $OCCUPANCY_LIMIT = [
  27. 1 => 4,
  28. 2 => 5,
  29. 3 => 593407,
  30. 4 => 593411,
  31. 5 => 600700,
  32. 6 => 600701,
  33. 7 => 790297,
  34. 8 => 790298,
  35. 9 => 790299,
  36. ];
  37. public $BED_TYPE = [
  38. '1' => 641440,
  39. '2' => 863115
  40. ];
  41. /**
  42. * Des:获取房型数据
  43. * Name: getSubBaseRoom
  44. * @param $params
  45. * @return array
  46. * @author 倪宗锋
  47. */
  48. public function getBaseRoom($params)
  49. {
  50. $channelRoomMapp = new ChannelBaseRoomMapping();
  51. $info = $channelRoomMapp->getInfoByMasterRoomId($params['master_base_room_id'], $params['channel_id']);
  52. if (empty($info['master_base_room_id'])) {
  53. return Util::returnArrEr('母物理房型不存在!');
  54. }
  55. if (empty($info['sub_base_room_id'])) {
  56. //添加子房型
  57. $this->addBaseRoom($info);
  58. //更新当前酒店的所有房型数据
  59. $this->updateBaseRoom($info['sub_hotel_id']);
  60. //再次查询
  61. $info = $channelRoomMapp->getInfoByMasterRoomId($params['master_base_room_id'], $params['channel_id']);
  62. if (empty($info['sub_base_room_id'])) {
  63. return Util::returnArrEr('新增子房型失败!');
  64. }
  65. }
  66. return Util::returnArrSu('', $info);
  67. }
  68. /**
  69. * Des:新增子房型
  70. * Name: addBaseRoom
  71. * @param $info
  72. * @return array
  73. * @author 倪宗锋
  74. */
  75. public function addBaseRoom($info)
  76. {
  77. $ctripSwitch = new CtripSwitch();
  78. $data = [
  79. 'updator' => (string)'',
  80. 'masterHotelId' => (int)$info['master_hotel_id'],
  81. 'childHotelId' => (int)$info['sub_hotel_id'],
  82. 'masterBasicRoomIds' => [
  83. (int)$info['base_room_id']
  84. ],
  85. 'supplierId' => (int)$ctripSwitch->ctripConf['switch_supplier_id'],
  86. 'opClientIP' => (string)\Yii::$app->request->userIP,
  87. 'currency' => (string)'CNY'
  88. ];
  89. $res = $ctripSwitch->request('getdltcountrylist', $data);
  90. if ($res->resultStatus->resultCode == 0) {
  91. return Util::returnArrSu();
  92. } else {
  93. return Util::returnArrEr();
  94. }
  95. }
  96. /**
  97. * Des:更新所有房型
  98. * Name: updateBaseRoom
  99. * @param $sub_hotel_id
  100. * @return array
  101. * @author 倪宗锋
  102. */
  103. public function updateBaseRoom($sub_hotel_id)
  104. {
  105. #1.获取酒店关联数据
  106. $chanelHotel = new ChannelHotelMapping();
  107. $hotelInfo = $chanelHotel->getInfoBySubHotel(['sub_hotel_id' => $sub_hotel_id]);
  108. if (empty($hotelInfo['hotel_id'])) {
  109. return Util::returnArrEr('酒店未关联!');
  110. }
  111. #2、获取携程数据
  112. $ctripSwitch = new CtripSwitch();
  113. $sendData = [
  114. 'supplierID' => (int)$ctripSwitch->ctripConf['switch_supplier_id'],
  115. 'hotelID' => (int)$sub_hotel_id
  116. ];
  117. $res = $ctripSwitch->request('getdltbasicroomlist', $sendData);
  118. if (!isset($res->resultStatus->resultCode) || $res->resultStatus->resultCode != 0) {
  119. return Util::returnArrEr('获取房型数据失败!');
  120. }
  121. $baseRoomList = (array)$res->dltBasicRoomTypeEntityList;
  122. $roomTypeInfo = json_decode(json_encode($baseRoomList), true);
  123. #4、对数组进行循环处理
  124. $channelBaseRoom = new ChannelBaseRoomMapping();
  125. $channel_arr = $ctripSwitch->ctripConf['supplier_list'];
  126. $masterBasicRoomList = [];
  127. foreach ($roomTypeInfo as $roomType) {
  128. #4.1 将母房型的子房型设置为空
  129. $data = [
  130. 'roomTypeId' => '',
  131. 'masterBasicRoomTypeId' => $roomType['masterBasicRoomId']
  132. ];
  133. $channelBaseRoom->editRow($data, $channel_arr);
  134. #4.2如果不存则添加、如果存在就更新
  135. $masterBasicRoomList[] = $roomType['masterBasicRoomId'];
  136. $getInfo = $channelBaseRoom->getInfoByMasterRoomId($roomType['masterBasicRoomId']);
  137. if (empty($getInfo['ID'])) {
  138. $channelBaseRoom->addRows($roomType, $hotelInfo, $channel_arr);
  139. }
  140. }
  141. #4.2如果库内的房型数据不在接口返回数据中则删除。
  142. $channelBaseRoom->delRow($sub_hotel_id, $channel_arr, $masterBasicRoomList);
  143. #5、获取售卖房型的数据
  144. $getSaleRoomList = $this->getSwitchSaleRoomList($sub_hotel_id);
  145. if ($getSaleRoomList['flag'] == false) {
  146. return $getSaleRoomList;
  147. }
  148. $saleRoomList = $getSaleRoomList['data'];
  149. #6、更新母房型的子房型信息
  150. foreach ($saleRoomList as $saleVal) {
  151. $channelBaseRoom->editRow($saleVal, $channel_arr);
  152. }
  153. return Util::returnArrSu();
  154. }
  155. /**
  156. * Des:获取售卖房型的列表
  157. * Name: getSwitchSaleRoomList
  158. * @param $sub_hotel_id
  159. * @return array
  160. * @author 倪宗锋
  161. */
  162. public function getSwitchSaleRoomList($sub_hotel_id)
  163. {
  164. $ctripSwitch = new CtripSwitch();
  165. $data = [
  166. 'supplierId' => (int)$ctripSwitch->ctripConf['switch_supplier_id'],
  167. 'hotelId' => (int)$sub_hotel_id,
  168. 'returnDataTypeList' => [
  169. 'BasicRoomTypeSimpleEntity',
  170. ]
  171. ];
  172. $res = $ctripSwitch->request('gethotelroomstaticinfo', $data);
  173. if (!isset($res->resultStatus->resultCode) || $res->resultStatus->resultCode != 0) {
  174. return Util::returnArrEr('获取房型数据失败!');
  175. }
  176. #3、截取房型数组
  177. if (empty($res->roomStaticInfos->roomStaticInfo[0]->roomTypeInfos->roomTypeInfo)) {
  178. $roomTypeInfo = [];
  179. } else {
  180. $roomTypeInfo = (array)$res->roomStaticInfos->roomStaticInfo[0]->roomTypeInfos->roomTypeInfo;
  181. $roomTypeInfo = json_decode(json_encode($roomTypeInfo), true);
  182. }
  183. return Util::returnArrSu('', $roomTypeInfo);
  184. }
  185. /**
  186. * Des:获取cs房型数据
  187. * Name: getCSRoomInfo
  188. * @param $roomId
  189. * @param $channel_id
  190. * @return array
  191. * @author 倪宗锋
  192. */
  193. public function getCSRoomInfo($roomId, $channel_id)
  194. {
  195. $operaHotelRoom = new OperaHotelBaseRoom();
  196. $getInfo = $operaHotelRoom->getRoomInfo($roomId, $channel_id);
  197. if (empty($getInfo['MAIN_ID'])) {
  198. return Util::returnArrEr('cs房型不存在!');
  199. }
  200. if (empty($getInfo['sub_base_room_id']) == false) {
  201. return Util::returnArrEr('该cs房型已经关联了其他房型数据!' . $getInfo['sub_base_room_id']);
  202. }
  203. if (empty($getInfo['sub_hotel_id'])) {
  204. return Util::returnArrEr('当前酒店未绑定!');
  205. }
  206. return Util::returnArrSu('', $getInfo);
  207. }
  208. /**
  209. * Des:获取代理通可以进行关联的房型数组
  210. * Name: getSwitchRoomList
  211. * @param $sub_hotel_id
  212. * @param $sub_base_room_id
  213. * @param $saleRoomList
  214. * @return array
  215. * @author 倪宗锋
  216. */
  217. public function getSwitchRoomList($sub_hotel_id, $sub_base_room_id, $saleRoomList)
  218. {
  219. #1、第一步調用接口獲取列表
  220. $ctripSwitch = new CtripSwitch();
  221. $data = [
  222. 'supplierId' => (int)$ctripSwitch->ctripConf['switch_supplier_id'],
  223. 'hotelId' => (int)$sub_hotel_id,
  224. 'returnDataTypeList' => [
  225. 'RoomTypeSimpleEntity',
  226. ]
  227. ];
  228. $res = $ctripSwitch->request('gethotelroomstaticinfo', $data);
  229. if (!isset($res->resultStatus->resultCode) || $res->resultStatus->resultCode != 0) {
  230. return [];
  231. }
  232. if (empty($res->roomStaticInfos->roomStaticInfo[0]->roomInfos->roomInfo)) {
  233. $roomInfo = [];
  234. } else {
  235. $roomInfo = (array)$res->roomStaticInfos->roomStaticInfo[0]->roomInfos->roomInfo;
  236. $roomInfo = json_decode(json_encode($roomInfo), true);
  237. }
  238. #2、獲取已关联的售卖房型ID
  239. $saleRoomArr = [];
  240. foreach ($saleRoomList as $salRoomVal) {
  241. $saleRoomArr[] = $salRoomVal['channel_mapping_id'];
  242. }
  243. #3、过滤掉不可关联的代理通房型ID
  244. $result = [];
  245. foreach ($roomInfo as $roomVal) {
  246. if ($roomVal['basicRoomTypeId'] != $sub_base_room_id) {
  247. continue;
  248. }
  249. if (in_array($roomVal['roomId'], $saleRoomArr)) {
  250. continue;
  251. }
  252. $roomVal['roomName'] = $roomVal['roomId'] . $roomVal['roomName'];
  253. $result[] = $roomVal;
  254. }
  255. return $result;
  256. }
  257. /**
  258. * Des:设置售卖房型的关联
  259. * Name: setSaleRoomMapping
  260. * @param $params
  261. * @return array
  262. * @author 倪宗锋
  263. */
  264. public function setSaleRoomMapping($params)
  265. {
  266. #1、获取cs房型数据 判断房型是否已经关联
  267. $operaHotelRoom = new OperaHotelRoom();
  268. $getRoomInfo = $operaHotelRoom->getRoomInfoForSetSaleRoom($params);
  269. if (empty($getRoomInfo['cs_sale_room_id'])) {
  270. return Util::returnArrEr('cs房型不存在 !');
  271. }
  272. if (empty($getRoomInfo['sale_room_id']) == false) {
  273. return Util::returnArrEr('cs房型已经关联了其他代理通房型!');
  274. }
  275. if (empty($getRoomInfo['sub_base_room_id'])) {
  276. return Util::returnArrEr('基础房型未关联!');
  277. }
  278. #2、进行关联操作
  279. $ctripSwitch = new CtripSwitch();
  280. $channel_arr = $ctripSwitch->ctripConf['supplier_list'];
  281. $operaRoomDistrip = new OperaRoomDistrib();
  282. $data = [
  283. 'DISTRIB_ROOM_NAME' => $params['sale_room_name'],//针对渠道设置的子房型名称
  284. 'ROOM_ID' => $params['cs_sale_room_id'],//房型ID 对应opera_hotel_room的ID
  285. 'CHANNEL_MAPPING_ID' => $params['sale_room_id']//渠道直连房型ID(携程:房型ID,阿里:RP ID)
  286. ];
  287. $operaRoomDistrip->addRow($data, $channel_arr);
  288. return Util::returnArrSu();
  289. }
  290. /**
  291. * Des:删除基础房型的关联关系
  292. * Name: delBaseRoomMapping
  293. * @param $param
  294. * @return array
  295. * @author 倪宗锋
  296. */
  297. public function delBaseRoomMapping($param)
  298. {
  299. if (empty($param['base_room_id'])) {
  300. return Util::returnArrEr('参数异常!');
  301. }
  302. $ctripSwitch = new CtripSwitch();
  303. $channel_arr = $ctripSwitch->ctripConf['supplier_list'];
  304. #1、获取基础房型下面子房型的关联关系
  305. $operaHotelRoom = new OperaHotelRoom();
  306. $getSaleChannelCnt = $operaHotelRoom->getChannelByBaseRoom($param, $channel_arr);
  307. if ($getSaleChannelCnt != 0) {
  308. return Util::returnArrEr('请先解除售卖房型的关联关系!');
  309. }
  310. #2、删除关联关系
  311. $channelBaseMappingRoom = new ChannelBaseRoomMapping();
  312. $channelBaseMappingRoom->delBaseRoomMapping($param, $channel_arr);
  313. return Util::returnArrSu();
  314. }
  315. /**
  316. * Des:解除售卖房型关联关系
  317. * Name: delSaleRoomMapping
  318. * @param $params
  319. * @return array
  320. * @author 倪宗锋
  321. */
  322. public function delSaleRoomMapping($params)
  323. {
  324. $ctripSwitch = new CtripSwitch();
  325. $channel_arr = $ctripSwitch->ctripConf['supplier_list'];
  326. $operaRoomDistrip = new OperaRoomDistrib();
  327. $data = [
  328. 'DISTRIB_ROOM_NAME' => '',//针对渠道设置的子房型名称
  329. 'ROOM_ID' => $params['cs_sale_room_id'],//房型ID 对应opera_hotel_room的ID
  330. 'CHANNEL_MAPPING_ID' => ''//渠道直连房型ID(携程:房型ID,阿里:RP ID)
  331. ];
  332. $operaRoomDistrip->editRow($data, $channel_arr);
  333. return Util::returnArrSu();
  334. }
  335. /**
  336. * Des:新增售卖房型数据
  337. * Name: addSaleRoomMapping
  338. * @param $params
  339. * @return array
  340. * @author 倪宗锋
  341. */
  342. public function addSaleRoomMapping($params)
  343. {
  344. $switch = new CtripSwitch();
  345. $config = $switch->ctripConf;
  346. #1、获取用于发送请求的参数
  347. $operaHotelRoom = new OperaHotelRoom();
  348. $getData = $operaHotelRoom->getDataForAddSaleRoom($params);
  349. if (empty($getData['master_base_room_id'])) {
  350. return Util::returnArrEr('基础房型未关联!不可新增!');
  351. }
  352. #设置接口参数
  353. $data = [
  354. 'supplierId' => (int)$config['switch_supplier_id'],//供应商
  355. 'hotelId' => (int)$getData['sub_hotel_id'],
  356. 'basicRoomTypeId' => (int)$getData['sub_base_room_id'],
  357. 'purchaseSourceID' => (int)0,
  358. 'priceType' => (int)2
  359. ];
  360. #餐食设置
  361. if ($getData['BREAKFAST_INCLUDE'] == 0) {
  362. $data['mealType'] = (int)0;//餐食
  363. $data['mealCount'] = (int)-1;//餐食份数
  364. $data['rateCodePropertyValueIDList'][] = (int)498160;//餐食
  365. } elseif ($getData['BREAKFAST_INCLUDE'] == 1) {
  366. $data['mealType'] = (int)1;
  367. $data['mealCount'] = (int)1;
  368. $data['rateCodePropertyValueIDList'][] = (int)7;
  369. } elseif ($getData['BREAKFAST_INCLUDE'] == 2) {
  370. $data['mealType'] = (int)1;
  371. $data['mealCount'] = (int)2;
  372. $data['rateCodePropertyValueIDList'][] = (int)640292;
  373. } else {
  374. $data['mealType'] = (int)10;
  375. $data['mealCount'] = (int)$getData['BREAKFAST_INCLUDE'];
  376. $data['rateCodePropertyValueIDList'][] = (int)8;
  377. }
  378. #入住人数
  379. if (isset($this->OCCUPANCY_LIMIT[$getData['OCCUPANCY_LIMIT']])) {
  380. $data['rateCodePropertyValueIDList'][] = $this->OCCUPANCY_LIMIT[$getData['OCCUPANCY_LIMIT']];//入住人数
  381. }
  382. #床行
  383. if (isset($this->BED_TYPE[$getData['BED_TYPE']])) {
  384. $data['rateCodePropertyValueIDList'][] = $this->BED_TYPE[$getData['BED_TYPE']];
  385. }
  386. $res = $switch->request('createRoom', $data);//向代理通发送添加请求
  387. if (!isset($res->resultStatus->resultCode) || $res->resultStatus->resultCode != 0) {
  388. $msg = empty($res->resultStatus->resultMsg) ? '新增房型数据失败!' : $res->resultStatus->resultMsg;
  389. return Util::returnArrEr($msg);
  390. }
  391. //添加成功则 设置关联关系
  392. $mappingData = [
  393. 'cs_sale_room_id' => $params['cs_sale_room_id'],//cs售卖房型ID
  394. 'sale_room_id' => $res->roomTypeId,//代理通售卖房型ID
  395. 'sale_room_name' => $res->roomName,//代理通售卖房型名称
  396. 'channel_id' => 669,//渠道ID
  397. ];
  398. $result = $this->setSaleRoomMapping($mappingData);
  399. return $result;
  400. }
  401. }