| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- <?php
- namespace common\models\order;
- use addons\HomeMaking\common\models\HomeMakingUser;
- use addons\ReservationService\common\models\ReservationServiceUser;
- use addons\ReservationService\common\services\BackendService;
- use addons\Store\common\models\StoreOrderReserve;
- use common\enums\StatusEnum;
- use common\models\goods\GoodsReserve;
- use common\models\user\User;
- use Yii;
- use Yii\db\Expression;
- /**
- * This is the model class for table "qimall_order_reserve_comments".
- *
- * @property int $id ID
- * @property int $aging_score 时效评分
- * @property int $major_score 专业评分
- * @property int $attitude_score 态度评分
- * @property int $staff_score 技师评分
- * @property int $environment_score 环境评分
- * @property int $service_score 服务评分
- * @property string|null $tags 评价标签
- * @property int $tech_id 技师ID/师傅ID
- * @property int $tech_user_id 技师用户ID/师傅用户ID
- * @property int $reserve_type 预约类型
- * @property int $store_id 预约类型
- * @property int $mch_id 预约类型
- * @property int $order_detail_id 预约类型
- * @property int $user_id 预约类型
- * @property int $score 预约类型
- * @property int $show_tech 门店预约商品:是否显示技师信息1:是;0否
- */
- class OrderReserveComments extends \common\models\base\BaseActiveRecord
- {
- /**
- * {@inheritdoc}
- */
- public static function tableName()
- {
- return 'qimall_order_reserve_comments';
- }
- /**
- * {@inheritdoc}
- */
- public function rules()
- {
- return [
- [['id'], 'required'],
- [['id', 'aging_score', 'major_score', 'attitude_score', 'tech_id', 'tech_user_id', 'reserve_type', 'store_id',
- 'mch_id', 'order_detail_id', 'user_id', 'score', 'staff_score', 'environment_score', 'service_score', 'show_tech'], 'integer'],
- [['tags'], 'safe'],
- [['id'], 'unique'],
- [['show_tech'], 'default', 'value' => 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;
- }
- }
|