<?php
namespace wstmart\common\model;
/**
 * ============================================================================
 * 评价类
 */
use think\Db;
class GoodsAppraises extends Base{
	public function queryByPage(){
		$shopId = (int)session('WST_USER.shopId');

		$where = [];
		$where['g.goodsStatus'] = 1;
		$where['g.dataFlag'] = 1;
		$where['g.isSale'] = 1;
		$c1Id = (int)input('cat1');
		$c2Id = (int)input('cat2');
		$goodsName = input('goodsName');
		if($goodsName != ''){
			$where['g.goodsName'] = ['like',"%$goodsName%"];
		}
		if($c2Id!=0 && $c1Id!=0){
			$where['g.shopCatId2'] = $c2Id;
		}else if($c1Id!=0){
			$where['g.shopCatId1'] = $c1Id;
		}
		$where['g.shopId'] = $shopId;


		$model = model('goods');
		$data = $model->alias('g')
					  ->field('g.goodsId,g.goodsImg,g.goodsName,ga.shopReply,ga.id gaId,ga.replyTime,ga.goodsScore,ga.serviceScore,ga.timeScore,ga.content,ga.images,u.loginName')
					  ->join('__GOODS_APPRAISES__ ga','g.goodsId=ga.goodsId','inner')
					  ->join('__USERS__ u','u.userId=ga.userId','inner')
					  ->where($where)
					  ->paginate()->toArray();
		if($data !== false){
			return WSTReturn('',1,$data);
		}else{
			return WSTReturn($this->getError(),-1);
		}
	}
	/**
	* 用户评价
	*/
	public function userAppraise(){
		$userId = (int)session('WST_USER.userId');

		$where = [];
		$where['g.goodsStatus'] = 1;
		$where['g.dataFlag'] = 1;
		$where['g.isSale'] = 1;


		$where['ga.userId'] = $userId;


		$model = model('goods');
		$data = $model->alias('g')
					  ->field('g.goodsId,g.goodsImg,g.goodsName,ga.goodsScore,ga.serviceScore,ga.timeScore,ga.content,ga.images,ga.shopReply,ga.replyTime,s.shopName,u.userName,o.orderNo')
					  ->join('__GOODS_APPRAISES__ ga','g.goodsId=ga.goodsId','inner')
					  ->join('__ORDERS__ o','o.orderId=ga.orderId','inner')
					  ->join('__USERS__ u','u.userId=ga.userId','inner')
					  ->join('__SHOPS__ s','o.shopId=s.shopId','inner')
					  ->where($where)
					  ->paginate()->toArray();
		if($data !== false){
			return WSTReturn('',1,$data);
		}else{
			return WSTReturn($this->getError(),-1);
		}
	}
 	/**
	* 添加评价
	*/
	public function add($uId=0){
		//检测订单是否有效
		$orderId = (int)input('orderId');
		$goodsId = (int)input('goodsId');
		$goodsSpecId = (int)input('goodsSpecId');
		$orderGoodsId = (int)input('orderGoodsId');

		// 没有传order_goods表的id
		if($orderGoodsId==0)return WSTReturn('数据出错,请联系管理员');

		$userId = ((int)$uId==0)?(int)session('WST_USER.userId'):$uId;
		
		$goodsScore = (int)input('goodsScore');
		$timeScore = (int)input('timeScore');
		$serviceScore = (int)input('serviceScore');
		$content = input('content');
		if(isset($content)){
			if(!WSTCheckFilterWords($content,WSTConf("CONF.limitWords"))){
				return WSTReturn("点评内容包含非法字符");
			}
		}
		$orders = model('orders')->where(['orderId'=>$orderId,'userId'=>$userId,'dataFlag'=>1])->field('orderStatus,orderNo,isAppraise,orderScore,shopId')->find();
		if(empty($orders))return WSTReturn("无效的订单");
		if($orders['orderStatus']!=2)return WSTReturn("订单状态已改变,请刷新订单后再尝试!");
		//检测商品是否已评价
		$apCount = $this->where(['orderGoodsId'=>$orderGoodsId,'dataFlag'=>1])->count();
		if($apCount>0)return WSTReturn("该商品已评价!");
		Db::startTrans();
		try{	
			//增加订单评价
			$data = [];
			$data['userId'] = $userId;
			$data['goodsSpecId'] = $goodsSpecId;
			$data['goodsId'] = $goodsId;
			$data['shopId'] = $orders['shopId'];
			$data['orderId'] = $orderId;
			$data['goodsScore'] = $goodsScore;
			$data['serviceScore'] = $serviceScore;
			$data['timeScore']= $timeScore;
			$data['content'] = $content;
			$data['images'] = input('images');
			$data['createTime'] = date('Y-m-d H:i:s');
			$data['orderGoodsId'] = $orderGoodsId;
			$rs = $this->validate('GoodsAppraises.add')->allowField(true)->save($data);
			if($rs !==false){
				$lastId = $this->id;
				WSTUseImages(0, $this->id, $data['images']);
				//增加商品评分
				$prefix = config('database.prefix');
				$updateSql = "update ".$prefix."goods_scores set 
				             totalScore=totalScore+".(int)($goodsScore+$serviceScore+$timeScore).",
				             goodsScore=goodsScore+".(int)$goodsScore.",
				             serviceScore=serviceScore+".(int)$serviceScore.",
				             timeScore=timeScore+".(int)$timeScore.",
				             totalUsers=totalUsers+1,goodsUsers=goodsUsers+1,serviceUsers=serviceUsers+1,timeUsers=timeUsers+1
				             where goodsId=".$goodsId;
				Db::execute($updateSql);
				//增加商品评价数
				Db::name('goods')->where('goodsId',$goodsId)->setInc('appraiseNum');
				//增加店铺评分
				$updateSql = "update ".$prefix."shop_scores set 
				             totalScore=totalScore+".(int)($goodsScore+$serviceScore+$timeScore).",
				             goodsScore=goodsScore+".(int)$goodsScore.",
				             serviceScore=serviceScore+".(int)$serviceScore.",
				             timeScore=timeScore+".(int)$timeScore.",
				             totalUsers=totalUsers+1,goodsUsers=goodsUsers+1,serviceUsers=serviceUsers+1,timeUsers=timeUsers+1
				             where shopId=".$orders['shopId'];
				Db::execute($updateSql);
				// 查询该订单是否已经完成评价,修改orders表中的isAppraise
				$ogRs = Db::name('order_goods')->alias('og')
				   ->join('__GOODS_APPRAISES__ ga','og.orderId=ga.orderId and og.goodsId=ga.goodsId and og.goodsSpecId=ga.goodsSpecId','left')
				   ->where('og.orderId',$orderId)->field('og.id,ga.id gid')->select();
				$isFinish = true;
				foreach ($ogRs as $key => $v){
					if($v['id']>0 && $v['gid']==''){
						$isFinish = false;
						break;
					}
				}
				//订单商品全部评价完则修改订单状态
				if($isFinish){
					if(WSTConf("CONF.isAppraisesScore")==1){
						$appraisesScore = (int)WSTConf('CONF.appraisesScore');
						if($appraisesScore>0){
							//给用户增加惠宝
							$score = [];
							$score['userId'] = $userId;
							$score['score'] = $appraisesScore;
							$score['dataSrc'] = 1;
							$score['dataId'] = $orderId;
							$score['dataRemarks'] = "评价订单【".$orders['orderNo']."】获得惠宝".$appraisesScore."个";
							$score['scoreType'] = 1;
							$score['createTime'] = date('Y-m-d H:i:s');
							
							model('UserScores')->add($score,true);
						}
					}
					//修改订单评价状态
					model('orders')->where('orderId',$orderId)->update(['isAppraise'=>1,'isClosed'=>1]);
				}
				//发送一条商家信息
				$tpl = WSTMsgTemplates('ORDER_APPRAISES');
				$orderGoods = Db::name('order_goods')->where(['orderId'=>$orderId,'goodsId'=>$goodsId,'goodsSpecId'=>$goodsSpecId])->field('goodsName')->find();
	           
	            $shopId = $orders['shopId'];
	            if( $tpl['tplContent']!='' && $tpl['status']=='1'){
	                $find = ['${ORDER_NO}','${GOODS}'];
	                $replace = [$orders['orderNo'],$orderGoods['goodsName']];
	                
	                $msg = array();
		            $msg["shopId"] = $shopId;
		            $msg["tplCode"] = $tpl["tplCode"];
		            $msg["msgType"] = 1;
		            $msg["content"] = str_replace($find,$replace,$tpl['tplContent']);
		            $msg["msgJson"] = ['from'=>6,'dataId'=>$lastId];
		            model("common/MessageQueues")->add($msg);
	            }
	            //微信消息
		        if((int)WSTConf('CONF.wxenabled')==1){
		            $params = [];
		            $params['ORDER_NO'] = $orders['orderNo'];
		            $params['GOODS'] = $orderGoods['goodsName'];  
	                
	                $msg = array();
					$tplCode = "WX_ORDER_APPRAISES";
					$msg["shopId"] = $shopId;
		            $msg["tplCode"] = $tplCode;
		            $msg["msgType"] = 4;
		            $msg["paramJson"] = ['CODE'=>$tplCode,'URL'=>'','params'=>$params] ;
		            $msg["msgJson"] = "";
		            model("common/MessageQueues")->add($msg);
		        }
				Db::commit();
				return WSTReturn('评价成功',1);
			}else{
				return WSTReturn($this->getError(),-1);
			}
		}catch (\Exception $e) {
		    Db::rollback();errLog($e);
	        return WSTReturn('评价失败',-1);
	    }

	}
	/**
	* 根据商品id取评论
	*/
	public function getById(){
		// 处理匿名
		$anonymous = (int)input('anonymous',1);
		$goodsId = (int)input('goodsId');
		$where = ['ga.goodsId'=>$goodsId,
				  'ga.dataFlag'=>1,
				  'ga.isShow'=>1];
		// 筛选条件
		$type = input('type');
		$filterWhere = '';
		switch ($type) {
			case 'pic':// 晒图
				$filterWhere['ga.images'] = ['<>',''];
				break;
			case 'best':// 好评
				$filterWhere = "(ga.goodsScore+ga.serviceScore+ga.timeScore)>=15*0.9";
				break;
			case 'good':// 中评
				$filterWhere = "(ga.goodsScore+ga.serviceScore+ga.timeScore)>=15*0.6 and (ga.goodsScore+ga.serviceScore+ga.timeScore)<15*0.9";
				break;
			case 'bad':// 差评
				$filterWhere = "(ga.goodsScore+ga.serviceScore+ga.timeScore)<15*0.6";
				break;
		}
		$rs  = 	$this->alias('ga')
					 ->field('DISTINCT(ga.id),ga.content,ga.images,ga.shopReply,ga.replyTime,ga.createTime,ga.goodsScore,ga.serviceScore,ga.timeScore,ga.shopId,ga.orderId,s.shopName,u.userPhoto,u.loginName,u.userTotalScore,goodsSpecNames')
					 ->join('__USERS__ u','ga.userId=u.userId','left')
					 ->join('__ORDER_GOODS__ og','og.orderId=ga.orderId and og.goodsId=ga.goodsId','inner')
					 ->join('__SHOPS__ s','ga.shopId=s.shopId','inner')
					 ->where($where)
					 ->where($filterWhere)
					 ->paginate()
					 ->toArray();
	
		foreach($rs['Rows'] as $k=>$v){
			// 格式化时间
			$rs['Rows'][$k]['createTime'] = date('Y-m-d',strtotime($v['createTime']));
			$rs['Rows'][$k]['goodsSpecNames'] = str_replace('@@_@@',',',$v['goodsSpecNames']);
			// 总评分
			$rs['Rows'][$k]['avgScore'] = ceil(($v['goodsScore'] + $v['serviceScore'] + $v['timeScore'])/3);
			if($anonymous){
				$start = floor((strlen($v['loginName'])/2))-1;
				$rs['Rows'][$k]['loginName'] = substr_replace($v['loginName'],'***',$start,3);
			}
			//获取用户等级
			$rrs = WSTUserRank($v['userTotalScore']);
			$rs['Rows'][$k]['userTotalScore'] = $rrs['userrankImg'];
			$rs['Rows'][$k]['rankName'] = empty($rrs['rankName'])?' ':$rrs['rankName'];
		}
		// 获取该商品 各评价数
		$eachApprNum = $this->getGoodsEachApprNum($goodsId);
		$rs['bestNum'] = $eachApprNum['best'];
		$rs['goodNum'] = $eachApprNum['good'];
		$rs['badNum'] = $eachApprNum['bad'];
		$rs['picNum'] = $eachApprNum['pic'];
		$rs['sum'] = $eachApprNum['sum'];
		if($rs!==false){
			return WSTReturn('',1,$rs);
		}else{
			return WSTReturn($this->getError(),-1);
		}
	}
	/**
	* 根据商品id获取各评价数
	*/
	public function getGoodsEachApprNum($goodsId){
		$rs = $this->field('(goodsScore+timeScore+serviceScore) as sumScore')->where(['dataFlag'=>1,'isShow'=>1,'goodsId'=>$goodsId])->select();
		$data = [];
		$best=0;
		$good=0;
		$bad=0;
		foreach($rs as $k=>$v){
			$sumScore = $v['sumScore'];
			// 计算好、差评数
			if($sumScore >= 15*0.9){
				++$best;
			}else if($sumScore < 15*0.6){
				++$bad;
			}
		}
		$data['best'] = $best;
		$data['bad'] = $bad;
		$data['good'] = count($rs)-$best-$bad;
		// 晒图评价数
		$data['pic'] = $this->where(['dataFlag'=>1,'isShow'=>1,'goodsId'=>$goodsId,'images'=>['<>','']])->count();
		// 总评价数
		$data['sum'] = $this->where(['dataFlag'=>1,'isShow'=>1,'goodsId'=>$goodsId])->count();
		return $data;
	}

	/**
	* 商家回复评价
	*/
	public function shopReply(){
		$id = (int)input('id');
		$data['shopReply'] = input('reply');
		$data['replyTime'] = date('Y-m-d');
		$rs = $this->where('id',$id)->update($data);
		if($rs !== false){
			return WSTReturn('回复成功',1);
		}else{
			return WSTReturn('回复失败',-1);
		}

	}
}