添加:订单分销佣金重新计算,添加商户分销设置判断

This commit is contained in:
wuhui_zzw 2023-11-16 10:07:18 +08:00
parent 8428b019ab
commit 94aa3e1255
6 changed files with 138 additions and 63 deletions

View File

@ -6,6 +6,7 @@
namespace app\common\model\store\product;
use app\common\model\BaseModel;
use think\facade\Log;
class ProductAttrValue extends BaseModel
{
@ -62,18 +63,33 @@ class ProductAttrValue extends BaseModel
return '未设置';
}
public function getBcExtensionOneAttr()
{
if(!intval(systemConfig('extension_status'))) return 0;
// 计算一级佣金
public function getBcExtensionOneAttr(){
$merId = (int)$this->product->mer_id;
// 判断:平台和商户是否开启分销
if(!intval(systemConfig('extension_status')) && !intval(merchantConfig((int)$merId,'extension_status'))) return 0;
// 商品设置固定金额 直接返回固定金额
if($this->product->extension_type == 1) return $this->extension_one;
return floatval(round(bcmul(systemConfig('extension_one_rate'), isset($this->org_price) ? $this->org_price : $this->price, 3),2));
}
// 计算佣金
$oneRate = (float)systemConfig('extension_one_rate');// 平台比例
$merOneRate = (float)merchantConfig((int)$merId,'extension_one_rate');// 商家比例
$rate = $merOneRate > 0 ? $merOneRate : $oneRate;
public function getBcExtensionTwoAttr()
{
if(!intval(systemConfig('extension_status'))) return 0;
return floatval(round(bcmul($rate, isset($this->org_price) ? $this->org_price : $this->price, 3),2));
}
// 计算二级佣金
public function getBcExtensionTwoAttr(){
$merId = (int)$this->product->mer_id;
// 判断:平台和商户是否开启分销
if(!intval(systemConfig('extension_status')) && !intval(merchantConfig((int)$merId,'extension_status'))) return 0;
// 商品设置固定金额 直接返回固定金额
if($this->product->extension_type == 1) return $this->extension_two;
return floatval(round(bcmul(systemConfig('extension_two_rate'), isset($this->org_price) ? $this->org_price : $this->price, 3),2));
// 计算佣金
$twoRate = (float)systemConfig('extension_two_rate');// 平台比例
$merTwoRate = (float)merchantConfig((int)$merId,'extension_two_rate');// 商家比例
$rate = $merTwoRate > 0 ? $merTwoRate : $twoRate;
return floatval(round(bcmul($rate, isset($this->org_price) ? $this->org_price : $this->price, 3),2));
}
public function productSku()

View File

@ -5,6 +5,8 @@
namespace app\common\model\store\product;
use app\common\model\BaseModel;
use app\common\repositories\store\product\ProductRepository;
use think\facade\Log;
class ProductPresellSku extends BaseModel
{
@ -54,17 +56,40 @@ class ProductPresellSku extends BaseModel
$query->where('product_presell_id',$value);
}
public function getBcExtensionOneAttr()
{
if (!intval(systemConfig('extension_status'))) return 0;
if ($this->sku->extension_one > 0) return $this->sku->extension_one;
return floatval(round(bcmul(systemConfig('extension_one_rate'), $this->presell_price, 3), 2));
}
// 计算一级佣金
public function getBcExtensionOneAttr(){
// 获取当前商品关联的商户id
$merId = app()->make(ProductRepository::class)
->getSearch([])
->where('product_id',$this->product_id)
->value('mer_id');
// 判断:平台和商户是否开启分销
if(!intval(systemConfig('extension_status')) && !intval(merchantConfig((int)$merId,'extension_status'))) return 0;
// 商品设置固定金额 直接返回固定金额
if($this->sku->extension_type == 1) return $this->sku->extension_one;
// 计算佣金
$oneRate = (float)systemConfig('extension_one_rate');// 平台比例
$merOneRate = (float)merchantConfig((int)$merId,'extension_one_rate');// 商家比例
$rate = $merOneRate > 0 ? $merOneRate : $oneRate;
public function getBcExtensionTwoAttr()
{
if (!intval(systemConfig('extension_status'))) return 0;
if ($this->sku->extension_two > 0) return $this->sku->extension_two;
return floatval(round(bcmul(systemConfig('extension_two_rate'), $this->presell_price, 3), 2));
return floatval(round(bcmul($rate, $this->presell_price, 3), 2));
}
// 计算二级佣金
public function getBcExtensionTwoAttr(){
// 获取当前商品关联的商户id
$merId = app()->make(ProductRepository::class)
->getSearch([])
->where('product_id',$this->product_id)
->value('mer_id');
// 判断:平台和商户是否开启分销
if(!intval(systemConfig('extension_status')) && !intval(merchantConfig((int)$merId,'extension_status'))) return 0;
// 商品设置固定金额 直接返回固定金额
if($this->sku->extension_type == 1) return $this->sku->extension_two;
// 计算佣金
$twoRate = (float)systemConfig('extension_two_rate');// 平台比例
$merTwoRate = (float)merchantConfig((int)$merId,'extension_two_rate');// 商家比例
$rate = $merTwoRate > 0 ? $merTwoRate : $twoRate;
return floatval(round(bcmul($rate, $this->presell_price, 3), 2));
}
}

View File

@ -2,6 +2,7 @@
namespace app\common\repositories\store\order;
use app\common\repositories\system\config\ConfigValueRepository;
use crmeb\jobs\SendSmsJob;
use crmeb\services\SwooleTaskService;
use think\exception\ValidateException;
@ -1059,6 +1060,20 @@ class StoreOrderCreateRepository extends StoreOrderRepository
$orderList = [];
foreach ($merchantCartList as $k => $merchantCart) {
// 获取当前商户相关的分销设置信息
$merPromoterConfig = app()->make(ConfigValueRepository::class)->getMerPromoterConfig((int)$merchantCart['mer_id']);
$spreadUserExtensionOneRate = 0;// 一级佣金上浮比例
if($spreadUid > 0 && $spreadUser->brokerage_level > 0 && $spreadUser->brokerage && $spreadUser->brokerage->extension_one_rate > 0){
$merSpreadUserExtensionOneRate = $merPromoterConfig['extension_level_set'][$spreadUser->brokerage_level]['one_rate'] ?? 0;
$spreadUserExtensionOneRate = $merSpreadUserExtensionOneRate > 0 ? $merSpreadUserExtensionOneRate : $spreadUser->brokerage->extension_one_rate;
}
$topUserExtensionTwoRate = 0;// 二级佣金上浮比例
if($topUid > 0 && $topUser->brokerage_level > 0 && $topUser->brokerage && $topUser->brokerage->extension_two_rate > 0){
$merTopUserExtensionTwoRate = $merPromoterConfig['extension_level_set'][$topUser->brokerage_level]['two_rate'] ?? 0;
$topUserExtensionTwoRate = $merTopUserExtensionTwoRate > 0 ? $merTopUserExtensionTwoRate : $topUser->brokerage->extension_two_rate;
}
$cost = 0;
$total_extension_one = 0;
$total_extension_two = 0;
@ -1070,34 +1085,27 @@ class StoreOrderCreateRepository extends StoreOrderRepository
$cost = bcadd(bcmul($cart['cost'], $cart['cart_num'], 2), $cost, 2);
$extension_one = 0;
$extension_two = 0;
if ($ex) {
if ($ex && $merPromoterConfig['extension_status']) {
//预售订单
if ($orderType == 2) {
// 预售商品
$_payPrice = $merchantCart['order']['pay_price'];
$rate = $cart['productPresell']['presell_type'] == 2 ? bcdiv($cart['productPresellAttr']['down_price'], $cart['productPresellAttr']['presell_price'], 3) : 1;
$one_price = $_payPrice > 0 ? bcdiv($_payPrice, $cart['cart_num'], 2) : 0;
if ($spreadUid && $cart['productPresellAttr']['bc_extension_one'] > 0) {
$org_extension = $cart['productPresellAttr']['bc_extension_one'];
if ($spreadUser->brokerage_level > 0 && $spreadUser->brokerage && $spreadUser->brokerage->extension_one_rate > 0) {
$org_extension = bcmul($org_extension, 1 + $spreadUser->brokerage->extension_one_rate, 2);
}
if ($spreadUserExtensionOneRate > 0) $org_extension = bcmul($org_extension, 1 + $spreadUserExtensionOneRate, 2);
$_extension_one = bcmul($rate, $org_extension, 3);
$presell_extension_one = 0;
if ($cart['true_price'] > 0) {
$extension_one = bcmul(bcdiv($one_price, $cart['productPresellAttr']['down_price'], 3), $_extension_one, 2);
}
if ($rate < 1) {
$presell_extension_one = bcmul(1 - $rate, $org_extension, 2);
}
if ($cart['true_price'] > 0) $extension_one = bcmul(bcdiv($one_price, $cart['productPresellAttr']['down_price'], 3), $_extension_one, 2);
if ($rate < 1) $presell_extension_one = bcmul(1 - $rate, $org_extension, 2);
$cart['final_extension_one'] = bcmul($extension_one, $cart['cart_num'], 2);
$extension_one = bcadd($extension_one, $presell_extension_one, 2);
$cart['presell_extension_one'] = bcmul($presell_extension_one, $cart['cart_num'], 2);
}
if ($topUid && $cart['productPresellAttr']['bc_extension_two'] > 0) {
$org_extension = $cart['productPresellAttr']['bc_extension_two'];
if ($topUser->brokerage_level > 0 && $topUser->brokerage && $topUser->brokerage->extension_two_rate > 0) {
$org_extension = bcmul($org_extension, 1 + $topUser->brokerage->extension_two_rate, 2);
}
if ($topUserExtensionTwoRate > 0) $org_extension = bcmul($org_extension, 1 + $topUserExtensionTwoRate, 2);
$_extension_two = bcmul($rate, $org_extension, 2);
$presell_extension_two = 0;
if ($cart['true_price'] > 0) {
@ -1111,18 +1119,15 @@ class StoreOrderCreateRepository extends StoreOrderRepository
$cart['presell_extension_two'] = bcmul($presell_extension_two, $cart['cart_num'], 2);
}
} else if (!$orderType) {
// 其他商品
if ($spreadUid && $cart['productAttr']['bc_extension_one'] > 0) {
$org_extension = $cart['productAttr']['bc_extension_one'];
if ($spreadUser->brokerage_level > 0 && $spreadUser->brokerage && $spreadUser->brokerage->extension_one_rate > 0) {
$org_extension = bcmul($org_extension, 1 + $spreadUser->brokerage->extension_one_rate, 2);
}
if ($spreadUserExtensionOneRate > 0) $org_extension = bcmul($org_extension, 1 + $spreadUserExtensionOneRate, 2);
$extension_one = $cart['true_price'] > 0 ? bcmul(bcdiv($cart['true_price'], $cart['total_price'], 3), $org_extension, 2) : 0;
}
if ($topUid && $cart['productAttr']['bc_extension_two'] > 0) {
$org_extension = $cart['productAttr']['bc_extension_two'];
if ($topUser->brokerage_level > 0 && $topUser->brokerage && $topUser->brokerage->extension_two_rate > 0) {
$org_extension = bcmul($org_extension, 1 + $topUser->brokerage->extension_two_rate, 2);
}
if ($topUserExtensionTwoRate > 0) $org_extension = bcmul($org_extension, 1 + $topUserExtensionTwoRate, 2);
$extension_two = $cart['true_price'] > 0 ? bcmul(bcdiv($cart['true_price'], $cart['total_price'], 3), $org_extension, 2) : 0;
}
}
@ -1188,6 +1193,9 @@ class StoreOrderCreateRepository extends StoreOrderRepository
$totalCost = bcadd($totalCost, $cost, 2);
$totalNum += $merchantCart['order']['total_num'];
}
$groupOrder = [
'uid' => $uid,
'group_order_sn' => count($orderList) === 1 ? $orderList[0]['order_sn'] : ($this->getNewOrderId(StoreOrderRepository::TYPE_SN_ORDER) . '0'),

View File

@ -1933,7 +1933,8 @@ class ProductRepository extends BaseRepository
if (!$sku) throw new ValidateException('SKU不存在');
//分销礼包
if ($product['is_gift_bag']) {
if (!systemConfig('extension_status')) throw new ValidateException('分销功能未开启');
// 平台开启分销 && 商户开启分销
if (!systemConfig('extension_status') || !merchantConfig($product->mer_id,'extension_status')) throw new ValidateException('分销功能未开启');
if (!$data['is_new']) throw new ValidateException('礼包商品不可加入购物车');
if ($data['cart_num'] !== 1) throw new ValidateException('礼包商品只能购买一个');
if ($userInfo->is_promoter) throw new ValidateException('您已经是分销员了');

View File

@ -11,6 +11,7 @@ use app\common\repositories\BaseRepository;
use app\common\repositories\store\product\ProductRepository;
use app\common\repositories\system\groupData\GroupDataRepository;
use app\common\repositories\system\groupData\GroupRepository;
use app\common\repositories\user\UserBrokerageRepository;
use crmeb\jobs\SyncProductTopJob;
use crmeb\services\DownloadImageService;
use crmeb\services\RedisCacheService;
@ -200,5 +201,44 @@ class ConfigValueRepository extends BaseRepository
}
return $data;
}
/**
* Common: 获取商户分销商配置
* Author: wu-hui
* Time: 2023/11/15 16:47
* @param int $merId
* @return array
*/
public function getMerPromoterConfig(int $merId){
// 获取分销商等级
$levelList = app()->make(UserBrokerageRepository::class)->getSearch(['type'=>0])
->field(['user_brokerage_id','brokerage_name'])
->order('brokerage_level Desc')
->select();
// 获取配置信息
$data['extension_status'] = (int)merchantConfig($merId,'extension_status');// 是否开启 0=关闭1=开启
$data['extension_one_rate'] = (float)merchantConfig($merId,'extension_one_rate');// 一级返佣比例
$data['extension_two_rate'] = (float)merchantConfig($merId,'extension_two_rate');// 二级返佣比例
$extensionLevelSet = merchantConfig($merId,'extension_level_set');// 每个等级设置的上浮比例
if($extensionLevelSet) {
$extensionLevelSet = json_decode($extensionLevelSet,true);
$extensionLevelSet = array_column($extensionLevelSet,null,'user_brokerage_id');
}
$data['extension_level_set'] = [];
foreach($levelList as $levelInfo){
$data['extension_level_set'][$levelInfo['user_brokerage_id']] = [
'user_brokerage_id' => $levelInfo['user_brokerage_id'],
'brokerage_name' => $levelInfo['brokerage_name'],
'one_rate' => $extensionLevelSet[$levelInfo['user_brokerage_id']]['one_rate'] ?? 0,
'two_rate' => $extensionLevelSet[$levelInfo['user_brokerage_id']]['two_rate'] ?? 0,
];
}
return $data;
}
}

View File

@ -251,29 +251,7 @@ class ConfigOthers extends BaseController
*/
public function getMerConfig(){
$merId = $this->request->merId();
// 获取分销商等级
$levelList = app()->make(UserBrokerageRepository::class)->getSearch(['type'=>0])
->field(['user_brokerage_id','brokerage_name'])
->order('brokerage_level Desc')
->select();
// 获取配置信息
$data['extension_status'] = (int)merchantConfig($merId,'extension_status');// 是否开启 0=关闭1=开启
$data['extension_one_rate'] = (float)merchantConfig($merId,'extension_one_rate');// 一级返佣比例
$data['extension_two_rate'] = (float)merchantConfig($merId,'extension_two_rate');// 二级返佣比例
$extensionLevelSet = merchantConfig($merId,'extension_level_set');// 每个等级设置的上浮比例
if($extensionLevelSet) {
$extensionLevelSet = json_decode($extensionLevelSet,true);
$extensionLevelSet = array_column($extensionLevelSet,null,'user_brokerage_id');
}
$data['extension_level_set'] = [];
foreach($levelList as $levelInfo){
$data['extension_level_set'][$levelInfo['user_brokerage_id']] = [
'user_brokerage_id' => $levelInfo['user_brokerage_id'],
'brokerage_name' => $levelInfo['brokerage_name'],
'one_rate' => $extensionLevelSet[$levelInfo['user_brokerage_id']]['one_rate'] ?? 0,
'two_rate' => $extensionLevelSet[$levelInfo['user_brokerage_id']]['two_rate'] ?? 0,
];
}
$data = app()->make(ConfigValueRepository::class)->getMerPromoterConfig((int)$merId);
return app('json')->success($data);
}
@ -286,6 +264,13 @@ class ConfigOthers extends BaseController
public function setMerConfig(){
$merId = $this->request->merId();
$params = $this->request->params(['extension_status','extension_one_rate','extension_two_rate','extension_level_set']);
// 判断:一级返佣比例 是否 小于 二级返佣比例
if (bccomp($params['extension_one_rate'], $params['extension_two_rate'], 4) == -1)
return app('json')->fail('一级比例不能小于二级比例');
// 判断一级返佣比例和二级返佣比例之和不能大于1
if (bccomp(bcadd($params['extension_one_rate'], $params['extension_two_rate'], 3), 1, 3) == 1)
return app('json')->fail('比例之和不能超过1即100%');
// 保存设置
app()->make(ConfigValueRepository::class)->setFormData($params, $merId);
return app('json')->success('编辑成功');