diff --git a/README.md b/README.md index 4df62a0..850f255 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ ## 权限 -````php +```php $permissions = [ 'orders' => ['name' => '订单列表', 'curd' => ['index', 'show', 'destroy'], 'children' => [ 'pay' => '支付订单', @@ -30,8 +30,17 @@ $permissions = [ 'price' => '订单改价', ]], ]; +``` -```` +## 菜单 + +```php +$menus = [ + ['title' => '订单模块', 'icon' => 'feather icon-book', 'uri' => '', 'permission' => ['orders'], 'children' => [ + ['title' => '订单管理', 'icon' => '', 'uri' => '/orders', 'permission' => 'orders.index'], + ]], +]; +``` ## 配置 diff --git a/src/Http/Admin/OrderController.php b/src/Http/Admin/OrderController.php index 2a3d0fb..9d6d04a 100644 --- a/src/Http/Admin/OrderController.php +++ b/src/Http/Admin/OrderController.php @@ -64,7 +64,6 @@ class OrderController extends AdminController }); $grid->column('sn')->copyable(); - $grid->column('merchant.name'); $grid->column('user.phone'); $grid->column('total_money'); $grid->column('order_status')->display(fn() => $this->status()->dot()); @@ -101,6 +100,12 @@ class OrderController extends AdminController $show->width(6)->field('score_discount_money'); $show->width(6)->field('score_discount_amount'); }); + if ($info->coupon_money > 0) { + $show->row(function (Show\Row $show) { + $show->width(6)->field('coupon_money')->as(fn ($v) => '-'.floatval($v).'')->unescape(); + $show->width(6)->field('coupon.name', '优惠券'); + }); + } $show->row(function (Show\Row $show) use ($info) { $show->width(6)->field('pay_money')->as(function ($value) { return ''.$value.'' . ($this->discount_price > 0 ? '(-'.$this->discount_price.')' : ''); diff --git a/src/Http/Api/OrderController.php b/src/Http/Api/OrderController.php index 7b166cb..68fd06e 100644 --- a/src/Http/Api/OrderController.php +++ b/src/Http/Api/OrderController.php @@ -6,6 +6,8 @@ use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Validation\Rule; +use Peidikeji\Coupon\CouponService; +use Peidikeji\Coupon\Http\Resources\UserCouponResource; use Peidikeji\Order\Enums\PayStatus; use Peidikeji\Order\Enums\PayWay; use Peidikeji\Order\Enums\ShipStatus; @@ -14,10 +16,13 @@ use Peidikeji\Order\Events\OrderCanceled; use Peidikeji\Order\Events\OrderCreated; use Peidikeji\Order\Events\OrderPaid; use Peidikeji\Order\Events\OrderReceived; +use Peidikeji\Order\Exceptions\OrderException; use Peidikeji\Order\Http\Resources\OrderResource; use Peidikeji\Order\Http\Resources\OrderShipResouce; use Peidikeji\Order\OrderService; use Peidikeji\Order\OrderStore; +use Peidikeji\Region\Models\Region; +use Peidikeji\User\Models\UserAddress; class OrderController extends Controller { @@ -51,12 +56,19 @@ class OrderController extends Controller $service->goods($goods); // 收货地址 - $address = $request->input('address'); + $address = $this->getAddress(); + $service->ship(ShipWay::Express->value, $address); // 优惠券 - // $coupons = UserCoupon::where('user_id', $user->id)->effective()->get(); - - $service->ship(ShipWay::Express->value, $this->formatAddress($address)); + $couponList = $user->coupons()->effective()->get(); + $coupons = CouponService::make()->availableList($couponList, $service->orderGoodsList); + if ($request->filled('coupon_id')) { + $coupon = $couponList->firstWhere('id', $request->input('coupon_id')); + if (!$coupon) { + throw new OrderException('优惠券不存在或已过期'); + } + $service->coupon($coupon); + } $score = $request->input('score'); $userScore = $user->balance; @@ -81,11 +93,11 @@ class OrderController extends Controller 'price' => [ 'goods' => floatval($goodsList->sum('money')), 'ship' => $service->ship['money'], - 'coupon' => 0, + 'coupon' => $service->coupon['money'], 'score' => $service->score['money'], 'total' => $payMoney, ], - 'coupons' => [] + 'coupons' => UserCouponResource::collection($coupons), ]); } @@ -106,18 +118,8 @@ class OrderController extends Controller } $store->goods($goods); - $address = null; - if ($request->filled('address_id')) { - $address = $user->addresses()->find($request->input('address_id')); - if (!$address) { - return $this->error('收货地址不存在'); - } - } - if (!$address) { - $address = $request->input('address'); - } - - $store->ship($request->input('ship_way', ShipWay::None->value), $this->formatAddress($address)); + $address = $this->getAddress(); + $store->ship($request->input('ship_way', ShipWay::None->value), $address); $store->score($request->input('score', 0)); @@ -260,8 +262,35 @@ class OrderController extends Controller return $goods; } - protected function formatAddress($userAddress) + protected function getAddress() { - return $userAddress; + $address = []; + $request = request(); + if ($request->filled('address_id')) { + $user = auth('api')->user(); + $userAddress = $user->addresses()->find($request->input('address_id')); + if (!$address) { + throw new OrderException('收货地址不存在'); + } + $address = [ + 'name' => $userAddress->contact_name, + 'phone' => $userAddress->phone, + 'region' => [$userAddress->province?->name, $userAddress->city?->name, $userAddress->area?->name], + 'zone' => [$userAddress->province_id, $userAddress->city_id, $userAddress->area_id], + 'address' => $userAddress->address, + 'address_id' => $userAddress->id, + ]; + } else { + $address = $request->input('address'); + $region = data_get($address, 'region'); + if (! $region || count($region) === 0) { + throw new OrderException('收货地址格式不正确'); + } + $area = Region::where('name', $region[2])->where('level', 3)->firstOrFail(); + $city = Region::findOrFail($area->parent_id); + $address['zone'] = [$city->parent_id, $area->parent_id, $area->id]; + } + + return $address; } } diff --git a/src/OrderServiceProvider.php b/src/OrderServiceProvider.php index 2919029..ebfe652 100644 --- a/src/OrderServiceProvider.php +++ b/src/OrderServiceProvider.php @@ -11,6 +11,8 @@ use Peidikeji\Order\Events\OrderCreated; use Peidikeji\Order\Listeners\OrderUseScore; use Peidikeji\Order\Listeners\UpdateGoodsSoldCount; use Peidikeji\Order\Listeners\UpdateGoodsStock; +use Dcat\Admin\Admin; +use Dcat\Admin\Layout\Menu; class OrderServiceProvider extends ServiceProvider { @@ -43,5 +45,15 @@ class OrderServiceProvider extends ServiceProvider $this->loadMigrationsFrom(__DIR__.'/../database/'); $this->loadTranslationsFrom(__DIR__.'/../lang', 'dcat-admin-order'); + + Admin::menu(function (Menu $menu) { + // ['title' => '订单模块', 'icon' => 'feather icon-book', 'uri' => '', 'permission' => ['orders'], 'children' => [ + // ['title' => '订单管理', 'icon' => '', 'uri' => '/orders', 'permission' => 'orders.index'], + // ]], + $menu->add([ + ['id' => 1, 'parent_id' => 0, 'title' => '订单模块', 'icon' => 'feather icon-book', 'uri' => '', 'permission' => ['orders']], + ['id' => 2, 'parent_id' => 1, 'title' => '订单管理', 'icon' => '', 'uri' => '/orders', 'permission' => 'orders.index'] + ]); + }); } }