// +---------------------------------------------------------------------- declare(strict_types=1); namespace app\store\model; use app\common\library\helper; use app\common\model\Comment as CommentModel; use app\store\model\CommentImage as CommentImageModel; /** * 商品评价模型 * Class Comment * @package app\store\model */ class Comment extends CommentModel { protected $append = ['status_text']; /** * 获取评价列表 * @param array $param * @return mixed */ public function getList(array $param = []) { // 检索查询条件 $query = $this->setQueryFilter($param); // 查询列表数据 return $query->with(['user.avatar', 'orderGoods' => ['image'], 'images.file']) ->alias($this->name) ->field(["$this->name.*"]) ->join('goods', "goods.goods_id = {$this->name}.goods_id") ->join('order', "order.order_id = {$this->name}.order_id") ->join('user', "user.user_id = {$this->name}.user_id") ->where("{$this->name}.is_delete", '=', 0) ->order(["{$this->name}.sort" => 'asc', "{$this->name}.create_time" => 'desc']) ->paginate(15); } /** * 检索查询条件 * @param array $param * @return \think\db\BaseQuery */ private function setQueryFilter(array $param) { // 实例化查询对象 $query = $this->getNewQuery(); // 查询参数 $params = $this->setQueryDefaultValue($param, [ 'score' => 0, // 评分 (1-5) 'goodsName' => '', // 商品名称/编码 'orderNo' => '', // 订单号 'userId' => 0, // 用户id 'status' => -1, // 评价状态 -1全部 0-待审核 1-审核通过 2-审核不通过 3-已解释 'nickName' => '', // 买家昵称 'content' => '', // 评价内容 ]); // 评分 $params['score'] > 0 && $query->where("{$this->name}.score", '=', $params['score']); // 商品名称/编码 !empty($params['goodsName']) && $query->where('goods.goods_name|goods.goods_no', 'like', "%{$params['goodsName']}%"); // 订单号 !empty($params['orderNo']) && $query->where('order.order_no', 'like', "%{$params['orderNo']}%"); // 用户id $params['userId'] > 0 && $query->where("{$this->name}.user_id", '=', $params['userId']); // 评价状态 if ($params['status'] == 3) { $query->where('reply_content', '<>', ''); } else { $params['status'] > -1 && $query->where("{$this->name}.status", '=', $params['status']); } // 买家昵称 !empty($params['nickName']) && $query->where("{$this->name}.nick_name", 'like', "%{$params['nickName']}%"); // 评价内容 !empty($params['content']) && $query->where("{$this->name}.content", 'like', "%{$params['content']}%"); // 起止时间 if (!empty($params['betweenTime'])) { $times = between_time($params['betweenTime']); $filter[] = ["{$this->name}.create_time", '>=', $times['start_time']]; $filter[] = ["{$this->name}.create_time", '<', $times['end_time'] + 86400]; $query->where($filter); } return $query; } /** * 获取评价详情 * @param int $commentId * @return Comment|array|null */ public function getDetail(int $commentId) { // 评价详情 $detail = static::detail($commentId, ['images.file']); // 图片ID集 $detail['imageIds'] = helper::getArrayColumn($detail, 'image_id'); // 图片列表 $detail['imageList'] = helper::getArrayColumn($detail['images'], 'file'); return $detail; } /** * 更新记录 * @param array $data * @return bool */ public function edit(array $data) { return $this->transaction(function () use ($data) { // 更新商品图片记录 CommentImageModel::updates((int)$this['comment_id'], $data['imageIds']); // 是否为图片评价 $data['is_picture'] = !empty($data['images']); // 更新评论记录 return $this->save($data); }); } public function reply($data) { return $this->save(['reply_content' => $data['reply_content']]); } /** * @param array $commentIds * @param bool $state * @return bool */ public function setStatus(array $commentIds, bool $state) { // 批量更新记录 return static::updateBase(['status' => $state ? 1 : 2], [['comment_id', 'in', $commentIds]]); } /** * 软删除 * @return false|int */ public function setDelete() { return $this->save(['is_delete' => 1]); } /** * 获取评价总数量 * @return int|string */ public function getCommentTotal() { return $this->where(['is_delete' => 0])->count(); } /** * 导入评论 */ public function importFake($filename) { $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); $excel = $reader->load(root_path('runtime/storage') . $filename); $sheet = $excel->getSheet(0); $totalRows = $sheet->getHighestRow(); $totalColumn = $sheet->getHighestColumn(); \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($totalColumn); $insert = []; for ($j = 1; $j <= $totalRows; $j++) { $goodsId = trim((string)$sheet->getCell('A' . $j)->getValue()); $nickName = (string)$sheet->getCell('C' . $j)->getValue(); $content = (string)$sheet->getCell('D' . $j)->getValue(); $createTime = (string)$sheet->getCell('E' . $j)->getValue(); // 验证表格模板正确性 if ($j == 1 && ($goodsId != 'goods_id' || $nickName != 'nick_name' || $content != 'content' || $createTime != 'create_time')) { $error = '表格模板不正确'; return false; } if ($j == 2 && ($goodsId != '商品ID' || $nickName != '昵称' || $content != '评价内容' || $createTime != '评价时间')) { $error = '表格模板不正确'; return false; } if ($j <= 2) { // 跳过 1,2行 字段名称,字段说明 continue; } if (!$goodsId || !$nickName || !$content || !$createTime) { continue; } $insert[] = [ 'score' => 5, 'content' => $content, 'user_id' => 0, 'nick_name' => $nickName, 'goods_id' => $goodsId, 'store_id' => 10001, 'is_public' => 1, 'status' => 1, 'create_time' => strtotime($createTime), 'update_time' => strtotime($createTime), ]; } // 写入评价 return $this->addAll($insert); } // public function removeEmojiChar($str) // { // $mbLen = mb_strlen($str); // // $strArr = []; // for ($i = 0; $i < $mbLen; $i++) { // $mbSubstr = mb_substr($str, $i, 1, 'utf-8'); // if (strlen($mbSubstr) >= 4) { // continue; // } // $strArr[] = $mbSubstr; // } // // return implode('', $strArr); // } }