|
- <?php
-
- namespace backend\modules\api\logic;
-
- use backend\modules\api\models\BaseResource;
- use backend\modules\api\models\OperaTouristCommon;
- use backend\modules\api\models\OperaTouristCtrip;
- use backend\modules\api\models\OrderMain;
- use backend\modules\api\models\OrderTitle;
- use backend\modules\api\util\Util;
- use common\models\Msg;
- use Yii;
- use backend\modules\zzcs\models\OrderTitleCancelRequest;
-
- class Ctrip
- {
- /**
- * Function Description:携程下单验证接口
- * Function Name: VerifyOrder
- * @param $params
- *
- * @return array
- *
- * @author 娄梦宁
- */
- public function VerifyOrder($params)
- {
- $opera_tourist_ctrip = new OperaTouristCtrip();
- $get_tourist_stock = new GetTouristStock();
-
- # 校验产品ID
- if (preg_match('/^[1-9][0-9]{0,10}$/', $params['productId']) == false) {
- return Util::returnArrEr('产品ID错误', [], '1001');
- }
-
- # 1:获取携程产品对应的自由行产品
- $operaTouristCommon = new OperaTouristCommon();
- $tourist_id =$operaTouristCommon->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);
- }
-
-
-
- }
|