Symfony网校edusoho分销插件二次开发-附代码
原文链接 https://m.zkdygl.com/d/38-edusoho
两种分销模式,指定分销和人人分销;
1、指定分销:用户默认无分销权限,需要后台开通分销权限后,才可以推广下级获得返佣;
2、人人分销:用户默认开启分销权限,新用户进入系统直接是分销推广员。可直接推广下级。
两种模式的推广方式、返佣方式均相同;
3、返佣规则
A推广B,B推广了C;
A购买专题后,自己没有返佣;
B购买专题后,A获得一级返佣;
C购买了专题,B获得一级返佣,A获得二级返佣
4、推广佣金计算
一级佣金 = 专题售价 x 一级返佣比例
二级佣金 = 专题售价 x 二级返佣比例
(一级返佣、二级返佣设置的数字:例如80,代表返佣金额为课程售价的80%)
5、佣金提现
用户需要在前端申请提现;
支付宝提现到账方式;
商家通过后台的申请记录在线下人工转账。
DistributionController.php
<?php
namespace DistributionPlugin\Controller\My;
use AppBundle\Common\ArrayToolkit;
use AppBundle\Common\Paginator;
use AppBundle\Common\StringToolkit;
use AppBundle\Controller\BaseController;
use Biz\System\Service\SettingService;
use Biz\User\Service\UserService;
use DistributionPlugin\Biz\Distribution\Service\DistributionService;
use DistributionPlugin\Biz\Distribution\Service\RewardService;
use Symfony\Component\HttpFoundation\Request;
class DistributionController extends BaseController
{
public function indexAction(Request $request)
{
$user = $this->getCurrentUser();
$distributionSetting = $this->getSettingService()->get('plugin_distribution');
if (empty($distributionSetting['enabled'])) {
return $this->render('DistributionPlugin:my:distribution-disable.html.twig');
}
if (!$user->isLogin()) {
return $this->createMessageResponse('error', '用户未登录,请先登录!');
}
if (empty($user['inviteCode'])) {
$user = $this->getUserService()->createInviteCode($user['id']);
}
$distribution = $this->getDistributionService()->getByUserId($user['id']);
if (isset($distributionSetting['distribution_template'])) {
$site = $this->getSettingService()->get('site', array());
$registerUrl = $this->generateUrl('register', array('inviteCode' => $user['inviteCode']), true);
$variables = array(
'siteName' => $site['name'],
'registerUrl' => $registerUrl,
);
$message = StringToolkit::template($distributionSetting['distribution_template'], $variables);
}
$conditions = $request->query->all();
$conditions['currentId'] = $user['id'];
$paginator = new Paginator(
$request, $this->getDistributionService()->countDistributions($conditions), 20
);
$distributions = $this->getDistributionService()->searchDistributions(
$conditions,
array('id' => 'desc'),
$paginator->getOffsetCount(),
$paginator->getPerPageCount()
);
$distributionUsers = $this->getUserService()->findUsersByIds(ArrayToolkit::column($distributions, 'userId'));
return $this->render(
'DistributionPlugin:My:index.html.twig',
array(
'code' => $user['inviteCode'],
'distribution_template' => $message,
'distribution' => $distribution,
'distributions' => $distributions,
'paginator' => $paginator,
'distributionUsers' => $distributionUsers,
)
);
}
public function rewardAction(Request $request)
{
$user = $this->getCurrentUser();
$distributionSetting = $this->getSettingService()->get('plugin_distribution');
if (empty($distributionSetting['enabled'])) {
return $this->render('DistributionPlugin:my:distribution-disable.html.twig');
}
if (!$user->isLogin()) {
return $this->createMessageResponse('error', '用户未登录,请先登录!');
}
$distribution = $this->getDistributionService()->getByUserId($user['id']);
$conditions = $request->query->all();
$conditions['userId'] = $user['id'];
$paginator = new Paginator(
$this->get('request'), $this->getRewardService()->countRewards($conditions), 10
);
$rewards = $this->getRewardService()->searchRewards(
$conditions,
array('id' => 'DESC'),
$paginator->getOffsetCount(),
$paginator->getPerPageCount()
);
$rewardOrders = $this->getRewardService()->findRewardInOrderSn(ArrayToolkit::column($rewards, 'orderSn'));
$users = $this->getUserService()->findUsersByIds(ArrayToolkit::column($rewardOrders, 'userId'));
return $this->render(
'DistributionPlugin:My/reward:index.html.twig',
array(
'distribution' => $distribution,
'paginator' => $paginator,
'rewards' => $rewards,
'rewardOrders' => $rewardOrders,
'users' => $users,
)
);
}
public function withdrawAction(Request $request)
{
$user = $this->getCurrentUser();
$distributionSetting = $this->getSettingService()->get('plugin_distribution');
$distribution = $this->getDistributionService()->getByUserId($user['id']);
if (empty($distribution['realname']) && empty($distribution['account'])) {
return $this->settingAction($request);
// return $this->render('DistributionPlugin:My/reward:disabled-modal.html.twig');
}
if ($request->getMethod() == 'POST') {
$amount = $request->request->get('amount');
$amount = $amount * 100;
if ($amount > $distribution['balance']) {
return $this->createJsonResponse(array('status' => 'danger', 'message' => '账户余额不足'));
}
$this->getRewardService()->changeReward($user['id'], $amount, 'extract', null);
return $this->createJsonResponse(array('status' => 'success', 'message' => '提交申请成功'));
}
return $this->render(
'DistributionPlugin:My/reward:withdraw-modal.html.twig',
array(
'distribution' => $distribution,
'distributionSetting' => $distributionSetting,
)
);
}
public function settingAction(Request $request)
{
$user = $this->getCurrentUser();
$distributionSetting = $this->getSettingService()->get('plugin_distribution');
$distribution = $this->getDistributionService()->getByUserId($user['id']);
if ($request->getMethod() == 'POST') {
$fields = $request->request->all();
$this->getDistributionService()->setAccount($distribution['id'], $fields['realname'], $fields['account']);
return $this->createJsonResponse(array('success' => true, 'message' => '设置成功'));
}
return $this->render(
'DistributionPlugin:My/reward:setting-modal.html.twig',
array(
'distribution' => $distribution,
)
);
}
/**
* @return UserService
* */
protected function getUserService()
{
return $this->createService('User:UserService');
}
/**
* @return SettingService
* */
protected function getSettingService()
{
return $this->createService('System:SettingService');
}
/**
* @return DistributionService
* */
protected function getDistributionService()
{
return $this->createService('DistributionPlugin:Distribution:DistributionService');
}
/**
* @return RewardService
* */
protected function getRewardService()
{
return $this->createService('DistributionPlugin:Distribution:RewardService');
}
}
DefaultController.php
<?php
namespace DistributionPlugin\Controller\AdminV2;
use AppBundle\Controller\Admin\BaseController;
use Biz\System\Service\SettingService;
use Symfony\Component\HttpFoundation\Request;
class DefaultController extends BaseController
{
public function settingAction(Request $request)
{
$distributionSetting = $this->getSettingService()->get('plugin_distribution', array());
if ($request->getMethod() == 'POST') {
$fields = $request->request->all();
$this->getSettingService()->set('plugin_distribution', $fields);
$this->getLogService()->info('system', 'update_settings', '更新推广设置', $fields);
$this->setFlashMessage('success', '推广设置已保存!');
return $this->redirectToRoute('admin_v2_distribution_setting');
}
return $this->render(
'DistributionPlugin:admin-v2:setting.html.twig',
array(
'distributionSetting' => $distributionSetting,
)
);
}
/**
* @return SettingService
* */
protected function getSettingService()
{
return $this->createService('System:SettingService');
}
}
RewardController.php
<?php
namespace DistributionPlugin\Controller\AdminV2;
use AppBundle\Common\ArrayToolkit;
use AppBundle\Common\Paginator;
use AppBundle\Controller\Admin\BaseController;
use Biz\System\Service\SettingService;
use DistributionPlugin\Biz\Distribution\Service\DistributionService;
use DistributionPlugin\Biz\Distribution\Service\RewardService;
use Symfony\Component\HttpFoundation\Request;
class RewardController extends BaseController
{
public function indexAction(Request $request)
{
$conditions = $request->query->all();
if (!empty($conditions['keywords'])) {
$user = $this->getUserService()->getUserByLoginField($conditions['keywords']);
$conditions['userId'] = !empty($user) ? $user['id'] : 0;
}
$paginator = new Paginator(
$this->get('request'), $this->getRewardService()->countRewards($conditions), 10
);
$rewards = $this->getRewardService()->searchRewards(
$conditions,
array('id' => 'DESC'),
$paginator->getOffsetCount(),
$paginator->getPerPageCount()
);
$rewardOrders = $this->getRewardService()->findRewardInOrderSn(ArrayToolkit::column($rewards, 'orderSn'));
if (!empty($rewardOrders)) {
list($userIds, $fromIds, $toFromIds) = ArrayToolkit::columns($rewardOrders, array('userId', 'fromId', 'toFromId'));
$userIds = array_merge($userIds, $fromIds, $toFromIds);
$users = $this->getUserService()->findUsersByIds($userIds);
} else {
$users = array();
}
$paginator = new Paginator(
$this->get('request'), $this->getRewardService()->countRewards($conditions), 10
);
return $this->render(
'DistributionPlugin:admin-v2/reward:index.html.twig',
array(
'paginator' => $paginator,
'rewards' => $rewards,
'rewardOrders' => $rewardOrders,
'users' => $users,
)
);
}
public function applyAction(Request $request, $id)
{
if ($request->getMethod() == 'POST') {
$fields = $request->request->all();
$this->getRewardService()->applyReward($id, $fields['status'], $fields['failNote']);
return $this->createJsonResponse(array('success' => true));
}
$reward = $this->getRewardService()->getReward($id);
$distributionSetting = $this->getSettingService()->get('plugin_distribution', array());
$distribution = $this->getDistributionService()->getByUserId($reward['userId']);
$user = $this->getUserService()->getUser($reward['userId']);
return $this->render('DistributionPlugin:Admin/reward:index-model.html.twig', array(
'distributionSetting' => $distributionSetting,
'reward' => $reward,
'distribution' => $distribution,
'user' => $user,
));
}
/**
* @return DistributionService
* */
protected function getDistributionService()
{
return $this->createService('DistributionPlugin:Distribution:DistributionService');
}
/**
* @return RewardService
* */
protected function getRewardService()
{
return $this->createService('DistributionPlugin:Distribution:RewardService');
}
/**
* @return SettingService
* */
protected function getSettingService()
{
return $this->createService('System:SettingService');
}
}