From ce8f753c5d70a0fdcfb93946b3472be723064ee2 Mon Sep 17 00:00:00 2001 From: xuanchen <122383162@qq.com> Date: Thu, 12 Jan 2023 15:53:40 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=B8=8B=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Area/IndexController.php | 3 + .../Controllers/Area/AreaCodeController.php | 7 ++ app/Api/Resources/Area/AreaFullResource.php | 2 + app/Api/Routes/area.php | 1 + app/Models/AreaCode.php | 13 +++ modules/Mall/Facades/Order.php | 18 ++-- .../Controllers/Api/ActivityController.php | 25 ++++- .../Http/Controllers/Api/IndexController.php | 57 +++++++++- .../Controllers/Api/OrderBuyController.php | 101 ++++++++++++------ modules/Mall/Models/Traits/HasRegion.php | 2 +- 10 files changed, 178 insertions(+), 51 deletions(-) diff --git a/app/Admin/Controllers/Area/IndexController.php b/app/Admin/Controllers/Area/IndexController.php index 78011a8..164776c 100644 --- a/app/Admin/Controllers/Area/IndexController.php +++ b/app/Admin/Controllers/Area/IndexController.php @@ -51,6 +51,7 @@ class IndexController extends AdminController $grid->column('id', '序号'); $grid->column('title', '地区名称'); + $grid->column('mobile', '联系方式'); $grid->column('stock', '库存') ->modal('变动记录', AreaStockAble::class); // $grid->column('user.username', '管理员') @@ -84,6 +85,7 @@ class IndexController extends AdminController $form = new Form(new Area()); $form->text('title', '地区名称')->required(); + $form->text('mobile', '联系方式')->required(); // $form->select('user_id', '管理员') // ->options(function ($userId) { @@ -101,6 +103,7 @@ class IndexController extends AdminController if ($form->isCreating()) { $form->number('stock', '库存(份)')->default(100)->help('1份2箱'); } + $form->select('province_id', '省份') ->options(Region::where('parent_id', 1)->pluck('name', 'id')) ->load('city_id', route('admin.mall.regions.region')) diff --git a/app/Api/Controllers/Area/AreaCodeController.php b/app/Api/Controllers/Area/AreaCodeController.php index 340c4c9..3672491 100644 --- a/app/Api/Controllers/Area/AreaCodeController.php +++ b/app/Api/Controllers/Area/AreaCodeController.php @@ -6,6 +6,7 @@ use App\Api\Controllers\Controller; use App\Api\Resources\Area\AreaCodeResource; use App\Models\AreaCode; use Illuminate\Http\JsonResponse; +use Illuminate\Http\Request; class AreaCodeController extends Controller { @@ -23,4 +24,10 @@ class AreaCodeController extends Controller return $this->success(new AreaCodeResource($code)); } + public function info(Request $request) + { + $code = AreaCode::query()->where('code', $request->code)->first(); + return $this->success(new AreaCodeResource($code)); + } + } diff --git a/app/Api/Resources/Area/AreaFullResource.php b/app/Api/Resources/Area/AreaFullResource.php index b10d974..32c53a3 100644 --- a/app/Api/Resources/Area/AreaFullResource.php +++ b/app/Api/Resources/Area/AreaFullResource.php @@ -12,10 +12,12 @@ class AreaFullResource extends JsonResource return [ 'area_id' => $this->id, 'title' => $this->title, + 'mobile' => $this->mobile, 'stock' => $this->stock, 'province' => $this->province->name, 'city' => $this->city->name, 'district' => $this->district->name, + 'address' => $this->address, 'full_address' => $this->getFullAddress(), ]; } diff --git a/app/Api/Routes/area.php b/app/Api/Routes/area.php index 2c390c5..80bebdd 100644 --- a/app/Api/Routes/area.php +++ b/app/Api/Routes/area.php @@ -18,5 +18,6 @@ Route::group([ 'middleware' => config('api.route.middleware_auth'), ], function (Router $router) { $router->get('areas/{code}/show', 'AreaCodeController@show'); + $router->get('areas/code/info', 'AreaCodeController@info'); }); diff --git a/app/Models/AreaCode.php b/app/Models/AreaCode.php index 8765d0d..998c5d0 100644 --- a/app/Models/AreaCode.php +++ b/app/Models/AreaCode.php @@ -5,6 +5,7 @@ namespace App\Models; use App\Models\Traits\BelongsToArea; use App\Traits\HasStatus; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Modules\Mall\Models\Order; use Modules\User\Models\User; use Modules\User\Traits\BelongsToUser; @@ -45,5 +46,17 @@ class AreaCode extends Model $this->save(); } + /** + * Notes: 关联订单 + * + * @Author: 玄尘 + * @Date: 2023/1/12 15:02 + * @return \Illuminate\Database\Eloquent\Relations\HasOne + */ + public function order() + { + return $this->hasOne(Order::class); + } + } diff --git a/modules/Mall/Facades/Order.php b/modules/Mall/Facades/Order.php index 9f7e46e..5626d4d 100644 --- a/modules/Mall/Facades/Order.php +++ b/modules/Mall/Facades/Order.php @@ -195,17 +195,17 @@ class Order DB::beginTransaction(); // try { - $orders = []; - foreach ($splits as $split) { - $orders[] = $this->createOne($split['items']); - } + $orders = []; + foreach ($splits as $split) { + $orders[] = $this->createOne($split['items']); + } - DB::commit(); - $result = new Collection($orders); + DB::commit(); + $result = new Collection($orders); - $result->total = $this->total(); + $result->total = $this->total(); - return $result; + return $result; // } catch (Exception $exception) { // DB::rollBack(); // throw new Exception($exception->getMessage()); @@ -278,7 +278,7 @@ class Order $order = OrderModel::query() ->create([ 'shop_id' => $split->shop_id, - 'area_code_id' => $this->area_code_id, + 'area_code_id' => $this->area_code_id ?? 0, 'user_id' => $this->user_id, 'amount' => $split->amount, 'type' => $this->type, diff --git a/modules/Mall/Http/Controllers/Api/ActivityController.php b/modules/Mall/Http/Controllers/Api/ActivityController.php index 22a57b9..9519a61 100644 --- a/modules/Mall/Http/Controllers/Api/ActivityController.php +++ b/modules/Mall/Http/Controllers/Api/ActivityController.php @@ -3,10 +3,14 @@ namespace Modules\Mall\Http\Controllers\Api; use App\Api\Controllers\Controller; +use App\Api\Resources\User\UserBaseResource; use Illuminate\Http\JsonResponse; +use Jason\Api\Api; use Modules\Mall\Http\Resources\Api\Activity\ActivityBaseResource; use Modules\Mall\Http\Resources\Api\Activity\ActivityResource; +use Modules\Mall\Http\Resources\Api\Goods\GoodsBaseResource; use Modules\Mall\Models\Activity; +use Modules\Mall\Models\Goods; class ActivityController extends Controller { @@ -27,7 +31,26 @@ class ActivityController extends Controller public function show(Activity $activity) { - return $this->success(new ActivityResource($activity)); + $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_NORMAL) + ->get(); + + + $user = Api::user(); + + return $this->success([ + 'user' => $user ? new UserBaseResource($user) : '', + 'show_goods' => $show_goods ? new GoodsBaseResource($show_goods) : '', + 'activity' => new ActivityResource($activity) + ]); } diff --git a/modules/Mall/Http/Controllers/Api/IndexController.php b/modules/Mall/Http/Controllers/Api/IndexController.php index 93fac3e..ecdb777 100644 --- a/modules/Mall/Http/Controllers/Api/IndexController.php +++ b/modules/Mall/Http/Controllers/Api/IndexController.php @@ -3,13 +3,16 @@ namespace Modules\Mall\Http\Controllers\Api; use App\Api\Controllers\Controller; -use App\Api\Resources\User\UserBaseResource; use Illuminate\Http\JsonResponse; -use Jason\Api\Api; +use Modules\Cms\Http\Resources\ArticleBaseResource; 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 { @@ -23,6 +26,10 @@ class IndexController extends Controller */ 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) { @@ -32,16 +39,56 @@ class IndexController extends Controller $goods = Goods::query() ->where('id', '<>', $show_goods_id) ->shown() - ->where('channel', Goods::CHANNEL_NORMAL) + ->where('channel', Goods::CHANNEL_SCORE) ->get(); + $videos = Video::query() + ->shown() + ->get(); - $user = Api::user(); + $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 = [ - 'user' => $user ? new UserBaseResource($user) : '', '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), + 'categories' => [ + 'memory' => Category::query()->where('slug', 'MEMORY')->value('id') ?? 0, + 'health' => Category::query()->where('slug', 'HEALTH')->value('id') ?? 0, + ], ]; return $this->success($data); diff --git a/modules/Mall/Http/Controllers/Api/OrderBuyController.php b/modules/Mall/Http/Controllers/Api/OrderBuyController.php index 3663aad..d9397e5 100644 --- a/modules/Mall/Http/Controllers/Api/OrderBuyController.php +++ b/modules/Mall/Http/Controllers/Api/OrderBuyController.php @@ -50,22 +50,9 @@ class OrderBuyController extends Controller $goods_sku_id = $request->goods_sku_id; $qty = $request->qty; - $detail = collect(); - $user = Api::user(); - $areaCode = $user->info->areaCode; - if (! $areaCode) { - return $this->failed('您没有提货码不可参与此活动'); - } - if ($areaCode->status != AreaCode::STATUS_INIT) { - return $this->failed('提货码已被使用,不可重复使用'); - } + $detail = collect(); + $user = Api::user(); -// $address_id = $request->address_id; -// 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); @@ -77,9 +64,35 @@ class OrderBuyController extends Controller return $this->failed($goods_sku->getGoodsName().'商品不可购买'); } + + $areaCode = $user->info->areaCode; + if (! $areaCode) { + return $this->failed('您没有提货码不可参与此活动'); + } + if ($areaCode->status != AreaCode::STATUS_INIT) { + return $this->failed('提货码已被使用,不可重复使用'); + } + + $address_id = $request->address_id; + if ($address_id) { + $address = Address::find($address_id); + } else { + $address = Address::where('user_id', $user->id)->orderBy('is_default', 'desc')->first(); + } + $item = new Item($goods_sku, null, $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; + } + $freight = $item->freight(); $amount = $item->total(); $weight = $item->weight(); @@ -91,14 +104,21 @@ class OrderBuyController extends Controller } $data = [ - 'areaCode' => new AreaCodeResource($areaCode), - 'detail' => $items, - 'amount' => floatval(bcadd($amount, $freight, 2)), - 'freight' => $freight, - 'weight' => $weight, - 'user' => $user ? new UserBaseResource($user) : '', + 'detail' => $items, + 'amount' => floatval(bcadd($amount, $freight, 2)), + 'freight' => $freight, + 'weight' => $weight, + 'user' => $user ? new UserBaseResource($user) : '', ]; + if ($type == OrderModel::TYPE_SAMPLE) { + $data['areaCode'] = new AreaCodeResource($areaCode); + } + + if ($address) { + $data['address'] = new AddressResource($address); + } + return $this->success($data); } @@ -127,9 +147,9 @@ class OrderBuyController extends Controller return $this->failed($validator->errors()->first()); } - $user = Api::user(); - $remark = $request->remark ?? ''; -// $address_id = $request->address_id ?? ''; + $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; @@ -142,10 +162,6 @@ class OrderBuyController extends Controller return $this->failed('提货码已被使用,不可重复使用'); } -// $address = Address::where('user_id', $user->id)->where('id', $address_id)->first(); -// if (! $address) { -// return $this->failed('未找到收货地址'); -// } $detail = collect(); @@ -171,14 +187,29 @@ class OrderBuyController extends Controller $type = OrderModel::TYPE_SCORE; } + $address = Address::where('user_id', $user->id)->where('id', $address_id)->first(); - $orders = (new Order)->user($user) - ->remark($remark) - ->items($detail) - ->areaCode($areaCode) - ->type($type) - ->source(['share_user_id' => $share_user_id,]) - ->create(); + if (in_array($type, [OrderModel::TYPE_SCORE, OrderModel::TYPE_NORMAL]) && ! $address) { + return $this->failed('未找到收货地址'); + } + + if ($type == OrderModel::TYPE_SAMPLE) { + $orders = (new Order)->user($user) + ->remark($remark) + ->items($detail) + ->areaCode($areaCode) + ->type($type) + ->source(['share_user_id' => $share_user_id,]) + ->create(); + } else { + $orders = (new Order)->user($user) + ->remark($remark) + ->items($detail) + ->address($address) + ->type($type) + ->source(['share_user_id' => $share_user_id,]) + ->create(); + } foreach ($orders as $order) { if ($type == OrderModel::TYPE_SAMPLE) { diff --git a/modules/Mall/Models/Traits/HasRegion.php b/modules/Mall/Models/Traits/HasRegion.php index 8843545..60d8fdc 100644 --- a/modules/Mall/Models/Traits/HasRegion.php +++ b/modules/Mall/Models/Traits/HasRegion.php @@ -52,7 +52,7 @@ trait HasRegion * @param string $separators 地址的分隔符 * @return string */ - public function getFullAddress(string $separators = ' '): string + public function getFullAddress(string $separators = ''): string { return $this->province->name.$separators.