瀏覽代碼

add - 销售统计

liugc 1 年之前
父節點
當前提交
495fd47ef2

+ 1 - 1
app/adminapi/controller/external/ExternalConsultationController.php

@@ -81,7 +81,7 @@ class ExternalConsultationController extends BaseAdminController
         $params = (new ExternalConsultationValidate())->post()->goCheck('edit');
         $result = ExternalConsultationLogic::order($params);
         if (true === $result) {
-            return $this->success('编辑成功', [], 1, 1);
+            return $this->success('下单成功', [], 1, 1);
         }
         return $this->fail(ExternalConsultationLogic::getError());
     }

+ 11 - 1
app/adminapi/controller/sale/SaleAnalysisController.php

@@ -19,6 +19,7 @@ namespace app\adminapi\controller\sale;
 use app\adminapi\controller\BaseAdminController;
 use app\adminapi\lists\sale\PropertyHeadAnalysisLists;
 use app\adminapi\lists\sale\SaleAnalysisLists;
+use app\adminapi\lists\sale\SaleCommissionLists;
 use app\adminapi\lists\sale\SaleGroupAnalysisLists;
 use app\adminapi\lists\sale\SaleLists;
 use app\adminapi\lists\sale\SaleMasterWorkerLists;
@@ -69,5 +70,14 @@ class SaleAnalysisController extends BaseAdminController
         return $this->dataLists(new SaleMasterWorkerLists());
     }
 
-
+    /**
+     * 销售提成统计
+     * @return \think\response\Json
+     * @author liugc <466014217@qq.com>
+     * @date 2025/5/5 9:07
+     */
+    public function saleCommissionLists()
+    {
+        return $this->dataLists(new SaleCommissionLists());
+    }
 }

+ 1 - 0
app/adminapi/lists/sale/SaleAnalysisLists.php

@@ -101,6 +101,7 @@ class SaleAnalysisLists extends BaseAdminDataLists implements ListsSearchInterfa
             ->where($this->searchWhere)
             ->where($this->queryWhere())
             ->where($this->queryDataWhere())
+            ->where('a.sale_id','>',0)
             ->where('a.sale_type', 'in', [1, 2])
             //->where('a.order_status', 3)
             ->where('b.service_status', 3)

+ 272 - 0
app/adminapi/lists/sale/SaleCommissionLists.php

@@ -0,0 +1,272 @@
+<?php
+// +----------------------------------------------------------------------
+// | likeadmin快速开发前后端分离管理后台(PHP版)
+// +----------------------------------------------------------------------
+// | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
+// | 开源版本可自由商用,可去除界面版权logo
+// | gitee下载:https://gitee.com/likeshop_gitee/likeadmin
+// | github下载:https://github.com/likeshop-github/likeadmin
+// | 访问官网:https://www.likeadmin.cn
+// | likeadmin团队 版权所有 拥有最终解释权
+// +----------------------------------------------------------------------
+// | author: likeadminTeam
+// +----------------------------------------------------------------------
+
+namespace app\adminapi\lists\sale;
+
+
+use app\adminapi\lists\BaseAdminDataLists;
+use app\common\model\group_activity\GroupOrder;
+use app\common\model\group_activity\GroupUserOrder;
+use app\common\model\master_worker\MasterWorker;
+use app\common\model\master_worker_register\MasterWorkerRegister;
+use app\common\lists\ListsSearchInterface;
+use app\common\model\property\PropertyHead;
+use app\common\model\sale\Sale;
+use app\workerapi\logic\MasterWorkerLogic;
+use think\facade\Db;
+
+
+/**
+ * Sale列表
+ * Class SaleLists
+ * @package app\adminapi\lists
+ */
+class SaleCommissionLists extends BaseAdminDataLists implements ListsSearchInterface
+{
+
+    /**
+     * @notes 设置搜索条件
+     * @return \string[][]
+     * @author likeadmin
+     * @date 2024/12/15 10:53
+     */
+    public function setSearch(): array
+    {
+        return [
+            '=' => ['id'],
+
+        ];
+    }
+
+    /*public function queryWhere()
+    {
+        $where = [];
+        if(isset($this->params['time_range']) && $this->params['time_range']){
+            $startDateTime = strtotime($this->params['time_range'][0]);
+            $endDateTime = strtotime($this->params['time_range'][1])+86400-1;
+            $where[] = ['b.finished_time','BETWEEN',[$startDateTime,$endDateTime]];
+        }
+        return $where;
+    }*/
+
+
+    public function queryWhereTime()
+    {
+        //dd($this->params);
+        if(isset($this->params['time_range']) && $this->params['time_range']){
+            $startDateTime = strtotime($this->params['time_range'][0]);
+            $endDateTime = strtotime($this->params['time_range'][1])+86400-1;
+        } else {
+            $startDateTime = strtotime(date('Y-m-01',time()));
+            $endDateTime = time();
+        }
+        return [$startDateTime,$endDateTime];
+    }
+
+
+    /**
+     * 获取数据权限
+     * $this->adminInfo['data_rules']
+     * province city admin_id sale_group_id sale_id  property_head_id
+     */
+    public function queryDataWhere(){
+        $where = [];
+        $data_rules = $this->adminInfo['data_rules'];
+        if (isset($data_rules['sale_group_id']) && !empty($data_rules['sale_group_id'])) {
+            $where[] = ['sale_group_id','in' ,$data_rules['sale_group_id']];
+        }
+        if (isset($data_rules['sale_id']) && !empty($data_rules['sale_id'])) {
+            $where[] = ['id','in' ,$data_rules['sale_id']];
+        }
+        return $where;
+    }
+    /**
+     * @notes 获取列表
+     * @return array
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\DbException
+     * @throws \think\db\exception\ModelNotFoundException
+     * @author likeadmin
+     * @date 2024/12/15 10:53
+     */
+    public function lists(): array
+    {
+        $list = Sale::with('saleGroupInfo')->where($this->searchWhere)
+            ->where($this->queryDataWhere())
+            ->field(['id','sale_name','mobile','sale_group_id',
+                    Db::raw("'".($this->queryWhereTime()[0]??'')."' AS start_date"),
+                    Db::raw("'".($this->queryWhereTime()[1]??'')."' AS end_date"),
+            ])
+            ->limit($this->limitOffset, $this->limitLength)
+            ->select()->toArray();
+
+        $passes_counts = $this->passesCounts($list,$this->queryWhereTime())??[];
+        $property_counts = $this->propertyCounts($list,$this->queryWhereTime())??[];
+        $group_counts = $this->groupCounts($list,$this->queryWhereTime())??[];
+
+        // $this->passesMerits($passes_counts[$item['id']]??0) * $passes_counts[$item['id']]??0;
+        // $this->propertyMerits($property_counts[$item['id']]??0) * $property_counts[$item['id']]??0;
+        //  * 0.05
+        foreach ($list as &$item) {
+            $item['passes_counts'] = $passes_counts[$item['id']]??0;
+            $item['passes_merits'] = $this->passesMerits($passes_counts[$item['id']]??0);
+
+            $item['property_counts'] = $property_counts[$item['id']]??0;
+            $item['property_merits'] = $this->propertyMerits($property_counts[$item['id']]??0);
+
+            $item['group_counts'] = $group_counts[$item['id']]??0;
+            $item['group_merits'] = $this->groupMerits($group_counts[$item['id']]??0);
+
+            $item['all_merits'] = $item['passes_merits'] + $item['property_merits'] + $item['group_merits'];
+        }
+        return $list;
+    }
+
+
+    /**
+     * @notes 获取数量
+     * @return int
+     * @author likeadmin
+     * @date 2024/12/15 10:53
+     */
+    public function count(): int
+    {
+        return Sale::where($this->searchWhere)->where($this->queryDataWhere())->count();
+    }
+
+    public function setExcelComplexFields(): array
+    {
+        $zh_cn_fields = [
+            '销售组','销售员', '销售手机号','工程师审核通过数量','入驻提成绩效','物业签约合计分数','物业提成绩效','拼团总流水','拼团提成绩效','总提成绩效'
+            ,'开始日期','结束日期'
+        ];
+        $data_fields = [function($row){ return $row['saleGroupInfo']['sale_name']??''; },'sale_name','mobile',
+            'passes_counts','passes_merits','property_counts','property_merits','group_counts','group_merits','all_merits'
+            ,'start_date','end_date'
+        ];
+        return [
+            'zh_cn_fields' => $zh_cn_fields,
+            'data_fields' => $data_fields
+        ];
+    }
+
+
+    public function passesCounts($list,$whereTime)
+    {
+        $sale_ids = array_column($list,'id');
+        $passes_counts = [];
+        foreach ($sale_ids as $sale_id) {
+            $worker_ids = MasterWorkerRegister::where('sale_id','>',0)->where('worker_id','>',0)
+                ->where('sale_id',$sale_id)
+                ->whereBetween('create_time',[$whereTime[0],$whereTime[1]])
+                ->column('worker_id');
+            foreach ($worker_ids as $worker_id) {
+                !isset($passes_counts[$sale_id]) && $passes_counts[$sale_id] = 0;
+                $passes_counts[$sale_id] += $this->requiredMasterWorker($worker_id)?1:0;
+            }
+        }
+        //dd($passes_counts);
+        return $passes_counts;
+    }
+    public function passesMerits($value)
+    {
+        switch (true){
+            case (60 <= $value && $value < 70):
+                return 200;
+            case (70 <= $value && $value < 80):
+                return 400;
+            case (80 <= $value && $value < 90):
+                return 600;
+            case (90 <= $value && $value < 100):
+                return 800;
+            case (100 <= $value ):
+                return 1000;
+            case ($value < 60):
+            default:
+                return 0;
+        }
+    }
+
+    public function propertyCounts($list,$whereTime)
+    {
+        $sale_ids = array_column($list,'id');
+        $propertyHeads = PropertyHead::where('sale_id','>',0)->where('is_cooperate','=',1)
+            ->where('sale_id','in',$sale_ids)
+            ->whereBetween('create_time',[$whereTime[0],$whereTime[1]])
+            ->field([
+                'sale_id',
+                Db::raw("SUM(rating_value) AS rating_values")
+            ])
+            ->group('sale_id')
+            ->select()->toArray();
+        return array_column($propertyHeads,'rating_values','sale_id');
+    }
+
+    public function propertyMerits($value)
+    {
+        switch (true){
+            case (60 <= $value && $value < 70):
+                return 200;
+            case (70 <= $value && $value < 80):
+                return 400;
+            case (80 <= $value && $value < 90):
+                return 600;
+            case (90 <= $value && $value < 100):
+                return 800;
+            case (100 <= $value ):
+                return 1000;
+            case ($value < 60):
+            default:
+                return 0;
+        }
+    }
+
+
+    public function groupCounts($list,$whereTime)
+    {
+        $sale_ids = array_column($list,'id');
+        $groupCounts = [];
+        foreach ($sale_ids as $sale_id) {
+            $propertyHeadIds = PropertyHead::where('sale_id','>',0)->where('is_cooperate','=',1)->where('sale_id',$sale_id)->column('id')??[];
+            $groupOrderIds = GroupOrder::whereIn('property_head_id',$propertyHeadIds)->column('id')??[];
+            //->whereB('pay_time',1)->
+            $paid_amounts = GroupUserOrder::whereIn('group_order_id',$groupOrderIds)
+                ->where('status',1)
+                ->whereBetween('pay_time',[$whereTime[0],$whereTime[1]])
+                ->sum('paid_amount');
+            $groupCounts[$sale_id] = $paid_amounts;
+        }
+        return $groupCounts;
+    }
+
+    public function groupMerits($value)
+    {
+        return $value;
+    }
+
+
+    public function requiredMasterWorker($master_worker_id): bool
+    {
+        $masterWorker = MasterWorker::where('id',$master_worker_id)->findOrEmpty();
+        if(!$masterWorker->isEmpty()){
+            // 该工程师所有必须任务是否完成
+            $taskRequired = MasterWorkerLogic::taskRequired($master_worker_id,$masterWorker->identity_source);
+            if($masterWorker->audit_state == 1 && $taskRequired){
+                return true;
+            }
+        }
+        return false;
+    }
+
+}

+ 19 - 16
app/adminapi/lists/sale/SaleMasterWorkerLists.php

@@ -47,15 +47,16 @@ class SaleMasterWorkerLists extends BaseAdminDataLists implements ListsSearchInt
         ];
     }
 
-    public function queryWhere()
+    public function queryWhereTime()
     {
-        $where = [];
         if(isset($this->params['time_range']) && $this->params['time_range']){
             $startDateTime = strtotime($this->params['time_range'][0]);
             $endDateTime = strtotime($this->params['time_range'][1])+86400-1;
-            $where[] = ['create_time','BETWEEN',[$startDateTime,$endDateTime]];
+        } else {
+            $startDateTime = strtotime(date('Y-m-01',time()));
+            $endDateTime = time();
         }
-        return $where;
+        return [$startDateTime,$endDateTime];
     }
     /**
      * 获取数据权限
@@ -94,13 +95,13 @@ class SaleMasterWorkerLists extends BaseAdminDataLists implements ListsSearchInt
         $list = MasterWorkerRegister::with(['sale'])
             ->where('sale_id','>',0)
             ->where($this->searchWhere)
-            ->where($this->queryWhere())
+            ->whereBetween('create_time',$this->queryWhereTime())
             ->where($this->queryDataWhere())
             ->field([
                 'sale_id',
                 Db::raw("COUNT(id) AS register_count,SUM(CASE WHEN worker_id > 0 THEN 1 ELSE 0 END) AS settled_count"),
-                Db::raw("'".($this->params['time_range'][0]??'')."' AS start_date"),
-                Db::raw("'".($this->params['time_range'][1]??'')."' AS end_date"),
+                Db::raw("'".($this->queryWhereTime()[0]??'')."' AS start_date"),
+                Db::raw("'".($this->queryWhereTime()[1]??'')."' AS end_date"),
             ])
             ->group('sale_id')
             ->limit($this->limitOffset, $this->limitLength)
@@ -108,16 +109,18 @@ class SaleMasterWorkerLists extends BaseAdminDataLists implements ListsSearchInt
 
         // tmp - 统计已完成所有必须任务工程师数
         $sale_ids = array_column($list,'sale_id');
-        $worker_ids = MasterWorkerRegister::where('sale_id','>',0)->where('worker_id','>',0)
-                        ->where('sale_id','in',$sale_ids)
-                        ->where($this->searchWhere)
-                        ->where($this->queryWhere())
-                        ->where($this->queryDataWhere())
-                        ->column('worker_id','sale_id');
         $passes_counts = [];
-        foreach ($worker_ids as $sale_id => $worker_id) {
-            !isset($passes_counts[$sale_id]) && $passes_counts[$sale_id] = 0;
-            $passes_counts[$sale_id] += $this->requiredMasterWorker($worker_id)?1:0;
+        foreach ($sale_ids as $sale_id) {
+            $worker_ids = MasterWorkerRegister::where('sale_id','>',0)->where('worker_id','>',0)
+                ->where('sale_id',$sale_id)
+                ->where($this->searchWhere)
+                ->whereBetween('create_time',$this->queryWhereTime())
+                ->where($this->queryDataWhere())
+                ->column('worker_id');
+            foreach ($worker_ids as $worker_id) {
+                !isset($passes_counts[$sale_id]) && $passes_counts[$sale_id] = 0;
+                $passes_counts[$sale_id] += $this->requiredMasterWorker($worker_id)?1:0;
+            }
         }
         //dd($passes_counts);
         foreach ($list as &$item) {

+ 1 - 0
config/export.php

@@ -20,5 +20,6 @@ return [
         '10' =>  'works.ServiceWorkLists',
         '11' =>  'group_activity.GroupUserOrderLists',
         '12' =>  'sale.SaleMasterWorkerLists',
+        '13' =>  'sale.SaleCommissionLists',
     ],
 ];