Преглед на файлове

Merge branch 'group_0313'

dongxiaoqin преди 1 година
родител
ревизия
2566ee1914
променени са 3 файла, в които са добавени 49 реда и са изтрити 9 реда
  1. 2 1
      app/adminapi/logic/works/GroupServiceWorkLogic.php
  2. 47 7
      app/common/command/UpdateWorkerScore.php
  3. 0 1
      app/workerapi/lists/GroupServiceWorkLists.php

+ 2 - 1
app/adminapi/logic/works/GroupServiceWorkLogic.php

@@ -307,6 +307,7 @@ class GroupServiceWorkLogic extends BaseLogic
                 }
             ])
             ->where($work_where)
+            ->field('id,work_sn,real_name,mobile,address,title,category_type,work_status,user_confirm_status,service_status,dispatch_time,appointment_time,receive_time,work_images,finished_images,finished_time,area_name,finally_door_time,create_time,remark,third_type,work_total,work_pay_status')
             ->append(['id','work_status_text','service_status_text'])
             ->findOrEmpty()->toArray();
         if (empty($result)) {
@@ -358,7 +359,7 @@ class GroupServiceWorkLogic extends BaseLogic
 
         $result['work_service_status'] = $work_service_status;
         $result['work_service_status_text'] = $work_service_status_text;
-
+        
         return  $result;
     }
 

+ 47 - 7
app/common/command/UpdateWorkerScore.php

@@ -109,7 +109,9 @@ class UpdateWorkerScore extends Command
         while(true) {
             $page++;
             $offset = ($page - 1) * $size;
-            $list = MasterWorker::field('id,category_ids')
+            $list = MasterWorker::alias("a")
+                    ->leftJoin("master_worker_score b","a.id = b.worker_id")
+                    ->field('a.id,a.category_ids,b.comprehensive_score_history')
                     ->limit($offset, $size)
                     ->select()
                     ->toArray();
@@ -118,7 +120,7 @@ class UpdateWorkerScore extends Command
             }
             foreach($list as $item) {
                 $workId = $item['id'];
-                $this->updateComprehensiveScore($startTime,$endTime,$workId);
+                $this->updateComprehensiveScore($startTime,$endTime,$workId,$item['comprehensive_score_history']);
 
                 //更新工程师平均服务时长
                 $this->updateServiceTime($startTime,$endTime,$item);
@@ -133,6 +135,9 @@ class UpdateWorkerScore extends Command
         if ($worker['category_ids']) {
             $category_ids = explode(",",$worker['category_ids']);
             foreach($category_ids as $categoryId) {
+                if (!$categoryId) {
+                    continue;
+                }
                 $avgTime = ServiceWork::where('master_worker_id',$worker['id'])->where('service_status',3)->whereIn('work_type',[0,1])->whereBetweenTime('create_time', $startTime, $endTime)->field('AVG(finished_time - appointment_time) as avg_time')->find();
                 if (isset($avgTime['avg_time']) && $avgTime['avg_time'] > 0) {
                     $avgTime = $avgTime['avg_time'] / 60 ;
@@ -160,7 +165,7 @@ class UpdateWorkerScore extends Command
     /**
      * 更新工程师综合评分
      */
-    protected function updateComprehensiveScore($startTime,$endTime,$workId) {
+    protected function updateComprehensiveScore($startTime,$endTime,$workId,$historyScore) {
         try {
             //查询本周平均评分值
             $goodsReviewsAvg = GoodsReviews::alias('a')->leftJoin("service_work b","a.work_id = b.id")->whereBetweenTime('a.create_time', $startTime, $endTime)->avg('rating');
@@ -170,7 +175,9 @@ class UpdateWorkerScore extends Command
             $allOrder = ServiceWorkAllocateWorkerLog::where('master_worker_id',$workId)->whereBetweenTime('create_time', $startTime, $endTime)->count();
             //完结工单:统计工单表已完成的工单
             $completeOrder = ServiceWork::where('master_worker_id',$workId)->where('service_status',3)->whereBetweenTime('create_time', $startTime, $endTime)->count();
-            
+            //接单量:统计工程师接单的数量
+            $acceptOrder = ServiceWorkReceiveLog::where('master_worker_id',$workId)->whereBetweenTime('create_time', $startTime, $endTime)->count();
+
             if ($allOrder == 0) {
                 $completionRate = 0;
                 $acceptRate = 0;
@@ -178,7 +185,6 @@ class UpdateWorkerScore extends Command
                 //完单率
                 $completionRate = bcdiv($completeOrder, $allOrder ,2);
                 //接单率
-                $acceptOrder = ServiceWorkReceiveLog::where('master_worker_id',$workId)->whereBetweenTime('create_time', $startTime, $endTime)->count();
                 $acceptRate = bcdiv($acceptOrder, $allOrder ,2);
             }
 
@@ -219,8 +225,7 @@ class UpdateWorkerScore extends Command
             $comprehensiveScore = $commentScore + $completionRate + $acceptRate + $issueRate + $viscosityRate + $warrantyRate + $returnRate + $addRate;
             $comprehensiveScore = bcdiv($comprehensiveScore, 8, 2) * 100;
             
-            MasterWorkerScore::where('worker_id',$workId)->update(['comprehensive_score' => $comprehensiveScore]);
-            
+            $this->doComprehenSivescore($workId,$comprehensiveScore,$historyScore,$acceptOrder);
         } catch (\Exception $e) {
             
             Log::write('更新工程师综合评分异常:'.$e->getMessage());
@@ -228,6 +233,41 @@ class UpdateWorkerScore extends Command
         }
     }
 
+    /**
+     * 综合评分活跃度衰退机制
+        1. 引入双周期加权计算机制
+        - 主周期(7天)数据:用于正常活跃状态的评分计算
+        - 辅助周期(30天)数据:用于低活跃状态的评分平滑
+        2. 设置活跃度阈值(建议值)
+        - 活跃状态:周接单量≥5单
+        - 低活跃状态:周接单量1-4单
+        - 停单状态:周接单量=0单
+        3. 衰减系数梯度表:
+        | 状态类型      | 衰减系数 | 数据来源权重         |
+        |---------------|----------|----------------------|
+        | 活跃状态      | 1.0      | 100%主周期数据       |
+        | 低活跃状态    | 0.8      | 70%主周期+30%辅助周期|
+        | 停单状态      | 0.6      | 50%主周期+50%辅助周期|
+     */
+    public static function doComprehenSivescore($workId,$curScore,$historyScore,$acceptOrder)
+    {
+        $historyScore = $historyScore ? explode(",",$historyScore) : [];
+        $argScore = $historyScore ? array_sum($historyScore)/count($historyScore) : 0;
+        if ($acceptOrder >= 1 && $acceptOrder < 5) {
+            $curScore = bcadd($curScore * 0.7, $argScore * 0.3, 2);
+        } elseif ($acceptOrder == 0) {
+            $curScore = bcadd($argScore * 0.5, 0, 2);
+        }
+        if ($curScore > 0) {
+            if (count($historyScore) >= 4) {
+                //移除第一个元素
+                array_shift($historyScore);
+            }
+            $historyScore[] = $curScore;
+        }
+        MasterWorkerScore::where('worker_id',$workId)->update(['comprehensive_score' => $curScore, 'comprehensive_score_history' => implode(",",$historyScore)]);
+    }
+
     /**
      * 更新团队服务评分
      */

+ 0 - 1
app/workerapi/lists/GroupServiceWorkLists.php

@@ -39,7 +39,6 @@ class GroupServiceWorkLists  extends BaseWorkerDataLists implements ListsSearchI
                 //今日上门
                 $startOfDayTimestamp = strtotime(date("Y-m-d"));
                 $endOfDayTimestamp = strtotime(date("Y-m-d 23:59:59"));
-                $where[] = ['work_status','=',3];
                 $where[] = ['appointment_time','between',[$startOfDayTimestamp, $endOfDayTimestamp]];
                 break;
             case 1: