ComplaintService.php 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. <?php
  2. namespace App\Services\Common;
  3. use App\Models\ActionLogModel;
  4. use App\Models\ComplaintModel;
  5. use App\Services\BaseService;
  6. /**
  7. * 投诉建议-服务类
  8. */
  9. class ComplaintService extends BaseService
  10. {
  11. public function __construct()
  12. {
  13. $this->model = new ComplaintModel();
  14. }
  15. public static function make()
  16. {
  17. if (!self::$instance) {
  18. self::$instance = (new static());
  19. }
  20. return self::$instance;
  21. }
  22. /**
  23. * 获取数据列表
  24. * @param array $params 请求参数
  25. * @param int $pageSize 分页大小
  26. */
  27. public function getDataList($params, $pageSize = 15)
  28. {
  29. try {
  30. $query = $this->model->where('mark', 1);
  31. // 状态筛选
  32. if (isset($params['status']) && $params['status'] !== '') {
  33. $query->where('status', $params['status']);
  34. }
  35. // 关键词搜索
  36. if (isset($params['keyword']) && $params['keyword']) {
  37. $keyword = $params['keyword'];
  38. $query->where(function ($q) use ($keyword) {
  39. $q->where('realname', 'like', '%' . $keyword . '%')
  40. ->orWhere('mobile', 'like', '%' . $keyword . '%')
  41. ->orWhere('content', 'like', '%' . $keyword . '%');
  42. });
  43. }
  44. $list = $query->with(['user'])
  45. ->orderBy('id', 'desc')
  46. ->paginate($pageSize);
  47. $list = $list ? $list->toArray() : [];
  48. if ($list && isset($list['data'])) {
  49. foreach ($list['data'] as &$item) {
  50. $item['create_time'] = $item['create_time'] ? date('Y-m-d H:i:s', $item['create_time']) : '';
  51. $item['update_time'] = $item['update_time'] ? date('Y-m-d H:i:s', $item['update_time']) : '';
  52. // 处理图片
  53. if (!empty($item['albums'])) {
  54. $albums = json_decode($item['albums'], true);
  55. if (is_array($albums)) {
  56. $item['albums_array'] = array_map(function($album) {
  57. // 如果是对象格式 {"url": "..."}
  58. if (is_array($album) && isset($album['url'])) {
  59. return get_image_url($album['url']);
  60. }
  61. // 如果是字符串格式
  62. return get_image_url($album);
  63. }, $albums);
  64. } else {
  65. $item['albums_array'] = [];
  66. }
  67. } else {
  68. $item['albums_array'] = [];
  69. }
  70. // 状态文本
  71. $item['status_text'] = $this->getStatusText($item['status']);
  72. // 用户信息
  73. if (isset($item['user']) && !empty($item['user'])) {
  74. $item['user_name'] = $item['user']['nickname'] ?? $item['user']['username'] ?? '-';
  75. $item['user_avatar'] = isset($item['user']['avatar']) ? get_image_url($item['user']['avatar']) : '';
  76. } else {
  77. $item['user_name'] = '-';
  78. $item['user_avatar'] = '';
  79. }
  80. }
  81. }
  82. return [
  83. 'msg' => '操作成功',
  84. 'code' => 0,
  85. 'data' => $list['data'] ?? [],
  86. 'count' => $list['total'] ?? 0,
  87. ];
  88. } catch (\Exception $e) {
  89. return [
  90. 'msg' => '查询失败: ' . $e->getMessage(),
  91. 'code' => 1,
  92. 'data' => [],
  93. 'count' => 0,
  94. ];
  95. }
  96. }
  97. /**
  98. * 获取状态文本
  99. */
  100. private function getStatusText($status)
  101. {
  102. $statusMap = [
  103. 1 => '待处理',
  104. 2 => '已处理'
  105. ];
  106. return isset($statusMap[$status]) ? $statusMap[$status] : '未知';
  107. }
  108. /**
  109. * 编辑(处理投诉)
  110. */
  111. public function edit($data = [])
  112. {
  113. if (empty($data)) {
  114. $data = request()->all();
  115. }
  116. if (empty($data['id'])) {
  117. return ['code' => 1, 'msg' => '参数错误'];
  118. }
  119. // 只允许修改备注和状态
  120. $updateData = [
  121. 'update_time' => time()
  122. ];
  123. if (isset($data['remark'])) {
  124. $updateData['remark'] = $data['remark'];
  125. }
  126. if (isset($data['status'])) {
  127. $updateData['status'] = $data['status'];
  128. }
  129. $result = $this->model->where('id', $data['id'])->update($updateData);
  130. if ($result !== false) {
  131. ActionLogModel::setTitle("处理投诉建议");
  132. ActionLogModel::record();
  133. return ['code' => 0, 'msg' => '操作成功'];
  134. }
  135. return ['code' => 1, 'msg' => '操作失败'];
  136. }
  137. /**
  138. * 删除
  139. */
  140. public function delete()
  141. {
  142. $id = request()->post('id');
  143. if (!$id) {
  144. return ['code' => 1, 'msg' => '参数错误'];
  145. }
  146. // 支持批量删除
  147. if (is_array($id)) {
  148. $result = $this->model->whereIn('id', $id)->update(['mark' => 0]);
  149. } else {
  150. $result = $this->model->where('id', $id)->update(['mark' => 0]);
  151. }
  152. if ($result) {
  153. ActionLogModel::setTitle("删除投诉建议");
  154. ActionLogModel::record();
  155. return ['code' => 0, 'msg' => '删除成功'];
  156. }
  157. return ['code' => 1, 'msg' => '删除失败'];
  158. }
  159. /**
  160. * 修改状态
  161. */
  162. public function status()
  163. {
  164. $params = request()->all();
  165. $id = isset($params['id']) ? intval($params['id']) : 0;
  166. $status = isset($params['status']) ? intval($params['status']) : 0;
  167. if (!$id) {
  168. return ['code' => 1, 'msg' => 'ID不能为空'];
  169. }
  170. if (!$status || ($status != 1 && $status != 2)) {
  171. return ['code' => 1, 'msg' => '状态参数错误'];
  172. }
  173. $result = $this->model->where('id', $id)->update([
  174. 'status' => $status,
  175. 'update_time' => time()
  176. ]);
  177. if ($result !== false) {
  178. ActionLogModel::setTitle("修改投诉状态");
  179. ActionLogModel::record();
  180. return ['code' => 0, 'msg' => '状态修改成功'];
  181. }
  182. return ['code' => 1, 'msg' => '状态修改失败'];
  183. }
  184. /**
  185. * 获取详情
  186. */
  187. public function getInfo($id)
  188. {
  189. $info = $this->model->with(['user'])->where('id', $id)->where('mark', 1)->first();
  190. if (!$info) {
  191. return ['code' => 1, 'msg' => '数据不存在'];
  192. }
  193. $info = $info->toArray();
  194. // 处理图片
  195. if (!empty($info['albums'])) {
  196. $albums = json_decode($info['albums'], true);
  197. if (is_array($albums)) {
  198. $info['albums_array'] = array_map(function($album) {
  199. // 如果是对象格式 {"url": "..."}
  200. if (is_array($album) && isset($album['url'])) {
  201. return get_image_url($album['url']);
  202. }
  203. // 如果是字符串格式
  204. return get_image_url($album);
  205. }, $albums);
  206. } else {
  207. $info['albums_array'] = [];
  208. }
  209. } else {
  210. $info['albums_array'] = [];
  211. }
  212. // 用户信息
  213. if (isset($info['user']) && !empty($info['user'])) {
  214. $info['user_name'] = $info['user']['nickname'] ?? $info['user']['username'] ?? '-';
  215. $info['user_avatar'] = isset($info['user']['avatar']) ? get_image_url($info['user']['avatar']) : '';
  216. } else {
  217. $info['user_name'] = '-';
  218. $info['user_avatar'] = '';
  219. }
  220. return ['code' => 0, 'data' => $info];
  221. }
  222. }