378 lines
13 KiB
PHP
378 lines
13 KiB
PHP
![]() |
<?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()
|
||
|
];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|