Comment.php 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2017~2021 https://www.yiovo.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
  8. // +----------------------------------------------------------------------
  9. // | Author: 萤火科技 <admin@yiovo.com>
  10. // +----------------------------------------------------------------------
  11. declare(strict_types=1);
  12. namespace app\store\model;
  13. use app\common\library\helper;
  14. use app\common\model\Comment as CommentModel;
  15. use app\store\model\CommentImage as CommentImageModel;
  16. /**
  17. * 商品评价模型
  18. * Class Comment
  19. * @package app\store\model
  20. */
  21. class Comment extends CommentModel
  22. {
  23. protected $append = ['status_text'];
  24. /**
  25. * 获取评价列表
  26. * @param array $param
  27. * @return mixed
  28. */
  29. public function getList(array $param = [])
  30. {
  31. // 检索查询条件
  32. $query = $this->setQueryFilter($param);
  33. // 查询列表数据
  34. return $query->with(['user.avatar', 'orderGoods' => ['image'], 'images.file'])
  35. ->alias($this->name)
  36. ->field(["$this->name.*"])
  37. ->join('goods', "goods.goods_id = {$this->name}.goods_id")
  38. ->join('order', "order.order_id = {$this->name}.order_id")
  39. ->join('user', "user.user_id = {$this->name}.user_id")
  40. ->where("{$this->name}.is_delete", '=', 0)
  41. ->order(["{$this->name}.sort" => 'asc', "{$this->name}.create_time" => 'desc'])
  42. ->paginate(15);
  43. }
  44. /**
  45. * 检索查询条件
  46. * @param array $param
  47. * @return \think\db\BaseQuery
  48. */
  49. private function setQueryFilter(array $param)
  50. {
  51. // 实例化查询对象
  52. $query = $this->getNewQuery();
  53. // 查询参数
  54. $params = $this->setQueryDefaultValue($param, [
  55. 'score' => 0, // 评分 (1-5)
  56. 'goodsName' => '', // 商品名称/编码
  57. 'orderNo' => '', // 订单号
  58. 'userId' => 0, // 用户id
  59. 'status' => -1, // 评价状态 -1全部 0-待审核 1-审核通过 2-审核不通过 3-已解释
  60. 'nickName' => '', // 买家昵称
  61. 'content' => '', // 评价内容
  62. ]);
  63. // 评分
  64. $params['score'] > 0 && $query->where("{$this->name}.score", '=', $params['score']);
  65. // 商品名称/编码
  66. !empty($params['goodsName']) && $query->where('goods.goods_name|goods.goods_no', 'like', "%{$params['goodsName']}%");
  67. // 订单号
  68. !empty($params['orderNo']) && $query->where('order.order_no', 'like', "%{$params['orderNo']}%");
  69. // 用户id
  70. $params['userId'] > 0 && $query->where("{$this->name}.user_id", '=', $params['userId']);
  71. // 评价状态
  72. if ($params['status'] == 3) {
  73. $query->where('reply_content', '<>', '');
  74. } else {
  75. $params['status'] > -1 && $query->where("{$this->name}.status", '=', $params['status']);
  76. }
  77. // 买家昵称
  78. !empty($params['nickName']) && $query->where("{$this->name}.nick_name", 'like', "%{$params['nickName']}%");
  79. // 评价内容
  80. !empty($params['content']) && $query->where("{$this->name}.content", 'like', "%{$params['content']}%");
  81. // 起止时间
  82. if (!empty($params['betweenTime'])) {
  83. $times = between_time($params['betweenTime']);
  84. $filter[] = ["{$this->name}.create_time", '>=', $times['start_time']];
  85. $filter[] = ["{$this->name}.create_time", '<', $times['end_time'] + 86400];
  86. $query->where($filter);
  87. }
  88. return $query;
  89. }
  90. /**
  91. * 获取评价详情
  92. * @param int $commentId
  93. * @return Comment|array|null
  94. */
  95. public function getDetail(int $commentId)
  96. {
  97. // 评价详情
  98. $detail = static::detail($commentId, ['images.file']);
  99. // 图片ID集
  100. $detail['imageIds'] = helper::getArrayColumn($detail, 'image_id');
  101. // 图片列表
  102. $detail['imageList'] = helper::getArrayColumn($detail['images'], 'file');
  103. return $detail;
  104. }
  105. /**
  106. * 更新记录
  107. * @param array $data
  108. * @return bool
  109. */
  110. public function edit(array $data)
  111. {
  112. return $this->transaction(function () use ($data) {
  113. // 更新商品图片记录
  114. CommentImageModel::updates((int)$this['comment_id'], $data['imageIds']);
  115. // 是否为图片评价
  116. $data['is_picture'] = !empty($data['images']);
  117. // 更新评论记录
  118. return $this->save($data);
  119. });
  120. }
  121. public function reply($data)
  122. {
  123. return $this->save(['reply_content' => $data['reply_content']]);
  124. }
  125. /**
  126. * @param array $commentIds
  127. * @param bool $state
  128. * @return bool
  129. */
  130. public function setStatus(array $commentIds, bool $state)
  131. {
  132. // 批量更新记录
  133. return static::updateBase(['status' => $state ? 1 : 2], [['comment_id', 'in', $commentIds]]);
  134. }
  135. /**
  136. * 软删除
  137. * @return false|int
  138. */
  139. public function setDelete()
  140. {
  141. return $this->save(['is_delete' => 1]);
  142. }
  143. /**
  144. * 获取评价总数量
  145. * @return int|string
  146. */
  147. public function getCommentTotal()
  148. {
  149. return $this->where(['is_delete' => 0])->count();
  150. }
  151. /**
  152. * 导入评论
  153. */
  154. public function importFake($filename)
  155. {
  156. $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
  157. $excel = $reader->load(root_path('runtime/storage') . $filename);
  158. $sheet = $excel->getSheet(0);
  159. $totalRows = $sheet->getHighestRow();
  160. $totalColumn = $sheet->getHighestColumn();
  161. \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($totalColumn);
  162. $insert = [];
  163. for ($j = 1; $j <= $totalRows; $j++) {
  164. $goodsId = trim((string)$sheet->getCell('A' . $j)->getValue());
  165. $nickName = (string)$sheet->getCell('C' . $j)->getValue();
  166. $content = (string)$sheet->getCell('D' . $j)->getValue();
  167. $createTime = (string)$sheet->getCell('E' . $j)->getValue();
  168. // 验证表格模板正确性
  169. if ($j == 1 && ($goodsId != 'goods_id' || $nickName != 'nick_name' || $content != 'content' || $createTime != 'create_time')) {
  170. $error = '表格模板不正确';
  171. return false;
  172. }
  173. if ($j == 2 && ($goodsId != '商品ID' || $nickName != '昵称' || $content != '评价内容' || $createTime != '评价时间')) {
  174. $error = '表格模板不正确';
  175. return false;
  176. }
  177. if ($j <= 2) { // 跳过 1,2行 字段名称,字段说明
  178. continue;
  179. }
  180. if (!$goodsId || !$nickName || !$content || !$createTime) {
  181. continue;
  182. }
  183. $insert[] = [
  184. 'score' => 5,
  185. 'content' => $content,
  186. 'user_id' => 0,
  187. 'nick_name' => $nickName,
  188. 'goods_id' => $goodsId,
  189. 'store_id' => 10001,
  190. 'is_public' => 1,
  191. 'status' => 1,
  192. 'create_time' => strtotime($createTime),
  193. 'update_time' => strtotime($createTime),
  194. ];
  195. }
  196. // 写入评价
  197. return $this->addAll($insert);
  198. }
  199. // public function removeEmojiChar($str)
  200. // {
  201. // $mbLen = mb_strlen($str);
  202. //
  203. // $strArr = [];
  204. // for ($i = 0; $i < $mbLen; $i++) {
  205. // $mbSubstr = mb_substr($str, $i, 1, 'utf-8');
  206. // if (strlen($mbSubstr) >= 4) {
  207. // continue;
  208. // }
  209. // $strArr[] = $mbSubstr;
  210. // }
  211. //
  212. // return implode('', $strArr);
  213. // }
  214. }