post(); $redis_key = 'photo_service_order_' . $request->user->id; // if (Redis::get($redis_key)) { // throw new Exception('请勿频繁操作'); // } // Redis::setEx($redis_key, 3, 1); //计算服务价格 $photo_service_price = 0.00; $paid_service_price = 0.00; $photo_service_detail = []; $paid_service_detail = []; if ($data['photo_service']) { $photo_service = json_decode($data['photo_service'], true); foreach ($photo_service as $item) { $service = PhotoService::where(['id' => $item['id']])->findOrEmpty(); // if($service->isEmpty()){ // throw new Exception('所选拍照服务不存在'); // } $photo_service_price += round($service->price + $item['number'], 2); array_push($photo_service_detail, [ 'service' => $service->toArray(), 'number' => $item['number'] ]); } } if ($data['paid_service']) { $paid_service = json_decode($data['paid_service'], true); foreach ($paid_service as $item) { $service = PaidService::where(['id' => $item['id']])->findOrEmpty(); $paid_service_price += round($service->price * $item['number'], 2); array_push($paid_service_detail, [ 'service' => $service->toArray(), 'number' => $item['number'] ]); } } $total = round($photo_service_price + $paid_service_price, 2); //保证金 $deposit = 0.00; if ($data['is_need_deposit']) { $ratio = RatioService::ratio(); $deposit = round($total * $ratio / 100, 2); } $order_no = generate_order_no('P'); //插入订单 $res = PhotoServiceOrder::create([ 'user_id' => $request->user->id, 'trade_no' => $order_no, 'user_name' => $data['user_name'], 'sex' => $data['sex'], 'user_mobile' => $data['user_mobile'], 'service_address' => $data['service_address'], 'service_time' => $data['service_time'], 'photo_service_type' => $data['photo_service_type'], 'photo_service_data' => $data['photo_service'], 'photo_service_detail' => json_encode($photo_service_detail), 'paid_service_type' => $data['paid_service_type'], 'paid_service_data' => $data['paid_service'], 'paid_service_detail' => json_encode($paid_service_detail), 'photographer_id' => $data['photographer_id'], 'is_need_deposit' => $data['is_need_deposit'], 'deposit_amount' => $deposit, 'total' => $total, 'remake' => $data['remake'], ]); if (!$res) { throw new Exception('创建订单失败'); } $pay_data = [ 'trade_no' => $order_no, 'total_amount' => $total, 'desc' => '拍照服务付款', 'notify_url' => getenv('SERVER_DOMAIN') . self::NOTIFY_URL,//回调地址 'openid' => $request->user->openid, ]; $result = (new PayService())->payment($pay_data); if (isset($result['code'])) { throw new Exception($result['msg']); } return [ 'code' => ResponseCode::SUCCESS, 'data' => $result, ]; } catch (Exception $e) { return [ 'code' => ResponseCode::FAIL, 'msg' => $e->getMessage() ]; } } /** * @desc 计算价格 * @param $request * @return array|void */ public function calculatePrice($request) { try { $photo_service_price = 0.00; $paid_service_price = 0.00; if ($request['photo_service']) { $photo_service = json_decode($request['photo_service'], true); foreach ($photo_service as $item) { $service = PhotoService::where(['id' => $item['id']])->findOrEmpty(); $photo_service_price += round($service->price + $item['number'], 2); } } if ($request['paid_service']) { $paid_service = json_decode($request['paid_service'], true); foreach ($paid_service as $item) { $service = PaidService::where(['id' => $item['id']])->findOrEmpty(); $paid_service_price += round($service->price * $item['number'], 2); } } $total = round($photo_service_price + $paid_service_price, 2); $deposit = 0.00; if ($request['is_need_deposit']) { $ratio = RatioService::ratio(); $deposit = round($total * $ratio / 100, 2); } return [ 'code' => ResponseCode::SUCCESS, 'data' => [ 'total' => $total, 'deposit' => $deposit, ] ]; } catch (Exception $e) { return [ 'code' => ResponseCode::FAIL, 'msg' => $e->getMessage() ]; } } /** * @desc 拍照服务支付保证金 * @param $request * @return array */ public function payOrderDeposit($request) { try { $data = $request->post(); //查找订单 $photo_order = PhotoServiceOrder::where(['id' => $data['order_id']])->findOrEmpty(); if ($photo_order->isEmpty()) { throw new Exception('订单不存在'); } if ($photo_order->is_need_deposit != 1) { throw new Exception('该订单无需支付保证金'); } if ($photo_order->pay_status != 1) { throw new Exception('用户未付款,无需支付保证金'); } $photographer = Photographer::where(['user_id' => $request->user->id])->findOrEmpty(); if ($photographer->id != $photo_order->photographer_id) { throw new Exception('非摄影师本人无法支付'); } $order_no = generate_order_no('D'); $deposit_order = DepositOrder::create([ 'user_id' => $request->user->id, 'photographer_id' => $photographer->id, 'order_type' => 'photo', 'deposit_amount' => $photo_order->deposit_amount, 'trade_no' => $order_no, ]); if (!$deposit_order) { throw new Exception('创建订单失败'); } //订单表中插入保证金订单号 $photo_order->save([ 'deposit_order_id' => $deposit_order->id, 'deposit_trade_no' => $order_no ]); $pay_data = [ 'trade_no' => $order_no, 'total_amount' => $photo_order->deposit_amount, 'desc' => '拍照服务付款', 'notify_url' => getenv('SERVER_DOMAIN') . self::NOTIFY_DEPOSIT_URL,//回调地址 'openid' => $request->user->openid, ]; $result = (new PayService())->payment($pay_data); if (isset($result['code'])) { throw new Exception($result['msg']); } return [ 'code' => ResponseCode::SUCCESS, 'data' => $result ]; } catch (Exception $e) { return [ 'code' => ResponseCode::FAIL, 'msg' => $e->getMessage() ]; } } /** * @desc 摄影师拍照订单列表 * @param $request * @return array|void */ public function getPhotoServiceOrderForPhotographer($request) { try { $data = $request->get(); //摄影师信息 $photographer = Photographer::where(['user_id' => $request->user->id])->findOrEmpty(); if ($photographer->isEmpty()) { throw new Exception('未找到摄影师信息'); } $order = PhotoServiceOrder::order('id desc')->where(['photographer_id' => $photographer->id]); if (isset($data['status']) && $data['status'] != -1) { $order->where(['status' => $data['status']]); } $page = isset($data['page']) ? $data['page'] : 1; $limit = isset($data['limit']) ? $data['limit'] : 10; $total = $order->count(); $list = $order->page($page, $limit)->with(['photographer'])->select(); foreach ($list as &$item){ if($item['photo_service_detail']){ $item['photo_service_detail'] = json_decode($item['photo_service_detail'], true); } if($item['paid_service_detail']){ $item['paid_service_detail'] = json_decode($item['paid_service_detail'], true); } } return [ 'code' => ResponseCode::SUCCESS, 'data' => [ 'list' => $list, 'total' => $total, 'page' => $page, ] ]; } catch (Exception $e) { return [ 'code' => ResponseCode::FAIL, 'msg' => $e->getMessage() ]; } } /** * @desc 摄影师拍照订单列表 * @param $request * @return array|void */ public function getPhotoServiceOrderForUser($request) { try { $data = $request->get(); $order = PhotoServiceOrder::order('id desc')->where(['user_id' => $request->user->id]); if (isset($data['status']) && $data['status'] != -1) { $order->where(['status' => $data['status']]); } $page = isset($data['page']) ? $data['page'] : 1; $limit = isset($data['limit']) ? $data['limit'] : 10; $total = $order->count(); $list = $order->page($page, $limit)->with(['photographer'])->select(); foreach ($list as &$item){ if($item['photo_service_detail']){ $item['photo_service_detail'] = json_decode($item['photo_service_detail'], true); } if($item['paid_service_detail']){ $item['paid_service_detail'] = json_decode($item['paid_service_detail'], true); } } return [ 'code' => ResponseCode::SUCCESS, 'data' => [ 'list' => $list, 'total' => $total, 'page' => $page, ] ]; } catch (Exception $e) { return [ 'code' => ResponseCode::FAIL, 'msg' => $e->getMessage() ]; } } public function confirmPhotoOrder($request) { try { $data = $request->post(); $photographer = Photographer::where(['user_id'=>$request->user->id])->findOrEmpty(); if($photographer->isEmpty()){ throw new Exception('未找到您的摄影师信息,操作失败'); } $order = PhotoServiceOrder::where(['out_trade_no'=>$data['out_trade_no']])->findOrEmpty(); if($order->isEmpty()){ throw new Exception('未找到订单信息'); } if($order->photographer_id != $photographer->id){ throw new Exception('非该订单摄影师不能操作'); } $order->save([ ]); }catch (Exception $e){ return [ 'code' => ResponseCode::FAIL, 'msg' => $e->getMessage() ]; } } /** * @desc 取消订单 * @param $request * @return array|void */ public function cancelPhotoOrder($request) { try { }catch (Exception $e){ return [ 'code' => ResponseCode::FAIL, 'msg' => $e->getMessage() ]; } } }