Browse Source

会员升级

Kirin 1 year ago
parent
commit
acd1b38bf0
2 changed files with 339 additions and 0 deletions
  1. 200 0
      app/services/order/StoreOrderServices.php
  2. 139 0
      app/services/order/StoreOrderTakeServices.php

+ 200 - 0
app/services/order/StoreOrderServices.php

@@ -14,6 +14,7 @@ use app\dao\order\StoreOrderDao;
 use app\jobs\BatchHandleJob;
 use app\jobs\order\AutoOrderUnpaidCancelJob;
 use app\jobs\order\SpliteStoreOrderJob;
+use app\model\system\config\SystemConfig;
 use app\services\activity\combination\StorePinkServices;
 use app\services\activity\coupon\StoreCouponIssueServices;
 use app\services\BaseServices;
@@ -29,6 +30,7 @@ use app\services\store\SystemStoreServices;
 use app\services\system\config\ConfigServices;
 use app\services\system\form\SystemFormServices;
 use app\services\user\UserAwardIntegralServices;
+use app\services\user\UserBrokerageServices;
 use app\services\user\UserInvoiceServices;
 use app\services\user\UserServices;
 use app\services\product\product\StoreProductReplyServices;
@@ -2749,4 +2751,202 @@ HTML;
         }
     }
 
+
+    /**
+     * 地区返佣
+     * @param $orderInfo
+     * @param $userInfo
+     * @return bool
+     */
+    public function backAreaBrokerage()
+    {
+        //商城分销功能是否开启 0关闭1开启
+        if (!sys_config('brokerage_func_status')) return true;
+
+        if (sys_config('area_award_time') <= 0) return true;
+
+        $last_time = sys_config('area_award_last_time');
+        if ($last_time + (3600 * (sys_config('area_award_time'))) > time()) {
+            return true;
+        }
+        //冻结时间
+        $broken_time = intval(sys_config('extract_time'));
+        $frozen_time = time() + $broken_time * 86400;
+        $userServices = app()->make(UserServices::class);
+        $storeOrderServices = app()->make(StoreOrderServices::class);
+        $res = true;
+
+        // 获取上级推广员信息
+        /** @var UserServices $userServices */
+
+        //找有代理的省
+        $provinces = $userServices->search()->where('area_admin', 3)->column('area_admin_province');
+        $provinces = array_unique($provinces);
+        foreach ($provinces as $value) {
+            $order_price = $storeOrderServices->search(['pid' => 0])->where('order_province', $value)
+                ->whereNotIn('type', [1, 2, 3, 5, 8])
+                ->where('send_area_award', 0)
+                ->where('paid', 1)
+                ->where('is_del', 0)
+                ->where('is_system_del', 0)
+                ->where('refund_status', 0)
+                ->whereIn('status', [2, 3])
+                ->field('sum(total_price-cost) as total_price_sum')
+                ->find();
+            $order_price = $order_price['total_price_sum'] ?? 0;
+            if ($order_price <= 0) {
+                continue;
+            }
+            //找省代
+            $admins = $userServices->search()->where('area_admin', 3)->where('area_admin_province', $value)->select();
+            if (count($admins) > 0) {
+                $award = bcdiv(bcmul((string)sys_config('province_award'), (string)$order_price, 2), 100, 2);
+                if ($award > 0) {
+                    $brokeragePrice = bcdiv($award, (string)count($admins), 2);
+                    if ($brokeragePrice > 0) {
+                        foreach ($admins as $v) {
+                            $spreadPrice = (string)$v['brokerage_price'];
+                            // 上级推广员返佣之后的金额
+                            $balance = bcadd($spreadPrice, $brokeragePrice, 2);
+                            // 添加佣金记录
+                            /** @var UserBrokerageServices $userBrokerageServices */
+                            $userBrokerageServices = app()->make(UserBrokerageServices::class);
+                            $type = 'get_area_award';
+                            $res1 = $userBrokerageServices->income($type, $v['uid'], [
+                                'pay_price' => floatval($order_price),
+                                'area' => $value . '省级',
+                                'number' => floatval($brokeragePrice),
+                                'frozen_time' => $frozen_time
+                            ], $balance, 0);
+                            // 添加用户佣金
+                            $res2 = $userServices->bcInc($v['uid'], 'brokerage_price', $brokeragePrice, 'uid');
+                            $res = $res1 && $res2 && $res;
+                        }
+                    }
+                }
+            }
+        }
+        $citys = $userServices->search()->where('area_admin', 2)->select();
+        $pc = [];
+        foreach ($citys as $v) {
+            $p = $v['area_admin_province'];
+            $c = $v['area_admin_city'];
+            if (!in_array(compact('p', 'c'), $pc)) {
+                $pc[] = compact('p', 'c');
+            }
+        }
+        foreach ($pc as $value) {
+            $order_price = $storeOrderServices->search(['pid' => 0])->where('order_province', $value['p'])->where('order_city', $value['c'])
+                ->whereNotIn('type', [1, 2, 3, 5, 8])
+                ->where('send_area_award', 0)
+                ->where('paid', 1)
+                ->where('is_del', 0)
+                ->where('is_system_del', 0)
+                ->where('refund_status', 0)
+                ->whereIn('status', [2, 3])
+                ->field('sum(total_price-cost) as total_price_sum')
+                ->find();
+            $order_price = $order_price['total_price_sum'] ?? 0;
+            if ($order_price <= 0) {
+                continue;
+            }
+            //找市代
+            $admins = $userServices->search()->where('area_admin', 2)->where('area_admin_province', $value['p'])
+                ->where('area_admin_city', $value['c'])->select();
+            if (count($admins) > 0) {
+                $award = bcdiv(bcmul((string)sys_config('city_award'), (string)$order_price, 2), 100, 2);
+                if ($award > 0) {
+                    $brokeragePrice = bcdiv($award, (string)count($admins), 2);
+                    if ($brokeragePrice > 0) {
+                        foreach ($admins as $v) {
+                            $spreadPrice = (string)$v['brokerage_price'];
+                            // 上级推广员返佣之后的金额
+                            $balance = bcadd($spreadPrice, $brokeragePrice, 2);
+                            // 添加佣金记录
+                            /** @var UserBrokerageServices $userBrokerageServices */
+                            $userBrokerageServices = app()->make(UserBrokerageServices::class);
+                            $type = 'get_area_brokerage';
+                            $res1 = $userBrokerageServices->income($type, $v['uid'], [
+                                'pay_price' => floatval($order_price),
+                                'area' => $value['p'] . $value['c'] . '级',
+                                'number' => floatval($brokeragePrice),
+                                'frozen_time' => $frozen_time
+                            ], $balance, 0);
+                            // 添加用户佣金
+                            $res2 = $userServices->bcInc($v['uid'], 'brokerage_price', $brokeragePrice, 'uid');
+                            $res = $res1 && $res2 && $res;
+                        }
+                    }
+                }
+            }
+        }
+
+        $citys = $userServices->search()->where('area_admin', 1)->select();
+        $pcd = [];
+        foreach ($citys as $v) {
+            $p = $v['area_admin_province'];
+            $c = $v['area_admin_city'];
+            $d = $v['area_admin_district'];
+            if (!in_array(compact('p', 'c', 'd'), $pcd)) {
+                $pcd[] = compact('p', 'c', 'd');
+            }
+        }
+        foreach ($pcd as $value) {
+
+            $order_price = $storeOrderServices->search(['pid' => 0])
+                ->where('order_province', $value['p'])
+                ->where('order_city', $value['c'])
+                ->where('order_district', $value['d'])
+                ->whereNotIn('type', [1, 2, 3, 5, 8])
+                ->where('send_area_award', 0)
+                ->where('paid', 1)
+                ->where('is_del', 0)
+                ->where('is_system_del', 0)
+                ->where('refund_status', 0)
+                ->whereIn('status', [2, 3])
+                ->field('sum(total_price-cost) as total_price_sum')
+                ->find();
+            $order_price = $order_price['total_price_sum'] ?? 0;
+            if ($order_price <= 0) {
+                continue;
+            }
+
+            //找区代
+            $admins = $userServices->search()->where('area_admin', 1)
+                ->where('area_admin_province', $value['p'])
+                ->where('area_admin_city', $value['c'])
+                ->where('area_admin_district', $value['d'])
+                ->select();
+            if (count($admins) > 0) {
+                $award = bcdiv(bcmul((string)sys_config('district_award'), (string)$order_price, 2), 100, 2);
+                if ($award > 0) {
+                    $brokeragePrice = bcdiv($award, (string)count($admins), 2);
+                    if ($brokeragePrice > 0) {
+                        foreach ($admins as $v) {
+                            $spreadPrice = (string)$v['brokerage_price'];
+                            // 上级推广员返佣之后的金额
+                            $balance = bcadd($spreadPrice, $brokeragePrice, 2);
+                            // 添加佣金记录
+                            /** @var UserBrokerageServices $userBrokerageServices */
+                            $userBrokerageServices = app()->make(UserBrokerageServices::class);
+                            $type = 'get_area_brokerage';
+                            $res1 = $userBrokerageServices->income($type, $v['uid'], [
+                                'pay_price' => floatval($order_price),
+                                'area' => $value['p'] . $value['c'] . $value['d'] . '级',
+                                'number' => floatval($brokeragePrice),
+                                'frozen_time' => $frozen_time
+                            ], $balance, 0);
+                            // 添加用户佣金
+                            $res2 = $userServices->bcInc($v['uid'], 'brokerage_price', $brokeragePrice, 'uid');
+                            $res = $res1 && $res2 && $res;
+                        }
+                    }
+                }
+            }
+        }
+
+        return $res
+            && $storeOrderServices->search()->where('send_area_award', 0)->update(['send_area_award' => 1])
+            && SystemConfig::where('menu_name', 'area_award_last_time')->update(['value' => time()]);
+    }
 }

+ 139 - 0
app/services/order/StoreOrderTakeServices.php

@@ -150,6 +150,8 @@ class StoreOrderTakeServices extends BaseServices
                 $res1 = $this->gainUserIntegral($order, $userInfo, $storeTitle);
                 //返佣
                 $res2 = $this->backOrderBrokerage($order, $userInfo);
+                //返佣
+                $res2 = $this->backAreaBrokerage($order, $userInfo);
                 //经验
                 $res3 = $this->gainUserExp($order, $userInfo);
                 if (!($res1 && $res2 && $res3)) {
@@ -223,6 +225,143 @@ class StoreOrderTakeServices extends BaseServices
         return true;
     }
 
+    /**
+     * 地区返佣
+     * @param $orderInfo
+     * @param $userInfo
+     * @return bool
+     */
+    public function backAreaBrokerage($orderInfo, $userInfo)
+    {
+        // 当前订单|用户不存在  直接返回
+        if (!$orderInfo || !$userInfo) {
+            return true;
+        }
+        if (!$orderInfo['province'] || $orderInfo['send_area_award'] == 1) {
+            return true;
+        }
+        //商城分销功能是否开启 0关闭1开启
+        if (!sys_config('brokerage_func_status')) return true;
+
+        if (sys_config('area_award_time') > 0) return true;
+
+        // 营销产品不返佣金
+        if (!isset($orderInfo['type']) || in_array($orderInfo['type'], [1, 2, 3, 5, 8])) {
+            return true;
+        }
+        //冻结时间
+        $broken_time = intval(sys_config('extract_time'));
+        $frozen_time = time() + $broken_time * 86400;
+
+        //订单中取出
+        $order_price = $orderInfo['total_price'] ?? 0;
+        $order_price = bcsub($order_price, $orderInfo['cost'], 2);
+        // 一级返佣金额小于等于0
+        if ($order_price <= 0) {//直接二级返佣
+            return true;
+        }
+        // 获取上级推广员信息
+        /** @var UserServices $userServices */
+        $userServices = app()->make(UserServices::class);
+        $storeOrderServices = app()->make(StoreOrderServices::class);
+
+        $res = true;
+        //找省代
+        $admins = $userServices->search()->where('area_admin', 3)->where('area_admin_province', $orderInfo['order_province'])->select();
+        if (count($admins) > 0) {
+            $award = bcdiv(bcmul((string)sys_config('province_award'), (string)$order_price, 2), 100, 2);
+            if ($award > 0) {
+                $brokeragePrice = bcdiv($award, (string)count($admins), 2);
+                if ($brokeragePrice > 0) {
+                    foreach ($admins as $v) {
+                        $spreadPrice = (string)$v['brokerage_price'];
+                        // 上级推广员返佣之后的金额
+                        $balance = bcadd($spreadPrice, $brokeragePrice, 2);
+                        // 添加佣金记录
+                        /** @var UserBrokerageServices $userBrokerageServices */
+                        $userBrokerageServices = app()->make(UserBrokerageServices::class);
+                        $type = 'get_area_brokerage';
+                        $res1 = $userBrokerageServices->income($type, $v['uid'], [
+                            'nickname' => $userInfo['nickname'],
+                            'pay_price' => floatval($orderInfo['pay_price']),
+                            'area' => $orderInfo['order_province'] . '省级',
+                            'number' => floatval($brokeragePrice),
+                            'frozen_time' => $frozen_time
+                        ], $balance, $orderInfo['id']);
+                        // 添加用户佣金
+                        $res2 = $userServices->bcInc($v['uid'], 'brokerage_price', $brokeragePrice, 'uid');
+                        $res = $res1 && $res2 && $res;
+                    }
+                }
+            }
+        }
+        //找市代
+        $admins = $userServices->search()->where('area_admin', 2)->where('area_admin_province', $orderInfo['order_province'])
+            ->where('area_admin_city', $orderInfo['order_city'])->select();
+        if (count($admins) > 0) {
+            $award = bcdiv(bcmul((string)sys_config('city_award'), (string)$order_price, 2), 100, 2);
+            if ($award > 0) {
+                $brokeragePrice = bcdiv($award, (string)count($admins), 2);
+                if ($brokeragePrice > 0) {
+                    foreach ($admins as $v) {
+                        $spreadPrice = (string)$v['brokerage_price'];
+                        // 上级推广员返佣之后的金额
+                        $balance = bcadd($spreadPrice, $brokeragePrice, 2);
+                        // 添加佣金记录
+                        /** @var UserBrokerageServices $userBrokerageServices */
+                        $userBrokerageServices = app()->make(UserBrokerageServices::class);
+                        $type = 'get_area_brokerage';
+                        $res1 = $userBrokerageServices->income($type, $v['uid'], [
+                            'nickname' => $userInfo['nickname'],
+                            'pay_price' => floatval($orderInfo['pay_price']),
+                            'area' => $orderInfo['order_province'] . $orderInfo['order_city'] . '级',
+                            'number' => floatval($brokeragePrice),
+                            'frozen_time' => $frozen_time
+                        ], $balance, $orderInfo['id']);
+                        // 添加用户佣金
+                        $res2 = $userServices->bcInc($v['uid'], 'brokerage_price', $brokeragePrice, 'uid');
+                        $res = $res1 && $res2 && $res;
+                    }
+                }
+            }
+        }
+        //找区代
+        $admins = $userServices->search()->where('area_admin', 1)
+            ->where('area_admin_province', $orderInfo['order_province'])
+            ->where('area_admin_city', $orderInfo['order_city'])
+            ->where('area_admin_district', $orderInfo['order_district'])
+            ->select();
+        if (count($admins) > 0) {
+            $award = bcdiv(bcmul((string)sys_config('district_award'), (string)$order_price, 2), 100, 2);
+            if ($award > 0) {
+                $brokeragePrice = bcdiv($award, (string)count($admins), 2);
+                if ($brokeragePrice > 0) {
+                    foreach ($admins as $v) {
+                        $spreadPrice = (string)$v['brokerage_price'];
+                        // 上级推广员返佣之后的金额
+                        $balance = bcadd($spreadPrice, $brokeragePrice, 2);
+                        // 添加佣金记录
+                        /** @var UserBrokerageServices $userBrokerageServices */
+                        $userBrokerageServices = app()->make(UserBrokerageServices::class);
+                        $type = 'get_area_brokerage';
+                        $res1 = $userBrokerageServices->income($type, $v['uid'], [
+                            'nickname' => $userInfo['nickname'],
+                            'pay_price' => floatval($orderInfo['pay_price']),
+                            'area' => $orderInfo['order_province'] . $orderInfo['order_city'] . $orderInfo['order_district'] . '级',
+                            'number' => floatval($brokeragePrice),
+                            'frozen_time' => $frozen_time
+                        ], $balance, $orderInfo['id']);
+                        // 添加用户佣金
+                        $res2 = $userServices->bcInc($v['uid'], 'brokerage_price', $brokeragePrice, 'uid');
+                        $res = $res1 && $res2 && $res;
+                    }
+                }
+            }
+        }
+        return $res && $storeOrderServices->update($orderInfo['id'], ['send_area_award' => 1]);
+    }
+
+
     /**
      * 一级返佣
      * @param $orderInfo