From 94aa3e1255f7e7c7917bbe90896d50696953cc02 Mon Sep 17 00:00:00 2001 From: wuhui_zzw <1760308791@qq.com> Date: Thu, 16 Nov 2023 10:07:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=9A=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E5=88=86=E9=94=80=E4=BD=A3=E9=87=91=E9=87=8D=E6=96=B0=E8=AE=A1?= =?UTF-8?q?=E7=AE=97=EF=BC=8C=E6=B7=BB=E5=8A=A0=E5=95=86=E6=88=B7=E5=88=86?= =?UTF-8?q?=E9=94=80=E8=AE=BE=E7=BD=AE=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/store/product/ProductAttrValue.php | 34 ++++++++++---- .../model/store/product/ProductPresellSku.php | 47 ++++++++++++++----- .../order/StoreOrderCreateRepository.php | 46 ++++++++++-------- .../store/product/ProductRepository.php | 3 +- .../system/config/ConfigValueRepository.php | 40 ++++++++++++++++ .../admin/system/config/ConfigOthers.php | 31 ++++-------- 6 files changed, 138 insertions(+), 63 deletions(-) diff --git a/app/common/model/store/product/ProductAttrValue.php b/app/common/model/store/product/ProductAttrValue.php index e629294..83e3766 100644 --- a/app/common/model/store/product/ProductAttrValue.php +++ b/app/common/model/store/product/ProductAttrValue.php @@ -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() diff --git a/app/common/model/store/product/ProductPresellSku.php b/app/common/model/store/product/ProductPresellSku.php index 40aa373..2003ec9 100644 --- a/app/common/model/store/product/ProductPresellSku.php +++ b/app/common/model/store/product/ProductPresellSku.php @@ -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)); } } diff --git a/app/common/repositories/store/order/StoreOrderCreateRepository.php b/app/common/repositories/store/order/StoreOrderCreateRepository.php index 3a26509..0163fe3 100644 --- a/app/common/repositories/store/order/StoreOrderCreateRepository.php +++ b/app/common/repositories/store/order/StoreOrderCreateRepository.php @@ -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'), diff --git a/app/common/repositories/store/product/ProductRepository.php b/app/common/repositories/store/product/ProductRepository.php index 507b004..5809b59 100644 --- a/app/common/repositories/store/product/ProductRepository.php +++ b/app/common/repositories/store/product/ProductRepository.php @@ -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('您已经是分销员了'); diff --git a/app/common/repositories/system/config/ConfigValueRepository.php b/app/common/repositories/system/config/ConfigValueRepository.php index c40b1a8..cafbb58 100644 --- a/app/common/repositories/system/config/ConfigValueRepository.php +++ b/app/common/repositories/system/config/ConfigValueRepository.php @@ -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; + } + + + + } diff --git a/app/controller/admin/system/config/ConfigOthers.php b/app/controller/admin/system/config/ConfigOthers.php index 4386daa..3342868 100644 --- a/app/controller/admin/system/config/ConfigOthers.php +++ b/app/controller/admin/system/config/ConfigOthers.php @@ -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('编辑成功');