This commit is contained in:
2023-03-08 09:16:04 +08:00
commit e78454540f
1318 changed files with 210569 additions and 0 deletions

View 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));
}
}

View 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('失败');
}
}
}

View 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));
}
}

View 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('删除成功');
}
}

View 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));
}
}

View 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));
}
}

View 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);
}
}

View 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());
}
}
}

View 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,
]);
}
}

View 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('未知错误');
}
}
}

View 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));
}
}

View 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('失败');
}
}
}

View 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));
}
}

View 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));
}
}