|
- <?php
- /**
- *
- * ============================================================================
- * * 版权所有 蜘蛛出行 * *
- * 网站地址: http://www.zhizhuchuxing.com
- * ----------------------------------------------------------------------------
- * 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和
- * 使用;不允许对程序代码以任何形式任何目的的再发布。
- * ============================================================================
- * Author By: 温依莅
- * PhpStorm ModifyBusOrder.php
- * Create By 2017/5/17 10:50 $
- */
-
- namespace backend\modules\api\logic;
-
- use yii\db\Query;
- use backend\modules\api\models\OperaTickets;
- use backend\modules\api\models\OrderMain;
- use backend\modules\api\models\RunMain;
- use backend\modules\api\models\RunProd;
-
- use backend\modules\api\models\BaseSupplier;
- use backend\modules\api\models\OperaLine;
- use backend\modules\api\models\RunStation;
- use backend\modules\api\models\BaseUniqueId2;
- use backend\modules\api\models\RunBus;
- use backend\modules\api\models\RunStock;
- use backend\modules\api\models\OrderPayMain;
- use backend\modules\api\models\OrderPayDetail;
- use backend\modules\api\models\OrderOperaLog;
- use backend\modules\api\models\OrderExtraInfo;
- use backend\modules\api\models\BaseResource;
- use backend\modules\api\models\BaseArea;
- use backend\modules\api\models\DictType;
- use backend\modules\api\models\BaseUser;
- use common\models\Msg;
- use common\models\Utils;
- use yii\base\Exception;
- use yii\db\Expression;
-
- use Yii;
-
- /**
- * Class ModifyBusOrder 巴士产品修改类
- * @package backend\modules\api\logic
- */
- class ModifyBusOrder extends Query
- {
- /**
- * Function Description:单巴士修改订单主接口
- * Function Name: modifyBusHub
- * @param int $para_order_id 订单号
- * @param array $para_prod_arr 巴士产品修改信息json: eg {"to_go":1,"run_id":"907812","prod_id":"453300","order_price":"33.94","bus_people_num":3,"bus_order_id":0}
- * @param array $para_order_info_arr 巴士订单信息json: eg {"modify_user_id":"1","member_id":0,"outside_sale_org_id":"75","outside_order_no":"","is_book":0,"pay_type":275,"is_pay":1,"sales_man":"业务员"}
- * @param array $para_customer_info_arr 顾客信息json: eg {"customer_name":"测试员","customer_phone":"15753206507","customer_id_type":"150","customer_id_no":"","customer_remark":""}
- * @param array $para_order_append_arr 附加信息json: eg 门票价格,酒店价格{'gate_price':0,'hotel_price':0}
- * @param array $para_receiver_value_arr 代收价格json: eg 代售单价,代售总价{'sin_rec_value' : 0, 'total_rec_value' : 0}
- *
- * @return mixed
- *
- * @author 温依莅
- */
- public function modifyBusHub($para_order_id, $para_prod_arr, $para_order_info_arr, $para_customer_info_arr, $para_order_append_arr, $para_receiver_value_arr)
- {
- //【〇】参数转换
- $order_id = $para_order_id; // 需要修改的订单id
- $prod_arr = $para_prod_arr; // 购买票种列表 格式为{去程/返程标志(1:去程 2:返程),去程/返程班次ID,票种ID,票种单价,预定数量,车号}...{"to_go":1,"run_id":"907812","prod_id":"453300","order_price":"33.94","bus_people_num":3,"bus_order_id":0}
- $order_info_arr = $para_order_info_arr; // 订单信息 {下单用户,会员号,渠道id,渠道订单号,是否自动退票(0否1是),支付方式(授信275),是否支付(0否1是),业务员}{"modify_user_id":"1","member_id":0,"outside_sale_org_id":"75","outside_order_no":"","is_book":0,"pay_type":275,"is_pay":1,"sales_man":"业务员"}
- $customer_info_arr = $para_customer_info_arr; //联系人信息,格式为{联系人,联系电话,z证件类型,联系人身份证,备注}{"customer_name":"测试员","customer_phone":"15753206507","customer_id_type":"150","customer_id_no":"","customer_remark":""}
- $order_append_arr = $para_order_append_arr; // 订单附加 ,格式为{门票价格,酒店价格}{'gate_price':0,'hotel_price':0}
- $receiver_value_arr = $para_receiver_value_arr; // 代收,格式为{代收单价,代收总价}{'sin_rec_value' : 0, 'total_rec_value' : 0}
- $is_send_msg = 0; // 是否发短信(0否1是) 默认0
-
-
- //$user_id = Yii::$app->request->cookies->getValue('user_id', 2);//修改订单用户id 默认2
- //获取订单配置信息,获取传递的user_id
- $order_info_arr = $this->getOrderInfoArray($order_info_arr);
- $user_id = $order_info_arr['user_id'];
- //获取原订单相关信息
- $ori_order_info = $this->getOrderModifyInfo($order_id);
-
- $transaction = Yii::$app->db->beginTransaction();//开始事务
- //【一】,释放原order_id所占用的资源
-
- $res = $this->emptyBusOrder($order_id, $user_id);
-
- if ($res['code'] != '0') {
- $transaction->rollBack();
- $result['code'] = '1';
- $result['info'] = '释放原订单所占资源失败';
- $result['error_info'] = $res['info'];
- return $result;
- }
-
- //【二】, 根据参数修改订单
- $prod_arr = $this->getBusProductList($prod_arr);
- if (count($prod_arr) == 0) {
- $transaction->rollBack();
- $result['code'] = '1';
- $result['info'] = '没有选购产品';
- return $result;
- }
- // 1,获取原订单相关信息
-
-
- // 2.获取订单配置数据
-
-
- // 3.获取乘客信息
- $customer_info_arr = $this->getCustomerInfoArray($customer_info_arr);
-
-
- // 4.获取附属产品
- $order_append_arr = $this->getOrderAppendArray($order_append_arr);
-
-
- // 5.获取产品的详细属性
- $run_ticket_arr = [];//班次票种数组
- foreach ($prod_arr as $key => $vel) {
- $run_ticket_one['run_id'] = $vel['run_id'];
- $run_ticket_one['ticket_id'] = $vel['ticket_id'];
- $run_ticket_arr[] = $run_ticket_one;
- }
- $prod_list = $this->getBusProductListByRunTicket($run_ticket_arr);
-
- #region 判断获取的产品和要下单的产品数量是否一致
- if (count($prod_arr) != count($prod_list)) {
- $transaction->rollBack();
- $result['code'] = '1';
- $result['info'] = '产品有误';
- return $result;
- }
-
- #region 6.判断价格
- #endregion
-
- // 7.检查run_x中是否有班次是否存在
- $date_run_arr = [];//日期-班次数组
- foreach ($prod_list as $key => $vel) {
- $vel_run_date = substr($vel['run_date'], 0, 7);
- $vel_run_date = str_replace('-', '', $vel_run_date);
- $date_run_arr[$vel_run_date][] = $vel['run_id'];
- }
- $check_run_result = $this->checkRunX($date_run_arr);
-
- if (!$check_run_result) {
- $transaction->rollBack();
- $result['code'] = '1';
- $result['info'] = '没有班次';
- return $result;
- }
-
-
- // 8.获取每个班次的可订座位量
- $run_bus_arr = [];
- foreach ($prod_list as $key => $vel) {
- $run_one['run_id'] = $vel['run_id'];//班次id
- $run_one['run_date'] = substr($vel['run_date'], 0, 7);//班次日期
- $run_one['run_date'] = str_replace('-', '', $run_one['run_date']);//班次日期
- $run_one['seat_type'] = $vel['seat_type'];//座位类型
- $run_one['start_seq_id'] = $vel['start_seq_id'];//开始站顺序号
- $run_one['end_seq_id'] = $vel['end_seq_id'];//结束站顺序号
- $run_one['seat_count'] = $run_one['end_seq_id'] - $run_one['start_seq_id'];//途径个数
- $run_one['ticket_id'] = $vel['ticket_id'];
- $run_one['num'] = $prod_arr[$vel['ticket_id']]['num'];
- $run_one['bus_order_id'] = $prod_arr[$vel['ticket_id']]['bus_order_id'];
- $run_bus_arr[] = $run_one;
- }
- $run_bus_seat = $this->getRunBusSeat($run_bus_arr);
-
- #检查库存
- if (!$run_bus_seat) {
- $transaction->rollBack();
- $result['code'] = '1';
- $result['info'] = '库存不足';
- return $result;
- }
- // 9.连坐优先分配座位
- $seat_arr = $this->getSeatArray($run_bus_seat, $prod_arr);
-
- // 10.获取代收价
- $prod_list = $this->getBusProductListReceiver($prod_list, $receiver_value_arr, $prod_arr);
-
-
- // 11.修改巴士订单
- $final_res = $this->modifyBusOrder($prod_list, $seat_arr, $order_info_arr, $customer_info_arr, $order_append_arr, $is_send_msg, $ori_order_info);
-
- if ($final_res['code'] != '0') {
- $transaction->rollBack();
- $result['code'] = '1';
- $result['info'] = '订单修改失败';
- $result['error_info'] = $final_res['info'];
- return $result;
- }
- //12.供应商渠道商先把已扣款的钱退回去
- $submit_order=new SubmitOrder();
- $submit_order->SupplierBalance($order_id,2,'巴士订单,修改先取消');
- $transaction->commit();
- $submit_order->SupplierBalance($order_id,2,'巴士订单,修改后新增');
- //$transaction->rollBack();
- $result['code'] = '0';
- $result['info'] = '订单修改成功';
- $result['data'] = $final_res['data'];
-
-
- return $result;
- }
-
-
- /**
- * Function Description:释放单一线路订单所占资源
- * Function Name: emptySingleBusOrder
- * @param array $order_id_arr 订单号
- * @param array $order_run_info 订单班次信息
- * @param int $user_id 操作用户
- * @param string $cancel_reason 退票原因
- *
- * @return mixed
- *
- * @author 张帅
- */
- public
- function emptySingleBusOrder($order_id_arr, $order_run_info, $user_id, $cancel_reason = '组合产品修改')
- {
- //$transaction = Yii::$app->db->beginTransaction();
- try {
- #region 1.更新主订单信息
- $update_value = [
- 'UPDATE_TIME' => date('Y-m-d H:i:s'),
- 'ORDER_STATUS' => 148,
- 'ORDER_VALID_STATUS' => 0,
- 'ORDER_DISABLE_USER_ID' => $user_id,
- 'ORDER_DISABLE_TIME' => date('Y-m-d H:i:s'),
- ];
- $update_where = [
- 'in', 'order_id', $order_id_arr
- ];
- $res = OrderMain::updateAll($update_value, $update_where);
- if (!$res) {
- throw new Exception('更新主订单信息失败');
- }
- #endregion
-
- #region 1.更新子订单信息
- $update_value = [
- 'UPDATE_TIME' => date('Y-m-d H:i:s'),
- 'ORDER_STATUS' => 148,
- 'ORDER_VALID_STATUS' => 0,
- 'CANCEL_FLAG' => 1,
- 'ORDER_DISABLE_USER_ID' => $user_id,
- 'ORDER_DISABLE_TIME' => date('Y-m-d H:i:s'),
- ];
- $update_where = [
- 'in', 'parent_order_id', $order_id_arr
- ];
- $res = OrderMain::updateAll($update_value, $update_where);
- if (!$res) {
- throw new Exception('更新子订单信息失败');
- }
- #endregion
-
- #region 2.更新run_x
- foreach ($order_run_info as $key => $vel) {
- $run_x_date = substr($vel['run_date'], 0, 7);
- $run_x_date = str_replace('-', '', $run_x_date);
- $update_sql = 'update run_' . $run_x_date . '
- set order_main_id = 0,
- order_main_prod_id = 0,
- order_prod_id = 0,
- seat_status = 0,
- order_lock_user_id = 0,
- order_lock_time = \'' . date('Y-m-d H:i:s') . '\'
- where run_id = ' . $vel['run_id'] . '
- and order_main_id in (' . $vel['order_id'] . ')';
- $res = Yii::$app->db->createCommand($update_sql)->execute();
- if (!$res) {
- throw new Exception('更新run_x失败');
- }
- }
- #endregion
-
- #region 3.更新run_prod,run_bus,run_stock
- foreach ($order_run_info as $key => $vel) {
- #region (1).更新run_prod
- $update_value = [
- 'UPDATE_USER_ID' => $user_id,
- 'UPDATE_TIME' => date('Y-m-d H:i:s'),
- 'SALED_COUNT' => new Expression('SALED_COUNT-' . $vel['order_num']),
- ];
- $update_where = [
- 'and',
- ['=', 'run_id', $vel['run_id']],
- ['=', 'prod_id', $vel['ticket_id']],
- ['=', 'cancel_flag', 0],
- ];
- $res = RunProd::updateAll($update_value, $update_where);
- if (!$res) {
- throw new Exception('更新run_prod失败');
- }
- #endregion
-
- #region (2).更新run_bus
- $update_value = [
- 'UPDATE_USER_ID' => $user_id,
- 'UPDATE_TIME' => date('Y-m-d H:i:s'),
- 'SALED_COUNT' => new Expression('SALED_COUNT-' . $vel['order_num']),
- ];
- $update_where = [
- 'and',
- ['=', 'run_id', $vel['run_id']],
- ['=', 'bus_order_id', $vel['bus_order_id']],
- ['=', 'cancel_flag', 0],
- ];
- $res = RunBus::updateAll($update_value, $update_where);
- if (!$res) {
- throw new Exception('更新run_bus失败');
- }
- #endregion
-
- #region (3).更新run_stock
- $update_value = [
- 'UPDATE_USER_ID' => $user_id,
- 'UPDATE_TIME' => date('Y-m-d H:i:s'),
- 'SALED_COUNT' => new Expression('SALED_COUNT-' . $vel['order_num']),
- ];
- $update_where = [
- 'and',
- ['=', 'run_id', $vel['run_id']],
- ['>=', 'seq_id', $vel['start_seq_id']],
- ['<', 'seq_id', $vel['end_seq_id']],
- ['=', 'seat_type', $vel['seat_type']],
- ['=', 'cancel_flag', 0],
- ];
- $res = RunStock::updateAll($update_value, $update_where);
- if (!$res) {
- throw new Exception('更新run_stock失败');
- }
- #endregion
- }
- #endregion
-
- $result['code'] = '0';
- $result['info'] = '退票成功';
- $result['data'] = implode(',', $order_id_arr);
- } catch (Exception $e) {
- # 回滚事务
- $result['code'] = '1';
- $result['info'] = '退票失败';
- $result['error'] = $e->getMessage();
- }
-
- return $result;
- }
-
- /**
- * Function Description:修改巴士订单
- * Function Name: submitBusOrder
- * @param array $prod_list 产品列表
- * @param array $seat_arr 座位
- * @param array $order_info_arr 订单的其他信息
- * @param array $customer_info_arr 乘客
- * @param array $order_append_arr 附加产品
- * @param int $is_send_msg 是否发短信
- * @param array $ori_order_info 原订单信息
- *
- * @return mixed
- *
- * @author 张帅
- */
- public
- function modifyBusOrder($prod_list, $seat_arr, $order_info_arr, $customer_info_arr, $order_append_arr, $is_send_msg, $ori_order_info)
- {
- #region 获取最大唯一值,先赋给支付id,然后递增
- $base_main_id = BaseUniqueId2::find()->select('unique_id')->where(['id' => 1])->asArray()->one();
- //更新唯一键值
- #获取订单人数
- $people_num = count(current($seat_arr));
- $time=time().rand(0,999999);
- $res = BaseUniqueId2::updateAll(['UNIQUE_ID' => $base_main_id['unique_id'] + $people_num + 1,'UPDATE_TIME'=>$time], ['id' => 1]);
- if (!$res) {
- $result['code'] = '1';
- $result['info'] = 'baseUnique更新失败';
- return $result;
- }
-
- $pay_main_id = $ori_order_info['order_pay_main_id']; // 原订单 支付记录order_pay_main 的id 和 支付明细order_pay_detail 的pay_main_id
-
- $parent_order_id = $ori_order_info['order_id']; // 原主订单记录
- $order_status = $ori_order_info['order_status']; // 原订单状态
- #endregion
-
- #region 提交订单操作数据库所需数据
- $main_order = [];//主订单数据
- $main_order_key = [];//提交主订单时所需key值
- $son_order = [];//子订单数据
- $son_order_key = [];//提交子订单时所需key值
- $run_x_arr = [];//run_x
- $run_bus_prod_stock_arr = [];//run_bus,run_prod,run_stock更新数据
- $main_order_id = [];//订单id数组
- $pay_main_arr = [];//主支付记录数据
- $pay_main_key = [];//主支付记录键值
- $order_price = 0;
- $son_order_id = 0;
- #endregion
-
- #region 整理数据
- foreach ($prod_list as $key => $vel) {
-
- $run_x_one = [];//run_x_one
- $prod_list[$key]['order_id'] = $parent_order_id;//订单号
- #region 主订单数据
- $main_order_val = [
- //'ID' => $parent_order_id,
- //'MAIN_CREATE_USER_ID' => $order_info_arr['user_id'],//'代下单用户ID,BASE_USER.ID,用户A代替用户B下单,则MAIN_CREATE_USER_ID=A,CREATE_USER_ID=B',
- //'CREATE_USER_ID' => $order_info_arr['user_id'],
- //'CREATE_TIME' => date('Y-m-d H:i:s'),
- 'UPDATE_USER_ID' => $order_info_arr['user_id'],
- 'UPDATE_TIME' => date('Y-m-d H:i:s'),
- 'SALE_ORG_ID' => 0,//'分销商机构ID',
- 'SALE_TOP_ORG_ID' => 0,//'下单组织机构所属一级机构ID',
- //'PROD_TOP_ORG_ID' => 0,//'产品所属一级机构ID',
- //'ORDER_ID' => $parent_order_id,
- 'ORDER_DESCRIPTION' => $vel['ticket_name'] . ',' . $vel['run_date'] . ',' . $vel['people_num'] . '|' . $vel['people_num'],//'最细颗粒度的订单描述',
- 'OUTSIDE_ORDER_NO' => $order_info_arr['outside_sale_order_no'],//'分销商订单编号',
- 'ORDER_VALID_STATUS' => 1,//'订单有效性状态,0失效订单、1有效订单',
- 'ORDER_BOOK_STATUS' => $order_info_arr['order_book_status'],//'订单预订状态,0非预订、1有时限、2永久锁位预订',
- 'ORDER_PAY_STATUS' => $order_info_arr['order_pay_status'],//'订单是否已支付,0未支付,1已支付',
- 'ORDER_PAY_MAIN_ID' => $pay_main_id,//'支付记录主ID,ORDER_PAY_MAIN.ID',
- //'ORDER_PAY_USER_ID' => $order_info_arr['user_id'],//'支付操作用户ID,BASE_USER.ID',
- //'ORDER_PAY_TIME' => date('Y-m-d H:i:s'),//'支付操作时间',
- 'PARENT_ORDER_ID' => 0,
- 'PARENT_PROD_ID' => $vel['line_id'],
- 'PARENT_PROD_NAME' => $vel['line_name'],
- 'ORDER_PRICE' => $vel['total_price'],//'订单价格',
- 'ORDER_PROD_TYPE' => 81,//'订单类型',
- 'PROD_START_STATION_CHECKPORT_RES_ID' => $vel['checkport_res_id'],//'上车站检票口资源ID',
- 'PROD_START_STATION_CHECKPORT_RES_NAME' => empty($vel['checkport_res_name']) ? '' : $vel['checkport_res_name'],//'上车站检票口资源名称',
- 'PROD_START_STATION_TIME_MINUTES' => $vel['start_minutes'],//'上车站发车时间距发车日零点分钟数',
- 'PROD_END_STATION_TIME_MINUTES' => $vel['end_minutes'],//'下车站发车时间距发车日零点分钟数',
- 'CUSTOMER_NAME' => $customer_info_arr['customer_name'],//'客人姓名',
- 'CUSTOMER_SEX' => 1,//'客人性别,0女1男',
- 'CUSTOMER_MOBILE' => $customer_info_arr['customer_mobile'],//'客人手机',
- 'CUSTOMER_MEMO' => $customer_info_arr['customer_memo'],//'订单备注',
- 'CUSTOMER_ID_TYPE' => $customer_info_arr['customer_id_type'],
- 'CUSTOMER_ID_NO' => $customer_info_arr['customer_id_no'],
- 'MEMBER_ID' => $order_info_arr['member_id'],
- 'ORDER_STATUS' => $order_status,//'订单当前状态',
- 'IF_LAST_PROD' => 1,//'是否最细颗粒度的判断',
- 'ORDER_LEVEL' => 0,//'Order Level',
- 'OUTSIDE_SALE_ORG_ID' => $order_info_arr['outside_sale_org_id'],//
- 'SALES_MAN' => $order_info_arr['sales_man'],
- 'RECEIVE_VALUE' => $vel['total_receiver_value'],
- 'ORDER_DISABLE_TIME' => '',
- 'BASE_PRICE' => $ori_order_info['base_price'] * $vel['people_num'],
- ];
- #endregion
-
- $order_price += $vel['total_price'];
-
- #region 收集主订单的id
- if ($vel['if_back'] == 1) {
- $main_order_id[0] = $parent_order_id;//收集主订单的id
- } else {
- $main_order_id[1] = $parent_order_id;//收集主订单的id
- }
- #endregion
-
- #region 主订单key值
- if (count($main_order_key) == 0) {
- $main_order_key = array_keys($main_order_val);
- }
- #endregion
-
- $son_order_id = $base_main_id['unique_id'] + 1;//子订单id号
-
- #region 根据人数遍历每个子订单的个数
- foreach ($seat_arr[$vel['ticket_id']] as $seat_key => $seat_vel) {
-
- $son_order_id++;//子订单号递增
-
- #region 子订单数据
- $son_order_val = [
- 'ID' => $son_order_id,
- 'MAIN_CREATE_USER_ID' => $ori_order_info['main_create_user_id'],//'代下单用户ID,BASE_USER.ID,用户A代替用户B下单,则MAIN_CREATE_USER_ID=A,CREATE_USER_ID=B',
- 'CREATE_USER_ID' => $ori_order_info['create_user_id'],
- 'CREATE_TIME' => $ori_order_info['create_time'],
- 'UPDATE_USER_ID' => $order_info_arr['user_id'],
- 'UPDATE_TIME' => date('Y-m-d H:i:s'),
- 'SALE_ORG_ID' => 0,//'分销商机构ID',
- 'SALE_TOP_ORG_ID' => 0,
- 'ORDER_ID' => $son_order_id,
- 'OUTSIDE_ORDER_NO' => $order_info_arr['outside_sale_order_no'],//'分销商订单编号',
- 'ORDER_VALID_STATUS' => 1,//'订单有效性状态,0失效订单、1有效订单',
- 'ORDER_BOOK_STATUS' => $order_info_arr['order_book_status'],//'订单预订状态,0非预订、1有时限、2永久锁位预订',
- 'ORDER_PAY_STATUS' => $order_info_arr['order_pay_status'],//'订单是否已支付,0未支付,1已支付',
- 'ORDER_PAY_MAIN_ID' => $pay_main_id,//'支付记录主ID,ORDER_PAY_MAIN.ID',
- 'ORDER_PAY_USER_ID' => $ori_order_info['create_user_id'],//'支付操作用户ID,BASE_USER.ID',
- 'ORDER_PAY_TIME' => date('Y-m-d H:i:s'),//'支付操作时间',
- 'PARENT_ORDER_ID' => $parent_order_id,
- 'PROD_ID' => $vel['ticket_id'],
- 'PARENT_PROD_ID' => $vel['line_id'],
- 'PROD_NAME' => $vel['ticket_name'],
- 'PARENT_PROD_NAME' => $vel['line_name'],
- 'ORDER_PRICE' => $vel['order_price'],
- 'ORDER_PROD_TYPE' => 82,
- 'RUN_ID' => $vel['run_id'],
- 'RUN_DATE' => $vel['run_date'],
- 'RUN_DATE_NUM' => (strtotime($vel['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24),//'班次首发日期参数,发车日期至2016-01-01天数,算法使用',
- 'RUN_TIME' => $vel['run_time'],
- 'RUN_BUS_ORDER_ID' => $seat_vel['bus_order_id'],//'班次车号,RUN_BUS.BUS_ORDER_ID',
- 'RUN_BUS_SEAT_TYPE' => $vel['seat_type'],//'座位类型,DICT_TYPE.ID,普通座、贵宾座等',
- 'RUN_BUS_SEAT_SEQ_ID' => $seat_vel['seat_seq_id'],//'座位内部序列ID',
- 'RUN_BUS_SEAT_NAME' => $seat_vel['seat_name'],
- 'PROD_START_STATION_RES_ID' => $vel['start_res_id'],
- 'PROD_START_STATION_RES_NAME' => $vel['start_res_name'],
- 'PROD_START_STATION_CHECKPORT_RES_ID' => $vel['checkport_res_id'],
- 'PROD_START_STATION_CHECKPORT_RES_NAME' => empty($vel['checkport_res_name']) ? '' : $vel['checkport_res_name'],
- 'PROD_START_STATION_SEQ_ID' => $vel['start_seq_id'],
- 'PROD_START_STATION_DATE' => $vel['run_date'],
- 'PROD_START_STATION_DATE_NUM' => (strtotime($vel['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24),
- 'PROD_START_STATION_TIME' => $vel['start_time'],
- 'PROD_START_STATION_TIME_MINUTES' => $vel['start_minutes'],
- 'PROD_START_STATION_AREA_ID' => $vel['start_area_id'],
- 'PROD_START_STATION_AREA_NAME' => $vel['start_area_name'],
- 'PROD_END_STATION_RES_ID' => $vel['end_res_id'],
- 'PROD_END_STATION_RES_NAME' => $vel['end_res_name'],
- 'PROD_END_STATION_SEQ_ID' => $vel['end_seq_id'],
- 'PROD_END_STATION_DATE' => $vel['run_date'],
- 'PROD_END_STATION_DATE_NUM' => (strtotime($vel['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24),
- 'PROD_END_STATION_TIME' => $vel['end_time'],
- 'PROD_END_STATION_TIME_MINUTES' => $vel['end_minutes'],
- 'PROD_END_STATION_AREA_ID' => $vel['end_area_id'],
- 'PROD_END_STATION_AREA_NAME' => $vel['end_area_name'],
- 'CUSTOMER_NAME' => $customer_info_arr['customer_name'],//'客人姓名',
- 'CUSTOMER_SEX' => 1,//'客人性别,0女1男',
- 'CUSTOMER_MOBILE' => $customer_info_arr['customer_mobile'],//'客人手机',
- 'CUSTOMER_MEMO' => $customer_info_arr['customer_memo'],//'订单备注',
- 'CUSTOMER_ID_TYPE' => $customer_info_arr['customer_id_type'],
- 'CUSTOMER_ID_NO' => $customer_info_arr['customer_id_no'],
- 'MEMBER_ID' => $order_info_arr['member_id'],
- 'ORDER_STATUS' => $order_info_arr['order_status'],
- //'if_gift' => 0,//'是否是赠票,0不是赠票,1是赠票',
- 'ORDER_LEVEL' => 0,
- 'OUTSIDE_SALE_ORG_ID' => $order_info_arr['outside_sale_org_id'],
- 'SALES_MAN' => $order_info_arr['sales_man'],
- 'RECEIVE_VALUE' => $vel['receiver_value'],
- 'ORDER_TITLE_ID' => $ori_order_info['order_title_id'],
- 'SUB_CHANNEL_ID' => $ori_order_info['sub_channel_id'],
- 'SUB_CHANNEL_NO' => $ori_order_info['sub_channel_no'],
- 'MAIN_CORP_ID' => $ori_order_info['main_corp_id'],
- 'SALE_PATH' => $ori_order_info['sale_path'],
- 'AGENT_LEVEL' => $ori_order_info['agent_level'],
- 'SOURCE_MAIN_CORP_ID' => $ori_order_info['source_main_corp_id'],
- 'PROD_SUPPLY_ORG_NAME' => $ori_order_info['prod_supply_org_name'],
- 'PROD_TOP_ORG_ID' => $ori_order_info['prod_top_org_id'],
- 'BASE_PRICE' => $ori_order_info['base_price'],
- ];
- #endregion
-
- #region 子订单key值
- if (count($son_order_key) == 0) {
- $son_order_key = array_keys($son_order_val);
- }
- #endregion
-
- #region run_bus,run_prod,run_stock更新数据
- if (!isset($run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']])) {
- $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['num'] = $vel['people_num'];//数量
- $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['run_id'] = $vel['run_id'];//班次id
- $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['bus_order_id'] = $seat_vel['bus_order_id'];//车次号
- $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['ticket_id'] = $vel['ticket_id'];//票种id
- $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['start_seq_id'] = $vel['start_seq_id'];//开始站顺序号
- $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['end_seq_id'] = $vel['end_seq_id'];//结束站顺序号
- $run_bus_prod_stock_arr[$vel['run_id'] . '-' . $seat_vel['bus_order_id']]['seat_type'] = $vel['seat_type'];//座位类型
- }
- #endregion
-
- #region 更新run_x配置数据
- $run_x_one[$seat_key]['run_x_id'] = $seat_vel['run_x_id'];
- $run_x_one[$seat_key]['run_date'] = substr($vel['run_date'], 0, 7);
- $run_x_one[$seat_key]['run_date'] = str_replace('-', '', $run_x_one[$seat_key]['run_date']);//run_x表的日期后缀
- $run_x_one[$seat_key]['order_main_id'] = $son_order_id;//主订单号
- $run_x_one[$seat_key]['order_main_prod_id'] = $vel['line_id'];//线路id
- $run_x_one[$seat_key]['order_prod_id'] = $vel['ticket_id'];//票种id
- #endregion
-
- #region 子订单数组
- $son_order[] = $son_order_val;
- #endregion
- }
- #endregion
-
- #region 更新run_x配置数据
- $run_x_arr[$key] = $run_x_one;
- #endregion
-
- //$parent_order_id = $son_order_id + 1;
-
- #region 主订单数组
- $main_order[] = $main_order_val;
- #endregion
- }
- #endregion
-
- $unique_id = $son_order_id;//唯一主键
-
- #region 主支付记录数据数组
- foreach ($main_order_id as $key => $vel) {
- #region 主支付记录
- $pay_main_one = [
- //'ID' => $pay_main_id,
- //'CREATE_USER_ID' => $order_info_arr['user_id'],
- //'CREATE_TIME' => date('Y-m-d H:i:s'),
- 'UPDATE_USER_ID' => $order_info_arr['user_id'],
- 'UPDATE_TIME' => date('Y-m-d H:i:s'),
- 'PAY_TOTAL' => $order_price,
- //'ORDER_ID' => $vel,
- ];
- #endregion
-
- $pay_main_arr[] = $pay_main_one;//主支付记录数组
-
- #region 主支付记录key值
- if (count($pay_main_key) == 0) {
- $pay_main_key = array_keys($pay_main_one);
- }
- #endregion
- }
- #endregion
-
- try {
- #region 1.占座 更新run_x表
- foreach ($run_x_arr as $run_x_key => $run_x_vel) {
- foreach ($run_x_vel as $key => $vel) {
- $update_sql = 'update run_' . $vel['run_date'] . '
- set order_main_id = ' . $vel['order_main_id'] . ',
- order_main_prod_id = ' . $vel['order_main_prod_id'] . ',
- order_prod_id = ' . $vel['order_prod_id'] . ',
- seat_status = 2,
- order_lock_user_id = ' . $order_info_arr['user_id'] . ',
- order_lock_time = \'' . date('Y-m-d H:i:s') . '\'
- where id in (' . $vel['run_x_id'] . ')';
- $res = Yii::$app->db->createCommand($update_sql)->execute();
- if (!$res) {
- throw new Exception('占位失败');
- }
- }
- }
- #endregion
-
- #region 2.更新主订单
- $order_main = new OrderMain();
- foreach ($main_order as $k => $v) {
- $update_where = [
- '=', 'order_id', $parent_order_id
- ];
- $res = $order_main::updateAll($v, $update_where);
- if (!$res) {
- throw new Exception('更新主订单失败' . serialize($order_main->getErrors()));
- }
- }
- #endregion
-
- #region 3.插入子订单
- $res = Yii::$app->db->createCommand()->batchInsert(OrderMain::tableName(), $son_order_key, $son_order)->execute();
- if (!$res) {
- throw new Exception('子订单提交失败');
- }
- #endregion
-
- #region 4.更新run_prod,run_bus,run_stock
- foreach ($run_bus_prod_stock_arr as $key => $vel) {
- #region (1).更新run_prod
- $update_value = [
- 'UPDATE_USER_ID' => $order_info_arr['user_id'],
- 'UPDATE_TIME' => date('Y-m-d H:i:s'),
- 'SALED_COUNT' => new Expression('SALED_COUNT+' . $vel['num']),
- ];
- $update_where = [
- 'and',
- ['=', 'run_id', $vel['run_id']],
- ['=', 'prod_id', $vel['ticket_id']],
- ['=', 'cancel_flag', 0],
- ];
- $res = RunProd::updateAll($update_value, $update_where);
- if (!$res) {
- throw new Exception('更新run_prod失败');
- }
- #endregion
-
- #region (2).更新run_bus
- $update_value = [
- 'UPDATE_USER_ID' => $order_info_arr['user_id'],
- 'UPDATE_TIME' => date('Y-m-d H:i:s'),
- 'SALED_COUNT' => new Expression('SALED_COUNT+' . $vel['num']),
- ];
- $update_where = [
- 'and',
- ['=', 'run_id', $vel['run_id']],
- ['=', 'bus_order_id', $vel['bus_order_id']],
- ['=', 'cancel_flag', 0],
- ];
- $res = RunBus::updateAll($update_value, $update_where);
- if (!$res) {
- throw new Exception('更新run_bus失败');
- }
- #endregion
-
- #region (3).更新run_stock
- $update_value = [
- 'UPDATE_USER_ID' => $order_info_arr['user_id'],
- 'UPDATE_TIME' => date('Y-m-d H:i:s'),
- 'SALED_COUNT' => new Expression('SALED_COUNT+' . $vel['num']),
- ];
- $update_where = [
- 'and',
- ['=', 'run_id', $vel['run_id']],
- ['>=', 'seq_id', $vel['start_seq_id']],
- ['<', 'seq_id', $vel['end_seq_id']],
- ['=', 'seat_type', $vel['seat_type']],
- ['=', 'cancel_flag', 0],
- ];
- $res = RunStock::updateAll($update_value, $update_where);
- if (!$res) {
- throw new Exception('更新run_stock失败');
- }
- #endregion
- }
- #endregion
-
- #region 5.修改主支付记录
-
- foreach ($pay_main_arr as $k => $v) {
- $update_where = [
- 'and',
- //['=', 'id', $pay_main_id],
- ['=', 'order_id', $parent_order_id],
- ];
- $res = OrderPayMain::updateAll($v, $update_where);
- if (!$res) {
- throw new Exception('更新主支付记录失败');
- }
- }
- #endregion
-
- #region 6.修改支付明细
-
- $order_pay_detail = OrderPayDetail::findOne(['pay_main_id' => $pay_main_id]);
- if ($order_pay_detail) {
- $order_pay_detail->attributes = [
- //'ID' => $pay_main_id,
- //'CREATE_USER_ID' => $order_info_arr['user_id'],
- //'CREATE_TIME' => date('Y-m-d H:i:s'),
- 'UPDATE_USER_ID' => $order_info_arr['user_id'],
- 'UPDATE_TIME' => date('Y-m-d H:i:s'),
- //'PAY_MAIN_ID' => $pay_main_id,
- 'PAY_TYPE_ID_1' => $order_info_arr['pay_type'],
- 'PAY_MONEY' => $order_price,
- ];
- $res = $order_pay_detail->update();
- if (!$res) {
- throw new Exception('修改支付明细失败');
- }
- }
-
- #endregion
-
- #region 7 修改酒店门票价格
-
- $order_extra_info = new OrderExtraInfo();
-
- $is_exist = $order_extra_info::findOne(['order_id' => $main_order_id[0]]);
- if ($is_exist) {
- #判断值是否有变化,如果有则修改
- $res = 1;
- if ($ori_order_info['gate_price'] != $order_append_arr['gate_price'] || $ori_order_info['hotel_price'] != $order_append_arr['hotel_price']) {
- $is_exist->attributes = [
- 'hotel_price' => $order_append_arr['hotel_price'],
- 'gate_price' => $order_append_arr['gate_price'],
- ];
- $res = $is_exist->update();
- }
-
- } else {
- $order_extra_info->attributes = [
- 'order_id' => $main_order_id[0],
- 'hotel_price' => $order_append_arr['hotel_price'],
- 'gate_price' => $order_append_arr['gate_price'],
- ];
- $res = $order_extra_info->insert();
- }
- if (!$res) {
- throw new Exception('酒店门票价格修改失败' . serialize($is_exist->getErrors()) . '|' . serialize($order_extra_info->getErrors()));
- }
-
- #endregion
-
- #region 8.插入日志
-
- $new_order_info = $this->getOrderModifyInfo($ori_order_info['order_id']); //修改后的订单信息
- //8.1,插入订单修改记录表(需要对原数据和新数据做比对,仅记录修改过的联系人信息项)
-
- $opera_detail1 = '修改订单-修改联系人信息:';
- $opera_detail_extra = '';
- ($ori_order_info['customer_name'] != $new_order_info['customer_name']) && ($opera_detail_extra .= '[联系人:' . $ori_order_info['customer_name'] . "=>" . $new_order_info['customer_name'] . "] ");
- ($ori_order_info['customer_mobile'] != $new_order_info['customer_mobile']) && ($opera_detail_extra .= '[手机号:' . $ori_order_info['customer_mobile'] . "=>" . $new_order_info['customer_mobile'] . "] ");
- ($ori_order_info['customer_id_no'] != $new_order_info['customer_id_no']) && ($opera_detail_extra .= '[身份证号:' . $ori_order_info['customer_id_no'] . "=>" . $new_order_info['customer_id_no'] . "] ");
- ($ori_order_info['customer_memo'] != $new_order_info['customer_memo']) && ($opera_detail_extra .= '[备注:' . $ori_order_info['customer_memo'] . "=>" . $new_order_info['customer_memo'] . "] ");
- $opera_detail1 .= $opera_detail_extra;
-
- if ($opera_detail_extra) {
- $values = [
- 'order_id' => $ori_order_info['order_id'],
- 'opera_platform' => 'CS系统',
- 'opera_user_id' => $order_info_arr['user_id'],
- 'opera_type' => 3,
- 'opera_time' => date('Y-m-d H:i:s', time()),
- 'opera_detail' => $opera_detail1
- ];
- $order_opera_log = new OrderOperaLog();
- $order_opera_log->attributes = $values;
- if (!$order_opera_log->insert()) {
- throw new Exception(serialize($order_opera_log->getErrors()));
- }
- }
-
-
- //8.2,插入订单修改记录表(需要对原数据和新数据做比对,仅记录修改过的产品信息项)
-
- $opera_detail = '修改订单-修改产品信息:';
- $opera_detail_extra = '';
- #8.2.1如果上下车站点变化,则记录上下车站点和票种变化; 如果上下车站点不变,(价格,数量)变化,则只记录票种变化
- if ($ori_order_info['start_station_name'] != $new_order_info['start_station_name'] || $ori_order_info['end_station_name'] != $new_order_info['end_station_name']) {
- $opera_detail_extra .= '【上下车站点:『' . $ori_order_info['start_station_name'] . '-->' . $ori_order_info['end_station_name'] . '』 => 『' . $new_order_info['start_station_name'] . '-->' . $new_order_info['end_station_name'] . '』】';
- $opera_detail_extra .= '【票种:『ID:' . $ori_order_info['prod_id'] . ',价格:' . $ori_order_info['order_price'] . ',数量:' . $ori_order_info['num'] . '』 => 『ID:' . $new_order_info['prod_id'] . ',价格:' . $new_order_info['order_price'] . ',数量:' . $new_order_info['num'] . '』】';
- } else if ($ori_order_info['order_price'] != $new_order_info['order_price'] || $ori_order_info['num'] != $new_order_info['num']) {
- $opera_detail_extra .= '【票种:『ID:' . $ori_order_info['prod_id'] . ',价格:' . $ori_order_info['order_price'] . ',数量:' . $ori_order_info['num'] . '』 => 『ID:' . $new_order_info['prod_id'] . ',价格:' . $new_order_info['order_price'] . ',数量:' . $new_order_info['num'] . '』】';
- }
- #8.2.2套餐产品(门票价格,酒店价格)
- if ($ori_order_info['gate_price'] != $new_order_info['gate_price'] || $ori_order_info['hotel_price'] != $new_order_info['hotel_price']) {
- $opera_detail_extra .= '【套餐价格:『门票:' . $ori_order_info['gate_price'] . ',酒店:' . $ori_order_info['hotel_price'] . '』 => 『门票:' . $new_order_info['gate_price'] . ',酒店:' . $new_order_info['hotel_price'] . '』】';
- }
- #8.2.3代收单价 代收总价
- if ($ori_order_info['sin_rec_value'] != $new_order_info['sin_rec_value'] || $ori_order_info['tot_rec_value'] != $new_order_info['tot_rec_value']) {
- $opera_detail_extra .= '【代收:『单价:' . $ori_order_info['sin_rec_value'] . ',总价:' . $ori_order_info['tot_rec_value'] . '』 => 『单价:' . $new_order_info['sin_rec_value'] . ',总价:' . $new_order_info['tot_rec_value'] . '』】';
- }
-
- $opera_detail .= $opera_detail_extra;
-
- if ($opera_detail_extra) {
- $values = [
- 'order_id' => $ori_order_info['order_id'],
- 'opera_platform' => 'CS系统',
- 'opera_user_id' => $order_info_arr['user_id'],
- 'opera_type' => 3,
- 'opera_time' => date('Y-m-d H:i:s', time()),
- 'opera_detail' => $opera_detail
- ];
- $order_opera_log = new OrderOperaLog();
- $order_opera_log->attributes = $values;
- if (!$order_opera_log->insert()) {
- throw new Exception(serialize($order_opera_log->getErrors()));
- }
- }
- #endregion
-
-
- $result['code'] = '0';
- $result['info'] = '修改订单成功';
- $result['data'] = implode(',', $main_order_id);
- } catch (Exception $e) {
- # 回滚事务
- //$transaction->rollBack();
- $result['code'] = '1';
- $result['info'] = '修改订单失败' . $e->getMessage();
- $result['error_info'] = $e->getMessage();
- }
-
- return $result;
- }
-
- /**
- * Function Description:整理产品数据
- * Function Name: getBusProductList
- * @param array $prod_arr 选购产品,格式为{去程/返程标志(1:去程 2:返程),去程/返程班次ID,票种ID,票种单价,预定数量,车号}...
- *
- * @return array
- *
- * @author 温依莅
- */
- public
- function getBusProductList($prod_arr)
- {
- $result = [];
- $prod_arr = array(0 => $prod_arr);
- foreach ($prod_arr as $key => $vel) {
- $result[$vel['prod_id']]['if_back'] = $vel['to_go'];//1:去程 2:返程
- $result[$vel['prod_id']]['run_id'] = $vel['run_id'];//班次id
- $result[$vel['prod_id']]['ticket_id'] = $vel['prod_id'];//票种id
- $result[$vel['prod_id']]['price'] = $vel['order_price'];//单价
- $result[$vel['prod_id']]['num'] = $vel['bus_people_num'];//数量
- //$result[$vel['prod_id']]['main_price'] = $vel['main_price'];//主订单价格()
- $result[$vel['prod_id']]['bus_order_id'] = isset($vel['bus_order_id']) ? $vel['bus_order_id'] : 0;//车号
- }
-
- return $result;
- }
-
- /**
- * Function Description:获取订单数据
- * Function Name: getOrderInfoArray
- * @param array $order_info_arr 订单基础信息{下单用户,会员号,渠道id,渠道订单号,是否自动退票(0否1是),支付方式(授信275),是否支付(0否1是),业务员}
- *
- * @return mixed
- *
- * @author 温依莅
- */
- public
- function getOrderInfoArray($order_info_arr)
- {
-
- $user_id = Yii::$app->request->cookies->getValue('user_id', 2);//修改订单用户id 默认2;
- $result['user_id'] = (!isset($order_info_arr['modify_user_id']) || empty($order_info_arr['modify_user_id'])) ? $user_id : $order_info_arr['modify_user_id'];//修改订单用户id
- //$result['user_id'] = $user_id;
- $result['member_id'] = (!isset($order_info_arr['member_id']) || empty($order_info_arr['member_id'])) ? 0 : $order_info_arr[member_id];//会员id
- $result['outside_sale_org_id'] = (!isset($order_info_arr['outside_sale_org_id']) || empty($order_info_arr['outside_sale_org_id'])) ? 0 : $order_info_arr['outside_sale_org_id'];//渠道id
- $result['outside_sale_order_no'] = (!isset($order_info_arr['outside_order_no']) || empty($order_info_arr['outside_order_no'])) ? '' : $order_info_arr['outside_order_no'];//渠道下单号
- $result['order_book_status'] = (!isset($order_info_arr['is_book']) || $order_info_arr['is_book'] === '') ? 0 : $order_info_arr['is_book'];//订单预订状态
- $result['pay_type'] = (!isset($order_info_arr['pay_type']) || empty($order_info_arr['pay_type'])) ? 275 : $order_info_arr['pay_type'];//支付方式(授信,微信)
- $result['order_pay_status'] = (!isset($order_info_arr['is_pay']) || empty($order_info_arr['is_pay'])) ? 0 : $order_info_arr['is_pay'];//是否支付
- $result['sales_man'] = (!isset($order_info_arr['sales_man']) || empty($order_info_arr['sales_man'])) ? '' : $order_info_arr['sales_man'];//业务员
-
-
- $supplier_info = BaseSupplier::find()->select('sales_man,supplier_name')->where(['id' => $result['outside_sale_org_id']])->asArray()->one();
- if ($result['sales_man'] == '') {
- $result['sales_man'] = empty($supplier_info['sales_man']) ? '' : $supplier_info['sales_man'];
- }
- $result['org_name'] = empty($supplier_info['supplier_name']) ? '' : $supplier_info['supplier_name'];
-
- $result['order_status'] = $result['order_pay_status'] == 0 ? 145 : 146;
-
- return $result;
- }
-
- /**
- * Function Description:获取乘客信息
- * Function Name: getCustomerInfoArray
- * @param array $customer_info_arr 顾客信息,格式为{联系人,联系电话,z证件类型,联系人身份证,备注}
- *
- * @return mixed
- *
- * @author 温依莅
- */
- public
- function getCustomerInfoArray($customer_info_arr)
- {
-
- $result['customer_name'] = (!isset($customer_info_arr['customer_name']) || empty($customer_info_arr['customer_name'])) ? '' : $customer_info_arr['customer_name'];//乘客姓名
- $result['customer_mobile'] = (!isset($customer_info_arr['customer_phone']) || empty($customer_info_arr['customer_phone'])) ? '' : $customer_info_arr['customer_phone'];//乘客电话
- $result['customer_id_type'] = (!isset($customer_info_arr['customer_id_type']) || empty($customer_info_arr['customer_id_type'])) ? 150 : $customer_info_arr['customer_id_type'];//乘客证件类型
- $result['customer_id_no'] = (!isset($customer_info_arr['customer_id_no']) || empty($customer_info_arr['customer_id_no'])) ? '' : $customer_info_arr['customer_id_no'];//乘客证件号
- $result['customer_memo'] = (!isset($customer_info_arr['customer_remark']) || empty($customer_info_arr['customer_remark'])) ? '' : $customer_info_arr['customer_remark'];//乘客备注
-
- return $result;
- }
-
- /**
- * Function Description:订单附加产品
- * Function Name: getOrderAppendArray
- * @param array $order_append_arr 订单附加产品,格式为{门票价格,酒店价格}
- *
- * @return mixed
- *
- * @author 温依莅
- */
- public
- function getOrderAppendArray($order_append_arr)
- {
- $result['gate_price'] = (!isset($order_append_arr['gate_price']) || empty($order_append_arr['gate_price'])) ? '0' : $order_append_arr['gate_price'];//门票价格
- $result['hotel_price'] = (!isset($order_append_arr['hotel_price']) || empty($order_append_arr['hotel_price'])) ? '0' : $order_append_arr['hotel_price'];//酒店价格
- return $result;
- }
-
- /**
- * Function Description:根据班次和票种id获取产品详情列表
- * Function Name: getBusProductListByRunTicket
- * @param array $run_ticket_arr 产品详情列表
- *
- * @return array|\yii\db\ActiveRecord[]
- *
- * @author 张帅
- */
- public
- function getBusProductListByRunTicket($run_ticket_arr)
- {
- #region 1.班次票种筛选条件
- $and_where = [
- 'or',
- ];
- foreach ($run_ticket_arr as $key => $vel) {
- $and_where[] = [
- 'and',
- ['=', 'rp.run_id', $vel['run_id']],
- ['=', 'rp.prod_id', $vel['ticket_id']],
- ];
- }
- #endregion
-
- #region 2.查询结果
- $result = RunProd::find()
- ->select([
- 'run_id' => 'rm.run_id',//班次id
- 'run_date' => 'rm.run_date',//出发日期
- 'run_time' => 'rm.run_time',//出发时间
- 'run_minutes' => 'rm.run_minutes',//出发分钟数
- 'ticket_id' => 'rp.prod_id',//票种id
- 'ticket_name' => 't.ticket_name',//票种名称
- 'seat_type' => 't.seat_type',//座位类型
- 'human_type' => 't.human_type',//人群属性
- 'line_id' => 't.line_id',//线路id
- 'line_name' => 'l.line_name',//线路名称
- 'start_res_id' => 't.start_station_res_id',//上车站id
- 'start_res_name' => BaseResource::find()->select('res_name')->where('res_id = t.start_station_res_id')->limit(1),//上车站name
- 'start_area_id' => 't.start_station_area_id',//出发地id
- 'start_area_name' => BaseArea::find()->select('area_name')->where('id = t.start_station_area_id')->limit(1),//出发地name
- 'start_seq_id' => 's1.station_order_id',//开始站顺序号
- 'start_time' => 's1.start_time',//开始时间
- 'start_minutes' => 's1.start_minutes',//开始分钟数
- 'checkport_res_id' => 's1.checkport_res_id',//检票口id
- 'checkport_res_name' => BaseResource::find()->select('res_name')->where('res_id = s1.checkport_res_id')->limit(1),//检票口name
- 'end_res_id' => 't.end_station_res_id',//下车站id
- 'end_res_name' => BaseResource::find()->select('res_name')->where('res_id = t.end_station_res_id')->limit(1),//下车站name
- 'end_area_id' => 't.end_station_area_id',//目的地id
- 'end_area_name' => BaseArea::find()->select('area_name')->where('id = t.end_station_area_id')->limit(1),//目的地name
- 'end_seq_id' => 's2.station_order_id',//结束站顺序号
- 'end_time' => 's2.start_time',//结束时间
- 'end_minutes' => 's2.start_minutes',//结束分钟数
- 'prod_price' => 't.prod_price',//分销价
- 'cus_price' => 't.cus_price',//零售价
- ])
- ->from(RunProd::tableName() . ' as rp')
- ->leftJoin(RunMain::tableName() . ' as rm', 'rp.run_id = rm.run_id')
- ->leftJoin(OperaTickets::tableName() . ' as t', 'rp.prod_id = t.ticket_id')
- ->leftJoin(OperaLine::tableName() . ' as l', 't.line_id = l.line_id')
- ->leftJoin(RunStation::tableName() . ' as s1', 'rm.run_id = s1.run_id and l.line_id = s1.prod_id and t.start_station_res_id = s1.station_res_id')
- ->leftJoin(RunStation::tableName() . ' as s2', 'rm.run_id = s2.run_id and l.line_id = s2.prod_id and t.end_station_res_id = s2.station_res_id')
- ->where([
- 'and',
- ['=', 'rp.cancel_flag', 0],
- ['=', 't.cancel_flag', 0],
- ])
- ->andWhere($and_where)
- ->indexBy('ticket_id')
- ->asArray()->all();
- #endregion
-
- return $result;
- }
-
- /**
- * Function Description:检查run_x中是否有班次
- * Function Name: checkRunX
- * @param array $date_run_arr 日期班次数组
- *
- * @return bool
- *
- * @author 张帅
- */
- public
- function checkRunX($date_run_arr)
- {
- #region 没有班次直接返回错误
- if (count($date_run_arr) == 0) {
- return false;
- }
- #endregion
-
- #region 判断每个班次是否存在run_x
- foreach ($date_run_arr as $key => $vel) {
- $sql = '' . 'select
- count(*) as toatl_count
- from run_' . $key . '
- where run_id in (' . implode(',', $vel) . ')
- group by run_id';
- $res = Yii::$app->db->createCommand($sql)->queryAll();
-
- #region 如果有不存在班次的直接返回错误
- if (count($res) != count($vel)) {
- return false;
- }
-
- foreach ($res as $res_key => $res_vel) {
- if ($res_vel['toatl_count'] == 0) {
- return false;
- }
- }
- #endregion
- }
- #endregion
-
- return true;
- }
-
- /**
- * Function Description:获取所有的座位
- * Function Name: getRunBunSeat
- * @param array $run_bus_arr 班次信息
- *
- * @return array|bool
- *
- * @author 张帅
- */
- public
- function getRunBusSeat($run_bus_arr)
- {
- $result = [];
- foreach ($run_bus_arr as $key => $vel) {
- $sql_and = '';
- if ($vel['bus_order_id'] != 0) {
- $sql_and = ' and bus_order_id = ' . $vel['bus_order_id'];
- }
-
- $sql = '' . 'select
- group_concat(id) as run_x_id,run_id,bus_order_id,seat_x,seat_y,seat_type,seat_seq_id,seat_name,count(id) as seat_count
- from
- run_' . $vel['run_date'] . '
- where
- run_id = ' . $vel['run_id'] . '
- and order_id >= ' . $vel['start_seq_id'] . '
- and order_id < ' . $vel['end_seq_id'] . '
- and seat_type = ' . $vel['seat_type'] . $sql_and . '
- and cancel_flag = 0
- and seat_status = 0
- group by
- run_id,bus_order_id,seat_type,seat_seq_id,seat_name
- order by seat_seq_id ASC';
- $res = Yii::$app->db->createCommand($sql)->queryAll();
- if (count($res) == 0) {
- return false;
- }
-
- //分车归理数据
- $res_one = [];
- foreach ($res as $res_key => $res_vel) {
- if ($res_vel['seat_count'] == $vel['seat_count']) {
- $res_one[$res_vel['bus_order_id']][$res_vel['seat_seq_id']] = $res_vel;
- }
- }
-
- //挑出可以放订单的车次,否则返回错误
- $result_one = [];
- foreach ($res_one as $res_key => $res_vel) {
- if (count($res_vel) >= $vel['num']) {
- $result_one = $res_vel;
- break;
- }
- }
- if (count($result_one) == 0) {
- return false;
- }
-
- //通过票种索引塞入数据
- $result[$vel['ticket_id']] = $result_one;
- }
- return $result;
- }
-
- /**
- * Function Description:获取座位信息
- * Function Name: getSeatArray
- * @param array $run_bus_arr 班次车次数组
- * @param array $prod_arr 产品数据
- *
- * @return array
- *
- * @author 张帅
- */
- public
- function getSeatArray($run_bus_arr, $prod_arr)
- {
- $result = [];
-
- foreach ($run_bus_arr as $key => $vel) {
- $seat_no = [];
- $i = 0;
- #region 连座筛选
- foreach ($vel as $key1 => $vel2) {
- $seat_no[$key1 - $i][$key1] = $vel2;
- $i++;
- }
- #endregion
-
- #region 挑选座位
- $run_seat_value = [];
- foreach ($seat_no as $key1 => $vel2) {
- if (count($vel2) >= $prod_arr[$key]['num']) {
- $run_seat_value = array_slice($vel2, 0, $prod_arr[$key]['num'], true);
- break;
- }
- }
- if (count($run_seat_value) == 0) {
- $run_seat_value = array_slice($vel, 0, $prod_arr[$key]['num'], true);
- }
- #endregion
- $result[$key] = $run_seat_value;
- }
-
- return $result;
- }
-
- /**
- * Function Description:获取代收价
- * Function Name: getBusProductListReceiver
- * @param array $prod_list 产品列表
- * @param array $receiver_value_arr 代收信息
- * @param array $prod_arr 产品简易数据
- *
- * @return mixed
- *
- * @author 张帅
- */
- public
- function getBusProductListReceiver($prod_list, $receiver_value_arr, $prod_arr)
- {
- $result = [];
-
- // $receiver_value_str = substr($receiver_value_str, 1, -1);
- // $receiver_value_arr = explode(',', $receiver_value_str);//代收价格信息
-
- $receiver_value = (!isset($receiver_value_arr['sin_rec_value']) || empty($receiver_value_arr['sin_rec_value'])) ? 0 : $receiver_value_arr['sin_rec_value'];//代收单价
- $total_receiver_value = (!isset($receiver_value_arr['total_rec_value']) || empty($receiver_value_arr['total_rec_value'])) ? 0 : $receiver_value_arr['total_rec_value'];//代收总价
-
- $receiver_value = $receiver_value / count($prod_list);
- $total_receiver_value = $total_receiver_value / count($prod_list);
-
- //将订单单价,人数,总价,往返标志,代收单价,代收总价放入产品列表中
- foreach ($prod_list as $key => $vel) {
- if ($total_receiver_value != 0) {
- $prod_list[$key]['total_receiver_value'] = round($total_receiver_value, 2);
- $prod_list[$key]['receiver_value'] = round($total_receiver_value / $prod_arr[$key]['num'], 2);
- } else {
- $prod_list[$key]['total_receiver_value'] = round($receiver_value * $prod_arr[$key]['num'], 2);
- $prod_list[$key]['receiver_value'] = round($receiver_value, 2);
- }
- $prod_list[$key]['order_price'] = $prod_arr[$key]['price'];
-
- $prod_list[$key]['total_price'] = $prod_arr[$key]['price'] * $prod_arr[$key]['num'];
- //$prod_list[$key]['total_price'] = $prod_arr[$key]['main_price'];
-
- $prod_list[$key]['people_num'] = $prod_arr[$key]['num'];
- $prod_list[$key]['if_back'] = $prod_arr[$key]['if_back'];
- }
-
- //将产品安往返排序
- foreach ($prod_arr as $key => $vel) {
- $result[$key] = $prod_list[$key];
- }
-
- return $result;
-
- }
-
- /**
- * Function Description:得到巴士订单修改所需信息
- * Function Name: getOrderModifyInfo
- * @param int $order_id
- * @return array
- *
- * @author 温依莅
- */
- public
- function getOrderModifyInfo($order_id)
- {
- //得到该订单的部分信息
- $order_main = new OrderMain();
- $order_info = $order_main::find()->select([
- 'b.order_id',
- 'a.run_id',
- 'a.main_create_user_id',
- 'a.create_user_id',
- 'b.create_time',
- 'd.bus_order_id',
- 'd.send_bus_no',
- 'd.send_driver_name',
- 'd.send_driver_mobile',
- 'seat_type' => DictType::find()->select('type_name')->where('id=e.parent_id')->limit(1),
- 'a.prod_id',
- 'a.prod_start_station_res_id as start_station_id',
- 'a.prod_end_station_res_id as end_station_id',
- 'a.prod_start_station_res_name as start_station_name',
- 'a.prod_end_station_res_name as end_station_name',
- 'a.order_price',
- 'b.order_price as total_price',
- 'num' => OrderMain::find()->select('count(*)')->where(['parent_order_id' => $order_id, 'cancel_flag' => 0, 'order_valid_status' => 1]),
- 'a.receive_value as sin_rec_value',
- 'b.receive_value as tot_rec_value',
- 'c.gate_price',
- 'c.hotel_price',
- 'a.customer_name',
- 'a.customer_mobile',
- 'a.customer_memo',
- 'a.customer_id_no',
- 'a.outside_sale_org_id',
- 'a.outside_order_no',
- 'a.order_pay_main_id',
- 'a.order_status',
- 'a.sales_man',
- 'l.line_id',
- 'l.line_name',
- 'r.run_date',
- 'r.run_time',
- 'b.order_valid_status',
- 'b.order_title_id',
- 'a.sub_channel_id',
- 'a.sub_channel_no',
- 'a.main_corp_id',
- 'a.sale_path',
- 'a.agent_level',
- 'a.source_main_corp_id',
- 'a.prod_supply_org_name',
- 'a.prod_top_org_id',
- 'a.base_price',
- ])->from(OrderMain::tableName() . ' as a')
- ->leftJoin(OrderMain::tableName() . ' as b', 'a.parent_order_id=b.order_id')
- ->leftJoin(OrderExtraInfo::tableName() . ' as c', 'c.order_id=b.order_id')
- ->leftJoin(RunBus::tableName() . ' as d', 'a.run_id=d.run_id and a.run_bus_order_id=d.bus_order_id')
- ->leftJoin(RunMain::tableName() . ' as r', 'a.run_id=r.run_id')
- ->leftJoin(BaseResource::tableName() . ' as e', 'd.bus_type_res_id=e.id')
- ->leftJoin(OperaLine::tableName() . ' as l', 'a.parent_prod_id=l.line_id')
- ->where(['a.cancel_flag' => 0, 'b.order_id' => $order_id, 'b.order_valid_status' => 1, 'a.order_valid_status' => 1]);
- $sql = $order_info->createCommand()->getRawSql();
- $res = $order_info->asArray()
- ->one();
- //$error=$order_main->getErrors();
- return $res;
- }
-
- /**
- * Function Description:释放原巴士订单所占资源
- * Function Name: emptyBusOrder
- * @param int $order_id 订单号
- * @param int $user_id 操作员id
- *
- * @return string
- *
- * @author 温依莅
- */
- public
- function emptyBusOrder($order_id, $user_id)
- {
- $order_id_arr = [];//订单id数组
- $line_type = 'single';
-
- $order_id_arr[$order_id] = $order_id;
-
-
- #region 判断线路类型是单一还是组合
- $line_info = $this->getOrderLineIdCount($order_id_arr);
- if (!$line_info) {
- $result['code'] = '2';
- $result['info'] = '错误订单号';
- return $result;
- }
- #endregion
-
- #region 判断订单是否已失效
- foreach ($line_info as $key => $vel) {
- if ($vel['order_valid_status'] == 0) {
- unset($order_id_arr[$key]);
- } else {
- if ($vel['line_id'] == 0 || $vel['line_type'] == 255 || $vel['line_type'] == 256) {
- $line_type = 'single';
- } else {
- $line_type = 'group';
- }
- }
- }
-
- if (count($order_id_arr) == 0) {
- $result['code'] = '3';
- $result['info'] = '订单已取消';
- return $result;
- }
- #endregion
-
- if ($line_type == 'single') {//单一线路
- #region 获取订单所属的班次信息
- $order_run_info = $this->getOrderRunInfo($order_id_arr);
- #endregion
-
- #region 释放单一订单所占资源
- $result = $this->emptySingleBusOrder($order_id_arr, $order_run_info, $user_id);
- #endregion
-
- } else {//组合线路
- $result['code'] = '1';
- $result['info'] = '暂不支持组合线路退单';
- return $result;
- }
-
- return $result;
- }
-
- /**
- * Function Description:获取订单所属线路
- * Function Name: getOrderLineIdCount
- * @param array $order_id_arr 订单id数组
- *
- * @return array|null|ActiveRecord
- *
- * @author 张帅
- */
- public
- function getOrderLineIdCount($order_id_arr)
- {
- $result = OrderMain::find()
- ->select([
- 'order_id',
- 'line_id' => 'parent_prod_id',//线路id
- 'order_count' => "substring_index(order_description,'|',-1)",//人数
- 'order_valid_status',//订单是否有效
- 'line_type' => OperaLine::find()->select('line_type')->where('line_id = m.parent_prod_id')->limit(1),//线路类型
- ])
- ->from(OrderMain::tableName() . ' as m')
- ->where([
- 'and',
- ['in', 'order_id', $order_id_arr],
- ['=', 'parent_order_id', 0],
- ])
- ->indexBy('order_id')
- ->asArray()->all();
-
- return $result;
- }
-
- /**
- * Function Description:获取订单班次信息
- * Function Name: getOrderRunInfo
- * @param array $order_id_arr 订单id数组
- *
- * @return array|\yii\db\ActiveRecord[]
- *
- * @author 张帅
- */
- public
- function getOrderRunInfo($order_id_arr)
- {
- $result = OrderMain::find()
- ->select([
- 'run_id',//班次id
- 'run_date',//班次日期
- 'bus_order_id' => "group_concat(distinct run_bus_order_id)",//车次号
- 'start_seq_id' => 'prod_start_station_seq_id',//开始站顺序号
- 'end_seq_id' => 'prod_end_station_seq_id',//结束站站顺序号
- 'order_num' => "count(*)",//订单人数
- 'ticket_id' => 'prod_id',//票种id
- 'order_id' => "group_concat(order_id)",//订单id
- 'seat_type' => 'run_bus_seat_type',//座位类型
- ])
- ->where([
- 'and',
- ['in', 'parent_order_id', $order_id_arr],
- ['=', 'cancel_flag', 0],
- ])
- ->groupBy([
- 'run_id',
- 'start_seq_id',
- 'end_seq_id',
- ])
- ->indexBy('run_id')
- ->asArray()->all();
-
- return $result;
- }
- }
|