first
This commit is contained in:
34
modules/Mall/Http/Controllers/Api/ActivityController.php
Normal file
34
modules/Mall/Http/Controllers/Api/ActivityController.php
Normal file
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Mall\Http\Controllers\Api;
|
||||
|
||||
use App\Api\Controllers\Controller;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Modules\Mall\Http\Resources\Api\Activity\ActivityBaseResource;
|
||||
use Modules\Mall\Http\Resources\Api\Activity\ActivityResource;
|
||||
use Modules\Mall\Models\Activity;
|
||||
|
||||
class ActivityController extends Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* Notes: 活动列表
|
||||
*
|
||||
* @Author: 玄尘
|
||||
* @Date: 2022/7/27 11:26
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function index(): JsonResponse
|
||||
{
|
||||
$activities = Activity::shown()->get();
|
||||
|
||||
return $this->success(ActivityBaseResource::collection($activities));
|
||||
}
|
||||
|
||||
public function show(Activity $activity)
|
||||
{
|
||||
return $this->success(new ActivityResource($activity));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
160
modules/Mall/Http/Controllers/Api/AddressController.php
Normal file
160
modules/Mall/Http/Controllers/Api/AddressController.php
Normal file
@@ -0,0 +1,160 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Mall\Http\Controllers\Api;
|
||||
|
||||
use App\Api\Controllers\Controller;
|
||||
use Exception;
|
||||
use Illuminate\Http\Request;
|
||||
use Jason\Api\Api;
|
||||
use Modules\Mall\Http\Requests\Address\AddressRequest;
|
||||
use Modules\Mall\Http\Resources\Api\Address\AddressResource;
|
||||
use Modules\Mall\Models\Address;
|
||||
use Modules\Mall\Models\Region;
|
||||
|
||||
class AddressController extends Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* Notes: 地址列表
|
||||
*
|
||||
* @Author: <C.Jason>
|
||||
* @Date : 2020/11/5 5:09 下午
|
||||
* @return mixed
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$addresses = Address::byUser(Api::user())->orderBy('is_default', 'desc')->get();
|
||||
|
||||
return $this->success(AddressResource::collection($addresses));
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes: 创建地址,展示地区联动数据
|
||||
*
|
||||
* @Author: <C.Jason>
|
||||
* @Date : 2020/11/5 5:10 下午
|
||||
*/
|
||||
public function create(Request $request)
|
||||
{
|
||||
$parentId = $request->parent_id ?? 1;
|
||||
|
||||
$list = Region::where('parent_id', $parentId)->get();
|
||||
|
||||
return $this->success($list);
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes: 保存地址
|
||||
*
|
||||
* @Author: <C.Jason>
|
||||
* @Date : 2020/11/5 5:13 下午
|
||||
* @param \Modules\Mall\Http\Requests\Address\AddressRequest $request
|
||||
* @return mixed
|
||||
*/
|
||||
public function store(AddressRequest $request)
|
||||
{
|
||||
$result = Address::create([
|
||||
'user_id' => Api::userId(),
|
||||
'name' => $request->name,
|
||||
'mobile' => $request->mobile,
|
||||
'province_id' => $request->province_id,
|
||||
'city_id' => $request->city_id,
|
||||
'district_id' => $request->district_id,
|
||||
'address' => $request->address,
|
||||
'is_default' => $request->is_default,
|
||||
]);
|
||||
if ($result) {
|
||||
return $this->success('操作成功');
|
||||
} else {
|
||||
return $this->failed('失败');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes: 地址详情,如果不是自己的地址,不显示
|
||||
*
|
||||
* @Author: <C.Jason>
|
||||
* @Date : 2020/11/5 5:31 下午
|
||||
* @param Address $address
|
||||
* @return mixed
|
||||
*/
|
||||
public function show(Address $address)
|
||||
{
|
||||
if ($address->user()->isNot(Api::user())) {
|
||||
return $this->failed('', 404);
|
||||
}
|
||||
|
||||
return $this->success(new AddressResource($address));
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes: 设置默认地址
|
||||
*
|
||||
* @Author: <C.Jason>
|
||||
* @Date : 2020/11/5 5:34 下午
|
||||
* @param Address $address
|
||||
* @return mixed
|
||||
*/
|
||||
public function setDefault(Address $address)
|
||||
{
|
||||
if ($address->user()->isNot(Api::user())) {
|
||||
return $this->failed('', 404);
|
||||
}
|
||||
try {
|
||||
$address->setDefault();
|
||||
|
||||
return $this->success('操作成功');
|
||||
} catch (Exception $exception) {
|
||||
return $this->failed('失败');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes: 更新地址
|
||||
*
|
||||
* @Author: <C.Jason>
|
||||
* @Date : 2020/11/5 5:40 下午
|
||||
*/
|
||||
public function update(AddressRequest $request, Address $address)
|
||||
{
|
||||
if ($address->user()->isNot(Api::user())) {
|
||||
return $this->failed('', 404);
|
||||
}
|
||||
|
||||
$address->update([
|
||||
'name' => $request->name,
|
||||
'mobile' => $request->mobile,
|
||||
'province_id' => $request->province_id,
|
||||
'city_id' => $request->city_id,
|
||||
'district_id' => $request->district_id,
|
||||
'address' => $request->address,
|
||||
'is_default' => $request->is_default,
|
||||
]);
|
||||
|
||||
return $this->success('操作成功');
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes: 删除地址
|
||||
*
|
||||
* @Author: <C.Jason>
|
||||
* @Date : 2020/11/5 5:52 下午
|
||||
* @param Address $address
|
||||
* @return mixed
|
||||
*/
|
||||
public function destroy(Address $address)
|
||||
{
|
||||
if ($address->user()->isNot(Api::user())) {
|
||||
return $this->failed('', 404);
|
||||
}
|
||||
|
||||
try {
|
||||
$address->delete();
|
||||
|
||||
return $this->success('操作成功');
|
||||
} catch (Exception$exception) {
|
||||
return $this->failed('失败');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
37
modules/Mall/Http/Controllers/Api/BannerController.php
Normal file
37
modules/Mall/Http/Controllers/Api/BannerController.php
Normal file
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Mall\Http\Controllers\Api;
|
||||
|
||||
use App\Api\Controllers\Controller;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\Mall\Http\Resources\Api\Banner\BannerResource;
|
||||
use Modules\Mall\Models\Banner;
|
||||
|
||||
class BannerController extends Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* Notes : 获取banner的接口
|
||||
* @Date : 2021/6/3 11:28 上午
|
||||
* @Author : <Jason.C>
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function index(Request $request): JsonResponse
|
||||
{
|
||||
$position = $request->position;
|
||||
$shopId = $request->shop_id;
|
||||
|
||||
// 店铺ID为null的是平台轮播
|
||||
$banners = Banner::when($shopId, function (Builder $query) use ($shopId) {
|
||||
$query->where('shop_id', $shopId);
|
||||
})->when(is_numeric($position), function (Builder $query) use ($position) {
|
||||
$query->ofPosition($position);
|
||||
})->get();
|
||||
|
||||
return $this->success(BannerResource::collection($banners));
|
||||
}
|
||||
|
||||
}
|
||||
159
modules/Mall/Http/Controllers/Api/CartController.php
Normal file
159
modules/Mall/Http/Controllers/Api/CartController.php
Normal file
@@ -0,0 +1,159 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Mall\Http\Controllers\Api;
|
||||
|
||||
use App\Api\Controllers\Controller;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Str;
|
||||
use Jason\Api\Api;
|
||||
use Modules\Mall\Http\Requests\Cart\CartRequest;
|
||||
use Modules\Mall\Http\Resources\Api\Goods\CartResource;
|
||||
use Modules\Mall\Http\Resources\Api\Shop\ShopBaseInfoResource;
|
||||
use Modules\Mall\Models\Cart;
|
||||
use Modules\Mall\Models\GoodsSku;
|
||||
use Modules\Mall\Models\Shop;
|
||||
|
||||
class CartController extends Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* Notes : 购物车内商品列表
|
||||
* @Date : 2021/8/26 3:42 下午
|
||||
* @Author : <Jason.C>
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function index(): JsonResponse
|
||||
{
|
||||
$list = Cart::byUser(Api::user())->with('sku')->orderByDesc('updated_at')->get();
|
||||
|
||||
$collection = $list->groupBy('shop_id');
|
||||
|
||||
$items = [];
|
||||
|
||||
foreach ($collection as $shopId => $item) {
|
||||
$items[] = [
|
||||
'shop' => new ShopBaseInfoResource(Shop::find($shopId)),
|
||||
'items' => CartResource::collection($item),
|
||||
];
|
||||
}
|
||||
|
||||
return $this->success($items);
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes : 加入购物车
|
||||
* @Date : 2021/5/14 2:17 下午
|
||||
* @Author : <Jason.C>
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return mixed
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
$skuId = $request->sku_id;
|
||||
$qty = $request->qty ?? 1;
|
||||
|
||||
$sku = GoodsSku::findOrFail($skuId);
|
||||
|
||||
if (!$sku->canBuy($qty)) {
|
||||
return $this->failed('超过最大可购买数量');
|
||||
}
|
||||
|
||||
$cart = Cart::where('user_id', Api::userId())->where('sku_id', $skuId)->first();
|
||||
|
||||
if ($cart) {
|
||||
$cart->qty = $cart->qty + $qty;
|
||||
$cart->save();
|
||||
} else {
|
||||
$cart = Cart::create([
|
||||
'user_id' => Api::userId(),
|
||||
'shop_id' => $sku->goods->shop_id,
|
||||
'sku_id' => $skuId,
|
||||
'qty' => $qty,
|
||||
]);
|
||||
}
|
||||
|
||||
return $this->success($cart->qty);
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes : 获取购物车商品数量
|
||||
* @Date : 2021/5/14 1:47 下午
|
||||
* @Author : <Jason.C>
|
||||
*/
|
||||
public function count(): JsonResponse
|
||||
{
|
||||
if (Api::userId()) {
|
||||
$count = Cart::where('user_id', Api::userId())->count();
|
||||
} else {
|
||||
$count = 0;
|
||||
}
|
||||
|
||||
return $this->success($count);
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes : 更新购物车商品数量
|
||||
* @Date : 2021/5/13 2:52 下午
|
||||
* @Author : <Jason.C>
|
||||
* @param \Modules\Mall\Http\Requests\Cart\CartRequest $request
|
||||
* @param \Modules\Mall\Models\Cart $cart
|
||||
* @return mixed
|
||||
*/
|
||||
public function update(CartRequest $request, Cart $cart)
|
||||
{
|
||||
$skuId = $request->sku_id;
|
||||
$qty = $request->qty;
|
||||
|
||||
if ($cart->user()->isNot(Api::user())) {
|
||||
return $this->failed('', 404);
|
||||
}
|
||||
|
||||
if ($skuId && ($skuId != $cart->sku_id)) {
|
||||
$sku = GoodsSku::find($skuId);
|
||||
|
||||
if (!$cart->sku->goods->is($sku->goods)) {
|
||||
return $this->failed('错误的商品');
|
||||
}
|
||||
|
||||
$cart->sku_id = $skuId;
|
||||
} else {
|
||||
$sku = $cart->sku;
|
||||
}
|
||||
|
||||
if ($qty < 1 || $qty > $sku->stock) {
|
||||
return $this->failed('库存不足');
|
||||
}
|
||||
|
||||
$cart->qty = $qty;
|
||||
$cart->save();
|
||||
|
||||
return $this->success($qty);
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes : 删除购物车商品
|
||||
* @Date : 2021/5/17 4:00 下午
|
||||
* @Author : <Jason.C>
|
||||
* @param string $cart
|
||||
* @return mixed|string
|
||||
*/
|
||||
public function destroy(string $cart)
|
||||
{
|
||||
if (Str::contains($cart, ',')) {
|
||||
$count = Cart::query()->where('user_id', Api::userId())->whereIn('id', explode(',', $cart))->delete();
|
||||
if (!$count) {
|
||||
return $this->failed('empty');
|
||||
}
|
||||
} else {
|
||||
$cart = Cart::find($cart);
|
||||
if ($cart->user()->isNot(Api::user())) {
|
||||
return $this->failed('', 404);
|
||||
}
|
||||
$cart->delete();
|
||||
}
|
||||
|
||||
return $this->success('删除成功');
|
||||
}
|
||||
|
||||
}
|
||||
37
modules/Mall/Http/Controllers/Api/CategoryController.php
Normal file
37
modules/Mall/Http/Controllers/Api/CategoryController.php
Normal file
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Mall\Http\Controllers\Api;
|
||||
|
||||
use App\Api\Controllers\Controller;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\Mall\Http\Resources\Api\Category\CategoryResource;
|
||||
use Modules\Mall\Models\Category;
|
||||
|
||||
class CategoryController extends Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* Notes : 商品分类列表
|
||||
*
|
||||
* @Date : 2021/6/3 12:08 下午
|
||||
* @Author : <Jason.C>
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function index(Request $request): JsonResponse
|
||||
{
|
||||
$shopId = $request->shop_id;
|
||||
|
||||
$list = Category::query()
|
||||
->where('id', '<>', 2)
|
||||
->when($shopId, function (Builder $query) use ($shopId) {
|
||||
$query->where('shop_id', $shopId);
|
||||
})->where('parent_id', 0)->get();
|
||||
|
||||
return $this->success(CategoryResource::collection($list));
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
87
modules/Mall/Http/Controllers/Api/GoodsController.php
Normal file
87
modules/Mall/Http/Controllers/Api/GoodsController.php
Normal file
@@ -0,0 +1,87 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Mall\Http\Controllers\Api;
|
||||
|
||||
use App\Api\Controllers\Controller;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\Mall\Http\Resources\Api\Goods\GoodsCollection;
|
||||
use Modules\Mall\Http\Resources\Api\Goods\GoodsResource;
|
||||
use Modules\Mall\Models\Goods;
|
||||
|
||||
class GoodsController extends Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* Notes: 商品列表
|
||||
* @Author: Mr.wang
|
||||
* @Date : 2021/5/11 16:20
|
||||
* @param Request $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function index(Request $request): JsonResponse
|
||||
{
|
||||
#todo 商品分类搜索,可展示下级分类下的所有商品,分类数据缓存
|
||||
|
||||
$name = $request->get('name');
|
||||
$shopId = $request->get('shop_id');
|
||||
$categoryId = $request->get('category_id');
|
||||
$brandId = $request->get('brand_id');
|
||||
$payType = $request->get('pay_type');
|
||||
$tagId = $request->get('tag_id');
|
||||
$isSelf = $request->get('is_self');
|
||||
$perPage = $request->get('per_page');
|
||||
$orderBy = $request->get('order_by');
|
||||
|
||||
$goods = Goods::shown()
|
||||
->select(Goods::LIST_SELECT_FIELDS)
|
||||
->with(['tags', 'shop'])
|
||||
->when($name, function (Builder $query) use ($name) {
|
||||
$query->where('name', 'like', "%$name%");
|
||||
})
|
||||
->when($isSelf, function (Builder $query) {
|
||||
$query->whereHas('shop', function (Builder $query) {
|
||||
$query->where('is_self', 1);
|
||||
});
|
||||
})
|
||||
->when($shopId, function (Builder $query) use ($shopId) {
|
||||
$query->where('shop_id', $shopId);
|
||||
})
|
||||
->when($categoryId, function (Builder $query) use ($categoryId) {
|
||||
$query->where('category_id', $categoryId);
|
||||
})
|
||||
->when($brandId, function (Builder $query) use ($brandId) {
|
||||
$query->where('brand_id', $brandId);
|
||||
})
|
||||
->when($payType, function (Builder $query) use ($payType) {
|
||||
$query->where('pay_type', $payType);
|
||||
})
|
||||
->when($tagId, function (Builder $query) use ($tagId) {
|
||||
$query->whereHas('tags', function (Builder $query) use ($tagId) {
|
||||
$query->whereIn('id', explode(',', $tagId));
|
||||
});
|
||||
})
|
||||
->when($orderBy, function (Builder $query) use ($orderBy) {
|
||||
switch ($orderBy) {
|
||||
case 'sales':
|
||||
$query->orderByDesc('sales');
|
||||
break;
|
||||
case 'price':
|
||||
$query->orderByPrice();
|
||||
break;
|
||||
}
|
||||
})
|
||||
->paginate($perPage);
|
||||
|
||||
return $this->success(new GoodsCollection($goods));
|
||||
}
|
||||
|
||||
public function show(Goods $goods): JsonResponse
|
||||
{
|
||||
$goods->incrementClicks();
|
||||
|
||||
return $this->success(new GoodsResource($goods));
|
||||
}
|
||||
|
||||
}
|
||||
99
modules/Mall/Http/Controllers/Api/IndexController.php
Normal file
99
modules/Mall/Http/Controllers/Api/IndexController.php
Normal file
@@ -0,0 +1,99 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Mall\Http\Controllers\Api;
|
||||
|
||||
use App\Api\Controllers\Controller;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Modules\Cms\Http\Resources\ArticleBaseResource;
|
||||
use Modules\Cms\Http\Resources\ArticleCollection;
|
||||
use Modules\Cms\Models\Article;
|
||||
use Modules\Cms\Models\Category;
|
||||
use Modules\Mall\Http\Resources\Api\Banner\BannerResource;
|
||||
use Modules\Mall\Http\Resources\Api\Goods\GoodsBaseResource;
|
||||
use Modules\Mall\Http\Resources\Api\Video\VideoResource;
|
||||
use Modules\Mall\Models\Banner;
|
||||
use Modules\Mall\Models\Goods;
|
||||
use Modules\Mall\Models\Video;
|
||||
|
||||
class IndexController extends Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* Notes :
|
||||
*
|
||||
* @Date : 2021/3/15 5:25 下午
|
||||
* @Author : <Jason.C>
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function index(): JsonResponse
|
||||
{
|
||||
$banners = Banner::query()->ofPosition(Banner::POSITION_INDEX)->get();
|
||||
$centers = Banner::query()->ofPosition(Banner::POSITION_INDEX_CENTER)->get();
|
||||
|
||||
|
||||
$show_goods_id = app('Conf_mall')['show_goods_id'] ?? 0;
|
||||
$show_goods = '';
|
||||
if ($show_goods_id > 0) {
|
||||
$show_goods = Goods::find($show_goods_id);
|
||||
}
|
||||
|
||||
$goods = Goods::query()
|
||||
->where('id', '<>', $show_goods_id)
|
||||
->shown()
|
||||
->where('channel', Goods::CHANNEL_SCORE)
|
||||
->get();
|
||||
|
||||
$videos = Video::query()
|
||||
->shown()
|
||||
->get();
|
||||
|
||||
$memories = Article::query()
|
||||
->whereHas('categories', function ($q) {
|
||||
$q->where('slug', 'MEMORY');
|
||||
})
|
||||
->inRandomOrder()
|
||||
->take(10)
|
||||
->get();
|
||||
|
||||
$memoriesData = [];
|
||||
$all = $memories->count() * 30;
|
||||
foreach ($memories as $key => $memory) {
|
||||
$id = ++$key;
|
||||
$memoriesData[] = [
|
||||
'id' => $memory->id,
|
||||
'title' => $memory->title,
|
||||
'description' => $memory->description,
|
||||
'zIndex' => $id,
|
||||
'left' => (int) bcsub($all, bcmul($key, 30)),
|
||||
'image' => $memory->cover_url,
|
||||
'animation' => null,
|
||||
];
|
||||
}
|
||||
|
||||
$healths = Article::query()
|
||||
->whereHas('categories', function ($q) {
|
||||
$q->where('slug', 'HEALTH');
|
||||
})
|
||||
->inRandomOrder()
|
||||
->take(3)
|
||||
->get();
|
||||
|
||||
$data = [
|
||||
'show_goods' => $show_goods ? new GoodsBaseResource($show_goods) : '',
|
||||
'videos' => VideoResource::collection($videos),
|
||||
'goods' => GoodsBaseResource::collection($goods),
|
||||
'banners' => BannerResource::collection($banners),
|
||||
'center' => BannerResource::collection($centers),
|
||||
'memories' => $memoriesData,
|
||||
'healths' => ArticleBaseResource::collection($healths),
|
||||
'water_mobile' => app('Conf_mall')['water_mobile'] ?? '',
|
||||
'categories' => [
|
||||
'memory' => Category::query()->where('slug', 'MEMORY')->value('id') ?? 0,
|
||||
'health' => Category::query()->where('slug', 'HEALTH')->value('id') ?? 0,
|
||||
],
|
||||
];
|
||||
|
||||
return $this->success($data);
|
||||
}
|
||||
|
||||
}
|
||||
298
modules/Mall/Http/Controllers/Api/OrderBuyController.php
Normal file
298
modules/Mall/Http/Controllers/Api/OrderBuyController.php
Normal file
@@ -0,0 +1,298 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Mall\Http\Controllers\Api;
|
||||
|
||||
use App\Api\Controllers\Controller;
|
||||
use Exception;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Jason\Api\Api;
|
||||
use Modules\Mall\Facades\Item;
|
||||
use Modules\Mall\Facades\Order;
|
||||
use Modules\Mall\Models\Order as OrderModel;
|
||||
use Modules\Mall\Http\Requests\Address\AddressRequest;
|
||||
use Modules\Mall\Http\Requests\OrderBuy\OrderBuyRequest;
|
||||
use Modules\Mall\Http\Resources\Api\Address\AddressResource;
|
||||
use Modules\Mall\Http\Resources\Api\Goods\GoodsBaseResource;
|
||||
use Modules\Mall\Http\Resources\Api\Goods\GoodsCollection;
|
||||
use Modules\Mall\Models\Address;
|
||||
use Modules\Mall\Models\Cart;
|
||||
use Modules\Mall\Models\Goods;
|
||||
use Modules\Mall\Models\GoodsSku;
|
||||
use Monolog\Handler\IFTTTHandler;
|
||||
|
||||
class OrderBuyController extends Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* Notes: 商品确认下单
|
||||
*
|
||||
* @Author: 玄尘
|
||||
* @Date : 2021/5/14 11:54
|
||||
* @param \Modules\Mall\Http\Requests\OrderBuy\OrderBuyRequest $request
|
||||
* @return mixed
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function goodsCreate(Request $request)
|
||||
{
|
||||
$validator = Validator::make($request->all(), [
|
||||
'goods_sku_id' => 'required|integer',
|
||||
'qty' => 'nullable|integer',
|
||||
], [
|
||||
'goods_sku_id.required' => '缺少商品规格id',
|
||||
'goods_sku_id.integer' => '商品规格id必须是数字',
|
||||
'qty.integer' => '数量必须是数字',
|
||||
]);
|
||||
|
||||
if ($validator->fails()) {
|
||||
return $this->failed($validator->errors()->first());
|
||||
}
|
||||
|
||||
$goods_sku_id = $request->goods_sku_id;
|
||||
$qty = $request->qty;
|
||||
$address_id = $request->address_id;
|
||||
|
||||
$detail = collect();
|
||||
$user = Api::user();
|
||||
|
||||
if ($address_id) {
|
||||
$address = Address::find($address_id);
|
||||
} else {
|
||||
$address = Address::where('user_id', $user->id)->orderBy('is_default', 'desc')->first();
|
||||
}
|
||||
|
||||
$goods_sku = GoodsSku::find($goods_sku_id);
|
||||
|
||||
if (! $goods_sku) {
|
||||
return $this->failed('未找到商品');
|
||||
}
|
||||
|
||||
if (! $goods_sku->canBuy($qty)) {
|
||||
return $this->failed($goods_sku->getGoodsName().'商品不可购买');
|
||||
}
|
||||
|
||||
$item = new Item($goods_sku, $address, $qty);
|
||||
$detail->push($item);
|
||||
|
||||
$freight = $item->freight();
|
||||
$amount = $item->total();
|
||||
$weight = $item->weight();
|
||||
|
||||
$detail = (new Order)->items($detail)->splitOrderByShop();
|
||||
$items = [];
|
||||
foreach ($detail as $item) {
|
||||
$items[] = $item;
|
||||
}
|
||||
|
||||
$data = [
|
||||
'address' => $address ? new AddressResource($address) : '',
|
||||
'detail' => $items,
|
||||
'amount' => floatval(bcadd($amount, $freight, 2)),
|
||||
'freight' => $freight,
|
||||
'weight' => $weight,
|
||||
];
|
||||
|
||||
return $this->success($data);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes: 商品下单
|
||||
*
|
||||
* @Author: 玄尘
|
||||
* @Date : 2021/5/14 13:53
|
||||
* @param \Modules\Mall\Http\Requests\OrderBuy\OrderBuyRequest $request
|
||||
* @return mixed
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function goodsBuy(OrderBuyRequest $request)
|
||||
{
|
||||
$validator = Validator::make($request->all(), [
|
||||
'goods_sku_id' => 'required|integer',
|
||||
'qty' => 'nullable|integer',
|
||||
'address_id' => 'required|integer',
|
||||
], [
|
||||
'goods_sku_id.required' => '缺少商品规格id',
|
||||
'goods_sku_id.integer' => '商品规格id必须是数字',
|
||||
'qty.integer' => '数量必须是数字',
|
||||
'address_id.required' => '缺少收货地址',
|
||||
'address_id.integer' => '收货地址必须是数字',
|
||||
]);
|
||||
|
||||
if ($validator->fails()) {
|
||||
return $this->failed($validator->errors()->first());
|
||||
}
|
||||
|
||||
$user = Api::user();
|
||||
$remark = $request->remark ?? '';
|
||||
$address_id = $request->address_id ?? '';
|
||||
$goods_sku_id = $request->goods_sku_id;
|
||||
$qty = $request->qty;
|
||||
$share_user_id = $request->share_user_id ?? 0;
|
||||
|
||||
$address = Address::where('user_id', $user->id)->where('id', $address_id)->first();
|
||||
if (! $address) {
|
||||
return $this->failed('未找到收货地址');
|
||||
}
|
||||
|
||||
$detail = collect();
|
||||
|
||||
$goods_sku = GoodsSku::find($goods_sku_id);
|
||||
|
||||
if (! $goods_sku) {
|
||||
return $this->failed('未找到商品');
|
||||
}
|
||||
|
||||
if (! $goods_sku->canBuy($qty)) {
|
||||
return $this->failed($goods_sku->getGoodsName().' 商品不可购买');
|
||||
}
|
||||
|
||||
$item = new Item($goods_sku, $address, $qty);
|
||||
$detail->push($item);
|
||||
|
||||
$type = OrderModel::TYPE_NORMAL;
|
||||
if ($goods_sku->goods->channel == Goods::CHANNEL_FREE) {
|
||||
$type = OrderModel::TYPE_SAMPLE;
|
||||
}
|
||||
|
||||
if ($goods_sku->goods->channel == Goods::CHANNEL_SCORE) {
|
||||
$type = OrderModel::TYPE_SCORE;
|
||||
}
|
||||
|
||||
$orders = (new Order)->user($user)
|
||||
->remark($remark)
|
||||
->items($detail)
|
||||
->type($type)
|
||||
->address($address)
|
||||
->source(['share_user_id' => $share_user_id,])
|
||||
->create();
|
||||
|
||||
return $this->success([
|
||||
'order_no' => $orders->first()->order_no,
|
||||
'total' => $orders->first()->total,
|
||||
'score' => $user->account->score,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes: 购物车确认下单
|
||||
*
|
||||
* @Author: 玄尘
|
||||
* @Date : 2021/5/17 10:14
|
||||
*/
|
||||
public function cartsCreate(Request $request)
|
||||
{
|
||||
$user = Api::user();
|
||||
|
||||
$cart_ids = $request->cart_ids;//1,2,3
|
||||
$cart_ids = explode(',', $cart_ids);
|
||||
$carts = Cart::where('user_id', $user->id)->whereIn('id', $cart_ids)->get();
|
||||
if ($carts->isEmpty()) {
|
||||
return $this->failed('未找到购物车');
|
||||
}
|
||||
|
||||
$detail = collect();
|
||||
|
||||
$all_address = Address::where('user_id', $user->id)->orderBy('is_default', 'desc')->get();
|
||||
$address = Address::where('user_id', $user->id)->orderBy('is_default', 'desc')->first();
|
||||
|
||||
$amount = $weight = $freight = 0;
|
||||
foreach ($carts as $cart) {
|
||||
$goods_sku = $cart->sku;
|
||||
|
||||
if (! $goods_sku) {
|
||||
return $this->failed('未找到商品');
|
||||
}
|
||||
|
||||
if (! $goods_sku->canBuy($cart->qty)) {
|
||||
return $this->failed($goods_sku->getGoodsName().' 不可购买');
|
||||
}
|
||||
|
||||
$item = new Item($goods_sku, $address, $cart->qty);
|
||||
$detail->push($item);
|
||||
|
||||
$freight += $item->freight();
|
||||
$amount += $item->total();
|
||||
$weight += $item->weight();
|
||||
}
|
||||
|
||||
try {
|
||||
$data = [
|
||||
'address' => $address ? new AddressResource($address) : '',
|
||||
'all_address' => AddressResource::collection($all_address),
|
||||
'detail' => (new Order)->items($detail)->splitOrderByShop(),
|
||||
'amount' => bcadd($amount, $freight, 2),
|
||||
'freight' => $freight,
|
||||
'weight' => $weight,
|
||||
];
|
||||
|
||||
return $this->success($data);
|
||||
|
||||
} catch (Exception $e) {
|
||||
return $this->failed($e->getMessage());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes: 购物车购买
|
||||
*
|
||||
* @Author: 玄尘
|
||||
* @Date : 2021/5/17 10:14
|
||||
*/
|
||||
public function cartsBuy(Request $request)
|
||||
{
|
||||
$user = Api::user();
|
||||
|
||||
$cart_ids = $request->cart_ids; //1,2,3
|
||||
$cart_ids = explode(',', $cart_ids);
|
||||
$address_id = $request->address_id ?? 0;
|
||||
$remark = $request->remark ?? '';
|
||||
$share_user_id = $request->share_user_id ?? 0;
|
||||
|
||||
$carts = Cart::where('user_id', $user->id)->whereIn('id', $cart_ids)->get();
|
||||
if ($carts->isEmpty()) {
|
||||
return $this->failed('未找到购物车');
|
||||
}
|
||||
|
||||
$address = Address::where('user_id', $user->id)->where('id', $address_id)->first();
|
||||
if (! $address) {
|
||||
return $this->failed('未找到收货地址');
|
||||
}
|
||||
|
||||
$detail = collect();
|
||||
foreach ($carts as $cart) {
|
||||
$goods_sku = $cart->sku;
|
||||
|
||||
if (! $goods_sku) {
|
||||
return $this->failed('未找到商品');
|
||||
}
|
||||
|
||||
if (! $goods_sku->canBuy($cart->qty)) {
|
||||
return $this->failed($goods_sku->getGoodsName().' 不可购买');
|
||||
}
|
||||
|
||||
$item = new Item($goods_sku, $address, $cart->qty);
|
||||
$detail->push($item);
|
||||
}
|
||||
|
||||
try {
|
||||
(new Order)->user($user)
|
||||
->remark($remark)
|
||||
->items($detail)
|
||||
->address($address)
|
||||
->source(['share_user_id' => $share_user_id])
|
||||
->create();
|
||||
//删除购物车
|
||||
Cart::whereIn('id', $cart_ids)->delete();
|
||||
|
||||
return $this->success('下单成功');
|
||||
} catch (Exception $e) {
|
||||
return $this->failed($e->getMessage());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
287
modules/Mall/Http/Controllers/Api/OrderController.php
Normal file
287
modules/Mall/Http/Controllers/Api/OrderController.php
Normal file
@@ -0,0 +1,287 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Mall\Http\Controllers\Api;
|
||||
|
||||
use App\Api\Controllers\Controller;
|
||||
use Exception;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Jason\Api\Api;
|
||||
use Modules\Mall\Facades\Refund;
|
||||
use Modules\Mall\Http\Resources\Api\Order\LogisticResource;
|
||||
use Modules\Mall\Http\Resources\Api\Order\OrderCollection;
|
||||
use Modules\Mall\Http\Resources\Api\Order\OrderItemResource;
|
||||
use Modules\Mall\Http\Resources\Api\Order\OrderLogisticResource;
|
||||
use Modules\Mall\Http\Resources\Api\Order\OrderResource;
|
||||
use Modules\Mall\Models\Order;
|
||||
use Modules\Mall\Models\OrderItem;
|
||||
use Modules\Mall\Models\Reason;
|
||||
use Modules\Mall\Models\Refund as RefundModel;
|
||||
use MrwangTc\Kuaidi100\Exceptions\HttpException;
|
||||
use MrwangTc\Kuaidi100\Express\Synquery;
|
||||
|
||||
class OrderController extends Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* Notes : 订单列表
|
||||
*
|
||||
* @Date : 2021/5/13 5:17 下午
|
||||
* @Author : <Jason.C>
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function index(Request $request): JsonResponse
|
||||
{
|
||||
$state = $request->state ?? '';
|
||||
$type = $request->type ?? '';// score sample
|
||||
|
||||
#todo 类别筛选
|
||||
#todo 商品名称搜索
|
||||
#todo 订单编号搜索
|
||||
|
||||
$list = Order::byUser(Api::user())
|
||||
->when($state, function ($query) use ($state) {
|
||||
switch ($state) {
|
||||
case 'unpay':
|
||||
$query->unPay();
|
||||
break;
|
||||
case 'paid':
|
||||
$query->paid();
|
||||
break;
|
||||
case 'delivered':
|
||||
$query->Delivered();
|
||||
break;
|
||||
case 'signed':
|
||||
$query->signed();
|
||||
break;
|
||||
case 'completed':
|
||||
$query->completed();
|
||||
break;
|
||||
}
|
||||
}, function ($query) {
|
||||
$query->common();
|
||||
})
|
||||
// ->when($type, function ($q) use ($type) {
|
||||
// if ($type == 'score') {
|
||||
// $q->TypeScore();
|
||||
// }
|
||||
//
|
||||
// if ($type == 'sample') {
|
||||
// $q->TypeSample();
|
||||
// }
|
||||
// })
|
||||
->paginate();
|
||||
|
||||
return $this->success(new OrderCollection($list));
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes : 订单详情
|
||||
*
|
||||
* @Date : 2021/5/13 5:17 下午
|
||||
* @Author : <Jason.C>
|
||||
* @param Order $order
|
||||
* @return mixed
|
||||
*/
|
||||
public function show(Order $order)
|
||||
{
|
||||
if ($order->user()->isNot(Api::user())) {
|
||||
return $this->failed('', 404);
|
||||
}
|
||||
|
||||
return $this->success(new OrderResource($order));
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes : 查看物流
|
||||
*
|
||||
* @Date : 2021/5/14 16:52
|
||||
* @Author : Mr.wang
|
||||
* @param Order $order
|
||||
* @return mixed
|
||||
* @throws HttpException
|
||||
*/
|
||||
public function logistic(Order $order)
|
||||
{
|
||||
if ($order->user()->isNot(Api::user())) {
|
||||
return $this->failed('', 404);
|
||||
}
|
||||
if (! $order->is_logistic_show) {
|
||||
return $this->failed('', 404);
|
||||
}
|
||||
|
||||
$express = new Synquery();
|
||||
$synQuery = $express->pollQuery($order->express->express->slug, $order->express->express_no);
|
||||
if (isset($synQuery->result) && $synQuery->result === false) {
|
||||
return $this->failed($synQuery->message);
|
||||
}
|
||||
$logistics = $synQuery->data;
|
||||
|
||||
return $this->success([
|
||||
'orderExpress' => new OrderLogisticResource($order->express),
|
||||
'logistics' => LogisticResource::collection($logistics),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes : 签收成功
|
||||
*
|
||||
* @Date : 2021/5/17 16:52
|
||||
* @Author : Mr.wang
|
||||
* @param Order $order
|
||||
* @return mixed
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function sign(Order $order)
|
||||
{
|
||||
if ($order->user()->isNot(Api::user())) {
|
||||
return $this->failed('', 404);
|
||||
}
|
||||
if ($order->sign() === true) {
|
||||
return $this->success('操作成功');
|
||||
} else {
|
||||
return $this->failed();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes : 取消订单
|
||||
*
|
||||
* @Date : 2021/5/19 11:35
|
||||
* @Author : Mr.wang
|
||||
* @param Order $order
|
||||
* @return mixed
|
||||
*/
|
||||
public function cancel(Order $order)
|
||||
{
|
||||
if ($order->user()->isNot(Api::user())) {
|
||||
return $this->failed('', 404);
|
||||
}
|
||||
try {
|
||||
$order->cancel();
|
||||
|
||||
return $this->success('操作成功');
|
||||
} catch (Exception $e) {
|
||||
return $this->failed($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes : 删除订单(对订单进行软删除操作)
|
||||
*
|
||||
* @Date : 2021/5/19 11:35
|
||||
* @Author : Mr.wang
|
||||
* @param Order $order
|
||||
* @return mixed
|
||||
*/
|
||||
public function destroy(Order $order)
|
||||
{
|
||||
if ($order->user()->isNot(Api::user())) {
|
||||
return $this->failed('', 404);
|
||||
}
|
||||
if ($order->canDelete() === false) {
|
||||
return $this->failed('订单不允许删除');
|
||||
}
|
||||
try {
|
||||
$order->delete();
|
||||
|
||||
return $this->success('操作成功');
|
||||
} catch (Exception $e) {
|
||||
return $this->failed($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes: 订单商品
|
||||
*
|
||||
* @Author: 玄尘
|
||||
* @Date : 2021/5/18 8:47
|
||||
* @param Order $order
|
||||
* @return mixed
|
||||
*/
|
||||
public function goods(Order $order)
|
||||
{
|
||||
$user = Api::user();
|
||||
|
||||
if ($order->user()->isNot($user)) {
|
||||
return $this->failed('', 404);
|
||||
}
|
||||
$data = [
|
||||
'order' => new OrderResource($order),
|
||||
'title' => Reason::query()->pluck('title'),
|
||||
];
|
||||
|
||||
return $this->success($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes: 退款/退货
|
||||
*
|
||||
* @Author: 玄尘
|
||||
* @Date : 2021/5/19 9:11
|
||||
* @param Order $order
|
||||
* @param Request $request
|
||||
* @return mixed
|
||||
*/
|
||||
public function refund(Order $order, Request $request)
|
||||
{
|
||||
$user = Api::user();
|
||||
|
||||
if (! $order->type == Order::TYPE_SAMPLE) {
|
||||
return $this->failed('操作失败,提货单不可退货');
|
||||
}
|
||||
|
||||
if (! $order->can('refund')) {
|
||||
return $this->failed('操作失败,此订单不可退货');
|
||||
}
|
||||
|
||||
if ($order->user()->isNot($user)) {
|
||||
return $this->failed('您没有权限进行此操作');
|
||||
}
|
||||
|
||||
$remark = $request->remark ?? '';
|
||||
$title = $request->title;//退款原因
|
||||
$pictures = $request->pictures;//图片 many
|
||||
|
||||
if (! $order->isPay()) {
|
||||
return $this->failed('退款失败,未找到支付信息');
|
||||
}
|
||||
|
||||
try {
|
||||
(new Refund)->user($user)
|
||||
->remark($remark)
|
||||
->order($order)
|
||||
->logs([
|
||||
'remark' => $remark,
|
||||
'title' => $title,
|
||||
'pictures' => $pictures,
|
||||
])
|
||||
->create();
|
||||
|
||||
return $this->success('提交成功,请等待审核。');
|
||||
} catch (Exception $e) {
|
||||
return $this->failed($e->getMessage());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes : 个人中心对订单的总数
|
||||
*
|
||||
* @Date : 2021/6/3 13:36
|
||||
* @Author : Mr.wang
|
||||
* @return mixed
|
||||
*/
|
||||
public function counts()
|
||||
{
|
||||
$orderCount = Order::byUser(Api::user())->common()->count();
|
||||
$refundCount = RefundModel::byUser(Api::user())->count();
|
||||
|
||||
return $this->success([
|
||||
'orderCount' => $orderCount,
|
||||
'refundCount' => $refundCount,
|
||||
]);
|
||||
}
|
||||
|
||||
}
|
||||
113
modules/Mall/Http/Controllers/Api/PayController.php
Normal file
113
modules/Mall/Http/Controllers/Api/PayController.php
Normal file
@@ -0,0 +1,113 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Mall\Http\Controllers\Api;
|
||||
|
||||
use App\Api\Controllers\Controller;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Jason\Api\Api;
|
||||
use Modules\Mall\Models\Order;
|
||||
|
||||
class PayController extends Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* Notes: 微信支付
|
||||
*
|
||||
* @Author: 玄尘
|
||||
* @Date : 2021/5/20 9:11
|
||||
* @param \Modules\Mall\Models\Order $order
|
||||
* @return mixed
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function wechat(Order $order)
|
||||
{
|
||||
$user = Api::user();
|
||||
|
||||
if (! $order->can('pay')) {
|
||||
return $this->failed('支付失败,订单不可支付');
|
||||
}
|
||||
|
||||
if ($order->user()->isNot($user)) {
|
||||
return $this->failed('支付失败,您没有权限支付');
|
||||
}
|
||||
|
||||
$payment = $order->createWechatPayment($user, $order->total, 'app');
|
||||
|
||||
$notify = $payment->getPaymentParams('商品下单', [
|
||||
'notify_url' => route('api.payment.notify.wechat'),
|
||||
]);
|
||||
|
||||
return $this->success($notify->getContent());
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes: 支付宝支付
|
||||
*
|
||||
* @Author: 玄尘
|
||||
* @Date : 2021/5/20 9:13
|
||||
* @param \Modules\Mall\Models\Order $order
|
||||
* @return mixed
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function alipay(Order $order)
|
||||
{
|
||||
$user = Api::user();
|
||||
|
||||
if (! $order->can('pay')) {
|
||||
return $this->failed('支付失败,订单不可支付');
|
||||
}
|
||||
|
||||
if ($order->user()->isNot($user)) {
|
||||
return $this->failed('支付失败,您没有权限支付');
|
||||
}
|
||||
|
||||
$payment = $order->createAlipayPayment($user, $order->total, 'app');
|
||||
|
||||
$notify = $payment->getPaymentParams('商品下单', [
|
||||
'notify_url' => route('api.payment.notify.alipay'),
|
||||
]);
|
||||
|
||||
return $this->success($notify->getContent());
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes: 水滴支付
|
||||
*
|
||||
* @Author: 玄尘
|
||||
* @Date: 2022/9/5 15:51
|
||||
* @param Order $order
|
||||
* @return JsonResponse|mixed
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function score(Order $order, Request $request)
|
||||
{
|
||||
$gateway = $request->gateway ?? 'web';
|
||||
$user = Api::user();
|
||||
|
||||
if (! $order->can('pay')) {
|
||||
return $this->failed('支付失败,订单不可支付');
|
||||
}
|
||||
|
||||
if ($order->user()->isNot($user)) {
|
||||
return $this->failed('支付失败,您没有权限支付');
|
||||
}
|
||||
|
||||
if ($user->account->score < $order->total) {
|
||||
return $this->failed('支付失败,您水滴积分不足');
|
||||
}
|
||||
|
||||
$payment = $order->createScorePayment($user, $order->total, $gateway);
|
||||
|
||||
if ($payment) {
|
||||
$payment->paid();
|
||||
$payment->order->pay();
|
||||
return $this->success('支付成功!');
|
||||
} else {
|
||||
return $this->failed('未知错误');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
124
modules/Mall/Http/Controllers/Api/RefundController.php
Normal file
124
modules/Mall/Http/Controllers/Api/RefundController.php
Normal file
@@ -0,0 +1,124 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Mall\Http\Controllers\Api;
|
||||
|
||||
use App\Api\Controllers\Controller;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Jason\Api\Api;
|
||||
use Modules\Mall\Http\Resources\Api\Order\RefundCollection;
|
||||
use Modules\Mall\Http\Resources\Api\Order\RefundLogResource;
|
||||
use Modules\Mall\Http\Resources\Api\Order\RefundResource;
|
||||
use Modules\Mall\Models\Refund;
|
||||
|
||||
class RefundController extends Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* Notes: 走退货流程的订单
|
||||
* @Author: 玄尘
|
||||
* @Date : 2021/5/18 9:02
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function index(Request $request): JsonResponse
|
||||
{
|
||||
$state = $request->state ?? 'refunding';//refunding refunded
|
||||
|
||||
$list = Refund::byUser(Api::user())
|
||||
->when($state, function ($query) use ($state) {
|
||||
switch ($state) {
|
||||
case 'refunding':
|
||||
$query->whereIn('state', [
|
||||
Refund::REFUND_APPLY,
|
||||
Refund::REFUND_AGREE,
|
||||
Refund::REFUND_PROCESS,
|
||||
Refund::REFUND_DELIVER,
|
||||
Refund::REFUND_DELIVERED,
|
||||
Refund::REFUND_SIGNED,
|
||||
]);
|
||||
break;
|
||||
case 'refunded':
|
||||
$query->whereIn('state', [
|
||||
Refund::REFUND_REFUSE,
|
||||
Refund::REFUND_COMPLETED,
|
||||
]);
|
||||
break;
|
||||
}
|
||||
})
|
||||
->paginate();
|
||||
|
||||
return $this->success(new RefundCollection($list));
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes: 退单详情
|
||||
* @Author: 玄尘
|
||||
* @Date : 2021/5/18 11:35
|
||||
* @param \Modules\Mall\Models\Refund $refund
|
||||
* @return mixed
|
||||
*/
|
||||
public function show(Refund $refund)
|
||||
{
|
||||
if ($refund->user()->isNot(Api::user())) {
|
||||
return $this->failed('您没有权限查看', 404);
|
||||
}
|
||||
|
||||
return $this->success(new RefundResource($refund));
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes: 退货
|
||||
* @Author: 玄尘
|
||||
* @Date : 2021/5/17 15:02
|
||||
* @param \Modules\Mall\Models\Refund $refund
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return mixed
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function deliver(Refund $refund, Request $request)
|
||||
{
|
||||
if ($refund->user()->isNot(Api::user())) {
|
||||
return $this->failed('您没有权限操作');
|
||||
}
|
||||
|
||||
$validator = Validator::make($request->all(), [
|
||||
'company' => 'required',
|
||||
'number' => 'required',
|
||||
], [
|
||||
'company.required' => '缺少物流公司',
|
||||
'number.required' => '缺少物流单号',
|
||||
]);
|
||||
|
||||
if ($validator->fails()) {
|
||||
return $this->failed($validator->errors()->first());
|
||||
}
|
||||
// $express = Express::find($request->company);
|
||||
// if (!$express) {
|
||||
// return $this->failed('未找到物流公司');
|
||||
// }
|
||||
|
||||
$res = $refund->deliver($request->company, $request->number);
|
||||
if ($res === true) {
|
||||
return $this->success('退货成功,请等待退款');
|
||||
}
|
||||
|
||||
return $this->failed('退货失败');
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes: 退单日志
|
||||
* @Author: 玄尘
|
||||
* @Date : 2021/5/18 11:36
|
||||
* @param \Modules\Mall\Models\Refund $refund
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function logs(Refund $refund): JsonResponse
|
||||
{
|
||||
$logs = $refund->logs()->latest()->get();
|
||||
|
||||
return $this->success(RefundLogResource::collection($logs));
|
||||
}
|
||||
|
||||
}
|
||||
210
modules/Mall/Http/Controllers/Api/ShopController.php
Normal file
210
modules/Mall/Http/Controllers/Api/ShopController.php
Normal file
@@ -0,0 +1,210 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Mall\Http\Controllers\Api;
|
||||
|
||||
use App\Api\Controllers\Controller;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Illuminate\Validation\Rule;
|
||||
use Jason\Api\Api;
|
||||
use Modules\Mall\Http\Requests\Shop\ShopRequest;
|
||||
use Modules\Mall\Http\Resources\Api\Region\RegionResource;
|
||||
use Modules\Mall\Http\Resources\Api\Shop\ShopCollection;
|
||||
use Modules\Mall\Http\Resources\Api\Shop\ShopEditResource;
|
||||
use Modules\Mall\Http\Resources\Api\Shop\ShopResource;
|
||||
use Modules\Mall\Models\Region;
|
||||
use Modules\Mall\Models\Shop;
|
||||
use Modules\Mall\Rules\CityRule;
|
||||
use Modules\Mall\Rules\DistrictRule;
|
||||
use Modules\Mall\Rules\ProvinceRule;
|
||||
|
||||
class ShopController extends Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* Notes : 全部店铺列表
|
||||
* @Date : 2021/8/26 3:40 下午
|
||||
* @Author : <Jason.C>
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function index(Request $request): JsonResponse
|
||||
{
|
||||
$name = $request->name ?? '';
|
||||
|
||||
$list = Shop::where('status', Shop::STATUS_NORMAL)
|
||||
->when($name, function (Builder $query) use ($name) {
|
||||
$query->where('name', 'like', "%{$name}%");
|
||||
})
|
||||
->paginate();
|
||||
|
||||
return $this->success(new ShopCollection($list));
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes : 店铺详情
|
||||
* @Date : 2021/5/6 3:28 下午
|
||||
* @Author : <Jason.C>
|
||||
*/
|
||||
public function show(Shop $shop): JsonResponse
|
||||
{
|
||||
if ($shop->status !== Shop::STATUS_NORMAL) {
|
||||
return $this->failed('店铺不存在或已关闭');
|
||||
}
|
||||
|
||||
return $this->success(new ShopResource($shop));
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes : 申请的前置判断和基础数据
|
||||
* @Date : 2021/5/6 3:29 下午
|
||||
* @Author : <Jason.C>
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
$user = Api::user();
|
||||
$checkShop = Shop::firstWhere('user_id', $user->id);
|
||||
if ($checkShop) {
|
||||
return $this->failed('用户已有店铺,不能重复申请');
|
||||
}
|
||||
$regions = Region::where('depth', 1)->get();
|
||||
|
||||
return $this->success(RegionResource::collection($regions));
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes : 申请一个店铺
|
||||
* @Date : 2021/5/6 3:29 下午
|
||||
* @Author : <Jason.C>
|
||||
*/
|
||||
public function store(ShopRequest $request)
|
||||
{
|
||||
$user = Api::user();
|
||||
|
||||
if (Shop::firstWhere('user_id', $user->id)) {
|
||||
return $this->failed('用户已有店铺,不能重复申请');
|
||||
}
|
||||
$result = Shop::create([
|
||||
'name' => $request->name,
|
||||
'user_id' => $user->id,
|
||||
'mobile' => $request->mobile,
|
||||
'description' => $request->description,
|
||||
'province_id' => $request->province_id,
|
||||
'city_id' => $request->city_id,
|
||||
'district_id' => $request->district_id,
|
||||
'cover' => $request->cover,
|
||||
'address' => $request->address,
|
||||
'status' => Shop::STATUS_APPLYING,
|
||||
]);
|
||||
if ($result) {
|
||||
return $this->success('操作成功');
|
||||
} else {
|
||||
return $this->failed('失败');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes : 编辑店铺需要的数据
|
||||
* @Date : 2021/5/7 10:26 上午
|
||||
* @Author : <Jason.C>
|
||||
*/
|
||||
public function edit()
|
||||
{
|
||||
$user = Api::user();
|
||||
$shop = Shop::firstWhere('user_id', $user->id);
|
||||
if (!$shop) {
|
||||
return $this->failed('用户没有店铺,不能编辑');
|
||||
}
|
||||
if ($shop->status == Shop::STATUS_NORMAL) {
|
||||
return $this->failed('用户已通过审核,不能编辑');
|
||||
}
|
||||
|
||||
return $this->success(new ShopEditResource($shop));
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes : 更新店铺数据
|
||||
* @Date : 2021/5/7 10:27 上午
|
||||
* @Author : <Jason.C>
|
||||
*/
|
||||
public function update(Request $request)
|
||||
{
|
||||
$user = Api::user();
|
||||
$shop = Shop::firstWhere('user_id', $user->id);
|
||||
if (!$shop) {
|
||||
return $this->failed('用户没有店铺,不能编辑');
|
||||
}
|
||||
if ($shop->status == Shop::STATUS_NORMAL) {
|
||||
return $this->failed('用户已通过审核,不能编辑');
|
||||
}
|
||||
$validator = Validator::make(
|
||||
$request->all(),
|
||||
[
|
||||
'name' => ['required', Rule::unique('mall_shops', 'name')->ignore($shop->id)],
|
||||
'mobile' => [
|
||||
'required', 'phone:CN', Rule::unique('mall_shops', 'mobile')->ignore($shop->id),
|
||||
],
|
||||
'description' => 'required',
|
||||
'province_id' => ['required', 'integer', new ProvinceRule()],
|
||||
'city_id' => ['required', 'integer', new CityRule()],
|
||||
'district_id' => ['required', 'integer', new DistrictRule()],
|
||||
'address' => 'required',
|
||||
'cover' => 'required',
|
||||
], [
|
||||
'name.required' => '店铺名称必须填写',
|
||||
'name.unique' => '店铺名称不能重复',
|
||||
'mobile.required' => '联系方式必须填写',
|
||||
'mobile.phone' => '联系方式格式不正确',
|
||||
'mobile.unique' => '联系方式不能重复',
|
||||
'description.required' => '店铺简介必须填写',
|
||||
'province_id.required' => '店铺所在省份必须选择',
|
||||
'province_id.integer' => '店铺所在省份格式不正确',
|
||||
'city_id.required' => '店铺所在城市必须选择',
|
||||
'city_id.integer' => '店铺所在城市格式不正确',
|
||||
'district_id.required' => '店铺所在地区必须选择',
|
||||
'district_id.integer' => '店铺所在地区格式不正确',
|
||||
'address.required' => '店铺详细地址必须填写',
|
||||
'cover.required' => '店铺封面图必须上传',
|
||||
]
|
||||
);
|
||||
if ($validator->fails()) {
|
||||
return $this->failed($validator->errors()->first(), 422);
|
||||
}
|
||||
$result = $shop->update([
|
||||
'name' => $request->name,
|
||||
'mobile' => $request->mobile,
|
||||
'description' => $request->description,
|
||||
'province_id' => $request->province_id,
|
||||
'city_id' => $request->city_id,
|
||||
'district_id' => $request->district_id,
|
||||
'cover' => $request->cover,
|
||||
'address' => $request->address,
|
||||
'status' => Shop::STATUS_APPLYING,
|
||||
]);
|
||||
if ($result) {
|
||||
return $this->success('操作成功');
|
||||
} else {
|
||||
return $this->failed('失败');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes : 关闭店铺
|
||||
* @Date : 2021/5/6 3:29 下午
|
||||
* @Author : <Jason.C>
|
||||
*/
|
||||
public function destroy(Shop $shop)
|
||||
{
|
||||
if ($shop->user()->isNot(Api::user())) {
|
||||
return $this->failed('', '404');
|
||||
}
|
||||
if ($shop->close()) {
|
||||
return $this->success('店铺关闭成功');
|
||||
} else {
|
||||
return $this->failed('失败');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
87
modules/Mall/Http/Controllers/Api/ShopExtendController.php
Normal file
87
modules/Mall/Http/Controllers/Api/ShopExtendController.php
Normal file
@@ -0,0 +1,87 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Mall\Http\Controllers\Api;
|
||||
|
||||
use App\Api\Controllers\Controller;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Modules\Mall\Http\Resources\Api\Banner\BannerResource;
|
||||
use Modules\Mall\Http\Resources\Api\Category\CategoryResource;
|
||||
use Modules\Mall\Http\Resources\Api\Goods\BrandResource;
|
||||
use Modules\Mall\Http\Resources\Api\Goods\TagResource;
|
||||
use Modules\Mall\Http\Resources\Api\Shop\ExpressResource;
|
||||
use Modules\Mall\Models\Shop;
|
||||
|
||||
class ShopExtendController extends Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* Notes : 店铺的分类列表
|
||||
* @Date : 2021/5/13 10:28 上午
|
||||
* @Author : <Jason.C>
|
||||
* @param \Modules\Mall\Models\Shop $shop
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function categories(Shop $shop): JsonResponse
|
||||
{
|
||||
$list = $shop->categories()->where('parent_id', 0)->get();
|
||||
|
||||
return $this->success(CategoryResource::collection($list));
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes : 店铺标签
|
||||
* @Date : 2021/5/13 11:35 上午
|
||||
* @Author : <Jason.C>
|
||||
* @param \Modules\Mall\Models\Shop $shop
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function tags(Shop $shop): JsonResponse
|
||||
{
|
||||
$list = $shop->tags()->get();
|
||||
|
||||
return $this->success(TagResource::collection($list));
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes : 店铺品牌
|
||||
* @Date : 2021/5/13 11:35 上午
|
||||
* @Author : <Jason.C>
|
||||
* @param \Modules\Mall\Models\Shop $shop
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function brands(Shop $shop): JsonResponse
|
||||
{
|
||||
$list = $shop->brands()->get();
|
||||
|
||||
return $this->success(BrandResource::collection($list));
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes : 支持的物流
|
||||
* @Date : 2021/5/13 11:36 上午
|
||||
* @Author : <Jason.C>
|
||||
* @param \Modules\Mall\Models\Shop $shop
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function expresses(Shop $shop): JsonResponse
|
||||
{
|
||||
$list = $shop->expresses()->get();
|
||||
|
||||
return $this->success(ExpressResource::collection($list));
|
||||
}
|
||||
|
||||
/**
|
||||
* Notes : 轮播图
|
||||
* @Date : 2021/5/13 11:36 上午
|
||||
* @Author : <Jason.C>
|
||||
* @param \Modules\Mall\Models\Shop $shop
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function banners(Shop $shop): JsonResponse
|
||||
{
|
||||
$list = $shop->banners()->get();
|
||||
|
||||
return $this->success(BannerResource::collection($list));
|
||||
}
|
||||
|
||||
}
|
||||
36
modules/Mall/Http/Controllers/Api/TagController.php
Normal file
36
modules/Mall/Http/Controllers/Api/TagController.php
Normal file
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Mall\Http\Controllers\Api;
|
||||
|
||||
use App\Api\Controllers\Controller;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\Mall\Http\Resources\Api\Goods\TagResource;
|
||||
use Modules\Mall\Models\Tag;
|
||||
|
||||
class TagController extends Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* Notes : 标签列表
|
||||
* @Date : 2021/6/3 2:20 下午
|
||||
* @Author : <Jason.C>
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function index(Request $request): JsonResponse
|
||||
{
|
||||
$shopId = $request->shop_id;
|
||||
$limit = $request->limit;
|
||||
|
||||
$list = Tag::when($shopId, function (Builder $query) use ($shopId) {
|
||||
$query->where('shop_id', $shopId);
|
||||
})->when($limit, function (Builder $query) use ($limit) {
|
||||
$query->take($limit);
|
||||
})->get();
|
||||
|
||||
return $this->success(TagResource::collection($list));
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user