course/app/common/service/PhotoServiceOrderService.php

378 lines
13 KiB
PHP
Raw Normal View History

<?php
namespace app\common\service;
use app\common\model\DepositOrder;
use app\common\model\PaidService;
use app\common\model\Photographer;
use app\common\model\PhotoService;
use app\common\model\PhotoServiceOrder;
use app\constant\ResponseCode;
use support\Redis;
use think\Exception;
class PhotoServiceOrderService
{
const NOTIFY_URL = '/notify/WechatPayNotify/photo_notify';
const NOTIFY_DEPOSIT_URL = '/notify/WechatPayNotify/photo_deposit_notify';
public function pay($request)
{
try {
$data = $request->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()
];
}
}
}