From 0da53d9bcb169d76596bd49f49ebd90e09c2090c Mon Sep 17 00:00:00 2001 From: lemon <15040771@qq.com> Date: Fri, 17 Sep 2021 18:10:19 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E7=9F=AD=E4=BF=A1=E9=80=9A=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Console/Commands/BalanceDue.php | 3 +- app/Events/OrderUpdated.php | 38 +++++++++ .../Api/VerificationController.php | 10 --- app/Listeners/OrderEventSubscriber.php | 77 +++++++++++++++++++ app/Models/Order.php | 5 ++ app/Providers/EventServiceProvider.php | 2 + config/sms.php | 4 +- 7 files changed, 127 insertions(+), 12 deletions(-) create mode 100644 app/Events/OrderUpdated.php create mode 100644 app/Listeners/OrderEventSubscriber.php diff --git a/app/Console/Commands/BalanceDue.php b/app/Console/Commands/BalanceDue.php index 1229039..d397fe6 100644 --- a/app/Console/Commands/BalanceDue.php +++ b/app/Console/Commands/BalanceDue.php @@ -8,6 +8,7 @@ use App\Models\Demand; use App\Models\Order; use App\Service\SmsService; use App\Traits\DemandTraits; +use App\Traits\SmsTraits; use Illuminate\Console\Command; use Illuminate\Support\Facades\Log; @@ -52,7 +53,7 @@ class BalanceDue extends Command foreach ($orders as $order) { if (!empty($order->mobile)) { $type = $order->pay_type == PayType::DEPOSIT_PAY ? '订金' : '定金'; - $sms->send('pay',['订单号:'.$order->orderNumber,$type,$order->timeout,$type,'小程序'],[$order->mobile]); + $sms->send('pay',['订单号:'.$order->orderNumber,$type,$order->timeout,$type,SmsTraits::$systeaNameText['user']],[$order->mobile]); } } } diff --git a/app/Events/OrderUpdated.php b/app/Events/OrderUpdated.php new file mode 100644 index 0000000..26862ac --- /dev/null +++ b/app/Events/OrderUpdated.php @@ -0,0 +1,38 @@ +order = $order; + } + + ///** + // * Get the channels the event should broadcast on. + // * + // * @return \Illuminate\Broadcasting\Channel|array + // */ + //public function broadcastOn() + //{ + // return new PrivateChannel('channel-name'); + //} +} diff --git a/app/Http/Controllers/Api/VerificationController.php b/app/Http/Controllers/Api/VerificationController.php index e97465b..768830c 100644 --- a/app/Http/Controllers/Api/VerificationController.php +++ b/app/Http/Controllers/Api/VerificationController.php @@ -57,16 +57,6 @@ class VerificationController extends Controller if ($order->pay_type != PayType::OFFLINE) { $this->fund($order); } - //短信 - if (env('SMS_SWITCH', '') == true) { - if (!empty($order->user->mobile)) { - (new SmsService)->send('verify', [$order->order_no, SmsTraits::$systeaNameText['user']], [$order->user->mobile]);//用户 - } - $supplierIds = OrderProductItem::query()->with('supplier')->where('order_id', $order->id)->distinct()->pluck('supplier_id'); - $phone = Supplier::query()->whereIn('id', $supplierIds)->pluck('contact_phone')->toArray(); - (new SmsService)->send('verify', [$order->order_no, SmsTraits::$systeaNameText['supplier']], $phone);//供应商 - (new SmsService)->send('verify', [$order->order_no, SmsTraits::$systeaNameText['agent']], [$order->agent->contact_phone]);//代理商 - } } return $this->success(); diff --git a/app/Listeners/OrderEventSubscriber.php b/app/Listeners/OrderEventSubscriber.php new file mode 100644 index 0000000..fcd9f02 --- /dev/null +++ b/app/Listeners/OrderEventSubscriber.php @@ -0,0 +1,77 @@ +order; + $sms = new SmsService(); + //退款通知 + if ($order->isDirty('status') && $order->status == OrderStatus::REFUNDING) { + $mobile = Agent::query()->where('id',$order->agent_id)->value('contact_phone'); + $sms->send('refund', [$order->order_no, SmsTraits::$systeaNameText['agent']], [$mobile]); + } + + //付款通知 + if ($order->isDirty('status') && ($order->status == OrderStatus::PAY_EARNEST || $order->status == OrderStatus::PAID)) { + //通知代理商 + $mobile = Agent::query()->where('id',$order->agent_id)->value('contact_phone'); + if (!empty($mobile)) { + $sms->send('order', [$order->order_no, SmsTraits::$systeaNameText['agent']], [$mobile]); + } + //通知供应商 + $supplierIds = OrderProductItem::query()->with('supplier')->where('order_id', $order->id)->distinct()->pluck('supplier_id'); + $phone = Supplier::query()->whereIn('id', $supplierIds)->pluck('contact_phone')->toArray(); + if (!empty($phone)) { + $sms->send('order', [$order->order_no, SmsTraits::$systeaNameText['supplier']], $phone);//供应商 + } + } + + //核销 + if ($order->isDirty('status') && $order->status == OrderStatus::SUCCESS) { + //通知用户 + if (!empty($order->mobile)) { + $sms->send('verify', [$order->order_no, SmsTraits::$systeaNameText['user']], [$order->mobile]);//用户 + } + //通知供应商 + $supplierIds = OrderProductItem::query()->with('supplier')->where('order_id', $order->id)->distinct()->pluck('supplier_id'); + $phone = Supplier::query()->whereIn('id', $supplierIds)->pluck('contact_phone')->toArray(); + if(!empty($phone)) { + $sms->send('verify', [$order->order_no, SmsTraits::$systeaNameText['supplier']], $phone);//供应商 + } + //通知代理商 + $mobile = Agent::query()->where('id',$order->agent_id)->value('contact_phone'); + if (!empty($mobile)) { + $sms->send('verify', [$order->order_no, SmsTraits::$systeaNameText['agent']], [$mobile]);//代理商 + } + } + } + } + + /** + * 为订阅者注册监听器 + * + * @param Illuminate\Events\Dispatcher $events + */ + public function subscribe($events) + { + $events->listen( + OrderUpdated::class, + OrderEventSubscriber::class . '@onOrderUpdated' + ); + } +} diff --git a/app/Models/Order.php b/app/Models/Order.php index 87d4b13..9d03db2 100644 --- a/app/Models/Order.php +++ b/app/Models/Order.php @@ -4,6 +4,7 @@ namespace App\Models; use App\Common\OrderStatus; use App\Common\PayType; +use App\Events\OrderUpdated; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\SoftDeletes; use App\Common\OrderStatus as Status; @@ -14,6 +15,10 @@ class Order extends BaseModel use HasFactory, SoftDeletes; protected $guarded = ['created_at', 'updated_at']; //不可批量赋值的属性 + protected $dispatchesEvents = [ + 'updated' => OrderUpdated::class, + ]; + public function scopeComplete($query) { return $query->where('status',OrderStatus::SUCCESS); diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 7048d90..f11e066 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -2,6 +2,7 @@ namespace App\Providers; +use App\Listeners\OrderEventSubscriber; use App\Listeners\SupplierEventSubscriber; use Illuminate\Auth\Events\Registered; use Illuminate\Auth\Listeners\SendEmailVerificationNotification; @@ -33,5 +34,6 @@ class EventServiceProvider extends ServiceProvider protected $subscribe = [ SupplierEventSubscriber::class, + OrderEventSubscriber::class, ]; } diff --git a/config/sms.php b/config/sms.php index 4eaab59..5f0501a 100644 --- a/config/sms.php +++ b/config/sms.php @@ -15,6 +15,8 @@ return [ 'auto_shelves' => '1120254', //供应商[{供应商名称}]在{时间}上传了一件新的产品,已为您自动上架,如需修改产品利润,请登录{系统名称}查看并修改。 'verify' => '1119775', //您有一笔订单[{订单号}]已成功核销,详情请登录{系统名称}查看 'pay' => '1120244', //您有一笔订单{1}已支付了{2},请在{3}之前支付尾款,未按时支付尾款订单将会失效,且{4}将不做退还,详情请登录{5}系统查看 - ] + 'order' => '1127625', //您有一笔新成交的订单{1},请及时登录{2}系统查看。 + 'refund' => '1127630', //您有一笔新的退款订单{1},请及时处理,详情请登录{2}系统查看。 + ] ], ]; From aef41a2b2b65308e4541dc24f401459c0fedad6b Mon Sep 17 00:00:00 2001 From: lemon <15040771@qq.com> Date: Fri, 17 Sep 2021 18:19:26 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BA=A4=E6=98=93=E8=B4=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/FinanceStatisticsController.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/AdminSupplier/Controllers/FinanceStatisticsController.php b/app/AdminSupplier/Controllers/FinanceStatisticsController.php index d522dd7..a7785e0 100755 --- a/app/AdminSupplier/Controllers/FinanceStatisticsController.php +++ b/app/AdminSupplier/Controllers/FinanceStatisticsController.php @@ -109,10 +109,11 @@ HTML; }); $row->column(3, function (Column $column) use ($profit) { - $column->row(Card::make('利润', function () use ($profit) { + $column->row(Card::make('交易费', function () use ($profit) { + $price = Admin::user()->deposit_used; return << -

$profit

+

$price

HTML; })); From 9b67cedf90f87827f4770fe689abc3450ab0970c Mon Sep 17 00:00:00 2001 From: lemon <15040771@qq.com> Date: Fri, 17 Sep 2021 19:09:09 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E9=9C=80=E6=B1=82=E5=B8=82=E5=9C=BA?= =?UTF-8?q?=E4=BA=A7=E5=93=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/DemandProductController.php | 2 +- .../Controllers/DemandBiddingController.php | 3 + .../Controllers/DemandProductController.php | 125 +++++++++++++----- ..._17_182618_update_demand_product_table.php | 32 +++++ 4 files changed, 131 insertions(+), 31 deletions(-) create mode 100644 database/migrations/2021_09_17_182618_update_demand_product_table.php diff --git a/app/Admin/Controllers/DemandProductController.php b/app/Admin/Controllers/DemandProductController.php index 0b51f17..d8ee9ee 100644 --- a/app/Admin/Controllers/DemandProductController.php +++ b/app/Admin/Controllers/DemandProductController.php @@ -34,7 +34,7 @@ class DemandProductController extends AdminController $grid->column('category.name', '分类'); $grid->column('picture')->image('', 60, 60); $grid->column('title'); - $grid->column('sale'); + //$grid->column('sale'); $grid->column('supplier.name', '供应商'); $grid->column('status') ->if(fn() => $this->status == ProductStatus::UNAUDITED) diff --git a/app/AdminSupplier/Controllers/DemandBiddingController.php b/app/AdminSupplier/Controllers/DemandBiddingController.php index cdc5483..45175a6 100755 --- a/app/AdminSupplier/Controllers/DemandBiddingController.php +++ b/app/AdminSupplier/Controllers/DemandBiddingController.php @@ -178,6 +178,9 @@ class DemandBiddingController extends AdminController $product->know = $demandProduct->know; $product->content = $demandProduct->content; $product->agent_id = $form->model()->bidding_user_id; + $product->type = $demandProduct->type; + $product->extends = $demandProduct->extends; + $product->service_persons = $demandProduct->service_persons; $product->save(); //处理需求 $demand = Demand::find($form->model()->demand_id); diff --git a/app/AdminSupplier/Controllers/DemandProductController.php b/app/AdminSupplier/Controllers/DemandProductController.php index da463e3..b1871dd 100755 --- a/app/AdminSupplier/Controllers/DemandProductController.php +++ b/app/AdminSupplier/Controllers/DemandProductController.php @@ -3,11 +3,14 @@ namespace App\AdminSupplier\Controllers; use App\AdminSupplier\Repositories\DemandProduct; +use App\AdminSupplier\Repositories\Product; use App\Common\ProductStatus; use App\Models\AgentProduct; +use App\Models\AgentProductItem; use App\Models\Category; use Dcat\Admin\Admin; use Dcat\Admin\Form; +use Dcat\Admin\Form\NestedForm; use Dcat\Admin\Grid; use Dcat\Admin\Repositories\EloquentRepository; use Dcat\Admin\Show; @@ -28,20 +31,20 @@ class DemandProductController extends AdminController $grid->model()->where('supplier_id', Admin::user()->id); $grid->column('id')->sortable(); + $grid->column('type')->using(admin_trans('product.options.publish_type')); $grid->column('category.name', '产品分类'); - $grid->column('title'); + $grid->column('title')->limit(15); $grid->column('picture')->image('', 60, 60); - //$grid->column('price'); - //$grid->column('original_price'); - //$grid->column('stock'); - $grid->column('sale'); + //$grid->column('sale'); $grid->column('status')->using(ProductStatus::array()); $grid->column('created_at'); $grid->column('updated_at'); - $grid->disableRowSelector(); + $grid->filter(function (Grid\Filter $filter) { - $filter->equal('id'); + $filter->panel(); + $filter->equal('id')->width(2); + $filter->equal('type')->select(admin_trans('product.options.publish_type'))->width(2); }); }); } @@ -55,17 +58,13 @@ class DemandProductController extends AdminController */ protected function detail($id) { - return Show::make($id, new DemandProduct(), function (Show $show) { + return Show::make($id, new DemandProduct(['category:id,name']), function (Show $show) { $show->field('id'); - $show->field('supplier_id'); - $show->field('category_id'); + $show->field('category.name','分类'); $show->field('title'); - //$show->field('price'); - //$show->field('original_price'); $show->field('pictures')->image('', 80, 80); - //$show->field('stock'); - $show->field('sale'); - $show->field('status'); + $show->field('service_persons','涉及用户数'); + $show->field('status')->using(ProductStatus::array()); $show->field('know')->unescape()->as(fn($v) => preg_replace('/.*?<\/script>/is', '', $v)); $show->field('content')->unescape()->as(fn($v) => preg_replace('/.*?<\/script>/is', '', $v)); $show->field('created_at'); @@ -80,6 +79,8 @@ class DemandProductController extends AdminController */ protected function form() { + + Admin::user()->publish_type = json_decode(Admin::user()->publish_type, true); return Form::make(new DemandProduct(), function (Form $form) { //不允许编辑非自己数据 if ($form->isEditing() && $form->model()->supplier_id != Admin::user()->id) { @@ -91,15 +92,81 @@ class DemandProductController extends AdminController $options = Category::selectOptions(fn($query) => $query->where('agent_id', 0)); $form->select('category_id')->options(array_slice($options, 1, null, true))->required(); $form->text('title')->required(); - //$form->text('price')->required(); - //$form->text('original_price')->required(); + //$form->currency('price')->symbol('¥')->required(); + //$form->currency('original_price')->symbol('¥')->required(); + $form->number('service_persons','涉及用户数')->required(); + //$form->number('stock')->required(); $form->multipleImage('pictures')->required()->removable(false)->retainable()->uniqueName(); - //$form->text('stock')->default(9999)->required(); $form->editor('know'); $form->editor('content')->required(); + //扩展字段 + $publish_type = array_intersect_key( + admin_trans('product.options.publish_type'), + array_flip(Admin::user()->publish_type) + ); + + $form->radio('type', '产品类型') + ->options($publish_type) + ->default(current(Admin::user()->publish_type)) + ->when(0, function (Form $form) { //旅游线路 + $form->table('extends.field_0.project', '包含项目', function (NestedForm $table) { + $table->text('name', '字段1'); + $table->text('num', '字段2'); + $table->text('price', '字段3'); + })->help('第一行数据默认是表头,如:项目名称、数量、额外费用'); + + $form->dateRange('extends.field_0.date.start', 'extends.field_0.date.end', '行程时间'); + })->when(1, function (Form $form) { //酒店 + $default = [ + ['tag' => '行李寄存'], ['tag' => '24小时前台'], ['tag' => '前台保险柜'], ['tag' => '唤醒服务'], + ['tag' => '早餐'], ['tag' => '送餐服务'], ['tag' => '电梯'], ['tag' => '空调'], + ['tag' => '新风系统'], ['tag' => '24小时热水'], ['tag' => '吹风机'], ['tag' => '加湿器'], + ['tag' => '自动售货机'], ['tag' => '健身房'], ['tag' => '桌球室'], ['tag' => '洗衣服务'] + ]; + $form->table('extends.field_1.tags', '酒店设施', function (NestedForm $table) { + $table->text('tag', '包含项目')->placeholder('如:24小时热水、干洗服务等'); + })->value($default)->help('首次创建时,系统会默认填充基本服务,请根据本酒店情况进行删减或新增'); + + $form->text('extends.field_1.name', '酒店名'); + $form->text('extends.field_1.address', '地址'); + $form->map('extends.field_1.latitude', 'extends.field_1.longitude', '位置'); + })->when(2, function (Form $form) { //景区 + $form->table('extends.field_2.open_time', '开放时间', function (NestedForm $table) { + $table->text('node', '字段1')->placeholder('如:周一至周五'); + $table->text('summer', '字段2')->placeholder('如:08:00~19:00'); + $table->text('winter', '字段3')->placeholder('如:08:00~18:00'); + })->help('第一行数据默认是表头,如:项目名称、数量、额外费用'); + + $form->table('extends.field_2.project', '包含项目', function (NestedForm $table) { + $table->text('name', '字段1'); + $table->text('num', '字段2'); + $table->text('price', '字段3'); + })->help('第一行数据默认是表头,如:项目名称、数量、额外费用'); + + $form->text('extends.field_2.name', '景区名'); + $form->text('extends.field_2.address', '地址'); + $form->map('extends.field_2.latitude', 'extends.field_2.longitude', '位置'); + })->when(3, function (Form $form) { //餐厅 + $form->table('extends.field_3.open_time', '开放时间', function (NestedForm $table) { + $table->text('week', '字段1')->placeholder('如:周一至周五'); + $table->text('section', '字段2')->placeholder('如:上午/下午'); + $table->text('time', '字段3')->placeholder('如:08:00~18:00'); + })->help('第一行数据默认是表头,如:项目名称、数量、额外费用'); + + $form->table('extends.field_3.package', '包含套餐', function (NestedForm $table) { + $table->text('name', '字段1')->placeholder('如:清蒸鱿鱼'); + $table->text('num', '字段2')->placeholder('如:1条'); + $table->text('price', '字段3')->placeholder('如:99元'); + })->help('第一行数据默认是表头,如:项目名称、数量、额外费用'); + + $form->text('extends.field_3.name', '餐厅名'); + $form->text('extends.field_3.address', '地址'); + $form->map('extends.field_3.latitude', 'extends.field_3.longitude', '位置'); + }); + if ($form->isEditing()) { - $form->confirm('提示', '编辑产品需要重新审核,同时下架所有关联的代理商产品,是否继续?'); + $form->confirm('提示', '修改标题、价格、产品图片、旅游须知、产品详情、产品类型及信息需要重新审核,同时下架所有关联的代理商产品,是否继续?'); } })->saving(function (Form $form) { //不允许编辑非自己数据 @@ -107,7 +174,11 @@ class DemandProductController extends AdminController return $form->response()->error('数据不存在'); } - //不允许编辑的字段 TODO 忽略字段不起作用 + if (!Admin::user()->publish_type || !in_array($form->type, Admin::user()->publish_type)) { + return $form->response()->error('对不起,你没有此类产品的发布、编辑权限'); + } + + //不允许编辑的字段,忽略字段不起作用? $form->ignore(['id', 'supplier_id', 'sale', 'status', 'created_at', 'updated_at', 'deleted_at']); //null字段转为'' @@ -118,16 +189,10 @@ class DemandProductController extends AdminController } //特殊字段处理 - $form->hidden(['status', 'supplier_id']); //表单没有的字段,必须加上这句才能重置值 - $form->status = ProductStatus::UNAUDITED; - $form->supplier_id = Admin::user()->id; - })->saved(function (Form $form, $result) { - //下架代理商产品 - if ($result) { - $id = $form->getKey(); - AgentProduct::where('product_id', $id) - ->orWhere(DB::raw('FIND_IN_SET(' . $id . ', product_ids)')) //TODO product_ids字段可能会去掉 - ->update(['status' => ProductStatus::SOLD_OUT]); + if ($form->isCreating()) { + $form->hidden(['status', 'supplier_id']); //表单没有的字段,必须加上这句才能重置值 + $form->supplier_id = Admin::user()->id; + $form->status = ProductStatus::UNAUDITED; } })->deleting(function (Form $form) { //不允许删除非自己的数据 diff --git a/database/migrations/2021_09_17_182618_update_demand_product_table.php b/database/migrations/2021_09_17_182618_update_demand_product_table.php new file mode 100644 index 0000000..eda8433 --- /dev/null +++ b/database/migrations/2021_09_17_182618_update_demand_product_table.php @@ -0,0 +1,32 @@ +json('extends')->default(null)->comment('扩展字段,根据type不同,字段名不同'); + $table->tinyInteger('type')->default(0)->comment('0:旅游线路、1:洒店、2:景区、3:餐厅、4:车队、5:单项'); + $table->integer('service_persons')->default(1)->comment('service_persons'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } +}