'在线支付', 'OFFLINE_PAY' => '线下支付']; ///订单类型 public $order_type = array( "group" => "套餐", // "site" => "站点", "sms" => "短信", ); //订单状态 public $order_status = array( 0 => "待支付", 2 => "支付待审核", 3 => "审核拒绝", -1 => "已关闭", 1 => "已完成", ); /** * 获取支付方式 */ public function getPayType() { //获取订单基础的其他支付方式 $pay_type = $this->pay_type; //获取当前所有在线支付方式 $online_pay = event('PayType', []); if (!empty($online_pay)) { foreach ($online_pay as $k => $v) { $pay_type[$v['pay_type']] = $v['pay_type_name']; } } return $pay_type; } /** * 获取订单类型 */ public function getOrderType() { $order_type = $this->order_type; return $order_type; } /** * 获取订单状态 */ public function getOrderStatus() { $order_status = $this->order_status; return $order_status; } /** * 获取系统订单列表 */ public function getSysOrderPageList($condition, $page = 1, $page_size = PAGE_LIST_ROWS, $fields = '*', $order = 'create_time DESC') { $res = model('site_order')->pageList($condition, $fields, $order, $page, $page_size); return $this->success($res); } /** * 获取系统订单列表 */ public function getSysOrderList($condition, $fields = '*', $order = 'create_time DESC') { $res = model('site_order')->getList($condition, $fields, $order); return $this->success($res); } /** * 获取订单详情 * @param $condtion * @param string $fields */ public function getSysOrderInfo($condtion, $fields = '*', $alias = 'a', $join = []) { $res = model('site_order')->getInfo($condtion, $fields, $alias, $join); return $this->success($res); } /** * 创建订单 * @param $data * @return array */ public function orderCreate($param, $agent_id = 1) { model('site_order')->startTrans(); try { $buyer_info = $param['buyer_info']; //套餐信息 $group_id = $param["group_id"] ?? 0; $group_num = $param["group_num"] ?? 0; $group_money = 0; $order_name = ''; if ($group_id > 0 && $group_num > 0) { $order_type = "group";//套餐订单 $sys_user_group_model = new SiteGroup(); $group_info = $sys_user_group_model->getSiteGroupDetail([['group_id', '=', $group_id], ['status', '=', 1]], 'type, group_name, image, addon_array, unit, fee,sms_num'); if (empty($group_info['data'])) { return error(); } $group_info = $group_info['data']; $data["group_id"] = $group_id; $data["group_name"] = $group_info['group_name']; $data['type'] = $group_info['type']; $data["group_image"] = $group_info['image']; $data["group_sms_num"] = $group_info['sms_num'];//免费赠送短信数 $data["group_period_num"] = 1; $data["group_period_unit"] = $group_info['unit']; $data["group_period_price"] = $group_info['fee']; $group_money = $group_num * $group_info['fee']; $order_name = $group_info['group_name']; } $data["group_num"] = $group_num; $data["site_id"] = $param['site_id']; $data["site_name"] = $param['site_name']; //短信订单 $sms_package_id = $param['sms_package_id']; $sms_package_num = $param['sms_package_num']; $sms_money = 0; //有效的短信套餐订单 // if ($sms_package_id > 0 && $sms_package_num > 0) { // $order_type = 'sms'; // $sms_package_model = new SmsPackage(); // $sms_package_condition = array( // ['package_id', '=', $sms_package_id], // ['status', '=', 1] // ); // $sms_package_result = $sms_package_model->getSmsPackageInfo($sms_package_condition, "sms_name, sms_image, sms_money, sms_num"); // $sms_package_info = $sms_package_result["data"]; // if (empty($sms_package_info)) { // model('site_order')->rollback(); // return error([], '找不到当前短信套餐');//非法的短信套餐 // } // $data['sms_package_id'] = $sms_package_id; // $data['sms_num'] = $sms_package_num; // $data['sms_package_num'] = $sms_package_info['sms_num']; // $data['sms_package_price'] = $sms_package_info['sms_money']; // $data['sms_package_name'] = $sms_package_info['sms_name']; // $data['sms_package_image'] = $sms_package_info['sms_image']; // $sms_money = $data['sms_package_price'] * $data['sms_num']; // $order_name = empty($order_name) ? "短信套餐" : $order_name . "-" . "短信套餐"; // } //非法订单 if (empty($order_type)) { model('site_order')->rollback(); return error('', '无效的订单'); } $data["buyer_uid"] = $buyer_info["buyer_uid"]; $data["buyer_name"] = $buyer_info["buyer_name"]; $data["group_money"] = $group_money;//套餐总额 $data["sms_money"] = $sms_money;//短信总额 $order_money = $group_money + $sms_money;//订单总价 $data["order_money"] = $order_money; $order_type_name = $this->order_type[$order_type]; $data["order_type"] = $order_type;//订单类型 $data["order_type_name"] = $order_type_name;//订单类型名称 $data['order_name'] = $order_name; $order_status = 0; $order_status_name = $this->order_status[$order_status]; $data["order_status"] = $order_status;//订单状态 $data["order_status_name"] = $order_status_name;//订单状态名称 $data['pay_type'] = 'cashier'; $pay_type_list = $this->getPayType(); $data['pay_type_name'] = $pay_type_list['alipay']; $pay_model = new Pay(); $out_trade_no = $pay_model->createOutTradeNo();//交易流水号 $data ['out_trade_no'] = $out_trade_no; $order_no = $this->createOrderNo(); $data['order_no'] = $order_no; $data['create_time'] = time(); $order_id = model('site_order')->add($data); $pay_model->addPay($agent_id, $out_trade_no, 'alipay', $order_name, $order_name, $data["order_money"], '', 'SiteOrderPayNotify', ''); //todo 生成待支付订单关闭事件 $this->addOrderCronClose($order_id); model('site_order')->commit(); return $this->success($out_trade_no); } catch (\Exception $e) { model('site_order')->rollback(); return $this->error(-1, $e->getMessage() . $e->getLine()); } } /** * 生成订单编号 * * @param array $site_id */ private function createOrderNo() { $time_str = date('YmdHi'); $max_no = Cache::get('sys' . "_" . $time_str); if (!isset($max_no) || empty($max_no)) { $max_no = 1; } else { $max_no = $max_no + 1; } $order_no = $time_str . sprintf("%04d", $max_no); Cache::set('sys' . "_" . $time_str, $max_no); return $order_no; } /** * 订单线上支付 * @param unknown $out_trade_no */ public function orderOnlinePay($data) { model('site_order')->startTrans(); try { $out_trade_no = $data['out_trade_no']; $order_info = model('site_order')->getInfo([['out_trade_no', '=', $out_trade_no]], '*'); if ($order_info['pay_status'] == 1) { return $this->success(); } $this->orderPay($order_info, $data['pay_type']); model('site_order')->commit(); return $this->success(); } catch (\Exception $e) { model('site_order')->rollback(); return $this->error('', $e->getMessage()); } } /** * 修改订单状态 * @param $order_info * @param $pay_type * @return array */ public function orderPay($order_info, $pay_type) { model('site_order')->startTrans(); try { $pay_type_list = $this->getPayType(); if ($order_info['pay_status'] != 0) { return $this->error(); } $condition = array( ['order_id', '=', $order_info['order_id']], ['pay_status', '=', 0], ); $data = array( 'pay_status' => 1, 'pay_time' => time(), 'pay_type' => $pay_type, 'pay_type_name' => $pay_type_list[$pay_type], 'order_status' => 1, 'order_status_name' => $this->order_status[1], ); model('site_order')->update($data, $condition); //套餐订单 if ($order_info['order_type'] == 'group') { $site_group_model = new SiteGroup(); $site_group_result = $site_group_model->orderSuccess($order_info); if ($site_group_result['code'] < 0) { model('site_order')->rollback(); return $site_group_result; } } //短信套餐 if ($order_info['order_type'] == 'sms') { //给用户添加短信数量 $sms_num = $order_info['sms_num'] * $order_info['sms_package_num']; model('site')->setInc([['site_id', '=', $order_info['site_id']]], 'sms_num', $sms_num); } model('site_order')->commit(); return $this->success(); } catch (\Exception $e) { model('site_order')->rollback(); return $this->error('', $e->getMessage()); } } /** * 提交线下支付 * @param array $condition * @param $data * @return array */ public function applyOfflinePay($condition = [], $data) { $pay_status = model('site_order')->getInfo($condition); if (empty($pay_status)) { return $this->error(-1, '找不到可支付的单据'); } $pay_type_list = $this->getPayType(); $data['order_status'] = 2; $data['pay_time'] = time(); $data['order_status_name'] = $this->order_status[2]; $data['pay_type'] = 'OFFLINE_PAY'; $data['pay_type_name'] = $pay_type_list['OFFLINE_PAY']; $res = model('site_order')->update($data, $condition); return $this->success($res); } /** * 订单关闭 * @param $order_id */ public function orderClose($condition) { model('site_order')->startTrans(); try { $data = [ 'order_status' => -1, 'order_status_name' => $this->order_status[-1] ]; //关闭订单状态 model('site_order')->update($data, $condition); model('site_order')->commit(); return $this->success(); } catch (\Exception $e) { model('site_order')->rollback(); return $this->error('', $e->getMessage()); } } /** * 订单删除 * @param $order_id */ public function orderDelete($condition) { model('site_order')->startTrans(); try { $data = [ 'is_delete' => 1, ]; //关闭订单状态 $result = model('site_order')->update($data, $condition); model('site_order')->commit(); if ($result === false) { return $this->error($result); } return $this->success($result); } catch (\Exception $e) { model('site_order')->rollback(); return $this->error('', $e->getMessage()); } } /** * 线下支付审核通过 */ public function offlinePay($order_id) { $order_info = model('site_order')->getInfo([['order_id', '=', $order_id], ['pay_status', '=', 0]]); if (empty($order_info)) { return $this->error(-1, '参数错误'); } $res = $this->orderPay($order_info, 'OFFLINE_PAY'); return $res; } /** * 线下支付审核拒绝 * @param $order_id * @return array */ public function refuseOfflinePay($order_id) { $order_info = model('site_order')->getInfo([['order_id', '=', $order_id], ['pay_status', '=', 0]]); if (empty($order_info)) { return $this->error(-1, '参数错误'); } $data = ['order_status' => 3, 'order_status_name' => $this->order_status[3]]; $res = model('site_order')->update($data, [['order_id', '=', $order_id], ['pay_status', '=', 0]]); return $this->success($res); } /** * 订单详情 * @param $out_trade_no */ public function getOrderInfo($condition, $field = "*") { $info = model('site_order')->getInfo($condition, $field); return $this->success($info); } /** * 订单详情 * @param $out_trade_no */ public function getOrderDetail($out_trade_no) { $info = model('site_order')->getInfo([['out_trade_no', '=', $out_trade_no]]); return $this->success($info); } /*********************************************************订单统计*************************************************************/ /** * 增加订单自动关闭事件 * @param $order_id */ public function addOrderCronClose($order_id) { //计算订单自动关闭时间 $now_time = time(); $execute_time = $now_time + 3600;//尚未配置 默认一小时 $cron_model = new Cron(); $cron_model->addCron(1, 0, "订单自动关闭", "CronSysOrderClose", $execute_time, $order_id); } }