diff --git a/plugins/area-dividend/migrations/2022_06_22_115850_add_extra_plugin_id_and_extra_id_to_yz_area_dividend_table.php b/plugins/area-dividend/migrations/2022_06_22_115850_add_extra_plugin_id_and_extra_id_to_yz_area_dividend_table.php new file mode 100644 index 00000000..f4e556bd --- /dev/null +++ b/plugins/area-dividend/migrations/2022_06_22_115850_add_extra_plugin_id_and_extra_id_to_yz_area_dividend_table.php @@ -0,0 +1,39 @@ +integer('extra_plugin_id')->default(0)->comment('区域分红特殊插件ID'); + } + }); + Schema::table('yz_area_dividend', function (Blueprint $table) { + if (!Schema::hasColumn('yz_area_dividend', 'extra_id')) { + $table->integer('extra_id')->default(0)->comment('区域分红特殊插件关联表ID'); + } + }); + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } +} diff --git a/plugins/area-dividend/migrations/2022_06_22_115850_add_settlement_type_to_yz_area_dividend_table.php b/plugins/area-dividend/migrations/2022_06_22_115850_add_settlement_type_to_yz_area_dividend_table.php new file mode 100644 index 00000000..88da3be8 --- /dev/null +++ b/plugins/area-dividend/migrations/2022_06_22_115850_add_settlement_type_to_yz_area_dividend_table.php @@ -0,0 +1,34 @@ +integer('settlement_type')->default(0)->comment('区域分红佣金类型'); + } + }); + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } +} diff --git a/plugins/area-dividend/package.json b/plugins/area-dividend/package.json index f0fd5fec..e3db0192 100644 --- a/plugins/area-dividend/package.json +++ b/plugins/area-dividend/package.json @@ -1,7 +1,7 @@ { "name": "area-dividend", "terminal": "wechat|min|wap", - "version": "1.0.171", + "version": "1.0.194", "title": "区域分红", "description": "线上实现行政区域代理渠道,依据地址进行分红。", "author": "", diff --git a/plugins/area-dividend/src/Frontend/Services/IncomePageService.php b/plugins/area-dividend/src/Frontend/Services/IncomePageService.php index 03a873d9..0ea04503 100644 --- a/plugins/area-dividend/src/Frontend/Services/IncomePageService.php +++ b/plugins/area-dividend/src/Frontend/Services/IncomePageService.php @@ -1,26 +1,29 @@ itemModel = $this->getItemModel(); + $upgrade_service = new UpgradeService(\YunShop::app()->getMemberId()); + $upgrade_check = $upgrade_service->check(); + if ($upgrade_check['status'] == 1 && !$upgrade_service->hasApply()) { + $this->upgrade_h5_url = 'outAreaSelect'; + $this->upgrade_min_url = '/packageJ/outArea/areaSelect/areaSelect'; + } } @@ -47,7 +50,7 @@ class IncomePageService implements IIncomePage */ public function isAvailable() { - if($this->itemModel) return true; else return false; + if ($this->itemModel) return true; else return false; } @@ -90,6 +93,12 @@ class IncomePageService implements IIncomePage public function getAppUrl() { $teamManage = app('plugins')->isEnabled('team-manage'); + + if ($this->upgrade_h5_url) { + return $this->upgrade_h5_url; + } + + if ($teamManage) { $url = 'selectionarea'; } else { @@ -102,6 +111,11 @@ class IncomePageService implements IIncomePage public function getMiniUrl() { $teamManage = app('plugins')->isEnabled('team-manage'); + + if ($this->upgrade_min_url) { + return $this->upgrade_min_url; + } + if ($teamManage) { $mini_url = ''; } else { @@ -139,7 +153,7 @@ class IncomePageService implements IIncomePage { $member_id = \YunShop::app()->getMemberId(); - $levelModel = AreaDividendAgent::uniacid()->where('member_id',$member_id)->where('status',1)->first(); + $levelModel = AreaDividendAgent::uniacid()->where('member_id', $member_id)->where('status', 1)->first(); return $levelModel; } diff --git a/plugins/area-dividend/src/Listener/AfterOrderPaidListener.php b/plugins/area-dividend/src/Listener/AfterOrderPaidListener.php new file mode 100644 index 00000000..f4c20301 --- /dev/null +++ b/plugins/area-dividend/src/Listener/AfterOrderPaidListener.php @@ -0,0 +1,36 @@ +listen(AfterOrderPaidEvent::class, static::class . "@handle"); + } + + public function handle(AfterOrderPaidEvent $event) + { + $order = $event->getOrder(); + try { + $this->run($order); + } catch (ShopException $e) { + \Log::debug('--区域分红升级条件--AfterOrderPaidListener', $e->getMessage()); + return; + } + } + + public function run(Order $order) + { + $service = new UpgradeService($order->uid); + $service->afterPay(); + } + +} diff --git a/plugins/area-dividend/src/Listener/CreatedCommissionListener.php b/plugins/area-dividend/src/Listener/CreatedCommissionListener.php index ee13ea19..72c3773f 100644 --- a/plugins/area-dividend/src/Listener/CreatedCommissionListener.php +++ b/plugins/area-dividend/src/Listener/CreatedCommissionListener.php @@ -36,6 +36,15 @@ class CreatedCommissionListener public function handle($orderModel, $amount) { + + if (in_array($orderModel->plugin_id, [54, 144]) && + app('plugins')->isEnabled('coupon-store') + && \Yunshop\CouponStore\models\StoreOrder::uniacid()->where('order_id', $orderModel->id)->first() + ) { + \Log::debug('区域分红:消费券终止执行分销事件'); + return; + } + \Log::debug('区域分红:一级分销事件handle()'); $this->orderModle = $orderModel; @@ -117,16 +126,16 @@ class CreatedCommissionListener $order = Order::find($this->orderModle->id);//订单信息 $order['goods'] = $this->orderModle->orderGoods;//订单商品 - \Log::error('区域分红订单'.$this->model->id.'开始分红'); + \Log::debug('区域分红订单'.$this->model->id.'开始分红'); $service = new OrderCreatedNewService($order,$area_level,false,$this->commission); foreach ($area_agent as $key => $time) { $service->addAreaDividendData($time,$key); } //预计分红 $this->totalDividend = $service->expectedDividend(); - \Log::error('区域分红订单'.$this->model->id.'预计分红',[$this->totalDividend,$service->amount]); + \Log::debug('区域分红订单'.$this->model->id.'预计分红',[$this->totalDividend,$service->amount]); - \Log::error('区域分红订单'.$this->model->id.'分红结束'); + \Log::debug('区域分红订单'.$this->model->id.'分红结束'); } /** diff --git a/plugins/area-dividend/src/Listener/OrderCreatedListener.php b/plugins/area-dividend/src/Listener/OrderCreatedListener.php index d345758c..a984c12d 100644 --- a/plugins/area-dividend/src/Listener/OrderCreatedListener.php +++ b/plugins/area-dividend/src/Listener/OrderCreatedListener.php @@ -1,10 +1,13 @@ listen(\app\common\events\order\AfterOrderCreatedEvent::class, function ($event) { + $this->setExtra(0, 0, null); $this->handle($event->getOrderModel()); }); } - public function handle($order,$is_fix = false) + public function setExtra($extra_plugin_id, $extra_id, $extra_address = null) + { + $this->extra_plugin_id = $extra_plugin_id; + $this->extra_id = $extra_id; + $this->extra_address = $extra_address; + } + + public function handle($order, $is_fix = false) { $this->is_fix = $is_fix; \Log::debug('区域分红:订单创建事件handle()'); + + $before_event = new BeforeAreaDividendCreatedEvent($order, $this->extra_plugin_id, $this->extra_id); + event($before_event); + if ($before_event->isBreak()) { + \Log::debug('区域分红订单监听事件终止创建:' . $before_event->breakMessage()); + } + $this->set = $order->getSetting('plugin.area_dividend'); \Log::debug('区域分红执行设置:', json_encode($this->set, 256)); $this->dividend($order); - \Log::debug('区域分红' . $this->model->id .'完成'); + \Log::debug('区域分红' . $this->model->id . '完成'); $order_bonus_job = new OrderBonusJob('yz_area_dividend', 'area-dividend', 'order_sn', 'order_sn', 'dividend_amount', $this->model, $this->totalDividend); $order_bonus_job->handle(); @@ -45,7 +66,8 @@ class OrderCreatedListener /** * @param $order */ - public function dividend($order){ + public function dividend($order) + { \Log::debug('dividend()'); //订单model $this->model = $order; @@ -59,8 +81,23 @@ class OrderCreatedListener \Log::debug('基础设置没有开启区域分红,返回'); return; } + \Log::debug('区域分红订单模型:', json_encode($this->model, 256)); - $order['address'] = $this->model->address;//订单地址 + \Log::debug('区域分红特殊数据:', [ + 'extra_plugin_id' => $this->extra_plugin_id, + 'extra_id' => $this->extra_id, + ]); + if ($this->extra_address) { + \Log::debug('区域分红特殊地址', [ + 'province_id' => $this->extra_address && intval($this->extra_address->province_id) ? intval($this->extra_address->province_id) : 0, + 'city_id' => $this->extra_address && intval($this->extra_address->city_id) ? intval($this->extra_address->city_id) : 0, + 'district_id' => $this->extra_address && intval($this->extra_address->district_id) ? intval($this->extra_address->district_id) : 0, + 'street_id' => $this->extra_address && intval($this->extra_address->street_id) ? intval($this->extra_address->street_id) : 0, + ]); + $order['address'] = $this->extra_address; + } else { + $order['address'] = $this->model->address;//订单地址 + } if ($order->plugin_id == 0 || $order->plugin_id == 92 || $order->plugin_id == 32) { \Yunshop\AreaDividend\models\Order::agentOrder($order); @@ -99,6 +136,8 @@ class OrderCreatedListener $area_level['level_4'] = $this->getLevelStatus($area_agent['street']); } + event(new AfterDetermineRegionEvent($this->model, $area_agent, $area_level)); + if (!$area_agent) { \Log::debug('区域代理为空,返回'); } else { @@ -117,16 +156,17 @@ class OrderCreatedListener $order = Order::find($this->model->id);//订单信息 $order['goods'] = $this->model->hasManyOrderGoods;//订单商品 - \Log::error('区域分红订单'.$this->model->id.'开始分红'); - $service = new OrderCreatedNewService($order,$area_level,$this->is_fix); + \Log::error('区域分红订单' . $this->model->id . '开始分红'); + $service = new OrderCreatedNewService($order, $area_level, $this->is_fix); + $service->setExtra($this->extra_plugin_id, $this->extra_id); foreach ($area_agent as $key => $time) { - $service->addAreaDividendData($time,$key); + $service->addAreaDividendData($time, $key); } //预计分红 $this->totalDividend = $service->expectedDividend(); - \Log::error('区域分红订单'.$this->model->id.'预计分红',[$this->totalDividend,$service->amount]); + \Log::error('区域分红订单' . $this->model->id . '预计分红', [$this->totalDividend, $service->amount]); - \Log::error('区域分红订单'.$this->model->id.'分红结束'); + \Log::error('区域分红订单' . $this->model->id . '分红结束'); } diff --git a/plugins/area-dividend/src/Listener/OrderFailureListener.php b/plugins/area-dividend/src/Listener/OrderFailureListener.php index 6b68c5d0..e61efb68 100644 --- a/plugins/area-dividend/src/Listener/OrderFailureListener.php +++ b/plugins/area-dividend/src/Listener/OrderFailureListener.php @@ -1,10 +1,5 @@ listen(\app\common\events\order\AfterOrderReceivedEvent::class, function ($event) { - $this->handle($event->getOrderModel()); + $order = $event->getOrderModel(); + $this->handle($order); + try { + $this->run($order); + } catch (ShopException $e) { + \Log::debug('--区域分红升级条件--OrderReceiveListener', $e->getMessage()); + return; + } }); } @@ -28,17 +36,21 @@ class OrderReceiveListener AreaDividend::updatedAreaDividend($areaDividendData, $areaDividendWhere); // 奖励积分 todo 查询订单所有奖励,每个代理商都获得奖励 - $areaDividendModels = AreaDividend::select('member_id','area_level','status') + $areaDividendModels = AreaDividend::select('member_id', 'area_level', 'status') ->where('order_id', $order->id) ->get(); if ($areaDividendModels->isEmpty()) { - $areaDividendModels = AreaDividend::select('member_id','area_level','status') + $areaDividendModels = AreaDividend::select('member_id', 'area_level', 'status') ->where('order_sn', $order->order_sn) ->get(); } if ($areaDividendModels->isEmpty()) { return; } + if ($order->plugin_id == 70 && !Setting::get('plugin.aggregation-cps.area_dividend.point_open_state')) { + \Log::debug('聚合cps订单未开启区域分红积分奖励'); + return; + } $set = Setting::get('plugin.area_dividend'); foreach ($areaDividendModels as $areaDividendModel) { // $agent = $areaDividendModel->hasOneAgent; @@ -50,26 +62,31 @@ class OrderReceiveListener continue; } - - $point_ratio = AgentLevel::getUserRate($areaDividendModel->member_id,$areaDividendModel->agent_level); - // switch ($areaDividendModel->area_level) { - // case 1: - // $point_ratio = $set['province_point']; - // break; - // case 2: - // $point_ratio = $set['city_point']; - // break; - // case 3: - // $point_ratio = $set['area_point']; - // break; - // default: - // $point_ratio = $set['street_point']; - // break; - // } + switch ($areaDividendModel->area_level) { + case 1: + $point_ratio = $set['province_point']; + break; + case 2: + $point_ratio = $set['city_point']; + break; + case 3: + $point_ratio = $set['area_point']; + break; + default: + $point_ratio = $set['street_point']; + break; + } $dividendRate['rate_' . $areaDividendModel->area_level]['point_ratio'] = $point_ratio; // 额外赠送积分 - AreaDividendAgent::awardPoint($dividendRate, $areaDividendModel->area_level,$areaDividendModel->member_id, $order, $set); + AreaDividendAgent::awardPoint($dividendRate, $areaDividendModel->area_level, $areaDividendModel->member_id, $order, $set); } } + + + public function run(Order $order) + { + $service = new UpgradeService($order->uid); + $service->afterComplete(); + } } diff --git a/plugins/area-dividend/src/PluginApplication.php b/plugins/area-dividend/src/PluginApplication.php index 054c5762..e24951bc 100644 --- a/plugins/area-dividend/src/PluginApplication.php +++ b/plugins/area-dividend/src/PluginApplication.php @@ -1,10 +1,5 @@ [ - 'title' => trans('Yunshop\AreaDividend::index.title') . "成为区域代理通知", - 'subtitle' => '成为区域代理通知', - 'value' => 'area_dividend_become_agent', - 'param' => [ - '昵称', '时间', '省', '市', '区/县', '街道/乡镇' + return [ + 'area_dividend_become_agent' => [ + 'title' => trans('Yunshop\AreaDividend::index.title') . "成为区域代理通知", + 'subtitle' => '成为区域代理通知', + 'value' => 'area_dividend_become_agent', + 'param' => [ + '昵称', '时间', '省', '市', '区/县', '街道/乡镇' + ] + ], + 'area_dividend_statement_notice' => [ + 'title' => trans('Yunshop\AreaDividend::index.title') . "分红结算通知", + 'subtitle' => '分红结算通知', + 'value' => 'area_dividend_statement_notice', + 'param' => [ + '昵称', '时间', '等级', '金额' + ] + ], + 'area_dividend_upgrade_notice' => [ + 'title' => "满足升级条件通知", + 'subtitle' => '满足升级条件通知', + 'value' => 'area_dividend_upgrade_notice', + 'param' => [ + '昵称', '时间' + ] ] - ], 'area_dividend_statement_notice' => [ - 'title' => trans('Yunshop\AreaDividend::index.title') . "分红结算通知", - 'subtitle' => '分红结算通知', - 'value' => 'area_dividend_statement_notice', - 'param' => [ - '昵称', '时间', '等级', '金额' - ] - ]]; + ]; } protected function setConfig() @@ -98,6 +106,10 @@ class PluginApplication extends \app\common\services\PluginApplication 'function_save' => 'relationSave' ]); + \app\common\modules\shop\ShopConfig::current()->set('appointment_area_reward', [ + 'class' => 'Yunshop\AreaDividend\services\AppointmentService', + 'function' => 'appointmentReward' + ]); \app\common\modules\shop\ShopConfig::current()->push('shop-foundation.member-cart.with', 'goods.areaDividendGoods'); \app\common\modules\shop\ShopConfig::current()->push('shop-foundation.member-cart.with', 'goods.areaDividendGoods'); @@ -120,7 +132,11 @@ class PluginApplication extends \app\common\services\PluginApplication ], 'vue-goods.area_dividend' => [ 'title' => trans('Yunshop\AreaDividend::index.title'), 'class' => \Yunshop\AreaDividend\widgets\DividendVueWidget::class, - ]]; + ], 'lang.area_dividend' => [ + 'title' => '语言设置', + 'class' => AreaDividendLangWidget::class, + ] + ]; } protected function setMenuConfig() @@ -273,8 +289,17 @@ class PluginApplication extends \app\common\services\PluginApplication ] ]); $area = \Yunshop\AreaDividend\models\AreaDividendAgent::getAgentByUserId(\YunShop::app()->uid)->first(); - if ($area) { + $coupon_menu = []; + if (app('plugins')->isEnabled('coupon-store') && \Yunshop\CouponStore\services\SettingService::getSetting()['open_state']) { + $coupon_menu = \Yunshop\CouponStore\services\MenuService::getMenu(); + } + if ($area || $coupon_menu) { Config::set('menu', []); + } + if ($coupon_menu) { + Menu::current()->setMainMenu('coupon_store_menu', $coupon_menu); + } + if ($area) { Menu::current()->setMainMenu('area_admin_menu', [ 'name' => '区域', 'url' => 'plugin.area-dividend.area.order-manage.index',// url 可以填写http 也可以直接写路由 @@ -464,6 +489,25 @@ class PluginApplication extends \app\common\services\PluginApplication ], ] ], + 'area_admin_point_log_list' => [ + 'name' => '赠送积分明细', + 'url' => 'plugin.area-dividend.area.point-log.index', + 'url_params' => '', + 'permit' => 0, + 'menu' => 1, + 'icon' => '', + 'item' => 'area_admin_point_log_list', + 'parents' => ['area_admin_menu'], + 'child' => [ + 'area_admin_point_log_export' => [ + 'name' => '积分导出', + 'url' => 'plugin.area-dividend.area.point-log.export', + 'permit' => 0, + 'menu' => 0, + 'parents' => ['area_admin_menu', 'area_admin_point_log_list'], + ], + ] + ], ] ]); @@ -492,6 +536,12 @@ class PluginApplication extends \app\common\services\PluginApplication $events->subscribe(OrderCreatedListener::class); $events->subscribe(CreatedCommissionListener::class); + /** + * 支付后 + * OrderCreatedListener + */ + $events->subscribe(AfterOrderPaidListener::class); + /** * 订单收货 * OrderReceiveListener @@ -506,16 +556,7 @@ class PluginApplication extends \app\common\services\PluginApplication $events->subscribe(OrderFailureListener::class); - /* - * 定时任务处理 - * - */ - \Event::listen('cron.collectJobs', function () { - \Cron::add('Area-dividend', '*/1 * * * *', function () { - (new TimedTaskService())->handle(); - return; - }); - }); + } @@ -526,5 +567,18 @@ class PluginApplication extends \app\common\services\PluginApplication return new \Yunshop\Supplier\common\models\MemberCart($params[0]); }); } + + public function cronConfig() + { + /* + * 定时任务处理 + * + */ + \Event::listen('cron.collectJobs', function () { + \Cron::add('Area-dividend', '*/1 * * * *', function () { + (new TimedTaskService())->handle(); + }); + }); + } } diff --git a/plugins/area-dividend/src/admin/AgentController.php b/plugins/area-dividend/src/admin/AgentController.php index fbed41d7..08eed35b 100644 --- a/plugins/area-dividend/src/admin/AgentController.php +++ b/plugins/area-dividend/src/admin/AgentController.php @@ -1,4 +1,5 @@ search; $pageSize = 20; - $list = AreaDividendAgent::getAgents($search)->orderBy('id','DESC')->paginate($pageSize); + $list = AreaDividendAgent::getAgents($search)->profileWith()->paginate($pageSize); $pager = PaginationHelper::show($list->total(), $list->currentPage(), $list->perPage()); - if(!$search['time']){ - $search['time']['start'] = date("Y-m-d H:i:s",time()); - $search['time']['end'] = date("Y-m-d H:i:s",time()); + if (!$search['time']) { + $search['time']['start'] = date("Y-m-d H:i:s", time()); + $search['time']['end'] = date("Y-m-d H:i:s", time()); } return view('Yunshop\AreaDividend::admin.list', [ 'list' => $list->toarray(), @@ -48,26 +45,74 @@ class AgentController extends BaseController $wq_data = \YunShop::request()->wq; if ($agentData) { - $agent = AreaDividendAgent::getAgentByMemberId($agentData['member_id'])->where('status','<>',-1)->first(); - if(!empty($agent)){ - $set = Setting::get('plugin.area_dividend'); - if($agent->status == 0){ + $agent = AreaDividendAgent::getAgentByMemberId($agentData['member_id'])->where('status', '<>', -1) + ->first(); + $set = Setting::get('plugin.area_dividend'); + if (!empty($agent)) { + if ($agent->status == 0) { return $this->message('添加失败,此会员已进行申请,请在申请列表进行审核', '', 'error'); - }else if($agent->status == 1 && !$set['agent_many']){ + } else if ($agent->status == 1 && !$set['agent_many']) { return $this->message('添加失败,此会员已是代理商', '', 'error'); } } $agentData = AgentService::setAgentData($agentData); + if ($set['agent_many']) {//一人可代理多个区域 + $hasAgent = AreaDividendAgent::uniacid() + ->where('member_id', \YunShop::app()->getMemberId()) + ->where('agent_level', $agentData['agent_level']) + ->where('province_name', $agentData['province_name']); + switch ($agentData['agent_level']) { + case 1: + $hasAgent = $hasAgent->first(); + break; + case 2: + $hasAgent = $hasAgent->where('city_name', $agentData['city_name']) + ->first(); + break; + case 3: + $hasAgent = $hasAgent->where('city_name', $agentData['city_name']) + ->where('district_name', $agentData['district_name']) + ->first(); + break; + case 4: + $hasAgent = $hasAgent->where('city_name', $agentData['city_name']) + ->where('district_name', $agentData['district_name']) + ->where('street_name', $agentData['street_name']) + ->first(); + break; + default: + return $this->errorJson('申请信息错误'); + } + if ($hasAgent && in_array($hasAgent->status, [0, 1])) { + return $this->errorJson('添加失败,此会员已是该区域代理商'); + } elseif ($hasAgent && $hasAgent->status == -1) { + AreaDividendAgent::uniacid() + ->where('id', $hasAgent->id)->delete(); + } + } + $retLock = Lock::verify($agentData); - if ($retLock) return $this->message('该区域已被锁定', '', 'error'); + if ($retLock) { + return $this->message('该区域已被锁定', '', 'error'); + } + + $verifyPasswordStrength = true; + if ((!$wq_data['username'] || !$wq_data['password']) && AreaDividendAgent::subPlatformOpen()) { + $accountPwd = \Yunshop\SubPlatform\services\AdminUserServices::createAccountPwd('agent', 8, true); + $wq_data['username'] = $accountPwd['account']; + $wq_data['password'] = $accountPwd['password']; + $wq_data['password_again'] = $accountPwd['password']; + $verifyPasswordStrength = false; + } + if (trim($wq_data['username']) && trim($wq_data['password'])) { if (trim($wq_data['password_again']) != trim($wq_data['password'])) { return $this->message('两次密码不相同', '', 'error'); } $verifyPassword = verifyPasswordStrength(trim($wq_data['password'])); - if($verifyPassword !== true){ + if ($verifyPasswordStrength && $verifyPassword !== true) { return $this->message($verifyPassword, '', 'error'); } @@ -89,15 +134,6 @@ class AgentController extends BaseController $agentModel->uniacid = \YunShop::app()->uniacid; $agentModel->status = 1; $agentModel->agent_at = time(); - $agentModel->title = request()->title; - $agentModel->min_status = request()->min_status; - $agentModel->min_app_id = request()->min_app_id; - $agentModel->min_app_secret = request()->min_app_secret; - $agentModel->min_mch_id = request()->min_mch_id; - $agentModel->min_api_secret = request()->min_api_secret; - if (request()->file('apiclient_cert')) $agentModel->min_apiclient_cert = $this->uploadFile('apiclient_cert', $agentModel->min_app_id); - if (request()->file('apiclient_key')) $agentModel->min_apiclient_key = $this->uploadFile('apiclient_key', $agentModel->min_app_id); - //字段检测 $validator = $agentModel->validator($agentModel->getAttributes()); if ($validator->fails()) { @@ -106,15 +142,19 @@ class AgentController extends BaseController } else { //数据保存 if ($agentModel->save()) { - $data=[ - 'member_id'=>$agentData['member_id'], - 'username'=>$agentData['username'], + YzUserProfile::syncMobile($agentModel->user_id, $agentModel->mobile); + $data = [ + 'member_id' => $agentData['member_id'], + 'username' => $agentData['username'], 'created_at' => time(), ]; event(new \app\common\events\plugin\AreaDividendEvent($data)); // 发送消息 $member = Member::getMemberByUid($agentModel->member_id)->with('hasOneFans')->first(); MessageService::becomeAgent($agentModel, $member->hasOneFans); + if (app('plugins')->isEnabled('coupon-store')) { + \Yunshop\CouponStore\models\Log::areaChange($agentModel->id, 1); + } //显示信息并跳转 return $this->message('添加成功', yzWebUrl('plugin.area-dividend.admin.agent')); } else { @@ -127,15 +167,23 @@ class AgentController extends BaseController ])->render(); } - public function editAgency(){ + public function editAgency() + { $id = \YunShop::request()->id; $agency = AreaDividendAgent::find($id); - if(!$agency) return $this->message('无此区域代理或已经删除','','error'); + if (!$agency) { + return $this->message('无此区域代理或已经删除', '', 'error'); + } + if ($agency->user_id) { $user = WeiQingUsers::getUserByUid($agency->user_id)->first(); - if (!$user) return $this->message('微擎账号不存在','','error'); + if (!$user) { + return $this->message('微擎账号不存在', '', 'error'); + } } + if (request()->isMethod('post')) { + $wq_data = \YunShop::request()->wq; if ($wq_data['password'] && $wq_data['password_again']) { if (trim($wq_data['password_again']) != trim($wq_data['password'])) { @@ -143,7 +191,7 @@ class AgentController extends BaseController } $verifyPassword = verifyPasswordStrength(trim($wq_data['password'])); - if($verifyPassword !== true){ + if ($verifyPassword !== true) { return $this->message($verifyPassword, '', 'error'); } @@ -166,14 +214,17 @@ class AgentController extends BaseController $agency->setRawAttributes($agentData); if ($agency->save()) { + if (app('plugins')->isEnabled('coupon-store')) { + \Yunshop\CouponStore\models\Log::areaChange($agency->id, 2); + } //显示信息并跳转 return $this->message('账号添加成功', yzWebUrl('plugin.area-dividend.admin.agent')); } else { return $this->message('账号添加失败', '', 'error'); } } - } - else { + } else { + if (request()->order_manage == 1) { $whereColumn = 'province_id'; if ($agency->agent_level == 4) { @@ -194,32 +245,30 @@ class AgentController extends BaseController return $this->message('该区域下已存在[订单管理权限]的代理商', '', 'error'); } } + $agency->manage = request()->order_manage; $agency->ratio = request()->ratio; $agency->has_ratio = request()->has_ratio; - $agency->title = request()->title; - // 支付信息修改 - $agency->min_status = request()->min_status; - $agency->min_app_id = request()->min_app_id; - $agency->min_app_secret = request()->min_app_secret; - $agency->min_mch_id = request()->min_mch_id; - $agency->min_api_secret = request()->min_api_secret; - if (request()->file('apiclient_cert')) $agency->min_apiclient_cert = $this->uploadFile('apiclient_cert', $agency->min_app_id); - if (request()->file('apiclient_key')) $agency->min_apiclient_key = $this->uploadFile('apiclient_key', $agency->min_app_id); - if (intval(request()->input('agent')['investor_uid'])) $agency->investor_uid = intval(request()->input('agent')['investor_uid']); + if (intval(request()->input('agent')['investor_uid'])) { + $agency->investor_uid = intval(request()->input('agent')['investor_uid']); + } $agency->save(); - return $this->message('账号编辑成功', yzWebUrl('plugin.area-dividend.admin.agent')); + if (app('plugins')->isEnabled('coupon-store')) { + \Yunshop\CouponStore\models\Log::areaChange($agency->id, 2); + } + return $this->message('账号添加成功', yzWebUrl('plugin.area-dividend.admin.agent')); } } - return view('Yunshop\AreaDividend::admin.change-pwd', [ 'username' => $user->username, - 'agency' => $agency->toArray() + 'real_name' => $agency->real_name, + 'order_manage' => $agency->manage, + 'agency' => $agency ])->render(); } - + public function agentApply() { $search = request()->search; @@ -258,7 +307,7 @@ class AgentController extends BaseController if ($agentModel->username) { $user = WeiQingUsers::getUserByUserName($agentModel->username)->first(); if ($user) { - return $this->message('用户名已存在,请驳回后重新申请','','error'); + return $this->message('用户名已存在,请驳回后重新申请', '', 'error'); } } $result = static::setApplyAdopt($agentModel, $status); @@ -271,9 +320,9 @@ class AgentController extends BaseController $member = Member::getMemberByUid($agentModel->member_id)->with('hasOneFans')->first(); MessageService::becomeAgent($agentModel, $member->hasOneFans); } - $data=[ - 'member_id'=>$agentModel['member_id'], - 'username'=>$agentModel['real_name'], + $data = [ + 'member_id' => $agentModel['member_id'], + 'username' => $agentModel['real_name'], 'created_at' => time(), ]; event(new \app\common\events\plugin\AreaDividendEvent($data)); @@ -284,6 +333,8 @@ class AgentController extends BaseController event(new \Yunshop\InstationMessage\event\AreaDividendEvent($agentModelNew)); } + //同步手机号 + YzUserProfile::syncMobile($agentModel->user_id, $agentModel->mobile); return $this->message('操作成功', yzWebUrl('plugin.area-dividend.admin.agent.agent-apply')); } else { return $this->message('操作失败', '', 'error'); @@ -293,8 +344,8 @@ class AgentController extends BaseController protected static function setApplyAdopt($agentModel, $status) { $agentModel->status = $status; - if (!empty($agentModel->username) && !empty($agentModel->password)) { - $user_uid= WeiQingUsers::registerBySalt($agentModel->username, $agentModel->password, $agentModel->salt); + if (!empty($agentModel->username) && !empty($agentModel->password)) { + $user_uid = WeiQingUsers::registerBySalt($agentModel->username, $agentModel->password, $agentModel->salt); $agentModel->user_id = $user_uid; } $agentModel->agent_at = time(); @@ -315,10 +366,12 @@ class AgentController extends BaseController { $file_name = date('Ymdhis', time()) . '区域代理导出'; $search = \YunShop::request()->search; - - $list = AreaDividendAgent::getAgents($search) - ->get() - ->toArray(); + $export_page = request()->export_page ? request()->export_page : 1; + $builder = AreaDividendAgent::getAgents($search); + $export_model = new ExportService($builder, $export_page); + if ($export_model->builder_model->isEmpty()) { + return $this->message('导出数据为空', Url::absoluteWeb('plugin.area-dividend.admin.agent.index'), 'error'); + } $export_data[0] = [ 'ID', '会员id', @@ -334,7 +387,7 @@ class AgentController extends BaseController '未结算分红金额' ]; - foreach ($list as $key => $item) { + foreach ($export_model->builder_model->toArray() as $key => $item) { $area = ''; if ($item['province_name']) { $area .= $item['province_name']; @@ -352,19 +405,20 @@ class AgentController extends BaseController $item['id'], $item['has_one_member']['uid'] ?: '', $item['has_one_member']['nickname'] ?: '', - $item['has_one_member']['realname'].'/'.$item['has_one_member']['mobile'], + $item['has_one_member']['realname'] . '/' . $item['has_one_member']['mobile'], $item['created_at'], $area, $item['level_name'], - $item['count_order_amount']."元", - $item['rate']."%", - $item['count_settle_amount']."元", - $item['settle_dividend_amount']."元", - $item['unsettled_dividend_amount']."元" + $item['count_order_amount'] . "元", + $item['rate'] . "%", + $item['count_settle_amount'] . "元", + $item['settle_dividend_amount'] . "元", + $item['unsettled_dividend_amount'] . "元" ]; } - return \app\exports\ExcelService::fromArrayExport($export_data,$file_name); + $export_model->export($file_name, $export_data, 'plugin.area-dividend.admin.agent.index'); + return true; // 商城更新,无法使用 // \Excel::create($file_name, function ($excel) use ($export_data) { @@ -390,7 +444,9 @@ class AgentController extends BaseController public function change() { $id = \YunShop::request()->id; - $agent = AreaDividendAgent::find($id); + if (!$agent = AreaDividendAgent::find($id)) { + return $this->errorJson('代理不存在'); + } $agentData = \YunShop::request()->value; $agentData = AgentService::setAgentData($agentData); @@ -414,6 +470,9 @@ class AgentController extends BaseController } else { $agent->setRawAttributes($agentData); $agent->save(); + if (app('plugins')->isEnabled('coupon-store')) { + \Yunshop\CouponStore\models\Log::areaChange($id, 2); + } return $this->errorJson('成功'); } } @@ -422,46 +481,21 @@ class AgentController extends BaseController { $id = \YunShop::request()->id; $agency = AreaDividendAgent::find($id); - if(!$agency) { - return $this->message('无此区域代理或已经删除','','error'); + if (!$agency) { + return $this->message('无此区域代理或已经删除', '', 'error'); } //删除登录 if ($agency->user_id) { WeiQingUsers::delUser($agency->user_id); } $result = AreaDividendAgent::daletedAgency($id); - if($result) { - return $this->message('删除成功',Url::absoluteWeb('plugin.area-dividend.admin.agent')); - }else{ - return $this->message('删除失败','','error'); + if ($result) { + if (app('plugins')->isEnabled('coupon-store')) { + \Yunshop\CouponStore\models\Log::areaChange($id, 3); + } + return $this->message('删除成功', Url::absoluteWeb('plugin.area-dividend.admin.agent')); + } else { + return $this->message('删除失败', '', 'error'); } } - /** - * Common: 证书上传 - 仅用于区域代理中的微信小程序配置中证书文件上传 - * Author: wu-hui - * Time: 2023/05/31 17:08 - * @param $fileKey - * @param $appId - * @return string - * @throws ShopException - */ - private function uploadFile($fileKey,$appId){ - $file = request()->file($fileKey); - if ($file->isValid()) { - //文件原名 - $originalName = $file->getClientOriginalName(); - //扩展名 - $fileExt = $file->getClientOriginalExtension(); - //临时文件的绝对路径 - $realPath = $file->getRealPath(); - //新文件名 - $fileName = "area_pem_{$appId}_{$originalName}"; - if ($fileExt != 'pem') throw new ShopException("{$originalName}文件格式错误"); - - $bool = Storage::disk('cert')->put($fileName, file_get_contents($realPath)); - if ($bool) return storage_path("cert/{$fileName}"); - } - throw new ShopException("{$fileKey}.pem文件上传错误"); - } - -} \ No newline at end of file +} diff --git a/plugins/area-dividend/src/admin/AreaDividendSetController.php b/plugins/area-dividend/src/admin/AreaDividendSetController.php index 824e74e8..f13a4e51 100644 --- a/plugins/area-dividend/src/admin/AreaDividendSetController.php +++ b/plugins/area-dividend/src/admin/AreaDividendSetController.php @@ -1,4 +1,5 @@ isEnabled('team-dividend')) { + $team_dividend_level_list = TeamDividendLevelModel::uniacid()->select(['id', 'level_name'])->orderByDesc('level_weight')->get(); + } + + if ($upgrade['goods_ids']) { + $goods = \app\common\models\Goods::uniacid()->whereIn('id', $upgrade['goods_ids'])->get(); + if (!$goods->isEmpty()) { + $goods = set_medias($goods->toArray(), array('thumb', 'share_icon')); + } + } + $requestModel = \YunShop::request()->setdata; - if($requestModel){ + if ($requestModel) { Setting::set('area_dividend.agreement', $requestModel['agreement']); unset($requestModel['agreement']); if ($requestModel['agent_many'] == 0) { $has_count = AreaDividendAgent::uniacid() ->select('member_id') - ->whereIn('status',[0,1]) + ->whereIn('status', [0, 1]) ->groupBy('member_id') ->havingRaw('COUNT(*) > 1') ->count(); if ($has_count) { - return $this->message('存在一人代理多个区域情况,不能关闭代理多个区域功能', Url::absoluteWeb('plugin.area-dividend.admin.area-dividend-set'),'error'); + return $this->message('存在一人代理多个区域情况,不能关闭代理多个区域功能', Url::absoluteWeb('plugin.area-dividend.admin.area-dividend-set'), 'error'); } } @@ -50,7 +61,30 @@ class AreaDividendSetController extends BaseController 'set' => $set, 'agreement' => $agreement, 'temp_list' => $temp_list, + 'goods' => $goods, + 'team_dividend_level_list' => $team_dividend_level_list, + 'upgrade' => $upgrade, + 'appointment' => app('plugins')->isEnabled('appointment') ? true : false ])->render(); } -} \ No newline at end of file + + + /** + * 搜索商品 + * @return array|string + * @throws \Throwable + */ + public function searchGoods() + { + $search['keyword'] = \YunShop::request()->keyword; + $goods = \app\common\models\Goods::uniacid()->search($search)->get(); + if (!$goods->isEmpty()) { + $goods = set_medias($goods->toArray(), array('thumb', 'share_icon')); + } + return view('Yunshop\AreaDividend::admin.tpl.goods_query', [ + 'goods' => $goods + ])->render(); + } + +} diff --git a/plugins/area-dividend/src/admin/DividendController.php b/plugins/area-dividend/src/admin/DividendController.php index d08798de..aee9adc4 100644 --- a/plugins/area-dividend/src/admin/DividendController.php +++ b/plugins/area-dividend/src/admin/DividendController.php @@ -1,10 +1,5 @@ $pager, 'statisti' => $statisti, 'search' => $search, + 'appointment' => app('plugins')->isEnabled('appointment') ])->render(); } diff --git a/plugins/area-dividend/src/admin/FixController.php b/plugins/area-dividend/src/admin/FixController.php index 37785195..b6b2495a 100644 --- a/plugins/area-dividend/src/admin/FixController.php +++ b/plugins/area-dividend/src/admin/FixController.php @@ -1,10 +1,5 @@ getMemberId()) - ->select('member_id', 'real_name', 'mobile', 'agent_level','status','province_name', 'city_name', 'district_name', 'street_name') - ->where('status',1) - ->orderBy('created_at','desc') + ->select('member_id', 'real_name', 'mobile', 'agent_level', 'status', 'province_name', 'city_name', 'district_name', 'street_name') + ->where('status', 1) + ->orderBy('created_at', 'desc') ->first(); - $agent_many = Setting::get('plugin.area_dividend.agent_many') ? : 0; + $agent_many = Setting::get('plugin.area_dividend.agent_many') ?: 0; if ($request) { $request = $request->toArray(); - $request['level_name']='代理区域:'.$request['province_name']; - $request['city_name'] ? $request['level_name']=$request['level_name'].'-'.$request['city_name'] : ''; - $request['district_name'] ? $request['level_name']=$request['level_name'].'-'.$request['district_name'] : ''; - $request['street_name'] ? $request['level_name']=$request['level_name'].'-'.$request['street_name'] : ''; + $request['level_name'] = '代理区域:' . $request['province_name']; + $request['city_name'] ? $request['level_name'] = $request['level_name'] . '-' . $request['city_name'] : ''; + $request['district_name'] ? $request['level_name'] = $request['level_name'] . '-' . $request['district_name'] : ''; + $request['street_name'] ? $request['level_name'] = $request['level_name'] . '-' . $request['street_name'] : ''; $request['agent_many'] = $agent_many; return $this->successJson('成功', $request); } @@ -45,16 +48,16 @@ class AreaDividendController extends ApiController public function getAllAreaAgent() { $requests = AreaDividendAgent::getAgentByMemberId(\YunShop::app()->getMemberId()) - ->select('member_id', 'real_name', 'mobile', 'agent_level','status','province_name', 'city_name', 'district_name', 'street_name') - ->where('status',1) - ->orderBy('created_at','desc') + ->select('member_id', 'real_name', 'mobile', 'agent_level', 'status', 'province_name', 'city_name', 'district_name', 'street_name') + ->where('status', 1) + ->orderBy('created_at', 'desc') ->get()->toArray(); if ($requests) { foreach ($requests as &$request) { $request['level_name'] = $request['province_name']; - $request['city_name'] ? $request['level_name'] = $request['level_name'].'-'.$request['city_name'] : ''; - $request['district_name'] ? $request['level_name'] = $request['level_name'].'-'.$request['district_name'] : ''; - $request['street_name'] ? $request['level_name'] = $request['level_name'].'-'.$request['street_name'] : ''; + $request['city_name'] ? $request['level_name'] = $request['level_name'] . '-' . $request['city_name'] : ''; + $request['district_name'] ? $request['level_name'] = $request['level_name'] . '-' . $request['district_name'] : ''; + $request['street_name'] ? $request['level_name'] = $request['level_name'] . '-' . $request['street_name'] : ''; } unset($request); } @@ -105,7 +108,7 @@ class AreaDividendController extends ApiController if (empty($create_month) && empty($status)){ $create_month = $dividendList[0]->create_month; } - + $list_data = AreaDividend::getStatusDividendList($create_month,$status)->where('member_id', \YunShop::app()->getMemberId())->paginate(10); PaginationHelper::show($list_data->total(), $list_data->currentPage(), $list_data->perPage()); $list['time'] = $dividendList; @@ -139,6 +142,12 @@ class AreaDividendController extends ApiController //plugin.area-dividend.api.area-dividend.set-agent-apply $set = Setting::get('plugin.area_dividend'); $agentData = \YunShop::request()->get('data'); + + $upgrade_service = new UpgradeService(\YunShop::app()->getMemberId()); + $upgrade_check = $upgrade_service->check(); + if ($upgrade_check['status'] == 1 && !$upgrade_service->hasApply()) { + return $this->errorJson('未通过升级条件!'); + } if (!$agentData) { return $this->errorJson('未检测到数据!'); } @@ -149,6 +158,11 @@ class AreaDividendController extends ApiController return $this->errorJson('未检测到申请区域数据!'); } + $subPlatformOpen = AreaDividendAgent::subPlatformOpen(); + if (!$subPlatformOpen && (!$agentData['username'] || !$agentData['password'])) { + return $this->errorJson('未检测到申请账号密码数据!'); + } + if (!$set['agent_many']) {//一人可代理多个区域 $agent = AreaDividendAgent::getAgentByMemberId(\YunShop::app()->getMemberId()) ->first(); @@ -199,7 +213,15 @@ class AreaDividendController extends ApiController return $this->errorJson('该区域已被锁定!'); } - if (trim($agentData['username']) && trim($agentData['password'])) { + $verifyPasswordStrength = true; + if ($subPlatformOpen) { + $accountPwd = \Yunshop\SubPlatform\services\AdminUserServices::createAccountPwd('agent',8,true); + $agentData['username'] = $accountPwd['account']; + $agentData['password'] = $accountPwd['password']; + $verifyPasswordStrength = false; + } + + if (trim($agentData['username']) /*&& trim($agentData['password'])*/) { $user = WeiQingUsers::getUserByUserName($agentData['username'])->first(); if ($user) { return $this->errorJson('账号重复!'); @@ -208,7 +230,7 @@ class AreaDividendController extends ApiController } $verifyPassword = verifyPasswordStrength($agentData['password']); - if($verifyPassword !== true){ + if($verifyPasswordStrength && $verifyPassword !== true){ return $this->errorJson($verifyPassword); } @@ -234,6 +256,12 @@ class AreaDividendController extends ApiController //数据保存 if ($agentModel->save()) { if (!$set['become_check']) { + $data=[ + 'member_id'=>$agentModel['member_id'], + 'username'=>$agentModel['real_name'], + 'created_at' => time(), + ]; + event(new \app\common\events\plugin\AreaDividendEvent($data)); // 发送消息 $member = Member::getMemberByUid($agentModel->member_id)->with('hasOneFans')->first(); MessageService::becomeAgent($agentModel, $member->hasOneFans); @@ -343,27 +371,4 @@ class AreaDividendController extends ApiController return $this->errorJson('未检测到数据!'); } - - /** - * Common: 根据条件获取区域代理列表 - * Author: wu-hui - * Time: 2023/06/01 16:55 - * @return \Illuminate\Http\JsonResponse - */ - public function getAreaDividendAgent(){ - // 参数获取 - $provinceId = request()->input('province_id'); - // 列表获取 - $list = AreaDividendAgent::uniacid() - ->select(['id','title','real_name','province_name','city_name','district_name']) - ->where('province_id',$provinceId) - ->where('status',1) - ->where('min_status',1) - ->get(); - if($list) $list = $list->toArray(); - - return $this->successJson('区域代理列表',$list); - } - - } diff --git a/plugins/area-dividend/src/api/PaymentCodeController.php b/plugins/area-dividend/src/api/PaymentCodeController.php deleted file mode 100644 index 6fc68418..00000000 --- a/plugins/area-dividend/src/api/PaymentCodeController.php +++ /dev/null @@ -1,125 +0,0 @@ -offsetSet('is_auto_order', true);// 标识为自动下单 - $params = [ - 'auth_code' => request()->input('auth_code'),// 扫码支付付款码,设备读取用户微信中的条码或者二维码信息 - 'parent_id' => (int)\YunShop::app()->getMemberId(),// 上级用户id - 'nickname' => request()->input('nickname'),// 用户昵称 - 'mobile' => request()->input('mobile'),// 用户手机号 - 'area_id' => request()->input('area_id'),// 区域代理id - 'pay_uid' => (int)request()->input('pay_uid'),// 付款用户id - 'operate_type' => (int)request()->input('operate_type'),// 操作类型 0=获取用户信息,1=下单支付 - ]; - if($params['parent_id'] <= 0) throw new Exception('请登录后操作!'); - $weChatMinPaymentCodeModel = new WechatPayCodePay(); - // 开始进行付款码付款处理流程 - DB::beginTransaction(); - try{ - $result = []; - // 判断:获取用户信息 or 下单付款 - if($params['operate_type'] != 1){ - // 获取用户信息 - $result['pay_uid'] = $weChatMinPaymentCodeModel->getPayUserId($params); - $message = '用户信息处理成功'; - }else{ - if($params['pay_uid'] <= 0) throw new AppException('付款用户信息获取失败!'); - // 用户信息处理 - $memberId = (int)$weChatMinPaymentCodeModel->userManage($params); - \Log::debug('微信付款码支付 - 用户信息处理 - UID:',$memberId); - // 上下级关系绑定 - $this->parentSubRelationship($params['parent_id'],$memberId); - // 付款码下单处理 - $_COOKIE['imitate_login_member_id'] = $memberId;// 变更登录用户 模拟为付款人下单 - $orderIds = $weChatMinPaymentCodeModel->createOrder($memberId); - // 开始支付 - $weChatMinPaymentCodeModel->orderPay($orderIds,$params); - // 不是经销商成为经销商 - \Log::debug('微信付款码支付 - 经销商处理 - UID:',$memberId); - if((int)TeamDividendAgencyModel::where('uid',$memberId)->value('id') <= 0){ - $levelId = (new TeamDividendLevelModel())->orderBy('level_weight', 'ASC')->value('id'); - (new UpgradeService())->memberUpgradeToAgency($memberId, $levelId); - } - // 开启推广员权限 - \Log::debug('微信付款码支付 - 开启推广员权限 - UID:',$memberId); - SubMemberModel::where('member_id',$memberId)->update([ - 'is_agent' => 1 - ]); - - $message = '支付成功'; - } - DB::commit(); - - return $this->successJson($message,$result); - } - catch(\Exception $e){ - DB::rollBack(); - - return $this->errorJson($e->getMessage()); - } - } - - /** - * Common: 上下级绑定 存在上级则不改变,不存在或者为绑定则改变 - * Author: wu-hui - * Time: 2023/06/02 16:46 - * @param $parent_id - * @param $uid - * @throws AppException - * @throws Exception - */ - public function parentSubRelationship($parent_id,$uid){ - $member = SubMemberModel::getMemberShopInfo($uid); - if($member['inviter'] != 1 || $member['parent_id'] <= 0){ - // 判断修改的上级是否推广员 - if ($parent_id != 0) { - $parent = SubMemberModel::getMemberShopInfo($parent_id); - if (!($parent->is_agent == 1 && $parent->status == 2)) throw new Exception('上线没有推广权限!'); - if ($parent->parent_id == $uid) throw new Exception('会员上下线冲突!'); - //验证是否闭环关系链 - $chain = ParentOfMember::where('member_id', $parent_id)->pluck('parent_id'); - $chain->push($uid); - $chain->push($parent_id); - if ($chain->count() != $chain->unique()->count()) throw new Exception('关系链闭环,请检测关系链!'); - } - $record_data = [ - 'uid' => $uid, - 'parent_id' => $member->parent_id, - 'after_parent_id' => $parent_id, - 'status' => 0, - 'uniacid' => \YunShop::app()->uniacid - ]; - $member_record = MemberRecord::create($record_data); - $this->dispatch(new ModifyRelationshipChainJob($uid, $parent_id, $member_record->id, \YunShop::app()->uniacid)); - } - } - - -} diff --git a/plugins/area-dividend/src/api/UpgradeController.php b/plugins/area-dividend/src/api/UpgradeController.php new file mode 100644 index 00000000..1e3b7de1 --- /dev/null +++ b/plugins/area-dividend/src/api/UpgradeController.php @@ -0,0 +1,41 @@ +getMemberId()); + $check_result = $upgrade_service->check(); + if (!$check_result['status']) { + return $this->errorJson($check_result['msg']); + } + $level_name = TeamDividendLevelModel::where('id', $upgrade_service->upgrade['push_level'])->value('level_name'); + $goods_list = Goods::whereIn('id', $upgrade_service->upgrade['goods_ids'] ?: []) + ->select(['id', 'thumb', 'title', 'price', 'description']) + ->paginate(); + foreach ($goods_list as $goods) { + $goods->thumb = yz_tomedia($goods->thumb); + } + $upgrade_data = [ + 'level_name' => $level_name, + 'push_num' => $upgrade_service->upgrade['push_num'], + 'price' => $upgrade_service->upgrade['price'], + 'have_push_num' => $upgrade_service->getAgencyCount(), + 'self_price' => $upgrade_service->getSelfPrice(), + 'has_buy_goods' => $upgrade_service->hasBuyGoods(), + 'goods_list' => $goods_list, + 'apply_background' => yz_tomedia(Setting::get('plugin.area_dividend.apply_background')), + ]; + return $this->successJson('ok', $upgrade_data); + } + +} diff --git a/plugins/area-dividend/src/area/AreaOrderController.php b/plugins/area-dividend/src/area/AreaOrderController.php index bb9a0963..f1dc59af 100644 --- a/plugins/area-dividend/src/area/AreaOrderController.php +++ b/plugins/area-dividend/src/area/AreaOrderController.php @@ -1,10 +1,5 @@ $pager, 'search' => $search, 'statisti' => $statisti, + 'appointment' => app('plugins')->isEnabled('appointment') ])->render(); } diff --git a/plugins/area-dividend/src/area/PointLogController.php b/plugins/area-dividend/src/area/PointLogController.php new file mode 100644 index 00000000..c05b5681 --- /dev/null +++ b/plugins/area-dividend/src/area/PointLogController.php @@ -0,0 +1,94 @@ +whereHas('hasOneOrder', function ($query) use ($search) { + $query->where('order_sn', 'like', "%{$search['order_sn']}%"); + }); + } + + if (in_array($search['time_search'], ['created_at']) && $search['time_arr'] && is_array($search['time_arr']) && $search['time_arr'][0] && $search['time_arr'][1]) { + if (strlen($search['time_arr'][0]) == 13) { + $search['time_arr'][0] = bcdiv($search['time_arr'][0], 1000, 0); + } + if (strlen($search['time_arr'][1]) == 13) { + $search['time_arr'][1] = bcdiv($search['time_arr'][1], 1000, 0); + } + $query->whereBetween($search['time_search'], $search['time_arr']); + } + return $query; + } + + public function index() + { + + if (!request()->is_json) { + return view('Yunshop\AreaDividend::area.point-log-list', [])->render(); + } + + $query = PointLog::uniacid()->orderBy('id', 'DESC') + ->where('member_id', $this->agent_model->member_id) + ->whereIn('point_mode', [PointService::POINT_MODE_AREA_DIVIDEND_AWARD,PointService::POINT_MODE_AREA_DIVIDEND]); + + $search = \YunShop::request()->search_data ?: []; + + $query = $this->search($query, $search); + + $sum = 0; + if ($search['is_count']) { + $sum = $query->sum('point'); + } + + $list = $query->with(['hasOneOrder' => function ($query) { + $query->select('id', 'order_sn'); + }])->paginate(); + return $this->successJson('成功', ['list' => $list, 'is_count' => $search['is_count'], 'sum_point' => $sum]); + + } + + + public function export() + { + + $export_page = intval(request()->export_page) ?: 1; + $query = PointLog::uniacid()->orderBy('id', 'DESC') + ->where('member_id', $this->agent_model->member_id) + ->where('point_mode', PointService::POINT_MODE_AREA_DIVIDEND_AWARD) + ->with(['hasOneOrder' => function ($query) { + $query->select('id', 'order_sn'); + }]); + $export_model = new OrderExportService($this->search($query, json_decode(request()->search_data, true) ?: []), $export_page); + $route = 'plugin.area-dividend.area.point-log.index'; + + if ($export_model->builder_model->isEmpty()) { + return $this->message('没有可导出的数据', Url::absoluteWeb($route), 'fail'); + } + $file_name = date('Ymdhis', time()) . '区域分红赠送积分明细数据导出' . $export_page; + $export_data[] = ['ID', '订单号', '赠送积分', '赠送时间']; + $k = 1; + $export_model->builder_model->each(function ($v) use (&$export_data, &$k) { + $export_data[$k] = [ + $v->id, + $v->hasOneOrder->order_sn ?: '', + $v->point, + $v->created_at, + ]; + $k++; + }); + $export_model->export($file_name, $export_data, $route); + } + +} \ No newline at end of file diff --git a/plugins/area-dividend/src/event/AfterDetermineRegionEvent.php b/plugins/area-dividend/src/event/AfterDetermineRegionEvent.php new file mode 100644 index 00000000..37cd7ddb --- /dev/null +++ b/plugins/area-dividend/src/event/AfterDetermineRegionEvent.php @@ -0,0 +1,53 @@ +order = $order; + $this->areaAgent = $areaAgent; + $this->areaLevel = $areaLevel; + } + + /** + * @return Order + */ + public function getOrder() + { + return $this->order; + } + + /** + * @return mixed + */ + public function getAreaAgent() + { + return $this->areaAgent; + } + + /** + * @return mixed + */ + public function getAreaLevel() + { + return $this->areaLevel; + } + + +} diff --git a/plugins/area-dividend/src/event/BeforeAreaDividendCreatedEvent.php b/plugins/area-dividend/src/event/BeforeAreaDividendCreatedEvent.php new file mode 100644 index 00000000..d1e09c85 --- /dev/null +++ b/plugins/area-dividend/src/event/BeforeAreaDividendCreatedEvent.php @@ -0,0 +1,59 @@ +id); + $this->order = $order; + $this->extra_plugin_id = $extra_plugin_id; + $this->extra_id = $extra_id; + $this->is_break = 0; + $this->break_message = ''; + } + + public function getOrderModel() + { + return $this->order; + } + + public function getExtraPluginId() + { + return $this->extra_plugin_id; + } + + public function getExtraId() + { + return $this->extra_id; + } + + public function isBreak() + { + return $this->is_break; + } + + public function setBreak($message = '') + { + $this->is_break = 1; + $this->break_message = $message ?: ''; + } + + public function breakMessage() + { + return $this->break_message; + } + + +} \ No newline at end of file diff --git a/plugins/area-dividend/src/models/AreaDividend.php b/plugins/area-dividend/src/models/AreaDividend.php index d2d725a3..c680e7a3 100644 --- a/plugins/area-dividend/src/models/AreaDividend.php +++ b/plugins/area-dividend/src/models/AreaDividend.php @@ -1,11 +1,6 @@ whereHas('hasOneMember', function ($query) use ($search) { - return $query->searchLike($search['member']); - }); + $model->where('member_id',$search['member']); } if (!empty($search['area_name'])) { $model->where('agent_area', 'like', '%' . $search['area_name'] . '%'); @@ -64,6 +57,10 @@ class AreaDividend extends BaseModel }); } + if($search['extra_plugin_id'] > 0){ + $model->where('extra_plugin_id', $search['extra_plugin_id']); + } + if (!empty($search['area_level'])) { $model->where('area_level', $search['area_level']); } @@ -80,8 +77,6 @@ class AreaDividend extends BaseModel } } - $model->where('dividend_amount' , '>', 0); - $model->with([ 'hasOneMember' => function ($query) { $query->select(['uid', 'avatar', 'nickname', 'realname', 'mobile'])->uniacid(); @@ -279,6 +274,22 @@ class AreaDividend extends BaseModel } return $this->StatusService; } + public function getSettlementNameAttribute() + { + if (!isset($this->SettlementService)) { + + switch ($this->settlement_type) { + case 0: + $this->SettlementService = '收入'; + break; + case 1: + $this->SettlementService = '积分'; + break; + default : $this->SettlementService = '收入'; + } + } + return $this->SettlementService; + } public function getLevelNameAttribute() diff --git a/plugins/area-dividend/src/models/AreaDividendAgent.php b/plugins/area-dividend/src/models/AreaDividendAgent.php index 2b2b1071..b9eac57d 100644 --- a/plugins/area-dividend/src/models/AreaDividendAgent.php +++ b/plugins/area-dividend/src/models/AreaDividendAgent.php @@ -1,20 +1,15 @@ LevelService; } - /** - * Common: 获取器 —— 分润比例 - * Author: wu-hui - * Time: 2022/09/27 17:38 - * @return mixed|void - */ - public function getRateAttribute(){ - if (!isset($this->Rate)) return AgentLevel::getUserRate($this->member_id,$this->agent_level,FALSE); - if ($this->has_ratio == 1) $this->Rate = $this->ratio; + + public function getRateAttribute() + { + $set = Setting::get('plugin.area_dividend'); + if (!isset($this->Rate)) { + + switch ($this->agent_level) { + case 1: + return $set['province_rate']; + break; + case 2: + return $set['city_rate']; + break; + case 3: + return $set['area_rate']; + break; + case 4: + return $set['street_rate']; + break; + } + } + + if ($this->has_ratio == 1) { + $this->Rate = $this->ratio; + } return $this->Rate; } @@ -215,6 +226,8 @@ class AreaDividendAgent extends BaseModel } // dump('costPrice:'.$costPrice); $calculatePrice = $order->price - $costPrice; + } elseif ($set['calculate_type'] == 2) { + $calculatePrice = $order->goods_price; } // dump($calculatePrice); @@ -238,10 +251,11 @@ class AreaDividendAgent extends BaseModel $point_data = [ 'point_income_type' => PointService::POINT_INCOME_GET, - 'point_mode' => PointService::POINT_MODE_TEAM, + 'point_mode' => PointService::POINT_MODE_AREA_DIVIDEND_AWARD, 'member_id' => $member_id, 'point' => $point, - 'remark' => '区域分红奖励' + 'remark' => '区域分红奖励', + 'order_id' => $order->id, ]; // dump($point_data); @@ -258,4 +272,27 @@ class AreaDividendAgent extends BaseModel ->where('manage', 1) ->first(); } -} \ No newline at end of file + + public function scopeProfileWith(Builder $builder) + { + return $builder->with([ + 'hasOneProfile:uid,mobile' + ]); + } + + /** + * 获取与用户表相关的用户信息 + * + * @return \Illuminate\Database\Eloquent\Relations\HasOne + */ + public function hasOneProfile() + { + return $this->hasOne(\app\platform\modules\user\models\YzUserProfile::class, 'uid', 'user_id'); + } + + public static function subPlatformOpen() + { + //子平台插件开启可不填账号密码 + return app('plugins')->isEnabled('sub-platform') && \Yunshop\SubPlatform\services\SettingService::applySwitch(); + } +} diff --git a/plugins/area-dividend/src/models/AreaDividendGoods.php b/plugins/area-dividend/src/models/AreaDividendGoods.php index 4ebe74b8..2bf6b9b0 100644 --- a/plugins/area-dividend/src/models/AreaDividendGoods.php +++ b/plugins/area-dividend/src/models/AreaDividendGoods.php @@ -1,11 +1,6 @@ appointment = $appointment_order; + $this->order = Order::find($appointment_order->order_id); + if($appointment_order->area_set != 1) return; + $set = \Setting::get('plugin.area_dividend'); + $appointment_basic_pay = false; + if($set['appointment_basic'] == 1) $appointment_basic_pay = true; + $this->appointment_basic_pay = $appointment_basic_pay; + //区域代理 + $area_level = []; + $area_agent = []; + + if ($area_arr['province_id']) { + $area_agent['province'] = $this->getProvince($area_arr['province_id']); + $area_level['level_1'] = $this->getLevelStatus($area_agent['province']); + } + + if ($area_arr['city_id']) { + $area_agent['city'] = $this->getCity($area_arr['city_id']); + $area_level['level_2'] = $this->getLevelStatus($area_agent['city']); + } + + if ($area_arr['district_id']) { + $area_agent['district'] = $this->getDistrict($area_arr['district_id']); + $area_level['level_3'] = $this->getLevelStatus($area_agent['district']); + } + + if ($area_arr['street_id']) { + $area_agent['street'] = $this->getStreet($area_arr['street_id']); + $area_level['level_4'] = $this->getLevelStatus($area_agent['street']); + } + + if (!$area_agent) { + \Log::info('门店预约区域代理为空,返回'); + } else { + \Log::info('门店预约区域代理不为空,继续'); + $this->runDividendData($area_agent); + } + } + + public function runDividendData($area_agents) + { + foreach ($area_agents as $areaLevel => $area_agent) { + if ($area_agent->isEmpty()) { + \Log::debug('门店预约区域分红' . $this->order->id .$areaLevel.'团队为空'); + continue; + } + + $same_level_num = $area_agent->count('id'); //同级人数 + \Log::debug('门店预约区域分红' . $this->order->id .$areaLevel.'同级人数'.$same_level_num); + + $areaDividendData = [ + 'uniacid' => \YunShop::app()->uniacid, + 'order_sn' => $this->order->order_sn, + 'order_id' => $this->order->id, + 'order_amount' => $this->order->price, + 'settle_days' => $this->getSet()['settle_days'] ?: 0, + 'create_month' => date('Y-m'), + 'same_level_number' => $same_level_num, + 'created_at' => time(), + 'extra_plugin_id' => 101,//门店预约插件 + 'extra_id' => $this->appointment->id, + ]; + + foreach ($area_agent as $agent) { + if ($agent['agent_at'] > $areaDividendData['created_at']) { + \Log::debug("门店预约区域分红{$this->order->id}: {$areaLevel}{$agent['id']}成为区域代理的时间大于下单时间"); + continue; + } + + + $areaDividendData['member_id'] = $agent['member_id']; + $areaDividendData['area_level'] = $agent['agent_level']; + $areaDividendData['agent_area'] = $this->getAreaName($agent); + $areaDividendData['dividend_rate'] = $this->dividendRate($agent,$areaLevel); + $price = $this->appointment->$areaLevel; + if ($this->appointment_basic_pay) $price = $this->order->price; + $dividend_amount = $this->getDividendAmount($areaDividendData,$price); + \Log::debug('门店预约区域分红-分红金额',[$dividend_amount,$areaDividendData['dividend_rate'],$price]); + if ($dividend_amount <= 0) { + continue; + } + $areaDividendData['dividend_amount'] = $dividend_amount; + $areaDividendData['amount'] = bcdiv($price,$this->appointment->total_count,2); + + //todo 防止多队列支付先走 + $order = \app\common\models\Order::find($this->order->id); + if ($order->status >= 3) { + $areaDividendData['recrive_at'] = strtotime($order->finish_time); + } + + $dividendModel = AreaDividend::create($areaDividendData); + + + $agentData = [ + 'unsettled_dividend_amount' => bcadd($areaDividendData['dividend_amount'],$agent['unsettled_dividend_amount'],2), + ]; + AreaDividendAgent::updatedAgentById($agentData, $agent['id']); + } + } + } + + + /** + * @param $provinceId + * @return mixed + */ + private function getProvince($provinceId) + { + return AreaDividendAgent::getAreaAgentByAddressId($provinceId, $level = 1)->get(); + } + + /** + * @param $cityId + * @return mixed + */ + private function getCity($cityId) + { + return AreaDividendAgent::getAreaAgentByAddressId($cityId, $level = 2)->get(); + } + + /** + * @param $districtId + * @return mixed + */ + private function getDistrict($districtId) + { + return AreaDividendAgent::getAreaAgentByAddressId($districtId, $level = 3)->get(); + } + + /** + * @param $streetId + * @return mixed + */ + private function getStreet($streetId) + { + return AreaDividendAgent::getAreaAgentByAddressId($streetId, $level = 4)->get(); + } + + /** + * @param $value + * @return int + */ + private function getLevelStatus($value) + { + return !$value->isEmpty() ? 1 : 0; + } + + private function getSet() + { + return \Setting::get('plugin.area_dividend'); + } + + /** + * @param $agent + * @return int + */ + private function getDividendAmount($areaDividendData,$price) + { + $basic = bcmul($price, $areaDividendData['dividend_rate']/100,2); + + return bcdiv($basic,$this->appointment->total_count,2); + } + + protected function dividendRate($agent,$areaLevel) + { + if($areaLevel == 'district') $areaLevel = 'area'; + $ratio = $this->getSet()[$areaLevel.'_rate']; + if ($agent->has_ratio == 1) { + $ratio = $agent->ratio; + } + return $ratio; + } + + private function getAreaName($agent) + { + $areaName = $agent->province_name; + $areaName .= $agent->city_name ? "-" . $agent->city_name : ''; + $areaName .= $agent->district_name ? "-" . $agent->district_name : ''; + $areaName .= $agent->street_name ? "-" . $agent->street_name : ''; + return $areaName; + } +} \ No newline at end of file diff --git a/plugins/area-dividend/src/services/AreaDividendGetService.php b/plugins/area-dividend/src/services/AreaDividendGetService.php index a32a1727..75228383 100644 --- a/plugins/area-dividend/src/services/AreaDividendGetService.php +++ b/plugins/area-dividend/src/services/AreaDividendGetService.php @@ -1,10 +1,5 @@ uid, $uniacid); } -} \ No newline at end of file + public static function meetUpgradeMessage($temp_id, Member $member, $uniacid = '') + { + $params = [ + ['name' => '昵称', 'value' => $member->nickname], + ['name' => '时间', 'value' => date('Y-m-d H:i:s', time())], + + ]; + $msg = MessageTemp::getSendMsg($temp_id, $params); + if (!$msg) { + return; + } + \app\common\services\MessageService::notice(MessageTemp::$template_id, $msg, $member->uid, $uniacid); + } + +} diff --git a/plugins/area-dividend/src/services/OrderCreatedNewService.php b/plugins/area-dividend/src/services/OrderCreatedNewService.php index d664fe1b..b8a41fec 100644 --- a/plugins/area-dividend/src/services/OrderCreatedNewService.php +++ b/plugins/area-dividend/src/services/OrderCreatedNewService.php @@ -7,7 +7,6 @@ use Yunshop\AreaDividend\event\CreatedAreaDividendBonusEvent; use Yunshop\AreaDividend\models\AreaDividend; use Yunshop\AreaDividend\models\AreaDividendAgent; use Yunshop\AreaDividend\models\AreaDividendGoods; -use Yunshop\Commission\models\AgentLevel; use Yunshop\Hotel\common\models\HotelGoods; use Yunshop\Hotel\common\models\HotelSetting; use Yunshop\StoreCashier\common\models\CashierGoods; @@ -26,6 +25,8 @@ class OrderCreatedNewService public $commission; public $alone_dividend_rate = false; public $lower_level_rate = false; + public $extra_plugin_id; + public $extra_id; public function __construct($order,$areaLevel,$is_fix,$commission=false) { @@ -33,6 +34,13 @@ class OrderCreatedNewService $this->areaLevel = $areaLevel; $this->is_fix = $is_fix; $this->commission = $commission; + $this->setExtra(0, 0); + } + + public function setExtra($extra_plugin_id, $extra_id) + { + $this->extra_plugin_id = $extra_plugin_id; + $this->extra_id = $extra_id; } protected function getSet() @@ -47,31 +55,12 @@ class OrderCreatedNewService { if (!isset($this->dividendRate)) { $set = $this->getSet(); - // 获取分红设置 - $uid = $this->order['uid'] > 0 ? $this->order['uid'] : \YunShop::app()->getMemberId(); - - \Log::debug("用户分红比例 - uid:",$uid); - - if($uid > 0){ - $originalStreetRate = AgentLevel::getUserRate($uid,4); - $originalAreaRate = AgentLevel::getUserRate($uid,3); - $originalCityRate = AgentLevel::getUserRate($uid,2); - $originalProvinceRate = AgentLevel::getUserRate($uid,1); - }else{ - $originalStreetRate = $set['street_rate'] ? : 0; - $originalAreaRate = $set['area_rate'] ? : 0; - $originalCityRate = $set['city_rate'] ? : 0; - $originalProvinceRate = $set['province_rate'] ? : 0; - } - \Log::debug("用户分红比例 - 全部比例:",[$originalStreetRate,$originalAreaRate,$originalCityRate,$originalProvinceRate]); - - // 分红配置 if ($set['is_distinction']) { //开启极差 - $street_rate = $this->areaLevel['level_4'] ? $originalStreetRate : 0; - $area_rate = $this->areaLevel['level_3'] ? $originalAreaRate : $street_rate; - $city_rate = $this->areaLevel['level_2'] ? $originalCityRate : $area_rate; - $province_rate = $this->areaLevel['level_1'] ? $originalProvinceRate : $city_rate; + $street_rate = $this->areaLevel['level_4'] ? $set['street_rate'] : 0; + $area_rate = $this->areaLevel['level_3'] ? $set['area_rate'] : $street_rate; + $city_rate = $this->areaLevel['level_2'] ? $set['city_rate'] : $area_rate; + $province_rate = $this->areaLevel['level_1'] ? $set['province_rate'] : $city_rate; $rates = [ 'province_rate' => $province_rate - $city_rate, @@ -101,11 +90,11 @@ class OrderCreatedNewService ], 'rate_3' => [ 'rate' => $rates['area_rate'] > 0 ? $rates['area_rate'] : 0, - 'lower_level_rate' => $originalStreetRate ? $originalStreetRate : 0, + 'lower_level_rate' => $set['street_rate'] ? $set['street_rate'] : 0, 'point_ratio' => $set['area_point'] ], 'rate_4' => [ - 'rate' => $originalStreetRate ? $originalStreetRate : 0, + 'rate' => $set['street_rate'] ? $set['street_rate'] : 0, 'lower_level_rate' => '0', 'point_ratio' => $set['street_point'] ] @@ -113,31 +102,28 @@ class OrderCreatedNewService } else { $this->dividendRate = [ 'rate_1' => [ - 'rate' => $originalProvinceRate, - 'lower_level_rate' => $originalCityRate, + 'rate' => $set['province_rate'], + 'lower_level_rate' => $set['city_rate'], 'point_ratio' => $set['province_point'] ], 'rate_2' => [ - 'rate' => $originalCityRate, - 'lower_level_rate' => $originalAreaRate, + 'rate' => $set['city_rate'], + 'lower_level_rate' => $set['area_rate'], 'point_ratio' => $set['city_point'] ], 'rate_3' => [ - 'rate' => $originalAreaRate, - 'lower_level_rate' => $originalStreetRate, + 'rate' => $set['area_rate'], + 'lower_level_rate' => $set['street_rate'], 'point_ratio' => $set['area_point'] ], 'rate_4' => [ - 'rate' => $originalStreetRate, + 'rate' => $set['street_rate'], 'lower_level_rate' => '', 'point_ratio' => $set['street_point'] ] ]; } } - - \Log::debug("用户分红比例 - 最终比例:",$this->dividendRate); - return $this->dividendRate; } @@ -161,7 +147,15 @@ class OrderCreatedNewService 'create_month' => date('Y-m'), 'same_level_number' => $same_level_num, 'created_at' => $this->order->create_time->timestamp, + 'extra_plugin_id' => $this->extra_plugin_id, + 'extra_id' => $this->extra_id, ]; + + if (app('plugins')->isEnabled('coupon-store') && $this->extra_plugin_id == 144) { + $coupon_count = \Yunshop\CouponStore\models\Coupon::uniacid()->where('order_id', $this->order->id)->count(); + $areaDividendData['order_amount'] = bcdiv($this->order->price, $coupon_count, 2); + } + foreach ($area_agents as $agent) { if($agent['agent_at'] > $areaDividendData['created_at']){ \Log::debug("区域分红{$this->order->id}: {$areaLevel}{$agent['id']}成为区域代理的时间大于下单时间"); @@ -172,6 +166,8 @@ class OrderCreatedNewService 'member_id' => $agent['member_id'], 'area_level' => $agent['agent_level'], 'order_sn' => $areaDividendData['order_sn'], + 'extra_plugin_id' => $areaDividendData['extra_plugin_id'], + 'extra_id' => $areaDividendData['extra_id'], ])->count(); if ($exist) { \Log::info("订单{$areaDividendData['order_sn']}:", "{$agent['member_id']}的分红记录已存在"); @@ -344,10 +340,9 @@ class OrderCreatedNewService return $dividendAmount; } - protected function getAloneRate($areaDividendGoods,$agent){ + protected function getAloneRate($areaDividendGoods,$agent) + { $set = $this->getSet(); - - if ($set['is_distinction']) { //开启极差 $street_rate = $this->areaLevel['level_4'] ? $areaDividendGoods['street_rate'] : 0; @@ -425,7 +420,8 @@ class OrderCreatedNewService protected function setDividendPrice($goods) { - if ($this->getSet()['culate_method']) { + \Log::debug("区域分红计算订单价格价格",[$this->getSet()['culate_method']]); + if ($this->getSet()['culate_method'] == 1) { //利润 $price = $goods->payment_amount - $goods->goods_cost_price; if (app('plugins')->isEnabled('store-cashier')) { @@ -441,7 +437,7 @@ class OrderCreatedNewService } } elseif ($store_good) { $store_setting = StoreSetting::where('store_id', $store_good->store_id)->where('key', 'store')->first(); - $shop_commission = (integer)$store_setting->value['shop_commission']; + $shop_commission = $store_setting->value['shop_commission']; $price = proportionMath($goods->payment_amount , $shop_commission); if (app('plugins')->isEnabled('consumer-reward') && \Setting::get('plugin.consumer_reward.is_open')==1) { if (\Setting::get('plugin.consumer_reward.store_profit')) { @@ -455,14 +451,24 @@ class OrderCreatedNewService $hotel_good = HotelGoods::select('id', 'hotel_id', 'goods_id')->where('goods_id', $goods->goods_id)->first(); if ($hotel_good) { $hotel_setting = HotelSetting::where('hotel_id', $hotel_good->hotel_id)->where('key', 'hotel')->first(); - $shop_commission = (integer)$hotel_setting->value['shop_commission']; + $shop_commission = $hotel_setting->value['shop_commission']; $price = proportionMath($goods->payment_amount , $shop_commission); } } + } elseif ($this->getSet()['culate_method'] == 2) { + //商品现价 + $price = $goods->goods_price; } else { //订单金额 $price = $goods->payment_amount; } + + //消费券联盟根据核销次数对金额进行等分 + if (app('plugins')->isEnabled('coupon-store') && $this->extra_plugin_id == 144 && bccomp($price, 0, 2) == 1) { + $coupon_count = \Yunshop\CouponStore\models\Coupon::uniacid()->where('order_id', $this->order->id)->count(); + $price = bcdiv($price, $coupon_count, 2); + } + return $price; } @@ -479,12 +485,10 @@ class OrderCreatedNewService { $set = $this->order->getSetting('plugin.area_dividend'); $totalDividend = 0.00; - $rates['province_rate'] = $set['province_rate']; $rates['city_rate'] = $set['city_rate']; $rates['area_rate'] = $set['area_rate']; $rates['street_rate'] = $set['street_rate']; - if ($set['is_distinction']) { $totalDividend = round(max($rates) / 100 * $this->amount, 2); } else { diff --git a/plugins/area-dividend/src/services/OrderCreatedService.php b/plugins/area-dividend/src/services/OrderCreatedService.php index 7075d415..3c34620c 100644 --- a/plugins/area-dividend/src/services/OrderCreatedService.php +++ b/plugins/area-dividend/src/services/OrderCreatedService.php @@ -5,19 +5,13 @@ namespace Yunshop\AreaDividend\services; use app\common\facades\Setting; use Yunshop\AreaDividend\models\AreaDividendAgent; use Yunshop\AreaDividend\models\AreaDividendGoods; -use Yunshop\Commission\models\AgentLevel; use Yunshop\Hotel\common\models\HotelGoods; use Yunshop\Hotel\common\models\HotelSetting; use Yunshop\StoreCashier\common\models\CashierGoods; use Yunshop\StoreCashier\common\models\StoreSetting; use Yunshop\StoreCashier\store\models\StoreGoods; -/** - * Created by PhpStorm. - * User: yanglei - * Date: 2017/5/8 - * Time: 上午10:04 - */ + class OrderCreatedService { /** @@ -150,35 +144,29 @@ class OrderCreatedService * @param $areaLevel * @return array */ - public static function getRateByAgent($set, $areaLevel){ - // 获取分红设置 - $uid = \YunShop::app()->getMemberId(); - if($uid > 0){ - $originalStreetRate = AgentLevel::getUserRate($uid,4); - $originalAreaRate = AgentLevel::getUserRate($uid,3); - $originalCityRate = AgentLevel::getUserRate($uid,2); - $originalProvinceRate = AgentLevel::getUserRate($uid,1); - }else{ - $originalStreetRate = $set['street_rate'] ? : 0; - $originalAreaRate = $set['area_rate'] ? : 0; - $originalCityRate = $set['city_rate'] ? : 0; - $originalProvinceRate = $set['province_rate'] ? : 0; - } - - // 其他操作 + public static function getRateByAgent($set, $areaLevel) + { $rateData = []; - if ($areaLevel['level_4']) $street_rate = $originalStreetRate; - else $street_rate = 0; - - if ($areaLevel['level_3']) $area_rate = $originalAreaRate; - else $area_rate = $street_rate; - - if ($areaLevel['level_2']) $city_rate = $originalCityRate; - else $city_rate = $area_rate; - - if ($areaLevel['level_1']) $province_rate = $originalProvinceRate; - else $province_rate = $city_rate; - + if ($areaLevel['level_4']) { + $street_rate = $set['street_rate']; + } else { + $street_rate = 0; + } + if ($areaLevel['level_3']) { + $area_rate = $set['area_rate']; + } else { + $area_rate = $street_rate; + } + if ($areaLevel['level_2']) { + $city_rate = $set['city_rate']; + } else { + $city_rate = $area_rate; + } + if ($areaLevel['level_1']) { + $province_rate = $set['province_rate']; + } else { + $province_rate = $city_rate; + } $street_point = $set['street_point']; $area_point = $set['area_point']; @@ -206,22 +194,8 @@ class OrderCreatedService { $set = Setting::get('plugin.area_dividend'); $dividendRate = []; - // 获取分红设置 - $uid = \YunShop::app()->getMemberId(); - if($uid > 0){ - $originalStreetRate = AgentLevel::getUserRate($uid,4); - $originalAreaRate = AgentLevel::getUserRate($uid,3); - $originalCityRate = AgentLevel::getUserRate($uid,2); - $originalProvinceRate = AgentLevel::getUserRate($uid,1); - }else{ - $originalStreetRate = $set['street_rate'] ? : 0; - $originalAreaRate = $set['area_rate'] ? : 0; - $originalCityRate = $set['city_rate'] ? : 0; - $originalProvinceRate = $set['province_rate'] ? : 0; - } - - if ($set['is_distinction']) { + $rates = static::getRateByAgent($set, $areaLevel); $province_rate = $rates['province_rate']; $city_rate = $rates['city_rate']; @@ -240,11 +214,11 @@ class OrderCreatedService ], 'rate_3' => [ 'rate' => $area_rate > 0 ? $area_rate : 0, - 'lower_level_rate' => $originalStreetRate ? $originalStreetRate : 0, + 'lower_level_rate' => $set['street_rate'] ? $set['street_rate'] : 0, 'point_ratio' => $set['area_point'] ], 'rate_4' => [ - 'rate' => $originalStreetRate ? $originalStreetRate : 0, + 'rate' => $set['street_rate'] ? $set['street_rate'] : 0, 'lower_level_rate' => '0', 'point_ratio' => $set['street_point'] ] @@ -252,22 +226,22 @@ class OrderCreatedService } else { $dividendRate = [ 'rate_1' => [ - 'rate' => $originalProvinceRate, - 'lower_level_rate' => $originalCityRate, + 'rate' => $set['province_rate'], + 'lower_level_rate' => $set['city_rate'], 'point_ratio' => $set['province_point'] ], 'rate_2' => [ - 'rate' => $originalCityRate, - 'lower_level_rate' => $originalAreaRate, + 'rate' => $set['city_rate'], + 'lower_level_rate' => $set['area_rate'], 'point_ratio' => $set['city_point'] ], 'rate_3' => [ - 'rate' => $originalAreaRate, - 'lower_level_rate' => $originalStreetRate, + 'rate' => $set['area_rate'], + 'lower_level_rate' => $set['street_rate'], 'point_ratio' => $set['area_point'] ], 'rate_4' => [ - 'rate' => $originalStreetRate, + 'rate' => $set['street_rate'], 'lower_level_rate' => '', 'point_ratio' => $set['street_point'] ] diff --git a/plugins/area-dividend/src/services/ReturnFormatService.php b/plugins/area-dividend/src/services/ReturnFormatService.php index 01f115e4..99991a64 100644 --- a/plugins/area-dividend/src/services/ReturnFormatService.php +++ b/plugins/area-dividend/src/services/ReturnFormatService.php @@ -1,16 +1,13 @@ $data->id, 'order_sn' => $data->order_sn, 'amount' => $data->dividend_amount, 'order' => $data->hasOneOrder ? $data->hasOneOrder->toArray() : [], ]; + $settlement_option = \Setting::get('plugin.area_dividend.settlement_option'); + if ($settlement_option == 1) { + return array_merge($res,['reward_type' => \Setting::get('shop.shop')['credit1'] ?: '积分']); + } + if ($settlement_option == 2) { + return array_merge($res,['reward_type' => \Setting::get('shop.shop')['credit'] ?: '余额']); + } + if ($settlement_option == 3) { + return array_merge($res,['reward_type' => '直接结算']); + } + return $res; } @@ -48,7 +56,10 @@ class ReturnFormatService public function setSettlement($result) { - $data = ['status'=>'1','statement_at'=>time()]; + // $data = ['status'=>'1','statement_at'=>time()]; + //AreaDividend::where('id', $result->id)->update($data); + $settlement_type = Setting::get('plugin.area_dividend.settlement_option') ?: 0; + $data = ['status'=>'1','statement_at'=>time(),'settlement_type' => $settlement_type]; AreaDividend::where('id', $result->id)->update($data); $areaDividend = collect([])->push($result); diff --git a/plugins/area-dividend/src/services/TimedTaskService.php b/plugins/area-dividend/src/services/TimedTaskService.php index d9da90fb..e53dad7e 100644 --- a/plugins/area-dividend/src/services/TimedTaskService.php +++ b/plugins/area-dividend/src/services/TimedTaskService.php @@ -3,6 +3,8 @@ namespace Yunshop\AreaDividend\services; use app\common\facades\Setting; use app\common\models\Member; use app\common\models\UniAccount; +use app\common\services\finance\BalanceChange; +use app\common\services\finance\PointService; use app\common\services\income\IncomeService; use Illuminate\Support\Facades\Log; use Yunshop\AreaDividend\event\SettleAreaDividendBonusEvent; @@ -12,12 +14,7 @@ use app\common\models\Income; use app\common\events\ProfitEvent; -/** - * Created by PhpStorm. - * User: yanglei - * Date: 2017/5/12 - * Time: 下午09:52 - */ + class TimedTaskService { public function handle() @@ -54,34 +51,50 @@ class TimedTaskService */ public function setStatement($areaDividend) { + $set = Setting::get('plugin.area_dividend'); foreach ($areaDividend as $item) { //增加区域代理已结算金额 $this->addAgentDividend($item); + $send_msg = true; + if (isset($set['settlement_option']) && $set['settlement_option'] == 1) { + //转入积分 + $this->addPoint($item); + } else if (isset($set['settlement_option']) && $set['settlement_option'] == 2) { + //转入积分 + $this->addBalance($item); + } elseif (isset($set['settlement_option']) && $set['settlement_option'] == 3) { + //直接结算 代理商分红在用 + \Log::info('----区域分红选择直接结算----',$item->id); + $send_msg = false; + }else { + //加入分红收入 + $this->addAreaDividendIncome($item); + } - //加入分红收入 - $this->addAreaDividendIncome($item); //招商专员插件分红 if(app('plugins')->isEnabled('invest-people')) { (new \Yunshop\InvestPeople\services\IncomeWithdrawService())->areaDividend($item); } - if ($item->dividend_amount > 0) { - MessageService::statementNotice($item); - } + if($send_msg){ + if ($item->dividend_amount > 0) { + MessageService::statementNotice($item); + } - if (app('plugins')->isEnabled('instation-message')) { - //开启了站内消息插件 - event(new \Yunshop\InstationMessage\event\AreaDividendSettlementEvent([ - 'changeTime'=>date('Y-m-d H:i:s', time()), - 'order_sn'=>$item->hasOneOrder->order_sn, - 'order_amount'=>$item->hasOneOrder->price, - 'amount'=>$item->amount, - 'dividend_amount'=>$item->dividend_amount, - 'member_id'=>$item->member_id, - 'uniacid'=>\YunShop::app()->uniacid - ])); + if (app('plugins')->isEnabled('instation-message')) { + //开启了站内消息插件 + event(new \Yunshop\InstationMessage\event\AreaDividendSettlementEvent([ + 'changeTime'=>date('Y-m-d H:i:s', time()), + 'order_sn'=>$item->hasOneOrder->order_sn, + 'order_amount'=>$item->hasOneOrder->price, + 'amount'=>$item->amount, + 'dividend_amount'=>$item->dividend_amount, + 'member_id'=>$item->member_id, + 'uniacid'=>\YunShop::app()->uniacid + ])); + } } } } @@ -92,7 +105,8 @@ class TimedTaskService */ public function updatedStatement($dividendData) { - $data = ['status'=>'1','statement_at'=>time()]; + $settlement_type = Setting::get('plugin.area_dividend.settlement_option') ?: 0; + $data = ['status'=>'1','statement_at'=>time(),'settlement_type' => $settlement_type]; $ids = $dividendData->pluck('id'); return AreaDividend::whereIn('id', $ids)->update($data); @@ -164,11 +178,6 @@ class TimedTaskService ] ]; - - //收入明细数据 - $incomeDetail = json_encode($data); - $config = \app\backend\modules\income\Income::current()->getItem('areaDividend'); - //收入明细数据 $incomeDetail = json_encode($data); @@ -213,4 +222,43 @@ class TimedTaskService // } // return $requestIncome; } + + /** + * @param $dividendData + * @throws \app\common\exceptions\ShopException + */ + public function addPoint($dividendData) + { + $point_data = [ + 'point_income_type' => PointService::POINT_INCOME_GET, + 'point_mode' => PointService::POINT_MODE_AREA_DIVIDEND, + 'member_id' => $dividendData['member_id'], + 'point' => $dividendData['dividend_amount'], + 'order_id' => $dividendData['order_id'], + 'remark' => "区域分红结算积分{$dividendData['id']}" + ]; + + (new PointService($point_data))->changePoint(); + } + + /** + * @param $dividendData + * @return void + * @throws \app\common\exceptions\AppException + */ + public function addBalance($dividendData) + { + $data = [ + 'member_id' => $dividendData->member_id, + 'change_value' => $dividendData->dividend_amount, + 'operator' => \app\common\services\credit\ConstService::OPERATOR_SHOP, + 'operator_id' => $dividendData->id, + 'remark' => 'id:'.$dividendData->id.',结算金额:'.$dividendData->dividend_amount, + 'relation' => '', + 'source' => \app\common\services\credit\ConstService::AREA_DIVIDEND, + 'type' => \app\common\services\credit\ConstService::TYPE_INCOME, + ]; + + (new BalanceChange())->universal($data); + } } \ No newline at end of file diff --git a/plugins/area-dividend/src/services/UpgradeService.php b/plugins/area-dividend/src/services/UpgradeService.php new file mode 100644 index 00000000..b228608a --- /dev/null +++ b/plugins/area-dividend/src/services/UpgradeService.php @@ -0,0 +1,271 @@ +setting = Setting::get('plugin.area_dividend'); + //升级条件的设置(不是总设置) + $this->upgrade = $this->setting['upgrade']; + $this->memberId = $memberId; + $this->member = Member::find($memberId); + } + + /** + * 是否为区域代理 + * @return bool + */ + protected function hasDividendAgent() + { + return AreaDividendAgent::uniacid()->where('status', 1)->where('member_id', $this->memberId)->exists(); + } + + /** + * 订单支付后 + * @return void + */ + public function afterPay() + { + if ($this->upgrade['event_type'] == 1) { + \Log::debug('--区域分红升级条件开始--afterPay'); + if ($this->verification()) { + $this->sendMessage(); + } + \Log::debug('--区域分红升级条件--结束'); + } + } + + /** + * 订单完成后 + * @return void + */ + public function afterComplete() + { + if ($this->upgrade['event_type'] == 2) { + \Log::debug('--区域分红升级条件开始--afterComplete'); + if ($this->verification()) { + $this->sendMessage(); + } + \Log::debug('--区域分红升级条件--结束'); + } + } + + /** + * 校验升级条件 + * @return bool + */ + public function verification(): bool + { + \Log::debug('--区域分红升级条件--升级设置', $this->upgrade); + $result = $this->check(); + if ($result['status'] == 0) { + \Log::debug('--区域分红升级条件--失败', $result['msg']); + return false; + } + + $one_result = $this->hasConditionOne(); + $two_result = $this->hasConditionTwo(); + + if (!$two_result['status'] && !$one_result['status']) { + \Log::debug('--UpgradeService--hasConditionTwo', $two_result['msg']); + \Log::debug('--UpgradeService--hasConditionOne', $one_result['msg']); + return false; + } + return true; + } + + /** + * @return bool + */ + public function hasApply() + { + if ($this->hasDividendAgent()) { + return true; + } + $one_result = $this->hasConditionOne(); + $two_result = $this->hasConditionTwo(); + if ($one_result['status'] || $two_result['status']) { + return true; + } + return false; + } + + protected function sendMessage() + { + try { + if (!$this->upgrade['template_id']) { + \Log::debug('--区域分红升级条件--没有设置模板'); + return false; + } else { + MessageService::meetUpgradeMessage($this->upgrade['template_id'], $this->member, $this->member->uniacid); + } + } catch (ShopException $e) { + \Log::debug('--区域分红升级条件--模板信息发送失败:', $e->getMessage()); + return false; + } + } + + /** + * 升级条件1 + * @return array + */ + public function hasConditionOne() + { + + if (!$this->upgrade['push_level']) { + return $this->error('没有设置经销商等级!'); + } + + if (!$this->upgrade['push_num']) { + return $this->error('没有设置直推数量!'); + } + + if (!$this->upgrade['price']) { + return $this->error('没有设置消费金额!'); + } + + if (!$this->upgrade['level_type']) { + return $this->error('没有设置等级类型!'); + } + + if (!$this->upgrade['push_level']) { + return $this->error('没有设置经销商等级!'); + } + + $push_count = $this->getAgencyCount(); + + if ($push_count < $this->upgrade['push_num']) { + return $this->error('经销商直推数量不符合条件!--' . ($this->upgrade['level_type'] ? '本级' : '以上') . '--经销商数量=' . $push_count); + } + + $self_price = $this->getSelfPrice(); + + if ($self_price < $this->upgrade['price']) { + return $this->error("没有设置累计消费!--self_price={$self_price}--upgrade_price={$this->upgrade['price']}"); + } + + return $this->success(); + } + + + /** + * 升级条件2 + * @return array + */ + public function hasConditionTwo() + { + if (empty($this->upgrade['goods_ids'])) { + return $this->error('没有设置指定商品'); + } + + if (!$this->hasBuyGoods()) { + return $this->error('不符合购买指定商品'); + } + return $this->success(); + } + + /** + * 自身团队已消费金额 + * @return float + */ + public function getSelfPrice() + { + $child_ids = MemberParent::where('parent_id', $this->memberId)->pluck('member_id'); + return Order::whereIn('status', [1, 2, 3])->whereIn('uid', $child_ids)->sum('price'); + } + + /** + * 是否有购买指定商品 + * @return mixed + */ + public function hasBuyGoods() + { + return OrderGoods::where('uid', $this->memberId) + ->whereIn('goods_id', $this->upgrade['goods_ids'] ?: []) + ->whereHas('hasOneOrder', function ($order) { + if ($this->upgrade['event_type'] == 1) { + $order->where('status', ">=", 1); + } elseif ($this->upgrade['event_type'] == 2) { + $order->where('status', 3); + } + }) + ->exists(); + } + + /** + * 经销商人数 + * @return int + */ + public function getAgencyCount() + { + $child_ids = MemberParent::where('parent_id', $this->memberId)->where('level', 1)->pluck('member_id'); + //经销商 + $agency_list = TeamDividendAgencyModel::whereIn('uid', $child_ids)->where('is_black', 0)->get(); + + $push_count = 0; + if ($this->upgrade['level_type'] == 1) { + $push_count = $agency_list->filter(function ($agency) { + return $this->upgrade['push_level'] == $agency->level; + })->count(); + } elseif ($this->upgrade['level_type'] == 2) { + $start_level = TeamDividendLevelModel::where('id', $this->upgrade['push_level'])->value('level_weight'); + if ($start_level) { + //获取设置等级以上的等级 + $level_ids = TeamDividendLevelModel::where('level_weight', '>=', $start_level)->pluck('id')->toArray(); + $push_count = $agency_list->filter(function ($agency) use ($level_ids) { + return in_array($agency->level, $level_ids); + })->count(); + } + } + return $push_count; + } + + protected function success($data = null, $mgs = 'success') + { + return ['status' => 1, 'msg' => $mgs, 'data' => $data]; + } + + protected function error($mgs = 'error', $data = null) + { + return ['status' => 0, 'msg' => $mgs, 'data' => $data]; + } + + public function check() + { + //未开启区域分红 || 未开启升级条件设置 + if ($this->setting['is_area_dividend'] != 1 || $this->upgrade['is_open'] != 1) { + return $this->error('未开启相关设置!'); + } + + if (!isset($this->memberId)) { + return $this->error('缺少会员id!!'); + } + + if (!app('plugins')->isEnabled('team-dividend')) { + return $this->error('未开启经销商管理插件!'); + } + + if ($this->hasDividendAgent()) { + return $this->error('已成为区域代理!'); + } + + return $this->success(); + } +} diff --git a/plugins/area-dividend/src/widgets/AreaDividendLangWidget.php b/plugins/area-dividend/src/widgets/AreaDividendLangWidget.php new file mode 100644 index 00000000..a6bc582d --- /dev/null +++ b/plugins/area-dividend/src/widgets/AreaDividendLangWidget.php @@ -0,0 +1,32 @@ + [ + 'tab' => '区域分红设置', + 'data' => [ + [ + 'key' => 'title', + 'default' => '区域分红', + 'remark' => '插件名称' + ], + [ + 'key' => 'area_dividend_center', + 'default' => '区域分红中心', + 'remark' => '' + ], + [ + 'key' => 'dividend_amount', + 'default' => '佣金', + 'remark' => '' + ] + ] + ] + ]; + } +} \ No newline at end of file diff --git a/plugins/area-dividend/src/widgets/AreaDividendWithdrawWidget.php b/plugins/area-dividend/src/widgets/AreaDividendWithdrawWidget.php index 809d897c..e8052f0e 100644 --- a/plugins/area-dividend/src/widgets/AreaDividendWithdrawWidget.php +++ b/plugins/area-dividend/src/widgets/AreaDividendWithdrawWidget.php @@ -1,11 +1,6 @@ -