0], [['show_tech'], 'integer'], ]; } /** * {@inheritdoc} */ public function attributeLabels() { return [ 'id' => 'ID', 'aging_score' => 'Aging Score', 'major_score' => 'Major Score', 'attitude_score' => 'Attitude Score', 'tags' => 'Tags', 'tech_id' => 'Tech ID', 'tech_user_id' => 'Tech User ID', 'reserve_type' => 'Reserve Type', ]; } public function behaviors() { return []; } public function getComment() { return $this->hasOne(OrderComments::class, ['id' => 'id']); } public function getTechUser() { return $this->hasOne(User::class, ['id' => 'tech_user_id']); } public function getUser() { return $this->hasOne(User::class, ['id' => 'user_id'])->select('id, nickname, mobile, avatar_url'); } public function getOrderDetail() { return $this->hasOne(OrderDetail::class, ['id' => 'order_detail_id']); } public static function setData(array $params, bool $is_valid = true) { try { if ($is_valid) { $res = \Yii::$app->services->validate->validate($params, [ [['id', 'aging_score', 'attitude_score', 'major_score', 'goods_id', 'order_id'], 'required'], [['id', 'aging_score', 'attitude_score', 'major_score', 'goods_id', 'order_id', 'store_id', 'mch_id', 'order_detail_id', 'user_id', 'score', 'show_tech', 'environment_score', 'service_score', 'staff_score' ], 'integer'], [['tags'], 'each', 'rule' => ['string']] ]); if ($res === false) throw new \Exception(\Yii::$app->services->validate->getErrorMessage()); } if (!empty($params['store_id'])) { /** * @var $order StoreOrderReserve */ $order = StoreOrderReserve::getOne([ ['main_order_id' => $params['order_id']], ], false, [], 'id asc', 'reserve_type, tech_id'); } else { /** * @var $order OrderReserve */ $order = OrderReserve::getOne([ ['order_id' => $params['order_id']], ], false, [], 'id asc', 'reserve_type, tech_id'); } if (empty($order)) throw new \Exception("预约订单不存在"); switch ($order->reserve_type) { case StatusEnum::DISABLED: $tech = HomeMakingUser::getOne([ ['id' => $order->tech_id], ], false, [], 'id desc', 'user_id, id'); break; case StatusEnum::ENABLED: $tech = ReservationServiceUser::getOne([ ['id' => $order->tech_id] ], false, [], 'id desc', 'user_id, id'); break; } $model = new self(); $model->loadDefaultValues(); $model->id = $params['id']; $model->mch_id = $params['mch_id']; $model->store_id = $params['store_id']; $model->aging_score = $params['aging_score']; $model->attitude_score = $params['attitude_score']; $model->major_score = $params['major_score']; $model->staff_score = $params['staff_score'] ?? 0; $model->environment_score = $params['environment_score'] ?? 0; $model->service_score = $params['service_score'] ?? 0; $model->score = $params['score']; $model->user_id = $params['user_id']; $model->order_detail_id = $params['order_detail_id']; $model->tags = !empty($params['tags']) ? $params['tags'] : []; $model->tech_id = $order->tech_id; $model->tech_user_id = !empty($tech->user_id) ? $tech->user_id : 0; $model->reserve_type = $order->reserve_type; $model->show_tech = $params['show_tech']; if (!$model->save()) { throw new \Exception($model->getErrorMessage()); } // 计算平分数 if (!empty($tech)) { // $scores = OrderReserveComments::getOne([ // ['reserve_type' => $model->reserve_type], // ['tech_id' => $order->tech_id] // ], true, [], // '', // "SUM(aging_score) as aging_score, SUM(attitude_score) as attitude_score ,SUM(major_score) as major_score, SUM(score) as score, COUNT(*) AS total" // ); // $current_scores = $params['aging_score'] + $params['attitude_score'] + $params['major_score'] + $params['score']; // $tech->service_rating = bcdiv((intval($scores['aging_score']) + intval($scores['attitude_score']) + // intval($scores['major_score']) + intval($scores['score']) + $current_scores), (intval($scores['total']) + 1) * 4, 2); // $service_rating = self::computeTechScore(['mall_id'=>$order['mall_id'],'store_id'=>0,'tech_user_id'=>$tech['user_id']]); // $tech->service_rating = $service_rating; // if (!$tech->save()) throw new \Exception($tech->getErrorMessage()); } return $model; } catch (\Exception $e) { self::$static_error = $e->getMessage(); return false; } } /** * 计算技师评分 * @param $params * @return int|string */ public static function computeTechScore($params) { $tech_user_id = $params['staff_user_id']; $store_id = $params['store_id'] ?? 0; $mall_id = $params['mall_id']; $num2 = 0; if($store_id){ $comments_list = OrderReserveComments::lists([ 'where'=>[ ['store_id'=>$store_id], ['tech_user_id'=>$tech_user_id] ], 'select'=>'sum(staff_score) as staff_score,count(*) as counts', 'group'=>'staff_score' ]); $score = $num = 0; foreach ($comments_list as $item){ $score += $item['staff_score']; $num += $item['counts']; } if($num==0){ return 0; } $res = bcdiv($score, $num, 2); }else{ $score = self::getCommentScore($tech_user_id,'score');//总评分平均 $aging_score = self::getCommentScore($tech_user_id,'aging_score');//时效评分平均 $major_score = self::getCommentScore($tech_user_id,'major_score');// 专业得分平均 $attitude_score = self::getCommentScore($tech_user_id,'attitude_score');//服务态度评分平均 $data = BackendService::getSetting($mall_id); $total_score = $data['basic']['total_score'] ?? 1; $speciality = $data['basic']['speciality'] ?? 1; $service_attitude = $data['basic']['service_attitude'] ?? 1; $timeliness = $data['basic']['timeliness'] ?? 1; $res = ($score * $total_score + $aging_score * $timeliness + $major_score * $speciality + $attitude_score * $service_attitude) / ($total_score + $speciality + $service_attitude + $timeliness); $res = bcadd($res, 0, 2); } $last_str = $res[strlen($res) - 1]; if (!empty($last_str)) { $num2 = 0.1; } return bcadd($res, $num2, 1); } protected static function getCommentScore($tech_user_id,$group) { $comments_list = OrderReserveComments::lists([ 'where'=>[ ['store_id'=>0], ['tech_user_id'=>$tech_user_id] ], 'select' => "sum({$group}) as {$group}_sum,count(*) as counts,{$group}", 'group'=>$group ]); $score = $num = 0; foreach ($comments_list as $item){ $score += $item[$group . '_sum']; $num += $item['counts']; } if($num>0){ return bcdiv($score,$num,2); } return 0; } }