|
- <?php
- /**
- *
- * ============================================================================
- * * 版权所有 蜘蛛出行 * *
- * 网站地址: http://www.zhizhuchuxing.com
- * ----------------------------------------------------------------------------
- * 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和
- * 使用;不允许对程序代码以任何形式任何目的的再发布。
- * ============================================================================
- * Author By: 张帅
- * PhpStorm GetTicketOrderData.php
- * Create By 2017/4/17 17:32 $
- */
-
- namespace backend\modules\api\logic;
-
-
- use backend\modules\api\models\OperaProduct;
- use backend\modules\api\models\OperaProductRun;
- use yii\db\Expression;
- use yii\db\Query;
-
- class GetTicketOrderData extends Query
- {
- public $ticket_product;//门票产品
-
- public $order_main_base = [];//订单基础配置
-
- public $pay_main_base = [];//主支付记录基础配置
-
- public $pay_detail_base = [];//支付明细
-
- public $user_id;//用户id
-
- public $create_time;//创建时间
-
- /**
- * Function Description:获取主门票信息详情
- * Function Name: getTicketMainProductList
- * @param array $ticket_product 门票选购产品
- *
- * @return mixed
- *
- * @author 张帅
- */
- public function getTicketMainProductList($ticket_product)
- {
- #region 获取所有的主票种id
- $ticket_id_arr = [];
- foreach ($ticket_product as $key => $vel) {
- $ticket_id_arr[$vel['ticket_id']] = $vel['ticket_id'];
- }
- #endregion
-
- #region 获取主票种数据列表
- $ticket_info_list = OperaProduct::find()
- ->select([
- 'ticket_id' => 'prod_id',//票种id
- 'prod_code',
- 'prod_name',
- 'prod_type',
- 'run_duty_id as principal_id',
- ])
- ->where([
- 'and',
- ['in', 'prod_id', $ticket_id_arr],
- ['=', 'cancel_flag', 0],
- ['=', 'is_onsale', 1],
- ])
- ->indexBy('ticket_id')
- ->asArray()->all();
- #endregion
-
- #region 检查主门票产品
- foreach ($ticket_product as $key => $vel) {
- if (!isset($ticket_info_list[$vel['ticket_id']])) {
- $json['code'] = '1';
- $json['info'] = '门票产品有误';
- return $json;
- }
- $ticket_product[$key]['ticket_code'] = $ticket_info_list[$vel['ticket_id']]['prod_code'];//门票编号
- $ticket_product[$key]['ticket_name'] = $ticket_info_list[$vel['ticket_id']]['prod_name'];//门票名称
- $ticket_product[$key]['ticket_type'] = $ticket_info_list[$vel['ticket_id']]['prod_type'];//门票类型
- $ticket_product[$key]['principal_id'] = $ticket_info_list[$vel['ticket_id']]['principal_id'];//运营负责人
- }
- #endregion
-
- $this->ticket_product = $ticket_product;
-
- $json['code'] = '0';
- $json['info'] = '成功';
- return $json;
- }
-
- /**
- * Function Description:获取子门票产品详情并检验库存
- * Function Name: getTicketSonProductList
- *
- * @return mixed
- *
- * @author 张帅
- */
- public function getTicketSonProductList()
- {
- #region 获取门票选购产品数据
- $ticket_product_info = $this->ticket_product;
- #endregion
-
- #region 获取and_where
- $and_where = ['or'];
- foreach ($ticket_product_info as $main_key => $main_vel) {
- $son_ticket_id = [];
- foreach ($main_vel['son_ticket'] as $son_key => $son_vel) {
- $son_ticket_id[$son_vel['son_ticket_id']] = $son_vel['son_ticket_id'];
- }
- $and_where[] = [
- 'and',
- ['=', 'p.parent_id', $main_vel['ticket_id']],
- ['=', 'pr.run_date', $main_vel['run_date']],
- ['in', 'p.prod_id', $son_ticket_id],
- ];
- }
- #endregion
-
- #region 获取数据详情
- $son_ticket_list = OperaProductRun::find()
- ->select([
- 'son_ticket_id' => 'p.prod_id',//票种id
- 'main_ticket_id' => 'p.parent_id',//父票种id
- 'p.prod_code',
- 'p.prod_name',
- 'p.prod_type',
- 'pr.run_date',//日期
- 'pr.run_time',//时间
- 'pr.cus_price',//销售价
- 'pr.prod_price',//成本价
- 'ticket_stock' => new Expression("pr.total_count-pr.saled_count"),//库存
- 'p.run_duty_id as principal_id',//运营负责人
- ])
- ->from(OperaProductRun::tableName() . ' as pr')
- ->leftJoin(OperaProduct::tableName() . ' as p', 'p.prod_id = pr.prod_id')
- ->where([
- 'and',
- ['=', 'p.cancel_flag', 0],
- ['=', 'pr.cancel_flag', 0],
- ['=', 'p.is_onsale', 1],
- ['=', 'pr.is_onsale', 1],
- ])
- ->andWhere($and_where)
- ->groupBy(['son_ticket_id', 'run_date'])
- ->asArray()->all();
- #endregion
-
- #region 整理数据并检验库存
- foreach ($son_ticket_list as $key => $vel) {
- $son_ticket_arr[$vel['son_ticket_id'] . '-' . $vel['run_date']] = $vel;
- }
-
- foreach ($ticket_product_info as $main_key => $main_vel) {
- foreach ($main_vel['son_ticket'] as $son_key => $son_vel) {
- if (!isset($son_ticket_arr[$son_vel['son_ticket_id'] . '-' . $main_vel['run_date']])) {
- $json['code'] = '1';
- $json['info'] = '子门票产品有误';
- return $json;
- }
- if ($son_ticket_arr[$son_vel['son_ticket_id'] . '-' . $main_vel['run_date']]['ticket_stock'] < $son_vel['prod_num']) {
- $json['code'] = '1';
- $json['info'] = '门票库存不足';
- return $json;
- }
-
- $ticket_product_info[$main_key]['son_ticket'][$son_key]['ticket_code'] = $son_ticket_arr[$son_vel['son_ticket_id'] . '-' . $main_vel['run_date']]['prod_code'];//子门票编号
- $ticket_product_info[$main_key]['son_ticket'][$son_key]['ticket_name'] = $son_ticket_arr[$son_vel['son_ticket_id'] . '-' . $main_vel['run_date']]['prod_name'];//子门票名称
- $ticket_product_info[$main_key]['son_ticket'][$son_key]['ticket_type'] = $son_ticket_arr[$son_vel['son_ticket_id'] . '-' . $main_vel['run_date']]['prod_type'];//子门票编号
- $ticket_product_info[$main_key]['son_ticket'][$son_key]['price'] = $ticket_product_info[$main_key]['son_ticket'][$son_key]['prod_price'];//子门票价格
- $ticket_product_info[$main_key]['son_ticket'][$son_key]['cus_price'] = $son_ticket_arr[$son_vel['son_ticket_id'] . '-' . $main_vel['run_date']]['cus_price'];//零售价
- $ticket_product_info[$main_key]['son_ticket'][$son_key]['prod_price'] = $son_ticket_arr[$son_vel['son_ticket_id'] . '-' . $main_vel['run_date']]['prod_price'];//分销价
- $ticket_product_info[$main_key]['son_ticket'][$son_key]['run_time'] = $son_ticket_arr[$son_vel['son_ticket_id'] . '-' . $main_vel['run_date']]['run_time'];//游玩时间
- $ticket_product_info[$main_key]['son_ticket'][$son_key]['principal_id'] = $son_ticket_arr[$son_vel['son_ticket_id'] . '-' . $main_vel['run_date']]['principal_id'];//运营负责人
- $son_ticket_arr[$son_vel['son_ticket_id'] . '-' . $main_vel['run_date']]['ticket_stock'] -= $son_vel['prod_num'];
- }
- }
- #endregion
-
- $this->ticket_product = $ticket_product_info;
-
- return $ticket_product_info;
- }
-
- /**
- * Function Description:获取提交门票订单数据
- * Function Name: getSubmitTicketData
- * @param int $unique_id 唯一主键
- * @param array $order_main_base 订单基础配置
- * @param array $pay_main_base 主支付记录基础配置
- * @param array $pay_detail_base 支付明细
- * @param int $user_id 用户id
- * @param string $create_time 创建时间
- *
- * @return array
- *
- * @author 张帅
- */
- public function getSubmitTicketData($unique_id, $order_main_base, $pay_main_base, $pay_detail_base, $user_id, $create_time)
- {
- #region 设置常量
- $this->order_main_base = $order_main_base;
- $this->pay_main_base = $pay_main_base;
- $this->pay_detail_base = $pay_detail_base;
- $this->user_id = $user_id;
- $this->create_time = $create_time;
- #endregion
-
- #region 获取门票选购产品数据
- $ticket_product_info = $this->ticket_product;
- #endregion
-
- #region 提交订单素材
- $order_main_arr = [];//订单表提交数据
- $main_order_id_arr = [];//巴士订单组
- $opera_product_run_arr = [];//opera_product_run需要修改数据
- $pay_main_arr = [];//主支付记录
- $pay_detail_arr = [];//支付明细
- #endregion
-
- #region 遍历主订单
- foreach ($ticket_product_info as $main_key => $main_vel) {
-
- $pay_main_id = $unique_id;
- $order_id = $pay_main_id + 1;//订单递增id
- $main_order_id = $order_id;//主订单id
-
- #region 主订单单一数据
- $order_main_one = $this->getMainOrderInfoArray($order_id, $pay_main_id, $main_vel);
- #endregion
-
- #region 插入主订单
- $order_main_arr[] = $order_main_one;
- $main_order_id_arr[$order_id] = $order_id;//收集主订单号
- #endregion
-
- #region 遍历子订单
- foreach ($main_vel['son_ticket'] as $son_key => $son_vel) {
- for ($i = 1; $i <= $son_vel['prod_num']; $i++) {
- $order_id++;//获取订单号
-
- #region 子订单单一数据
- $order_main_one = $this->getSonOrderInfoArray($order_id, $main_order_id, $pay_main_id, $main_vel, $son_vel);
- #endregion
-
- #region 插入子订单
- $order_main_arr[] = $order_main_one;
- #endregion
- }
-
- #region 获取opera_product_run数据
- $opera_product_run_arr = $this->getOperaProductRunInfo($opera_product_run_arr, $main_vel['run_date'], $son_vel['son_ticket_id'], $son_vel['prod_num']);
- #endregion
- }
- #endregion
-
- #region 获取主支付记录数据
- $total_price = 0;
- foreach ($main_vel['son_ticket'] as $key => $vel) {
- $total_price += $vel['price'] * $vel['prod_num'];
- }
- $pay_main_one = $this->getPayMainInfo($pay_main_id, $main_order_id, $total_price);
- $pay_main_arr[] = $pay_main_one;
- #endregion
-
- #region 获取支付明细数据
- $pay_detail_one = $this->getPayDetailInfo($pay_main_id, $total_price);
- $pay_detail_arr[] = $pay_detail_one;
- #endregion
-
- $unique_id = $order_id + 1;
- }
- #endregion
-
- $result = [
- 'main_order_id_arr' => $main_order_id_arr,//巴士订单号数组
- 'order_main_arr' => $order_main_arr,//订单表数据
- 'opera_product_run_arr' => $opera_product_run_arr,//opera_product_run需要修改数据
- 'pay_main_arr' => $pay_main_arr,//主支付记录
- 'pay_detail_arr' => $pay_detail_arr,//支付明细
- 'unique_id' => $unique_id,//唯一键值
- ];
-
- return $result;
- }
-
- /**
- * Function Description:获取门票主订单数据
- * Function Name: getMainOrderInfoArray
- * @param int $order_id 订单号
- * @param int $pay_main_id 支付号
- * @param array $main_order 订单信息
- *
- * @return mixed
- *
- * @author 张帅
- */
- public function getMainOrderInfoArray($order_id, $pay_main_id, $main_order)
- {
- #region 获取订单配置
- $result = $this->order_main_base;
- #endregion
-
- $result['ID'] = $order_id;//订单号
- $result['ORDER_ID'] = $order_id;//订单号
-
- #region 获取订单描述 和 总价 总人数 总成本价
- $order_description = [];
- $total_price = 0;
- $total_base_price = 0;
- $total_prod_num = 0;
- foreach ($main_order['son_ticket'] as $key => $vel) {
- $order_description[] = $vel['ticket_name'] . ',' . date('Y-m-d', time()) . ',' . $vel['prod_num'];
- $total_price += $vel['price'] * $vel['prod_num'];
- $total_base_price += $vel['prod_price'] * $vel['prod_num'];
- $total_prod_num += $vel['prod_num'];
- }
- $order_description[] = $total_prod_num;
- $order_description = implode('|', $order_description);
- #endregion
-
- $result['ORDER_DESCRIPTION'] = $order_description;//订单描述
- $result['ORDER_PAY_MAIN_ID'] = $pay_main_id;//主支付记录id
- $result['PROD_ID'] = $main_order['ticket_id'];//父门票id
- $result['PROD_NAME'] = $main_order['ticket_name'];//父门票名称
- $result['PARENT_PROD_ID'] = $main_order['ticket_id'];//父门票id
- $result['PARENT_PROD_NAME'] = $main_order['ticket_name'];//父门票名称
- $result['BASE_PRICE'] = $total_base_price;//产品成本
- $result['ORDER_PRICE'] = $total_base_price;//订单价格
- $result['ORDER_PROD_TYPE'] = 311;//订单类型
- $result['RUN_DATE'] = $main_order['run_date'];//游玩日期
- $result['PRINCIPAL_ID'] = isset($main_order['principal_id'])?$main_order['principal_id']:0; //运营负责人
- $result['RUN_DATE_NUM'] = (strtotime($main_order['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24);//班次首发日期参数,发车日期至2016-01-01天数,算法使用,
-
- return $result;
- }
-
- /**
- * Function Description:获取门票子订单数据
- * Function Name: getSonOrderInfoArray
- * @param int $order_id 订单号
- * @param int $main_order_id 父订单号
- * @param int $pay_main_id 支付号
- * @param array $main_order 订单信息
- * @param array $son_order 子票种信息
- *
- * @return mixed
- *
- * @author 张帅
- */
- public function getSonOrderInfoArray($order_id, $main_order_id, $pay_main_id, $main_order, $son_order)
- {
- #region 获取订单配置
- $result = $this->order_main_base;
- #endregion
-
- $result['ID'] = $order_id;//订单号
- $result['ORDER_ID'] = $order_id;//订单号
- $result['ORDER_PAY_MAIN_ID'] = $pay_main_id;//主支付记录id
- $result['PARENT_ORDER_ID'] = $main_order_id;//父订单id
- $result['PROD_ID'] = $son_order['son_ticket_id'];//子产品id
- $result['PROD_NAME'] = $son_order['ticket_name'];//子产品名称
- $result['PARENT_PROD_ID'] = $main_order['ticket_id'];//父产品id
- $result['PARENT_PROD_NAME'] = $main_order['ticket_name'];//父产品名称
- $result['BASE_PRICE'] = $son_order['prod_price'];//产品成本
- $result['ORDER_PRICE'] = $son_order['price'];//订单价格
- $result['ORDER_PROD_TYPE'] = $son_order['ticket_type'];//订单类型
-
- $result['RUN_DATE'] = $main_order['run_date'];//出行日期
- $result['PRINCIPAL_ID'] = isset($main_order['principal_id'])?$main_order['principal_id']:0; //运营负责人
- $result['RUN_DATE_NUM'] = (strtotime($main_order['run_date']) - strtotime('2016-01-01')) / (60 * 60 * 24);//班次首发日期参数,发车日期至2016-01-01天数,算法使用,
- $result['RUN_TIME'] = $son_order['run_time'];//出行日期
-
- return $result;
- }
-
- /**
- * Function Description:opera_product_run要更新的数据
- * Function Name: getOperaProductRunInfo
- * @param array $opera_product_run_arr opera_product_run要更新的数据
- * @param string $run_date 游玩日期
- * @param int $son_ticket_id 子票种id
- * @param int $prod_num 人数
- *
- * @return mixed
- *
- * @author 张帅
- */
- public function getOperaProductRunInfo($opera_product_run_arr, $run_date, $son_ticket_id, $prod_num)
- {
- if (!isset($opera_product_run_arr[$run_date . '-' . $son_ticket_id])) {
- $opera_product_run_one = [];
- $opera_product_run_one['run_date'] = $run_date;//游玩日期
- $opera_product_run_one['ticket_id'] = $son_ticket_id;//子票种id
- $opera_product_run_one['update_user_id'] = $this->user_id;//更新用户id
- $opera_product_run_one['update_time'] = $this->create_time;//更新时间
- $opera_product_run_one['num'] = $prod_num;//人数
-
- $opera_product_run_arr[$run_date . '-' . $son_ticket_id] = $opera_product_run_one;//run_bus数据
- } else {
- $opera_product_run_arr[$run_date . '-' . $son_ticket_id]['num']++;//增加人数
- }
-
- return $opera_product_run_arr;
- }
-
- /**
- * Function Description:获取主支付记录数据
- * Function Name: getPayMainInfo
- * @param int $pay_main_id 支付id
- * @param int $order_id 订单id
- * @param double $total_price 总价
- *
- * @return mixed
- *
- * @author 张帅
- */
- public function getPayMainInfo($pay_main_id, $order_id, $total_price)
- {
- #region 获取主支付记录配置
- $result = $this->pay_main_base;
- #endregion
-
- $result['ID'] = $pay_main_id;//支付id
- $result['PAY_TOTAL'] = $total_price;//订单id
- $result['ORDER_ID'] = $order_id;//总价
-
- return $result;
- }
-
- /**
- * Function Description:获取支付明细数据
- * Function Name: getPayDetailInfo
- * @param int $pay_main_id 支付id
- * @param double $total_price 总价
- *
- * @return mixed
- *
- * @author 张帅
- */
- public function getPayDetailInfo($pay_main_id, $total_price)
- {
- #region 获取支付明细配置
- $result = $this->pay_detail_base;
- #endregion
-
- $result['ID'] = $pay_main_id;//支付id
- $result['PAY_MAIN_ID'] = $pay_main_id;//订单id
- $result['PAY_MONEY'] = $total_price;//总价
-
- return $result;
- }
-
- }
|