getTouristByCode($params['productId']); if (empty($tourist_id)) { return Util::returnArrEr('产品ID不存在', [], '1001'); } # 2:校验自由行产品实时库存 $stock = $get_tourist_stock->getFormatTouristStock($tourist_id, $params['useDate'], 164, 2); if ($stock['code'] != 0) { return Util::returnArrEr('库存不足', ['inventory' => 0], '1003'); } ##有库存,但剩余库存小于下单所需数量 if ($stock['list']['max_adult_num'] < $params['count']) { return Util::returnArrEr('库存不足', ['inventory' => $stock['list']['max_adult_num']], '1003'); } # 3:库存充足,返回成功 return Util::returnArrSu('验证成功', ['inventory' => $stock['list']['max_adult_num']], '0000'); } /** * Function Description:携程自由行下单 * Function Name: CreateOrder * @param $params * * @return array * * @author 娄梦宁 */ public function CreateOrder($params) { # 返回信息 $return = [ 'otaOrderId' => $params['otaOrderId'], 'vendorOrderId' => 0, 'smsCodeType' => 1, ]; if (preg_match('/^[1-9][0-9]{0,10}$/', $params['productId']) == false) { return Util::returnArrEr('产品ID错误', [], '1001'); } if (empty($params['passengerInfos']['passengerInfo'])){ return Util::returnArrEr('证件不能为空', $return, '1009'); } # 1:传入参数的简单校验 $params_check = self::createOrderCheckParams($params); if ($params_check['code'] != 0) { return Util::returnArrEr($params_check['info'], $return, '1005'); } # 2:判断携程订单是否已下 $order_title = new OrderTitle(); $getInfo = $order_title->getCtripOrderInfoById($params['otaOrderId']); if (empty($getInfo['order_title_id']) == false) { $return['vendorOrderId'] = $getInfo['order_title_id']; return Util::returnArrSu('下单成功', $return, '0000'); } # 3:找出携程产品对应的自由行产品 $operaTouristCommon = new OperaTouristCommon(); $tourist_id =$operaTouristCommon->getTouristByCode($params['productId']); if (empty($tourist_id)) { return Util::returnArrEr('产品ID不存在', $return, '1001'); } # 4:构造自由行下单所需参数 $build_params = self::createOrderBuildParams($params, $tourist_id); if (empty($build_params)) { $return['inventory'] = 0; return Util::returnArrEr('库存不足', $return, '1003'); } # 校验证件 $passenger_info = json_decode($build_params['passenger_info'], true); if ($passenger_info == []) { return Util::returnArrEr('证件不能为空', $return, '1009'); } foreach ($passenger_info as $val) { if (empty($val['passenger_name']) || empty($val['passenger_cardid'])) { return Util::returnArrEr('证件不能为空', $return, '1009'); } } $res = Msg::httpRequest(CS1_DOMAIN . '/api/submit-order', $build_params); $result = json_decode($res, true); if (isset($result['code']) && $result['code'] == 0) { #组合订单修改is_connected_order $order_title::updateAll(['is_connected_order' => 1], ['order_title_id' => $result['order_title_id']]); $return['vendorOrderId'] = $result['order_title_id']; return Util::returnArrSu('下单成功', $return, '0000'); } $return['inventory'] = 0; return Util::returnArrEr('库存不足', $return, '1100'); } /** * Function Description:携程自由行下单前简单的参数校验 * Function Name: createOrderCheckParams * @param $params * * @return array * * @author 娄梦宁 */ private function createOrderCheckParams($params) { if (empty($params['otaOrderId'])) { return [ 'code' => 1, 'info' => '参数为空 otaOrderId' ]; } if (empty($params['productId'])) { return [ 'code' => 1, 'info' => '参数为空 productId' ]; } if (empty($params['count'])) { return [ 'code' => 1, 'info' => '参数为空 count' ]; } if (empty($params['contactName'])) { return [ 'code' => 1, 'info' => '参数为空 contactName' ]; } if (empty($params['contactMobile'])) { return [ 'code' => 1, 'info' => '参数为空 contactMobile' ]; } if (empty($params['useDate'])) { return [ 'code' => 1, 'info' => '参数为空 useDate' ]; } return ['code' => 0]; } /** * Function Description:处理携程自由行下单参数 * Function Name: createOrderBuildParams * @param $params * @param $tourist_id * * @return array * * @author 娄梦宁 */ private function createOrderBuildParams($params, $tourist_id) { $transObj = new TouristToResource(); # 出行人信息 $passenger_info = []; if (isset($params['passengerInfos']['passengerInfo']) && !empty($params['passengerInfos']['passengerInfo'])) { if (empty($params['passengerInfos']['passengerInfo']['name']) == false) { $passengerInfo[] = $params['passengerInfos']['passengerInfo']; } else { $passengerInfo = $params['passengerInfos']['passengerInfo']; } foreach ($passengerInfo as $key => $val) { $passenger_info[] = [ 'passenger_name' => $val['name'], 'passenger_mobile' => $val['mobile'], 'passenger_cardid' => $val['cardNo'] ]; } } # 产品数组 $prodArr = [ 1 => [ 'prod_id' => 'TR-' . $tourist_id . '-1', 'prod_name' => '成人票', 'prod_num' => $params['count'] ], 2 => [ 'prod_id' => 'TR-' . $tourist_id . '-2', 'prod_name' => '儿童票', 'prod_num' => 0 ] ]; #如果没有传入价格则获取价格 if (empty($params['price'])) { $getTouristStock = new GetTouristStock(); $payPrice = $getTouristStock->getTouristPayTotal($tourist_id, $params['useDate'], Yii::$app->params['ctrip_config']['supplier_id'], 2, $prodArr); if (isset($payPrice['code']) && $payPrice['code'] == 0) { $params['price'] = $payPrice['list']['total_money']; } else { return []; } } # 订单信息 $order_info = [ 'user_id' => 2, 'member_id' => 1, 'outside_sale_org_id' => Yii::$app->params['ctrip_config']['supplier_id'], 'outside_sale_order_no' => $params['otaOrderId'], 'total_money' => $params['price'], 'order_book_status' => 0, 'pay_type' => 275, 'order_pay_status' => 1, 'sales_man' => '' ]; $trans_res = $transObj->getTouristToAll($tourist_id, $params['useDate'], $prodArr, [ 'customer_name' => $params['contactName'], 'customer_mobile' => $params['contactMobile'], 'customer_id_type' => 150, 'customer_id_no' => empty($params['contactIdCardNo']) ? '' : $params['contactIdCardNo'], ], $order_info, Yii::$app->params['ctrip_config']['supplier_id']); if ($trans_res['code'] != 0) { return []; } # 自由行下单前身份加密校验 $user = 'ctrip'; $user_key = 'ctrip'; $request_time = time(); //加密规则为 request_time(linux时间戳)前三位 + user + user_key + request_time(linux时间戳)末尾三位,进行MD5加密后,换成大写字母 $auth_code = strtoupper(md5(substr($request_time, 0, 3) . "|" . $user . "|" . $user_key . "|" . substr($request_time, strlen($request_time) - 3, 3))); #最终参数封装 $trans_arr = $trans_res['list']; $data['product_name'] = $trans_arr['product_name']; $data['bus_product'] = empty($trans_arr['bus_product']) ? '' : json_encode($trans_arr['bus_product']); $data['hotel_product'] = empty($trans_arr['hotel_product']) ? '' : json_encode($trans_arr['hotel_product']); $data['ticket_product'] = empty($trans_arr['ticket_product']) ? '' : json_encode($trans_arr['ticket_product']); $data['customer_info'] = json_encode($trans_arr['customer_info']); $data['order_info'] = json_encode($trans_arr['order_info']);//这里内含的outside_sale_org_id为该运营主体对应的内部采购渠道id $data['group_order_price'] = $params['price'];//组合产品销售价格 $data['tourist_mark'] = $tourist_id;//$tourist_mark 标志该组合下单是否是自由行产品下单:0表示否,如是则为 tourist_id $data['tourist_org_id'] = Yii::$app->params['ctrip_config']['supplier_id'];//自由行产品销售渠道id,区别于order_info里的outside_sale_org_id[运营主体所对应]内部采购渠道id $data['tourist_extra_info'] = json_encode(array('adult_num' => $params['count'], 'child_num' => 0));//自由行产品附属信息(成人和儿童数) $data['action'] = 'submit_group_order'; $data['passenger_info'] = json_encode($passenger_info); $data['buy_insurance'] = 0; $data['insurance'] = ''; $data['auth_code'] = $auth_code; $data['user_key'] = $user_key; $data['user'] = $user; $data['user_id'] = 2; $data['request_time'] = $request_time; $data['tourist_id'] = $tourist_id; $data['date'] = $params['useDate']; $data['product_name'] = empty($params['otaProductName']) ? $trans_arr['product_name'] : $params['otaProductName']; return $data; } /** * Des:取消接口 * Name: CancelOrder * @param $params array * @return array * @author 倪宗锋 */ public function CancelOrder($params) { if (empty($params['cancelCount'])) {//取消产品数量 return Util::returnArrEr("参数为空【cancelCount】", [], '1005'); } if (empty($params['otaOrderId'])) {//携程订单ID return Util::returnArrEr("参数为空【otaOrderId】", [], '1005'); } if (empty($params['sequenceId'])) {//流水号 return Util::returnArrEr("参数为空【sequenceId】", [], '1005'); } # 2 订单信息校验 $orderTitle = new OrderTitle(); $titleInfo = $orderTitle->getCtripTitleInfo($params['otaOrderId']); if (empty($titleInfo['order_title_id'])) {//订单信息是否存在 return Util::returnArrEr("订单不存在", [], '2001'); } if ($titleInfo['order_title_status'] == 3) {//订单状态是否支持申请取消订单 return Util::returnArrEr("该订单已经使用", [], '2002'); } if ($titleInfo['order_title_status'] == 4) {//订单状态是否支持申请取消订单 return Util::returnArrEr("该订单已经取消,不可重复申请", [], '2003'); } if ($titleInfo['adult_num'] != $params['cancelCount']) {//校验订单产品数量是否一致 return Util::returnArrEr("取消数量不正确", [], '2004'); } if ($titleInfo['is_connected_order'] != 1 || $titleInfo['outside_sale_org_id']!=Yii::$app->params['ctrip_config']['supplier_id']) {//校验订单是否是携程直连订单 return Util::returnArrEr("非携程直连订单,不支持取消", [], '2111'); } # 3 订单取消记录校验 $orderTitleCancelRequest = new OrderTitleCancelRequest(); $cancelLast = $orderTitleCancelRequest->getLastInfo($titleInfo['order_title_id']); if (empty($cancelLast['order_title_id']) == false) { # 5 设置 成功返回值 $return = [ 'cancelCount' => $params['cancelCount'], 'charge' => 0, 'orderStatus' => 2, 'auditDuration' => 2 ]; if (in_array($cancelLast['request_status'], [3, 4])) {//如果取消申请失败 $return['orderStatus'] = 4; } if ($cancelLast['request_status'] == 2) {//如果取消申请成功 $return['orderStatus'] = 3; } return Util::returnArrSu('', $return); } # 4 插入新记录 $data = [ 'order_title_id' => $titleInfo['order_title_id'], 'from_org_id' => \Yii::$app->params['ctrip_config']['supplier_id'], 'create_time' => date('Y-m-d H:i:s'), 'limit_time' => '120', 'last_time' => date('Y-m-d H:i:s', strtotime('+24 hours')), 'sequence_id' => $params['sequenceId'] ]; $flag = $orderTitleCancelRequest->addRow($data); if ($flag != 0) { # 5 设置 成功返回值 $return = [ 'cancelCount' => $params['cancelCount'], 'charge' => 0, 'orderStatus' => 2, 'auditDuration' => 24 ]; return Util::returnArrSu('', $return); } return Util::returnArrEr('申请取消失败', [], '2199'); } /** * Des:查询订单信息 * Name: QueryOrder * @param $params * @return array * @author 倪宗锋 */ public function QueryOrder($params) { # 1 参数校验 if (empty($params['otaOrderId'])) {//携程订单ID return Util::returnArrEr("参数为空【otaOrderId】", [], '4100'); } # 2 订单信息校验 $orderTitle = new OrderTitle(); $titleInfo = $orderTitle->getCtripTitleInfo($params['otaOrderId']); if (empty($titleInfo['order_title_id'])) {//订单信息是否存在 return Util::returnArrEr("订单不存在", [], '4001'); } if ($titleInfo['is_connected_order'] != 1) {//校验订单是否直连订单 return Util::returnArrEr("非携程直连订单,不支持查询", [], '4102'); } if ($titleInfo['outside_order_no'] != $params['otaOrderId']) {//校验携程订单号是否一致 return Util::returnArrEr("otaOrderId不正确!", [], '4103'); } # 5设置 成功返回值 $return = [ 'otaOrderId' => $titleInfo['outside_order_no'], 'vendorOrderId' => $titleInfo['order_title_id'], 'orderStatus' => 0, 'amount' => $titleInfo['order_title_all_price'], 'count' => $titleInfo['adult_num'], 'useCount' => 0, 'cancelCount' => 0 ]; if ($titleInfo['order_title_status'] == 3) {//订单状态已完成 $return['orderStatus'] = 5;//订单已完成 $return['useCount'] = $titleInfo['adult_num'];//使用数等于总数 } elseif ($titleInfo['request_status'] == 0) {//没有取消申请 则是新订单 $return['orderStatus'] = 1;//新订单 } elseif ($titleInfo['request_status'] == 1) {//1 申请审核中 $return['orderStatus'] = 2;//申请取消成功 } elseif ($titleInfo['request_status'] == 2) {//2 申请审核通过 $return['orderStatus'] = 3;//取消(审核)成功 $return['cancelCount'] = $titleInfo['adult_num'];//取消数量 } elseif (in_array($titleInfo['request_status'], [3, 4])) {//3 申请审核被拒 4 申请超时被拒 $return['orderStatus'] = 4;//取消(审核)失败 } return Util::returnArrSu('', $return); } /** * Function Description:获取出发城市列表 * Function Name: GetFromCityList * @param $params * @return array * @author 田玲菲 */ public function GetFromCityList($params){ $baseResource = new BaseResource(); $res = $baseResource->getFromCities(); $data = []; foreach($res as $k=>$v){ $data['fromCityList'][] = $v['res_name']; } return Util::returnArrSu('', $data); } /** * Function Description:获取到达城市列表 * Function Name: GetToCityList * @param $params * @return array * @author 田玲菲 */ public function GetToCityList($params){ //1. 验证参数 if (empty($params['fromCity'])) { //出发城市 return Util::returnArrEr("参数为空【fromCity】", [], '2100'); } //2. 根据res_name获取res_id $baseResource = new BaseResource(); $res = $baseResource->getResId($params['fromCity']); if(count($res)<1){ return Util::returnArrEr("查询出错", [], '2101'); } $res_id = $res['res_id']; // 3.获取所有的prod_id $res1 = $baseResource->getProdIds(); if(isset($res1['prod_id'])){ $prod_arr = $res1['prod_id']; }else{ $prod_arr = []; } //2. 根据res_id获取到达城市 $result = $baseResource->getTocities($res_id,$prod_arr); foreach ($result as &$v){ $v['preSaleStart'] = date("Y-m-d",strtotime($v['preSaleStart'])); $v['preSaleEnd'] = date("Y-m-d"); } $data['toCityList'] = $result; return Util::returnArrSu('', $data); } }