Merge branch 'feature/purchase_record' into dev

# Conflicts:
#	vendor/composer/installed.php
This commit is contained in:
luofei 2023-07-04 14:42:00 +08:00
commit 758687c8bd
21 changed files with 499 additions and 49 deletions

View File

@ -114,7 +114,7 @@ class StoreCartDao extends BaseDao
->append(['bc_extension_one', 'bc_extension_two']);
},
'merchant' => function (Relation $query) use ($uid) {
$query->field('mer_id,mer_name,mer_state,mer_avatar,delivery_way,commission_rate,category_id,credit_buy')->with(['coupon' => function ($query) use ($uid) {
$query->field('mer_id,mer_name,mer_state,mer_avatar,delivery_way,commission_rate,category_id,credit_buy,settle_cycle,interest_rate')->with(['coupon' => function ($query) use ($uid) {
$query->where('uid', $uid);
},
'config' => function ($query) {

View File

@ -91,6 +91,9 @@ class StoreOrderDao extends BaseDao
->when(isset($where['activity_type']) && $where['activity_type'] != '', function ($query) use ($where) {
$query->where('activity_type', $where['activity_type']);
})
->when(isset($where['product_type']) && $where['product_type'] != '', function ($query) use ($where) {
$query->where('activity_type', $where['product_type']);
})
->when(isset($where['status']) && $where['status'] !== '', function ($query) use ($where) {
switch ($where['status']) {
case 0 :

View File

@ -49,6 +49,9 @@ class MerchantDao extends BaseDao
->when($is_del !== null, function ($query) use ($is_del) {
$query->where('is_del', $is_del);
})
->when(isset($where['credit_buy']) && $where['credit_buy'] !== '', function ($query) use ($where) {
$query->where('credit_buy', $where['credit_buy']);
})
->when(isset($where['is_trader']) && $where['is_trader'] !== '', function ($query) use ($where) {
$query->where('is_trader', $where['is_trader']);
})

View File

@ -110,4 +110,10 @@ class StoreGroupOrder extends BaseModel
}
return $params;
}
public function interest()
{
return $this->hasOne(StoreOrderInterest::class, 'group_order_id', 'group_order_id');
}
}

View File

@ -26,6 +26,9 @@ use app\common\repositories\store\MerchantTakeRepository;
class StoreOrder extends BaseModel
{
const STATUS_WAIT_CONFIRM = 12; //待确认
const STATUS_WAIT_PAY = 0; //待支付
public static function tablePk(): ?string
{
return 'order_id';
@ -177,4 +180,15 @@ class StoreOrder extends BaseModel
{
return StoreRefundOrder::where('order_id',$this->order_id)->where('status',3)->sum('refund_price');
}
public function interest()
{
return $this->hasOne(StoreOrderInterest::class, 'order_id', 'order_id');
}
public function allowCreditPay()
{
return $this->pay_type == StoreGroupOrder::PAY_TYPE_CREDIT_BUY && $this->status == self::STATUS_WAIT_PAY;
}
}

View File

@ -0,0 +1,35 @@
<?php
namespace app\common\model\store\order;
use app\common\model\BaseModel;
class StoreOrderInterest extends BaseModel
{
const STATUS_SETTLED = 1; //已结算
const STATUS_UNSETTLED = 0; //未结算
public static function tablePk(): ?string
{
return 'id';
}
public static function tableName(): string
{
return 'store_order_interest';
}
/**
* 计算利息
* @return string
*/
public function calculateInterest()
{
$days = ceil((time() - strtotime($this->start_time)) / 86400);
$days = max($days ,0);
$money = bcmul($this->total_price, $this->rate, 2);
return bcmul($days, $money, 2);
}
}

View File

@ -4,6 +4,7 @@ namespace app\common\repositories\store\order;
use app\common\dao\store\order\StoreCartDao;
use app\common\model\store\order\StoreGroupOrder;
use app\common\model\store\order\StoreOrder;
use app\common\repositories\store\coupon\StoreCouponRepository;
use app\common\repositories\store\coupon\StoreCouponUserRepository;
use app\common\repositories\store\product\ProductAssistSkuRepository;
@ -96,6 +97,9 @@ class StoreOrderCreateRepository extends StoreOrderRepository
}
}
}
if ($order_type == 98 && count($merchantCartList) > 1) {
throw new ValidateException('采购商品不支持跨店购买');
}
unset($merchantCart, $cart);
$order_price = 0;
@ -925,7 +929,7 @@ class StoreOrderCreateRepository extends StoreOrderRepository
$extend = [];
}
$orderType = $orderInfo['order_type'];
if (!in_array($orderType, [98, 0]) && (count($orderInfo['order']) > 1 || ($orderType != 10 && count($orderInfo['order'][0]['list']) > 1))) {
if ($orderType != 0 && (count($orderInfo['order']) > 1 || ($orderType != 10 && count($orderInfo['order'][0]['list']) > 1))) {
throw new ValidateException('活动商品请单独购买');
}
@ -1216,6 +1220,9 @@ class StoreOrderCreateRepository extends StoreOrderRepository
$orderProduct = [];
$orderStatus = [];
foreach ($orderList as $order) {
if ($order['pay_type'] == StoreGroupOrder::PAY_TYPE_CREDIT_BUY) {
$order['status'] = StoreOrder::STATUS_WAIT_CONFIRM;
}
$cartInfo = $order['cartInfo'];
unset($order['cartInfo']);
//创建子订单

View File

@ -0,0 +1,28 @@
<?php
namespace app\common\repositories\store\order;
use app\common\model\store\order\StoreOrderInterest;
use app\common\repositories\BaseRepository;
class StoreOrderInterestRepository extends BaseRepository
{
public function create($data)
{
$data['status'] = StoreOrderInterest::STATUS_UNSETTLED;
$model = new StoreOrderInterest();
return $model->insert($data);
}
public function getByGroupOrder($groupOrderId)
{
return StoreOrderInterest::where('group_order_id', $groupOrderId)->find();
}
public function getByOrder($orderId)
{
return StoreOrderInterest::where('order_id', $orderId)->find();
}
}

View File

@ -14,6 +14,7 @@ namespace app\common\repositories\store\order;
use app\common\dao\store\order\StoreOrderDao;
use app\common\model\store\order\StoreGroupOrder;
use app\common\model\store\order\StoreOrder;
use app\common\model\store\order\StoreOrderInterest;
use app\common\model\user\User;
use app\common\repositories\BaseRepository;
use app\common\repositories\delivery\DeliveryOrderRepository;
@ -1689,8 +1690,17 @@ class StoreOrderRepository extends BaseRepository
$order->presell_price = $order->pay_price;
}
}
if ($order->pay_type == StoreGroupOrder::PAY_TYPE_CREDIT_BUY && $order->interest) {
$order->interest_start_time = $order->interest->start_time;
$order->interest_status = $order->interest->status;
if ($order->interest_status == StoreOrderInterest::STATUS_SETTLED) {
$order->interest_money = $order->interest->interest;
} else {
$order->interest_money = $order->interest->calculateInterest();
}
}
$order->takeOrderCount = count($order['takeOrderList']);
unset($order['takeOrderList']);
unset($order['takeOrderList'], $order->interest);
}
return compact( 'count','list');
@ -2419,4 +2429,108 @@ class StoreOrderRepository extends BaseRepository
return true;
}
/**
* 订单结算
* @param $id
* @param $type
* @param $user
* @return array
* @throws Exception
*/
public function settle($id, $type, $user)
{
/** @var StoreGroupOrderRepository $groupOrderRepository */
$groupOrderRepository = app()->make(StoreGroupOrderRepository::class);
$groupOrderRepository->getAll = true;
Db::startTrans();
try {
$groupOrder = $groupOrderRepository->detail($user['uid'], $id, false);
if (!$groupOrder) {
throw new Exception('订单不存在或已支付');
}
if (!$groupOrder->interest || $groupOrder->interest->status == StoreOrderInterest::STATUS_SETTLED) {
throw new Exception('订单无需结算');
}
$interest = $groupOrder->interest->calculateInterest();
$payMoney = bcadd($groupOrder->interest->total_price, $interest, 2);
$result = true;
$data = ['type' => $type, 'order_id' => $groupOrder->group_order_id, 'paid' => true];
if ($payMoney > 0) {
if (!in_array($type, ['balance', 'scrcu'])) {
if (systemConfig('open_wx_combine')) {
$service = new CombinePayService($type, $groupOrder->getCombinePayParams());
} else {
$service = new PayService($type, $groupOrder->getPayParams($type === 'alipay' ? request()->param('return_url') : ''));
}
$result = $service->pay($user);
$data = array_merge($data, $result, ['paid' => false]);
} else {
$payTool = PayTool::instance($type);
$groupOrder->pay_price = $payMoney;
$result = $payTool->pay($groupOrder);
}
}
if ($result === true) {
$groupOrder->interest->status = StoreOrderInterest::STATUS_SETTLED;
$groupOrder->interest->settle_time = date('Y-m-d H:i:s');
$groupOrder->interest->interest = $interest;
$groupOrder->interest->save();
/** @var UserBillRepository $userBillRepository */
$userBillRepository = app()->make(UserBillRepository::class);
$userBillRepository->decBill($user['uid'], 'now_money', 'pay_product', [
'link_id' => $groupOrder['group_order_id'],
'status' => 1,
'title' => '购买商品',
'number' => $groupOrder['pay_price'],
'mark' => '余额支付支付' . floatval($groupOrder['pay_price']) . '元购买商品',
'balance' => $user->now_money
]);
$unSettleCount = StoreOrderInterest::where('mer_id', $groupOrder->interest->mer_id)->where('status', 0)->count();
if ($unSettleCount === 0) {
/** @var MerchantRepository $merchantRepo */
$merchantRepo = app()->make(MerchantRepository::class);
$merchantRepo->unfreeze($groupOrder->interest->mer_id);
}
}
Db::commit();
return $data;
} catch (\Exception $e) {
Db::rollback();
throw new Exception($e->getMessage());
}
}
/**
* 确认接单
* @param $user
* @param $id
* @return void
* @throws Exception
*/
public function confirm($user, $id)
{
/** @var StoreGroupOrderRepository $groupOrderRepository */
$groupOrderRepository = app()->make(StoreGroupOrderRepository::class);
$groupOrderRepository->getAll = true;
Db::startTrans();
try {
$groupOrder = $groupOrderRepository->detail($user['uid'], $id, false);
if ($groupOrder->pay_type != StoreGroupOrder::PAY_TYPE_CREDIT_BUY) {
throw new Exception('订单类型错误');
}
$order = $groupOrder->orderList[0];
if ($order->status != StoreOrder::STATUS_WAIT_CONFIRM) {
throw new Exception('订单状态错误');
}
$order->status = StoreOrder::STATUS_WAIT_PAY;
$order->save();
Db::commit();
} catch (\Exception $e) {
Db::rollback();
throw new Exception($e->getMessage());
}
}
}

View File

@ -2299,4 +2299,51 @@ class ProductRepository extends BaseRepository
return true;
}
/**
* 导入商品
* @param $product_id
* @param $user
* @return bool
* @throws \Exception
*/
public function import($product_id, $user)
{
$mer_id = Db::name('store_service')->where('uid', $user['uid'])->where('status', 1)->value('mer_id');
if ($mer_id == 0) {
throw new \Exception('商户不存在');
}
$find = Db::name('store_product')->where('product_id', $product_id)->find();
if ($find) {
if ($find['product_type'] != 0) {
throw new \Exception('该商品不是普通商品');
}
$exist = Db::name('store_product')->where('old_product_id', $product_id)->where('mer_id', $mer_id)->find();
if ($exist) {
throw new \Exception('已经导入过该商品了');
}
$find['attrValue'] = Db::name('store_product_attr_value')->where('product_id', $find['product_id'])->field('image,price,cost,ot_price,svip_price,stock,bar_code,weight,volume')->select();
$find['content'] = Db::name('store_product_content')->where('product_id', $find['product_id'])->value('content');
$find['is_show'] = 0;
$find['mer_id'] = $mer_id;
$find['temp_id'] = "";
$find['give_coupon_ids'] = [];
$find['params'] = [];
$find['extend'] = [];
$find['param_temp_id'] = [];
$find['mer_labels'] = [];
$find['attr'] = [];
$find['delivery_way'] = [0 => "2"];
$find["guarantee_template_id"] = "";
$find['product_type'] = 0;
$find['mer_cate_id'] = [0 => 0];
$find['is_used'] = 1;
$find['status'] = 1;
$find['mer_status'] = 1;
$find['old_product_id'] = $product_id;
$find['slider_image'] = explode(',', $find['slider_image']);
unset($find['product_id'], $find['create_time']);
}
return $this->create($find, 0);
}
}

View File

@ -290,7 +290,7 @@ class MerchantRepository extends BaseRepository
*/
public function getList($where, $page, $limit, $userInfo)
{
$field = 'care_count,is_trader,type_id,mer_id,mer_banner,mini_banner,mer_name, mark,mer_avatar,product_score,service_score,postage_score,sales,status,is_best,create_time,long,lat,is_margin,service_phone,mer_address,mer_info';
$field = 'care_count,is_trader,type_id,mer_id,mer_banner,mini_banner,mer_name, mark,mer_avatar,product_score,service_score,postage_score,sales,status,is_best,create_time,long,lat,is_margin,service_phone,mer_address,mer_info,credit_buy,settle_cycle,interest_rate';
$where['status'] = 1;
$where['mer_state'] = 1;
$where['is_del'] = 0;
@ -743,5 +743,34 @@ class MerchantRepository extends BaseRepository
return [$income, $finance, true];
}
/**
* 冻结商户提现
* @param $merchantId
* @return void
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
public function freeze($merchantId)
{
$merchant = $this->get($merchantId);
$merchant->is_fronze = 1;
$merchant->save();
}
/**
* 解冻商户提现
* @param $merchantId
* @return void
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
public function unfreeze($merchantId)
{
$merchant = $this->get($merchantId);
$merchant->is_fronze = 0;
$merchant->save();
}
}

View File

@ -54,7 +54,7 @@ class Merchant extends BaseController
public function lst()
{
[$page, $limit] = $this->getPage();
$where = $this->request->params(['keyword', 'order', 'is_best', 'location', 'category_id', 'type_id','is_trader', 'street_id']);
$where = $this->request->params(['keyword', 'order', 'is_best', 'location', 'category_id', 'type_id','is_trader', 'street_id', 'credit_buy']);
if (empty($where['type_id'])) {
$where['type_id'] = [MerchantModel::TypeCloudWarehouse, MerchantModel::TypeStore, MerchantModel::TypeSupplyChain, MerchantModel::TypePlatform];
}
@ -283,6 +283,9 @@ class Merchant extends BaseController
if ($this->userInfo['uid'] != $merchant->uid){
return app('json')->fail('你不是管理员无法进行提现操作');
}
if ($merchant->is_frozen){
return app('json')->fail('账户被冻结,无法进行提现操作');
}
$bankInfo = [
'name' => $data['financial_bank_name'],
'bank' => $data['financial_bank_bank'],

View File

@ -106,11 +106,11 @@ class StoreOrder extends BaseController
return $orderCreateRepository->v2CreateOrder(array_search($payType, StoreOrderRepository::PAY_TYPE), $this->request->userInfo(), $cartId, $extend, $mark, $receipt_data, $takes, $couponIds, $useIntegral, $addressId, $post);
});
if ($groupOrder['pay_price'] == 0 || $groupOrder['pay_type'] == StoreGroupOrder::PAY_TYPE_CREDIT_BUY) {
if ($groupOrder['pay_price'] == 0) {
$this->repository->paySuccess($groupOrder);
return app('json')->status('success', '支付成功', ['order_id' => $groupOrder['group_order_id']]);
}
if ($isPc) {
if ($isPc || $groupOrder['pay_type'] == StoreGroupOrder::PAY_TYPE_CREDIT_BUY) {
return app('json')->success(['order_id' => $groupOrder->group_order_id]);
}
try {
@ -240,6 +240,9 @@ class StoreOrder extends BaseController
if (!$groupOrder)
return app('json')->fail('订单不存在或已支付');
$this->repository->changePayType($groupOrder, array_search($type, StoreOrderRepository::PAY_TYPE));
if ($groupOrder['pay_type'] == StoreGroupOrder::PAY_TYPE_CREDIT_BUY && !$groupOrder->orderList[0]->allowCreditPay()) {
return app('json')->fail('请等待商家确认订单');
}
if ($groupOrder['pay_price'] == 0 || $groupOrder['pay_type'] == StoreGroupOrder::PAY_TYPE_CREDIT_BUY) {
$this->repository->paySuccess($groupOrder);
return app('json')->status('success', '支付成功', ['order_id' => $groupOrder['group_order_id']]);
@ -298,4 +301,37 @@ class StoreOrder extends BaseController
$res = $orderRepository->show($id, $this->request->uid());
return app('json')->success($res);
}
/**
* 订单结算
* @return mixed
* @throws \Psr\SimpleCache\InvalidArgumentException
*/
public function settle()
{
$id = $this->request->param('id/d');
$type = $this->request->param('type');
try {
$data = $this->repository->settle($id, $type, $this->request->userInfo());
return app('json')->success('success', $data);
} catch (\Exception $e) {
return app('json')->fail($e->getMessage());
}
}
/**
* 确认接单
* @return mixed
*/
public function confirm()
{
$id = $this->request->param('id/d');
try {
$this->repository->confirm($this->request->userInfo(), $id);
return app('json')->success('success');
} catch (\Exception $e) {
return app('json')->fail($e->getMessage());
}
}
}

View File

@ -50,42 +50,13 @@ class StoreMicro extends BaseController
public function ProductImport(){
$product_id = $this->request->param('id', 0);
$user = $this->request->userInfo();
$mer_id =Db::name('store_service')->where('uid',$user['uid'])->where('status',1)->value('mer_id');
if ($mer_id==0) return app('json')->fail('商户id不能为空');
$find=Db::name('store_product')->where('product_id',$product_id)->find();
if($find){
if($find['product_type']!=0){
return app('json')->fail('该商品不是普通商品');
}
$exist = Db::name('store_product')->where('old_product_id', $product_id)->where('mer_id', $mer_id)->find();
if($exist){
return app('json')->fail('已经导入过该商品了');
}
$find['attrValue']=Db::name('store_product_attr_value')->where('product_id',$find['product_id'])->field('image,price,cost,ot_price,svip_price,stock,bar_code,weight,volume')->select();
$find['content']=Db::name('store_product_content')->where('product_id',$find['product_id'])->value('content');
$find['is_show']=0;
$find['mer_id']=$mer_id;
$find['temp_id']="";
$find['give_coupon_ids']=[];
$find['params']=[];
$find['extend']=[];
$find['param_temp_id']=[];
$find['mer_labels']=[];
$find['attr']=[];
$find['delivery_way']=[ 0 => "2"];
$find["guarantee_template_id"] = "";
$find['product_type']=0;
$find['mer_cate_id']=[0 => 0];
$find['is_used']=1;
$find['status']=1;
$find['mer_status']=1;
$find['old_product_id']=$product_id;
$find['slider_image']=explode(',',$find['slider_image']);
unset($find['product_id'],$find['create_time']);
try {
/** @var ProductRepository $productRepository */
$productRepository = app()->make(ProductRepository::class);
$a = $productRepository->import($product_id, $user);
} catch (\Exception $e) {
return app('json')->fail($e->getMessage());
}
/** @var ProductRepository $make */
$make = app()->make(ProductRepository::class);
$a=$make->create($find,0);
if($a){
return app('json')->success(['data'=>$a,'msg'=>'导入成功']);
}else{

View File

@ -55,6 +55,7 @@ return [
\crmeb\listens\AuthCancelActivityListen::class,
\crmeb\listens\CloseUserSvipListen::class,
\crmeb\listens\SendSvipCouponListen::class,
\crmeb\listens\AutoUnfreezeMerchantListen::class,
] : [],
'pay_success_user_recharge' => [\crmeb\listens\pay\UserRechargeSuccessListen::class],
'pay_success_user_order' => [\crmeb\listens\pay\UserOrderSuccessListen::class],
@ -67,6 +68,7 @@ return [
'product.create'=>[\app\listener\ProductCreate::class],
'product.sell'=>[\app\listener\CloudProduct::class], //商品上下架
'refund.after'=>[\app\listener\AfterRefund::class],
'order.take'=>[\app\listener\OrderTake::class],
],
'subscribe' => [],

View File

@ -0,0 +1,37 @@
<?php
declare (strict_types=1);
namespace app\listener;
use app\common\model\system\merchant\Merchant;
use app\common\repositories\store\order\StoreOrderInterestRepository;
/**
* 订单确认收货后置事件
*/
class OrderTake
{
public function handle($event)
{
$order = $event['order'];
if ($order['merchant']['interest_rate'] <= 0) {
return true;
}
/** @var StoreOrderInterestRepository $storeOrderInterestRepository */
$storeOrderInterestRepository = app()->make(StoreOrderInterestRepository::class);
$merchantId = Merchant::where('uid', $order['uid'])->value('mer_id');
$data = [
'group_order_id' => $order['group_order_id'],
'order_id' => $order['order_id'],
'mer_id' => $merchantId,
'to_mer_id' => $order['mer_id'],
'total_price' => $order['total_price'],
'rate' => $order['merchant']['interest_rate'],
'start_time' => date('Y-m-d H:i:s', strtotime("+{$order['merchant']['settle_cycle']} days")),
];
return $storeOrderInterestRepository->create($data);
}
}

View File

@ -29,6 +29,7 @@ class MerchantUpdateValidate extends Validate
'mer_address|店铺地址' => 'require|max:128',
'long|店铺经度' => 'max:24',
'lat|店铺纬度' => 'max:24',
'interest_rate|利率' => 'max:0.05',
];
protected function isPhone($val)

View File

@ -0,0 +1,35 @@
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace crmeb\listens;
use app\common\model\store\order\StoreOrderInterest;
use app\common\repositories\system\merchant\MerchantRepository;
use crmeb\interfaces\ListenerInterface;
use crmeb\services\TimerService;
class AutoUnfreezeMerchantListen extends TimerService implements ListenerInterface
{
public function handle($event): void
{
$this->tick(1000 * 60, function () {
request()->clearCache();
$unSettle = StoreOrderInterest::whereTime('start_time', '<=', time())->where('status', 0)->group('mer_id')->column('mer_id');
/** @var MerchantRepository $merchantRepo */
$merchantRepo = app()->make(MerchantRepository::class);
foreach ($unSettle as $merId) {
$merchantRepo->freeze($merId);
}
});
}
}

View File

@ -0,0 +1,82 @@
<?php
namespace crmeb\services\payTool;
class Balance extends PayTool
{
public $order;
public function __construct()
{
}
/**
* 发起支付
* @param $order
* @return bool
* @throws \Exception
*/
public function pay($order)
{
$user = request()->userInfo();
if (!systemConfig('yue_pay_status')) {
throw new \Exception('未开启余额支付');
}
if ($user['now_money'] < $order['pay_price']) {
throw new \Exception('余额不足,请更换支付方式');
}
$user->now_money = bcsub($user->now_money, $order['pay_price'], 2);
if (!$user->save()) {
throw new \Exception('用户余额扣减失败');
}
return true;
}
/**
* 查询
* @param $order
* @return string
* @throws \Exception
*/
public function query($order)
{
}
/**
* 退款
* @param $order
* @return string
* @throws \Exception
*/
public function refund($order)
{
}
/**
* 发起请求
* @param $body
* @return string
* @throws \Exception
*/
public function request($body)
{
}
public function success()
{
}
public function callback($request = null)
{
}
public function refundQuery($refundOrder)
{
}
public function transfer($withdraw)
{
}
}

View File

@ -7,21 +7,16 @@ abstract class PayTool
public $config;
public $error = ['success' => false];
const Scrcu = 'scrcu';
const ClassMap = [
self::Scrcu => Scrcu::class,
];
/**
* @param $name
* @param $params
* @return mixed|Scrcu
* @return mixed|PayTool
* @throws \Exception
*/
public static function instance($name, $params = [])
{
$class = self::ClassMap[$name];
$class = 'crmeb\services\payTool\\' . ucfirst($name);
if (class_exists($class)) {
return new $class($params);
}

View File

@ -90,6 +90,8 @@ Route::group('api/', function () {
Route::get('verify_code/:id', '/verifyCode');
Route::post('receipt/:id', '/createReceipt');
Route::get('delivery/:id', '/getOrderDelivery');
Route::post('settle', '/settle');
Route::post('confirm', '/confirm');
})->prefix('api.store.order.StoreOrder');
// 预售