Browse Source

当面付订单页面,当面付下单+支付

master
weigang 5 years ago
parent
commit
f9e9edfa17
  1. 8
      app/Controller/v3/HomeController.php
  2. 66
      app/Controller/v3/OrderOfflineController.php
  3. 17
      app/Model/v3/Order.php
  4. 21
      app/Model/v3/OrderGoods.php
  5. 5
      app/Model/v3/Store.php
  6. 45
      app/Request/v3/OrderOfflineRequest.php
  7. 95
      app/Service/v3/Implementations/OrderOfflineService.php
  8. 15
      app/Service/v3/Implementations/OrderOnlineService.php
  9. 6
      app/Service/v3/Implementations/PaymentService.php
  10. 30
      app/Service/v3/Implementations/StoreInfoService.php
  11. 5
      app/Service/v3/Implementations/StoreService.php
  12. 10
      app/Service/v3/Interfaces/OrderOfflineServiceInterface.php
  13. 2
      app/Service/v3/Interfaces/PaymentServiceInterface.php
  14. 1
      config/autoload/dependencies.php
  15. 2
      config/routes.php

8
app/Controller/v3/HomeController.php

@ -13,7 +13,7 @@ use App\Service\v3\Interfaces\BannerServiceInterface;
use App\Service\v3\Interfaces\CategoryServiceInterface;
use App\Service\v3\Interfaces\CollectStoreServiceInterface;
use App\Service\v3\Interfaces\CouponServiceInterface;
use App\Service\v3\Interfaces\StoreInfoServiceInterface;
use App\Service\v3\Interfaces\StoreServiceInterface;
use App\Service\v3\Interfaces\TabsServiceInterface;
use App\Service\v3\Interfaces\UserCenterBlockServiceInterface;
use App\Service\v3\Interfaces\UserInfoServiceInterface;
@ -56,9 +56,9 @@ class HomeController extends BaseController
/**
* @Inject
* @var StoreInfoServiceInterface
* @var StoreServiceInterface
*/
protected $storeInfoService;
protected $storeService;
/**
* @Inject
@ -149,7 +149,7 @@ class HomeController extends BaseController
public function storeIndex()
{
$data['detail'] = $this->storeInfoService->detail();
$data['detail'] = $this->storeInfoService->detail(1);
$data['order_online'] = [
'count' => 6549,
'total' => 12654.12

66
app/Controller/v3/OrderOfflineController.php

@ -0,0 +1,66 @@
<?php
namespace App\Controller\v3;
use App\Controller\BaseController;
use App\Request\v3\OrderOfflineRequest;
use App\Request\v3\OrderOnlineRequest;
use App\Service\v3\Interfaces\OrderOfflineServiceInterface;
use App\Service\v3\Interfaces\StoreServiceInterface;
use Hyperf\Validation\ValidationException;
use Hyperf\Di\Annotation\Inject;
class OrderOfflineController extends BaseController
{
/**
* @Inject
* @var StoreServiceInterface
*/
protected $storeService;
/**
* @Inject
* @var OrderOfflineServiceInterface
*/
protected $orderOfflineService;
/**
* 当面付的页面详情
* 1、上传store_id,获取商户相关信息
* 2、返回商户相关信息即可
*/
public function review()
{
$validator = $this->validationFactory->make(
$this->request->all(),
['store_id' => 'required|nonempty'],
['*.*' => '商户ID参数异常']
);
if ($validator->fails()) {
throw new ValidationException($validator);
}
$params = $validator->validated();
$store = $this->storeService->detail($params['store_id']);
return $this->success(['store' => $store]);
}
/**
* 当面付下单支付
* 1、用户id、去商户id下支付、支付的金额
* 2、下单同时支付,下发支付参数
* @param OrderOfflineRequest $request
*/
public function add(OrderOfflineRequest $request)
{
$params = $request->validated();
$data = $this->orderOfflineService->do(
$params['store_id'],
$params['user_id'],
$params['money'],
$params['plat']
);
return $this->success(['data' => $data]);
}
}

17
app/Model/v3/Order.php

@ -12,6 +12,23 @@ class Order extends Model
'created_at_text',
];
protected $fillable = [
'order_main_id',
'user_id',
'store_id',
'refund_time',
'status',
'money',
'oid',
'order_num',
'refuse_refund_note',
'note',
'created_at',
'updated_at',
'deleted_at',
'refund_note',
];
public function getCreatedAtTextAttribute()
{
return date('Y-m-d H:i:s', $this->attributes['created_at']);

21
app/Model/v3/OrderGoods.php

@ -17,6 +17,27 @@ class OrderGoods extends Model
'tags'
];
protected $fillable = [
'order_id',
'goods_id',
'activity_type',
'number',
'status',
'price',
'original_price',
'vip_price',
'name',
'goods_unit',
'cover_img',
'spec',
'refund_time',
'created_at',
'updated_at',
'deleted_at',
'refuse_refund_note',
'refund_note',
];
public function goods()
{
return $this->belongsTo(Goods::class, 'goods_id', 'id');

5
app/Model/v3/Store.php

@ -72,4 +72,9 @@ class Store extends Model
{
return $this->hasMany(ShoppingCart::class, 'store_id', 'id');
}
public function market()
{
return $this->belongsTo(Market::class, 'market_id', 'id');
}
}

45
app/Request/v3/OrderOfflineRequest.php

@ -0,0 +1,45 @@
<?php
declare(strict_types=1);
namespace App\Request\v3;
use App\Request\BaseFormRequest;
class OrderOfflineRequest extends BaseFormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*/
public function rules(): array
{
return [
'store_id' => 'required|nonempty|integer',
'user_id' => 'required|nonempty|integer',
'money' => 'required|nonempty',
'plat' => 'nonempty',
];
}
public function messages(): array
{
return [
'*.*' => ':attribute 参数异常'
];
}
public function attributes(): array
{
return [
];
}
}

95
app/Service/v3/Implementations/OrderOfflineService.php

@ -0,0 +1,95 @@
<?php
namespace App\Service\v3\Implementations;
use App\Constants\v3\ErrorCode;
use App\Constants\v3\LogLabel;
use App\Constants\v3\OrderState;
use App\Constants\v3\OrderType;
use App\Exception\ErrorCodeException;
use App\Model\v3\Order;
use App\Model\v3\OrderMain;
use App\Model\v3\Store;
use App\Service\v3\Interfaces\OrderOfflineServiceInterface;
use App\Service\v3\Interfaces\PaymentServiceInterface;
use Hyperf\DbConnection\Db;
use Hyperf\Snowflake\IdGeneratorInterface;
use Hyperf\Utils\ApplicationContext;
use Hyperf\Di\Annotation\Inject;
class OrderOfflineService implements OrderOfflineServiceInterface
{
/**
* @Inject
* @var PaymentServiceInterface
*/
protected $paymentService;
public function do($storeId, $userId, $money, $plat ='')
{
try {
$store = Store::find($storeId);
// 获取分布式全局ID
$generator = ApplicationContext::getContainer()->get(IdGeneratorInterface::class);
$globalOrderId = $generator->generate();
$dataMain = [
'market_id' => $store->market_id,
'order_num' => $globalOrderId,
'global_order_id' => $globalOrderId,
'user_id' => $userId,
'type' => OrderType::OFFLINE,
'money' => $money,
'total_money' => $money,
'services_money' => 0,
'coupon_money' => 0,
'delivery_money' => 0,
'state' => OrderState::UNPAID,
'tel' => '',
'address' => '',
'lat' => '',
'lng' => '',
'name' => '',
'plat' => $plat,
'delivery_time_note' => ''
];
$orderMain = OrderMain::create($dataMain);
$orderMainId = $orderMain->id;
// 子订单数据
$dataChildren = [
'order_main_id' => $orderMainId,
'user_id' => $userId,
'store_id' => $storeId,
'money' => $money,
'order_num' => date('YmdHis').mt_rand(1000, 9999),
'note' => ''
];
$orderChild = Order::create($dataChildren);
$orderChildId = $orderChild->id;
Db::commit();
// 支付
return $this->paymentService->do($globalOrderId, $money, $userId, config('site_host') . '/wechat/notify/wxminioffline');
} catch (\Exception $e) {
Db::rollBack();
$this->log->event(LogLabel::ORDER_ONLINE_LOG, ['exception_msg' => $e->getMessage()]);
throw new ErrorCodeException(ErrorCode::ORDER_ONLINE_FAIL);
}
}
public function check()
{
// TODO: Implement check() method.
}
public function undo()
{
// TODO: Implement undo() method.
}
}

15
app/Service/v3/Implementations/OrderOnlineService.php

@ -227,7 +227,7 @@ class OrderOnlineService implements OrderOnlineServiceInterface
// 获取分布式全局ID
$generator = ApplicationContext::getContainer()->get(IdGeneratorInterface::class);
$global_order_id = $generator->generate();
$globalOrderId = $generator->generate();
$orderAmount = bcadd((string)$orderAmount, '0', 2);
$totalAmount = bcadd((string)$totalAmount, (string)$orderAmount);
@ -242,8 +242,8 @@ class OrderOnlineService implements OrderOnlineServiceInterface
$dataMain = [
'market_id' => $marketId,
'order_num' => $global_order_id,
'global_order_id' => $global_order_id,
'order_num' => $globalOrderId,
'global_order_id' => $globalOrderId,
'user_id' => $userId,
'type' => OrderType::ONLINE,
'money' => $totalAmount,
@ -262,16 +262,19 @@ class OrderOnlineService implements OrderOnlineServiceInterface
];
// 生成主订单
$orderMain = OrderMain::create($dataMain);
$orderMain = OrderMain::query()->create($dataMain);
$orderMainId = $orderMain->id;
// 处理子订单
foreach ($dataChildren as $key => &$child) {
$child['order_main_id'] = $orderMainId;
$orderChildId = Order::query()->insertGetId($child);
$orderChild = Order::query()->create($child);
$orderChildId = $orderChild->id;
foreach ($dataOrderGoods[$child['store_id']] as $k => &$orderGoods) {
$orderGoods['order_id'] = $orderChildId;
$orderGoods['created_at'] = $currentTime;
$orderGoods['updated_at'] = $currentTime;
}
OrderGoods::query()->insert($dataOrderGoods[$child['store_id']]);
}
@ -341,7 +344,7 @@ class OrderOnlineService implements OrderOnlineServiceInterface
Db::commit();
// 支付
return $this->paymentService->do($global_order_id, $totalAmount, $userId);
return $this->paymentService->do($globalOrderId, $totalAmount, $userId, config('site_host') . '/wechat/notify/wxminionline');
} catch (\Exception $e) {
Db::rollBack();
$this->log->event(LogLabel::ORDER_ONLINE_LOG, ['exception_msg' => $e->getMessage()]);

6
app/Service/v3/Implementations/PaymentService.php

@ -29,7 +29,7 @@ class PaymentService implements PaymentServiceInterface
*/
protected $goodsActivityService;
public function do($globalOrderId, $money, $userId)
public function do($globalOrderId, $money, $userId, $notifyUrl)
{
try {
@ -55,10 +55,10 @@ class PaymentService implements PaymentServiceInterface
$user = User::select('openid')->find($userId);
$result = $app->order->unify([
'body' => '懒族生活 - 外卖下单',
'body' => '懒族生活',
'out_trade_no' => $orderMain->global_order_id,
'total_fee' => $payMoney,
'notify_url' => config('site_host') . '/wechat/notify/wxminionline',
'notify_url' => $notifyUrl,
'trade_type' => 'JSAPI',
'openid' => $user['openid'],
]);

30
app/Service/v3/Implementations/StoreInfoService.php

@ -1,30 +0,0 @@
<?php
namespace App\Service\v3\Implementations;
use App\Service\v3\Interfaces\StoreInfoServiceInterface;
use App\Model\v3\Store;
class StoreInfoService implements StoreInfoServiceInterface
{
public function do()
{
// TODO: Implement do() method.
}
public function check()
{
}
public function undo()
{
// TODO: Implement undo() method.
}
public function detail()
{
return Store::query()->where('id',1)->first()->toArray();
}
}

5
app/Service/v3/Implementations/StoreService.php

@ -27,10 +27,7 @@ class StoreService implements StoreServiceInterface
public function detail($storeId)
{
return Store::query()
->select([
'id', 'name', 'logo', 'introduction', 'announcement', 'address', 'tel', 'stall_info',
'is_rest','time1', 'time2', 'time3', 'time4',
])
->with('market')
->where('id',$storeId)
->first()->toArray();
}

10
app/Service/v3/Interfaces/StoreInfoServiceInterface.php → app/Service/v3/Interfaces/OrderOfflineServiceInterface.php

@ -1,16 +1,10 @@
<?php
namespace App\Service\v3\Interfaces;
interface StoreInfoServiceInterface
interface OrderOfflineServiceInterface
{
public function do();
public function do($storeId, $userId, $money, $plat='');
public function check();
public function undo();
public function detail();
}

2
app/Service/v3/Interfaces/PaymentServiceInterface.php

@ -4,7 +4,7 @@ namespace App\Service\v3\Interfaces;
interface PaymentServiceInterface
{
public function do($globalOrderId, $money, $userId);
public function do($globalOrderId, $money, $userId, $notifyUrl);
public function check();
public function undo();
}

1
config/autoload/dependencies.php

@ -66,4 +66,5 @@ return [
\App\Service\v3\Interfaces\CouponRecServiceInterface::class => \App\Service\v3\Implementations\CouponRecService::class,
\App\Service\v3\Interfaces\PaymentServiceInterface::class => \App\Service\v3\Implementations\PaymentService::class,
\App\Service\v3\Interfaces\WithdrawalListServiceInterface::class => \App\Service\v3\Implementations\WithdrawalListService::class,
\App\Service\v3\Interfaces\OrderOfflineServiceInterface::class => \App\Service\v3\Implementations\OrderOfflineService::class,
];

2
config/routes.php

@ -109,6 +109,7 @@ Router::addGroup('/v3/', function () {
Router::post('shopCartUpdate/update', 'App\Controller\v3\ShopCartUpdateController@update');
Router::post('shopCart/detail', 'App\Controller\v3\ShopCartController@detail');
Router::post('orderOnline/review', 'App\Controller\v3\OrderOnlineController@review');
Router::post('orderOffline/review', 'App\Controller\v3\OrderOfflineController@review');
Router::post('storeLogin/login', 'App\Controller\v3\StoreLoginController@login');
Router::post('home/storeIndex', 'App\Controller\v3\HomeController@storeIndex');
Router::post('orderList/onlineForStore', 'App\Controller\v3\OrderListController@onlineForStore');
@ -116,6 +117,7 @@ Router::addGroup('/v3/', function () {
Router::post('collectStore/getListByUser', 'App\Controller\v3\CollectStoreController@getListByUser');
Router::post('balanceStatement/getRevenueListByUser', 'App\Controller\v3\BalanceStatementController@getRevenueListByUser');
Router::post('orderOnline/add', 'App\Controller\v3\OrderOnlineController@add');
Router::post('orderOffline/add', 'App\Controller\v3\OrderOfflineController@add');
Router::post('store/storeWithdrawalList', 'App\Controller\v3\BalanceStatementController@getWithdrawalListByStore');
Router::post('payment/wechatpayOnline', 'App\Controller\v3\PaymentController@wechatpayOnline');
},['middleware' => [\App\Middleware\Auth\ApiMiddleware::class, \App\Middleware\Auth\UserMiddleware::class]]);
Loading…
Cancel
Save