OrderReserveComments.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. <?php
  2. namespace common\models\order;
  3. use addons\HomeMaking\common\models\HomeMakingUser;
  4. use addons\ReservationService\common\models\ReservationServiceUser;
  5. use addons\ReservationService\common\services\BackendService;
  6. use addons\Store\common\models\StoreOrderReserve;
  7. use common\enums\StatusEnum;
  8. use common\models\goods\GoodsReserve;
  9. use common\models\user\User;
  10. use Yii;
  11. use Yii\db\Expression;
  12. /**
  13. * This is the model class for table "qimall_order_reserve_comments".
  14. *
  15. * @property int $id ID
  16. * @property int $aging_score 时效评分
  17. * @property int $major_score 专业评分
  18. * @property int $attitude_score 态度评分
  19. * @property int $staff_score 技师评分
  20. * @property int $environment_score 环境评分
  21. * @property int $service_score 服务评分
  22. * @property string|null $tags 评价标签
  23. * @property int $tech_id 技师ID/师傅ID
  24. * @property int $tech_user_id 技师用户ID/师傅用户ID
  25. * @property int $reserve_type 预约类型
  26. * @property int $store_id 预约类型
  27. * @property int $mch_id 预约类型
  28. * @property int $order_detail_id 预约类型
  29. * @property int $user_id 预约类型
  30. * @property int $score 预约类型
  31. * @property int $show_tech 门店预约商品:是否显示技师信息1:是;0否
  32. */
  33. class OrderReserveComments extends \common\models\base\BaseActiveRecord
  34. {
  35. /**
  36. * {@inheritdoc}
  37. */
  38. public static function tableName()
  39. {
  40. return 'qimall_order_reserve_comments';
  41. }
  42. /**
  43. * {@inheritdoc}
  44. */
  45. public function rules()
  46. {
  47. return [
  48. [['id'], 'required'],
  49. [['id', 'aging_score', 'major_score', 'attitude_score', 'tech_id', 'tech_user_id', 'reserve_type', 'store_id',
  50. 'mch_id', 'order_detail_id', 'user_id', 'score', 'staff_score', 'environment_score', 'service_score', 'show_tech'], 'integer'],
  51. [['tags'], 'safe'],
  52. [['id'], 'unique'],
  53. [['show_tech'], 'default', 'value' => 0],
  54. [['show_tech'], 'integer'],
  55. ];
  56. }
  57. /**
  58. * {@inheritdoc}
  59. */
  60. public function attributeLabels()
  61. {
  62. return [
  63. 'id' => 'ID',
  64. 'aging_score' => 'Aging Score',
  65. 'major_score' => 'Major Score',
  66. 'attitude_score' => 'Attitude Score',
  67. 'tags' => 'Tags',
  68. 'tech_id' => 'Tech ID',
  69. 'tech_user_id' => 'Tech User ID',
  70. 'reserve_type' => 'Reserve Type',
  71. ];
  72. }
  73. public function behaviors() {
  74. return [];
  75. }
  76. public function getComment()
  77. {
  78. return $this->hasOne(OrderComments::class, ['id' => 'id']);
  79. }
  80. public function getTechUser()
  81. {
  82. return $this->hasOne(User::class, ['id' => 'tech_user_id']);
  83. }
  84. public function getUser()
  85. {
  86. return $this->hasOne(User::class, ['id' => 'user_id'])->select('id, nickname, mobile, avatar_url');
  87. }
  88. public function getOrderDetail()
  89. {
  90. return $this->hasOne(OrderDetail::class, ['id' => 'order_detail_id']);
  91. }
  92. public static function setData(array $params, bool $is_valid = true)
  93. {
  94. try {
  95. if ($is_valid) {
  96. $res = \Yii::$app->services->validate->validate($params, [
  97. [['id', 'aging_score', 'attitude_score', 'major_score', 'goods_id', 'order_id'], 'required'],
  98. [['id', 'aging_score', 'attitude_score', 'major_score', 'goods_id', 'order_id', 'store_id',
  99. 'mch_id', 'order_detail_id', 'user_id', 'score', 'show_tech', 'environment_score', 'service_score', 'staff_score'
  100. ], 'integer'],
  101. [['tags'], 'each', 'rule' => ['string']]
  102. ]);
  103. if ($res === false) throw new \Exception(\Yii::$app->services->validate->getErrorMessage());
  104. }
  105. if (!empty($params['store_id'])) {
  106. /**
  107. * @var $order StoreOrderReserve
  108. */
  109. $order = StoreOrderReserve::getOne([
  110. ['main_order_id' => $params['order_id']],
  111. ], false, [], 'id asc', 'reserve_type, tech_id');
  112. } else {
  113. /**
  114. * @var $order OrderReserve
  115. */
  116. $order = OrderReserve::getOne([
  117. ['order_id' => $params['order_id']],
  118. ], false, [], 'id asc', 'reserve_type, tech_id');
  119. }
  120. if (empty($order)) throw new \Exception("预约订单不存在");
  121. switch ($order->reserve_type) {
  122. case StatusEnum::DISABLED:
  123. $tech = HomeMakingUser::getOne([
  124. ['id' => $order->tech_id],
  125. ], false, [], 'id desc', 'user_id, id');
  126. break;
  127. case StatusEnum::ENABLED:
  128. $tech = ReservationServiceUser::getOne([
  129. ['id' => $order->tech_id]
  130. ], false, [], 'id desc', 'user_id, id');
  131. break;
  132. }
  133. $model = new self();
  134. $model->loadDefaultValues();
  135. $model->id = $params['id'];
  136. $model->mch_id = $params['mch_id'];
  137. $model->store_id = $params['store_id'];
  138. $model->aging_score = $params['aging_score'];
  139. $model->attitude_score = $params['attitude_score'];
  140. $model->major_score = $params['major_score'];
  141. $model->staff_score = $params['staff_score'] ?? 0;
  142. $model->environment_score = $params['environment_score'] ?? 0;
  143. $model->service_score = $params['service_score'] ?? 0;
  144. $model->score = $params['score'];
  145. $model->user_id = $params['user_id'];
  146. $model->order_detail_id = $params['order_detail_id'];
  147. $model->tags = !empty($params['tags']) ? $params['tags'] : [];
  148. $model->tech_id = $order->tech_id;
  149. $model->tech_user_id = !empty($tech->user_id) ? $tech->user_id : 0;
  150. $model->reserve_type = $order->reserve_type;
  151. $model->show_tech = $params['show_tech'];
  152. if (!$model->save()) {
  153. throw new \Exception($model->getErrorMessage());
  154. }
  155. // 计算平分数
  156. if (!empty($tech)) {
  157. // $scores = OrderReserveComments::getOne([
  158. // ['reserve_type' => $model->reserve_type],
  159. // ['tech_id' => $order->tech_id]
  160. // ], true, [],
  161. // '',
  162. // "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"
  163. // );
  164. // $current_scores = $params['aging_score'] + $params['attitude_score'] + $params['major_score'] + $params['score'];
  165. // $tech->service_rating = bcdiv((intval($scores['aging_score']) + intval($scores['attitude_score']) +
  166. // intval($scores['major_score']) + intval($scores['score']) + $current_scores), (intval($scores['total']) + 1) * 4, 2);
  167. // $service_rating = self::computeTechScore(['mall_id'=>$order['mall_id'],'store_id'=>0,'tech_user_id'=>$tech['user_id']]);
  168. // $tech->service_rating = $service_rating;
  169. // if (!$tech->save()) throw new \Exception($tech->getErrorMessage());
  170. }
  171. return $model;
  172. } catch (\Exception $e) {
  173. self::$static_error = $e->getMessage();
  174. return false;
  175. }
  176. }
  177. /**
  178. * 计算技师评分
  179. * @param $params
  180. * @return int|string
  181. */
  182. public static function computeTechScore($params)
  183. {
  184. $tech_user_id = $params['staff_user_id'];
  185. $store_id = $params['store_id'] ?? 0;
  186. $mall_id = $params['mall_id'];
  187. $num2 = 0;
  188. if($store_id){
  189. $comments_list = OrderReserveComments::lists([
  190. 'where'=>[
  191. ['store_id'=>$store_id],
  192. ['tech_user_id'=>$tech_user_id]
  193. ],
  194. 'select'=>'sum(staff_score) as staff_score,count(*) as counts',
  195. 'group'=>'staff_score'
  196. ]);
  197. $score = $num = 0;
  198. foreach ($comments_list as $item){
  199. $score += $item['staff_score'];
  200. $num += $item['counts'];
  201. }
  202. if($num==0){
  203. return 0;
  204. }
  205. $res = bcdiv($score, $num, 2);
  206. }else{
  207. $score = self::getCommentScore($tech_user_id,'score');//总评分平均
  208. $aging_score = self::getCommentScore($tech_user_id,'aging_score');//时效评分平均
  209. $major_score = self::getCommentScore($tech_user_id,'major_score');// 专业得分平均
  210. $attitude_score = self::getCommentScore($tech_user_id,'attitude_score');//服务态度评分平均
  211. $data = BackendService::getSetting($mall_id);
  212. $total_score = $data['basic']['total_score'] ?? 1;
  213. $speciality = $data['basic']['speciality'] ?? 1;
  214. $service_attitude = $data['basic']['service_attitude'] ?? 1;
  215. $timeliness = $data['basic']['timeliness'] ?? 1;
  216. $res = ($score * $total_score + $aging_score * $timeliness + $major_score * $speciality + $attitude_score * $service_attitude) / ($total_score + $speciality + $service_attitude + $timeliness);
  217. $res = bcadd($res, 0, 2);
  218. }
  219. $last_str = $res[strlen($res) - 1];
  220. if (!empty($last_str)) {
  221. $num2 = 0.1;
  222. }
  223. return bcadd($res, $num2, 1);
  224. }
  225. protected static function getCommentScore($tech_user_id,$group)
  226. {
  227. $comments_list = OrderReserveComments::lists([
  228. 'where'=>[
  229. ['store_id'=>0],
  230. ['tech_user_id'=>$tech_user_id]
  231. ],
  232. 'select' => "sum({$group}) as {$group}_sum,count(*) as counts,{$group}",
  233. 'group'=>$group
  234. ]);
  235. $score = $num = 0;
  236. foreach ($comments_list as $item){
  237. $score += $item[$group . '_sum'];
  238. $num += $item['counts'];
  239. }
  240. if($num>0){
  241. return bcdiv($score,$num,2);
  242. }
  243. return 0;
  244. }
  245. }