$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; } }