|
|
@@ -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)]);
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 更新团队服务评分
|
|
|
*/
|