|
|
@@ -18,7 +18,9 @@ use app\common\model\master_worker\MasterWorkerTeam;
|
|
|
use app\common\model\master_worker\MasterWorkerScore;
|
|
|
use app\common\model\works\ServiceWorkAllocateWorkerLog;
|
|
|
use app\common\model\master_worker\MasterWorkerServiceTime;
|
|
|
+use app\common\model\works\ServiceWorkLog;
|
|
|
use app\common\model\service_area\ServiceArea;
|
|
|
+use app\common\model\dict\DictConfig;
|
|
|
|
|
|
class UpdateWorkerScore extends Command
|
|
|
{
|
|
|
@@ -46,7 +48,7 @@ class UpdateWorkerScore extends Command
|
|
|
}
|
|
|
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 初始化工程师服务区域ID
|
|
|
*/
|
|
|
@@ -103,7 +105,9 @@ class UpdateWorkerScore extends Command
|
|
|
protected function changeWorderScore()
|
|
|
{
|
|
|
$startTime = date('Y-m-d 00:00:00', strtotime('-7 days'));
|
|
|
+ $startTime = strtotime($startTime);
|
|
|
$endTime = date('Y-m-d 23:59:59', strtotime('-1 days'));
|
|
|
+ $endTime = strtotime($endTime);
|
|
|
$page = 0;
|
|
|
$size = 50;
|
|
|
while(true) {
|
|
|
@@ -111,7 +115,7 @@ class UpdateWorkerScore extends Command
|
|
|
$offset = ($page - 1) * $size;
|
|
|
$list = MasterWorker::alias("a")
|
|
|
->leftJoin("master_worker_score b","a.id = b.worker_id")
|
|
|
- ->field('a.id,a.category_ids,b.comprehensive_score_history')
|
|
|
+ ->field('a.id,a.category_ids,a.type,b.comprehensive_score_history')
|
|
|
->limit($offset, $size)
|
|
|
->select()
|
|
|
->toArray();
|
|
|
@@ -120,7 +124,11 @@ class UpdateWorkerScore extends Command
|
|
|
}
|
|
|
foreach($list as $item) {
|
|
|
$workId = $item['id'];
|
|
|
- $this->updateComprehensiveScore($startTime,$endTime,$workId,$item['comprehensive_score_history']);
|
|
|
+ if ($item['type'] == 2) {
|
|
|
+ $this->updateComprehensiveScore($startTime,$endTime,$workId,$item['comprehensive_score_history']);
|
|
|
+ } else {
|
|
|
+ $this->updateTemporaryComprehensiveScore($startTime,$endTime,$workId,$item['comprehensive_score_history']);
|
|
|
+ }
|
|
|
|
|
|
//更新工程师平均服务时长
|
|
|
$this->updateServiceTime($startTime,$endTime,$item);
|
|
|
@@ -162,21 +170,91 @@ class UpdateWorkerScore extends Command
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * 长期合作师傅综合评分 100分 (每一项默认20%)
|
|
|
+ 评分周期:每周
|
|
|
+ 1、用户评分
|
|
|
+ 2、完单率 = 完结工单/总工单
|
|
|
+ 3、客户粘性率 = 工程师第一次联系客户时间-领单时间 和定义的时间进行比较
|
|
|
+ 4、加单率 = 加单个数/派单数
|
|
|
+ 5、上门率 = 已上门/总单数
|
|
|
+ */
|
|
|
+ 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');
|
|
|
+ $commentScore = $goodsReviewsAvg > 0 ? bcdiv($goodsReviewsAvg, 5, 2) : 0;
|
|
|
+
|
|
|
+ //总工单:统计派单日志记录
|
|
|
+ $allOrder = ServiceWorkAllocateWorkerLog::where('master_worker_id',$workId)->whereBetweenTime('create_time', $startTime, $endTime)->group('work_id')->count();
|
|
|
+
|
|
|
+ //完结工单:统计工单表已完成的工单
|
|
|
+ $completeOrder = ServiceWork::where('master_worker_id',$workId)->where('service_status',3)->where('work_pay_status','in',[1,2])->whereBetweenTime('create_time', $startTime, $endTime)->count();
|
|
|
+
|
|
|
+ if ($allOrder == 0) {
|
|
|
+ $completionRate = 0;
|
|
|
+ } else {
|
|
|
+ //完单率
|
|
|
+ $completionRate = bcdiv($completeOrder, $allOrder ,2);
|
|
|
+ }
|
|
|
+
|
|
|
+ if ($completeOrder == 0) {
|
|
|
+ $addRate = 0;
|
|
|
+ } else {
|
|
|
+ //加单率
|
|
|
+ $addWord = ServiceWork::where('master_worker_id',$workId)->where('work_type',2)->whereBetweenTime('create_time', $startTime, $endTime)->count();
|
|
|
+ $addRate = bcdiv($addWord, $completeOrder ,2);
|
|
|
+ $addRate = $addRate > 1 ? 1 : $addRate;
|
|
|
+ }
|
|
|
+
|
|
|
+ //客户粘性率(10分钟内)
|
|
|
+ $viscosityCount = ServiceWork::where('master_worker_id',$workId)->where('work_status','>',1)->where('first_contact_time','>',0)->whereRaw('first_contact_time - receive_time < 600')->whereBetweenTime('create_time', $startTime, $endTime)->count();
|
|
|
+ $viscosityRate = $allOrder > 0 ? bcdiv($viscosityCount, $allOrder,2) : 0;
|
|
|
+
|
|
|
+ //上门率
|
|
|
+ $doorCount = ServiceWorkLog::where('master_worker_id',$workId)->where('opera_log','like','%已上门%')->whereBetweenTime('create_time', $startTime, $endTime)->count();
|
|
|
+
|
|
|
+ $doorRate = $allOrder > 0 ? bcdiv($doorCount, $allOrder,2) : 0;
|
|
|
+ //echo $commentScore ."--". $completionRate ."--". $viscosityRate ."--". $addRate ."--". $doorRate;die;
|
|
|
+ //工程师汇总评分
|
|
|
+ $comprehensiveScore = $commentScore + $completionRate + $viscosityRate + $addRate + $doorRate;
|
|
|
+ $comprehensiveScore = bcdiv($comprehensiveScore, 5, 2) * 100;
|
|
|
+
|
|
|
+ //更新工程师等级晋升
|
|
|
+ $score = bcdiv($comprehensiveScore, 20, 1);
|
|
|
+
|
|
|
+ $content = DictConfig::where('value', 'promotion_level')->value('content');
|
|
|
+ $content = $content ? json_decode($content, true) : [];
|
|
|
+ foreach($content as $item) {
|
|
|
+ $value = explode("-",$item['value']);
|
|
|
+ if ($score >= $value[0] || (isset($value[1]) && $score >= $value[0] && $score <= $value[1])) {
|
|
|
+ $promotion_level = $item['key'];
|
|
|
+ MasterWorker::where('id',$workId)->update(['promotion_level' => $promotion_level]);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ $this->doComprehenSivescore($workId,$comprehensiveScore,$historyScore,$doorCount);
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ Log::write('更新长期合作工程师综合评分异常:'.$e->getMessage());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
- * 更新工程师综合评分
|
|
|
+ * 更新工程师综合评分 (短期合作工程师)
|
|
|
*/
|
|
|
- protected function updateComprehensiveScore($startTime,$endTime,$workId,$historyScore) {
|
|
|
+ protected function updateTemporaryComprehensiveScore($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');
|
|
|
$commentScore = $goodsReviewsAvg > 0 ? bcdiv($goodsReviewsAvg, 5, 2) : 0;
|
|
|
|
|
|
//总工单:统计派单日志记录
|
|
|
- $allOrder = ServiceWorkAllocateWorkerLog::where('master_worker_id',$workId)->whereBetweenTime('create_time', $startTime, $endTime)->count();
|
|
|
+ $allOrder = ServiceWorkAllocateWorkerLog::where('master_worker_id',$workId)->whereBetweenTime('create_time', $startTime, $endTime)->group('work_id')->count();
|
|
|
//完结工单:统计工单表已完成的工单
|
|
|
$completeOrder = ServiceWork::where('master_worker_id',$workId)->where('service_status',3)->where('work_pay_status','in',[1,2])->whereBetweenTime('create_time', $startTime, $endTime)->count();
|
|
|
//接单量:统计工程师接单的数量
|
|
|
- $acceptOrder = ServiceWorkReceiveLog::where('master_worker_id',$workId)->whereBetweenTime('create_time', $startTime, $endTime)->count();
|
|
|
+ $acceptOrder = ServiceWorkReceiveLog::where('master_worker_id',$workId)->whereBetweenTime('create_time', $startTime, $endTime)->group('work_id')->count();
|
|
|
|
|
|
if ($allOrder == 0) {
|
|
|
$completionRate = 0;
|
|
|
@@ -208,9 +286,8 @@ class UpdateWorkerScore extends Command
|
|
|
}
|
|
|
|
|
|
//客户粘性率(10分钟内)
|
|
|
- $avgTime = ServiceWork::where('master_worker_id',$workId)->where('work_status','>',1)->where('first_contact_time','>',0)->whereBetweenTime('create_time', $startTime, $endTime)->field('AVG(first_contact_time - receive_time) as avg_time')->find();
|
|
|
- $avgTime = $avgTime['avg_time'] ? $avgTime['avg_time'] / 60 : 0;
|
|
|
- $viscosityRate = $avgTime <= 10 && $avgTime > 0 ? 1 : 0;
|
|
|
+ $viscosityCount = ServiceWork::where('master_worker_id',$workId)->where('work_status','>',1)->where('first_contact_time','>',0)->whereRaw('first_contact_time - receive_time < 600')->whereBetweenTime('create_time', $startTime, $endTime)->count();
|
|
|
+ $viscosityRate = $acceptOrder > 0 ? bcdiv($viscosityCount, $acceptOrder,2) : 0;
|
|
|
|
|
|
$partOrder = ServiceWork::where('master_worker_id',$workId)->where('work_status','>',1)->where('order_effective_id',0)->whereBetweenTime('create_time', $startTime, $endTime)->count();
|
|
|
if ($partOrder == 0) {
|
|
|
@@ -228,7 +305,7 @@ class UpdateWorkerScore extends Command
|
|
|
$this->doComprehenSivescore($workId,$comprehensiveScore,$historyScore,$acceptOrder);
|
|
|
} catch (\Exception $e) {
|
|
|
|
|
|
- Log::write('更新工程师综合评分异常:'.$e->getMessage());
|
|
|
+ Log::write('更新短期合作工程师综合评分异常:'.$e->getMessage());
|
|
|
return false;
|
|
|
}
|
|
|
}
|