From b317777eedfba86c19caa6190163bb56c15bbd10 Mon Sep 17 00:00:00 2001 From: vine_liutk <961510893@qq.com> Date: Fri, 10 Dec 2021 11:26:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=90=8E=E5=8F=B0=E9=83=A8?= =?UTF-8?q?=E5=88=86=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Admin/Controllers/CouponController.php | 43 ++++---- .../ShippingTemplateController.php | 2 +- app/Admin/Renderable/CouponRangeTable.php | 8 +- app/Models/UserCoupon.php | 10 ++ app/Services/CouponService.php | 98 +++++++++++++++++++ database/seeders/AdminMenuSeeder.php | 13 ++- resources/lang/zh_CN/shipping-rule.php | 4 +- 7 files changed, 147 insertions(+), 31 deletions(-) create mode 100644 app/Services/CouponService.php diff --git a/app/Admin/Controllers/CouponController.php b/app/Admin/Controllers/CouponController.php index 999f24ea..2d4e257f 100644 --- a/app/Admin/Controllers/CouponController.php +++ b/app/Admin/Controllers/CouponController.php @@ -38,13 +38,18 @@ class CouponController extends AdminController } })->label(); $grid->column('threshold')->append('元'); - $grid->column('limit'); + $grid->column('limit')->display(function ($value) { + if ($value == 0) { + return '不限量'; + } + return $value; + }); $grid->column('sent'); $grid->column('use_day')->append('天'); $grid->column('use_start_at'); $grid->column('use_end_at'); $grid->column('created_at')->sortable(); - + $grid->model()->orderBy('created_at', 'desc'); /** 操作 **/ //新增 if (Admin::user()->can('dcat.admin.coupons.create')) { @@ -108,25 +113,23 @@ class CouponController extends AdminController $form->text('name')->required(); $form->number('limit')->min(0)->default(0)->help('0为不限量'); - if ($form->isEditing()) { - if (!$form->model()->hasReceived()) { - $form->radio('type') - ->when(1, function (Form $form) { - $form->currency('amount1')->symbol('¥')->help('例:100.00表示优惠100元。')->value($form->model()->amount); - }) - ->when(2, function (Form $form) { - $form->currency('amount2')->symbol('%')->help('例:0.95表示95折。')->value($form->model()->amount); - }) - ->options([ - 1 =>'抵扣券', - 2 =>'折扣券', - ])->default(1); - $form->hidden('amount'); + if ($form->isCreating() || ($form->isEditing() && !$form->model()->hasReceived())) { + $form->radio('type') + ->when(1, function (Form $form) { + $form->currency('amount1')->symbol('¥')->help('例:100.00表示优惠100元。')->value($form->model()->amount); + }) + ->when(2, function (Form $form) { + $form->currency('amount2')->symbol('%')->help('例:0.95表示95折。')->value($form->model()->amount); + }) + ->options([ + 1 =>'抵扣券', + 2 =>'折扣券', + ])->default(1); + $form->hidden('amount'); - $form->currency('threshold')->symbol('¥')->default(0); - $form->number('use_day')->min(0)->default(1)->help('单位:天;指领取后几天内有效。'); - $form->datetimeRange('use_start_at', 'use_end_at', '使用时间')->help('设置时间后,期限字段失效。'); - } + $form->currency('threshold')->symbol('¥')->default(0); + $form->number('use_day')->min(0)->default(1)->help('单位:天;指领取后几天内有效。'); + $form->datetimeRange('use_start_at', 'use_end_at', '使用时间')->help('设置时间后,期限字段失效。'); } // $form->editing(function (Form $form) { diff --git a/app/Admin/Controllers/ShippingTemplateController.php b/app/Admin/Controllers/ShippingTemplateController.php index bcf7288b..cba01fc9 100644 --- a/app/Admin/Controllers/ShippingTemplateController.php +++ b/app/Admin/Controllers/ShippingTemplateController.php @@ -109,7 +109,7 @@ class ShippingTemplateController extends AdminController */ public function ruleList(Content $content, ShippingTemplateModel $template) { - return $content->header(__('coupon.labels.coupons')) + return $content->header(__('shipping-rule.labels.ShippingRule')) ->description($template->name) ->body(ShippingRuleTable::grid($template->id)); } diff --git a/app/Admin/Renderable/CouponRangeTable.php b/app/Admin/Renderable/CouponRangeTable.php index 4206104d..9c813c84 100644 --- a/app/Admin/Renderable/CouponRangeTable.php +++ b/app/Admin/Renderable/CouponRangeTable.php @@ -3,6 +3,7 @@ namespace App\Admin\Renderable; use App\Admin\Repositories\CouponRange; +use App\Models\Coupon; use App\Models\ProductCategory; use Dcat\Admin\Admin; use Dcat\Admin\Grid; @@ -41,11 +42,12 @@ class CouponRangeTable extends Grid }); $grid->column('created_at'); $grid->column('updated_at')->sortable(); + $grid->model()->orderBy('created_at', 'desc'); /** 操作 **/ //新增 if (Admin::user()->can('dcat.admin.coupon_ranges.create')) { - $grid->disableCreateButton(false); + // $grid->disableCreateButton(false); $grid->enableDialogCreate(); } //修改 @@ -63,6 +65,10 @@ class CouponRangeTable extends Grid $grid->model()->setConstraints([ 'coupon_id' => $couponId, ]); + $coupon = Coupon::findOrFail($couponId); + if ($coupon->hasReceived()) { + $grid->disableCreateButton(); + } } return $grid; } diff --git a/app/Models/UserCoupon.php b/app/Models/UserCoupon.php index 5bf0a729..84ac0b9d 100644 --- a/app/Models/UserCoupon.php +++ b/app/Models/UserCoupon.php @@ -22,4 +22,14 @@ class UserCoupon extends Model 'created_at', 'updated_at', ]; + + /** + * 优惠券可用范围规则 + * + * @return void + */ + public function ranges() + { + return $this->hasMany(CouponRange::class, 'coupon_id', 'coupon_id'); + } } diff --git a/app/Services/CouponService.php b/app/Services/CouponService.php new file mode 100644 index 00000000..8840b701 --- /dev/null +++ b/app/Services/CouponService.php @@ -0,0 +1,98 @@ +userCalidCoupons($user); + //判断券在这批商品中是否可用 + $availableCouponIds = []; + $availableCoupons = []; + foreach ($coupons as $coupon) { + if (in_array($coupon->coupon_id, $availableCouponIds)) {//遇到同样的券ID时直接跳过 + $availableCoupons[] = $coupon; + } else { + if ($this->isAvailableCouponToSomeSku($skus, $coupon)) { + $availableCouponIds[] = $coupon->coupon_id; + $availableCoupons[] = $coupon; + } + } + } + + return collect($availableCoupons); + } + + /** + * 用户有效的优惠券 + * + * @param User $user + * @return collection + */ + public function userCalidCoupons(User $user): collection + { + return UserCoupon::with('ranges')->where([ + 'user_id'=>$user->id, + 'status'=>0, + ])->where('use_start_at', '<=', now())->where('use_end_at', '>=', now())->get(); + } + + /** + * 这批商品中,这个券是否可用 + * + * @return boolean + */ + protected function isAvailableCouponToSomeSku(collection $skus, UserCoupon $coupon) + { + $res = false; + foreach ($skus as $sku) { + if ($sku instanceof ProductSku && $this->isAvailableCouponToSku($sku, $coupon)) { + $res = true; + break;//提前退出循环 + } + } + return $res; + } + + /** + * 这个商品是否可用这个券 + * + * @param ProductSku $productSku + * @param Coupon $coupon + * @return boolean + */ + protected function isAvailableCouponToSku(ProductSku $sku, UserCoupon $coupon) + { + $res = false; + foreach ($coupon->ranges as $range) { + switch ($range->type) { + case 1://指定商品分类 + if (in_array($sku->category_id, explode(',', $range->ranges))) { + $res = true; + } + break; + case 2://指定商品IDS + if (in_array($sku->id, explode(',', $range->ranges))) { + $res = true; + } + break; + } + if ($res) {//如果可用提前跳出循环; + break; + } + } + return $res; + } +} diff --git a/database/seeders/AdminMenuSeeder.php b/database/seeders/AdminMenuSeeder.php index bfb10213..1d8e80b9 100644 --- a/database/seeders/AdminMenuSeeder.php +++ b/database/seeders/AdminMenuSeeder.php @@ -70,7 +70,11 @@ class AdminMenuSeeder extends Seeder 'icon' => '', 'uri' => 'coupons', ], - + [ + 'title' => '运费模板管理', + 'icon' => '', + 'uri' => 'shipping-templates', + ], ], ], [ @@ -104,7 +108,7 @@ class AdminMenuSeeder extends Seeder 'uri' => 'product-groups', ], [ - 'title'=> '商品标签', + 'title'=> '商品特点', 'icon' => '', 'uri' => 'product-features', ], @@ -113,11 +117,6 @@ class AdminMenuSeeder extends Seeder 'icon' => '', 'uri' => 'product-buynotes', ], - [ - 'title' => '运费模板管理', - 'icon' => '', - 'uri' => 'shipping-templates', - ], ], ], [ diff --git a/resources/lang/zh_CN/shipping-rule.php b/resources/lang/zh_CN/shipping-rule.php index a1b0e75b..7f7b1f3f 100644 --- a/resources/lang/zh_CN/shipping-rule.php +++ b/resources/lang/zh_CN/shipping-rule.php @@ -2,8 +2,8 @@ return [ 'labels' => [ - 'ShippingRule' => 'ShippingRule', - 'shipping-rule' => 'ShippingRule', + 'ShippingRule' => '运费规则', + 'shipping-rules' => '运费规则', ], 'fields' => [ 'template_id' => '运费模板',