ChatService.php 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392
  1. <?php
  2. namespace App\JsonRpc;
  3. use App\Model\ChatFriends;
  4. use App\Model\ChatGroups;
  5. use App\Model\ChatGroupsMember;
  6. use App\Model\ChatRecords;
  7. use App\Model\ChatTopic;
  8. use App\Model\ChatTopicsReply;
  9. use App\Model\Contact;
  10. use App\Model\TalkGroup;
  11. use App\Model\TalkGroupMember;
  12. use App\Model\TalkRecords;
  13. use App\Model\TalkRecordsFile;
  14. use App\Model\TalkSession;
  15. use App\Model\TalkSessionAssociation;
  16. use App\Model\User;
  17. use App\Tools\PublicData;
  18. use App\Tools\Result;
  19. use Hyperf\DbConnection\Db;
  20. use Hyperf\RpcServer\Annotation\RpcService;
  21. #[RpcService(name: "ChatService", protocol: "jsonrpc-http", server: "jsonrpc-http")]
  22. class ChatService implements ChatServiceInterface
  23. {
  24. /**
  25. * 获取用户信息
  26. * @param array $data
  27. * @return array
  28. */
  29. public function getFriendInfo(array $data): array
  30. {
  31. $result = ChatFriends::where('friend_id', $data['friend_id'])
  32. ->where('user_id', $data['user_id'])
  33. ->select(
  34. 'chat_friends.*',
  35. 'user.user_name',
  36. 'user.mobile',
  37. 'user.nickname',
  38. 'user.avatar'
  39. )
  40. ->leftJoin('user', 'user.id', '=', 'chat_friends.friend_id')
  41. ->first();
  42. return Result::success($result);
  43. }
  44. /**
  45. * 搜索好友
  46. * @param array $data
  47. * @return array
  48. */
  49. public function searchFriend(array $data): array
  50. {
  51. $keyword = $data['keyword'];
  52. $userId = $data['user_id'];
  53. $result = User::where('user_name', 'like', '%' . $data['keyword'] . '%')
  54. ->orWhere('nickname', 'like', '%' . $data['keyword'] . '%')
  55. ->orWhere('mobile', 'like', '%' . $data['keyword'] . '%')
  56. ->leftJoin('chat_friends', function ($join) use ($userId) {
  57. $join->on('user.id', '=', 'chat_friends.friend_id')
  58. ->where('chat_friends.user_id', $userId);
  59. })
  60. ->select('user.*', 'chat_friends.remark as remark', 'chat_friends.id as isfriend')
  61. ->get();
  62. if ($result) {
  63. return Result::success($result);
  64. } else {
  65. return Result::error('没有找到相关好友');
  66. }
  67. }
  68. /**
  69. * 添加申请
  70. * @param array $data
  71. * @return array
  72. */
  73. public function addFriend(array $data): array
  74. {
  75. Db::beginTransaction();
  76. try
  77. {
  78. // 检查是否存在相同的记录
  79. $existingRecord = ChatFriends::where([
  80. 'user_id' => $data['user_id'],
  81. 'friend_id' => $data['friend_id'],
  82. ])->first();
  83. if ($existingRecord) {
  84. Db::rollBack();
  85. if ($existingRecord->status == 1) {
  86. return Result::error("好友申请已存在", 0);
  87. } elseif ($existingRecord->status == 2) {
  88. return Result::error("已经是好友关系", 0);
  89. }
  90. }
  91. $result = ChatFriends::insertGetId($data);
  92. Db::commit();
  93. } catch (\Throwable $ex) {
  94. Db::rollBack();
  95. var_dump($ex->getMessage());
  96. return Result::error("添加好友申请失败", 0);
  97. }
  98. return Result::success("添加成功");
  99. }
  100. /**
  101. * 好友列表
  102. * @param array $data
  103. * @return array
  104. */
  105. public function getFriendsList(array $data): array
  106. {
  107. var_dump($data);
  108. $result = ChatFriends::leftJoin('user', 'user.id', '=', 'chat_friends.friend_id')
  109. ->select(
  110. 'chat_friends.*',
  111. 'user.user_name',
  112. 'user.mobile',
  113. 'user.nickname',
  114. 'user.avatar'
  115. )
  116. ->where([
  117. ['user_id', $data['user_id']],
  118. ['chat_friends.status', $data['status']], // 明确指定 chat_friends 表中的 status 列
  119. ])
  120. ->get();
  121. return Result::success($result);
  122. }
  123. /**
  124. * 好友列表
  125. * @param array $data
  126. * @return array
  127. */
  128. public function getFriendsApplyList(array $data): array
  129. {
  130. var_dump($data);
  131. $result = ChatFriends::leftJoin('user', 'user.id', '=', 'chat_friends.friend_id')
  132. ->select(
  133. 'chat_friends.*',
  134. 'user.user_name',
  135. 'user.mobile',
  136. 'user.nickname',
  137. 'user.avatar'
  138. )
  139. ->where([
  140. ['friend_id', $data['friend_id']],
  141. ['chat_friends.status', $data['status']], // 明确指定 chat_friends 表中的 status 列
  142. ])
  143. ->get();
  144. return Result::success($result);
  145. }
  146. /**
  147. * 更新申请
  148. * @param array $data
  149. * @return array
  150. */
  151. public function applyFriend(array $data): array
  152. {
  153. $status = $data['status'];
  154. //判断同意还是不同意
  155. if ($status == 2) {
  156. Db::beginTransaction();
  157. try {
  158. $where = [
  159. 'id' => $data['id'],
  160. 'status' => 1,
  161. ];
  162. $fr = ChatFriends::where($where)->first();
  163. if (empty($fr)) {
  164. Db::rollBack();
  165. return Result::error("好友申请记录不存在,已经是好友了", 0);
  166. }
  167. $data['status'] = $status;
  168. $data['applied_at'] = date("Y-m-d H:i:s"); //好友审核时间操作人friend_id
  169. ChatFriends::where($where)->update($data);
  170. ChatFriends::updateOrInsert([
  171. 'user_id' => $fr['friend_id'],
  172. 'friend_id' => $fr['user_id'],
  173. // 'remark' => $data['remark'],
  174. 'status' => $status,
  175. ]);
  176. Db::commit();
  177. } catch (\Throwable $ex) {
  178. Db::rollBack();
  179. var_dump($ex->getMessage());
  180. return Result::error("同意添加为好友失败", 0);
  181. }
  182. return Result::success(['添加成功']);
  183. } else if ($status == 4) { //拒绝
  184. Db::beginTransaction();
  185. try {
  186. $where1 = [
  187. 'id' => $data['id'],
  188. ];
  189. $deletedRows = ChatFriends::where($where1)->delete();
  190. if ($deletedRows > 0) {
  191. Db::commit();
  192. } else {
  193. // 处理记录不存在的情况
  194. Db::rollBack();
  195. throw new \Exception('记录不存在');
  196. }
  197. } catch (\Throwable $ex) {
  198. Db::rollBack();
  199. var_dump($ex->getMessage());
  200. return Result::error("拒绝添加好友失败", 0);
  201. }
  202. return Result::success(['已经拒绝']);
  203. }
  204. }
  205. /**
  206. * 删除好友
  207. * @param array $data
  208. * @return array
  209. */
  210. public function delFriend(array $data): array
  211. {
  212. $where = [
  213. 'user_id' => $data['user_id'],
  214. 'friend_id' => $data['friend_id'],
  215. ];
  216. $orwhere = [
  217. 'friend_id' => $data['user_id'],
  218. 'user_id' => $data['friend_id'],
  219. ];
  220. $result = ChatFriends::where($where)
  221. ->orWhere($orwhere)->delete();
  222. if ($result) {
  223. return Result::success("删除成功”");
  224. } else {
  225. return Result::error('删除失败');
  226. }
  227. }
  228. /**
  229. * 是否好友
  230. * @param array $data
  231. * @return array
  232. */
  233. public function isFriend(array $data): array
  234. {
  235. $where = [
  236. 'user_id' => $data['user_id'],
  237. 'friend_id' => $data['friend_id'],
  238. ];
  239. $result = ChatFriends::where($where)->first();
  240. if ($result) {
  241. return Result::success(true);
  242. } else {
  243. return Result::error('不是好友');
  244. }
  245. }
  246. /**
  247. * 添加聊天内容
  248. * @param array $data
  249. * @return array
  250. */
  251. public function addChatRecords(array $data): array
  252. {
  253. Db::beginTransaction();
  254. try {;
  255. //添加会话内容
  256. $ChatRecordsData = [[
  257. 'msg_type' => $data['msg_type'] ?? 0,
  258. 'user_id' => $data['user_id'] ?? 0,
  259. 'is_read' => $data['is_read'] ?? 0,
  260. 'talk_type' => $data['talk_type'] ?? 0,
  261. 'action' => $data['action'] ?? 0,
  262. 'group_receiver_id' => $data['group_receiver_id'] ?? 0,
  263. 'content' => $data['content'] ?? '',
  264. 'receiver_id' => $data['receiver_id'] ?? '',
  265. ]];
  266. ChatRecords::insert($ChatRecordsData);
  267. Db::commit();} catch (\Throwable $ex) {
  268. Db::rollBack();
  269. var_dump($ex->getMessage());
  270. return Result::error("存储消息失败", 0);
  271. }
  272. return Result::success([]);
  273. }
  274. /**
  275. * 修改好友备注
  276. * @param array $data
  277. * @return array
  278. */
  279. public function updateFriend(array $data): array
  280. {
  281. $result = ChatFriends::where(['user_id' => $data['user_id'],
  282. 'friend_id' => $data['friend_id'],
  283. 'status' => 2,
  284. ])->update(['remark' => $data['remark']]);
  285. if ($result) {
  286. return Result::success('修改成功');
  287. } else {
  288. return Result::error('修改失败');
  289. }
  290. }
  291. /**
  292. * 会话列表
  293. * @param array $data
  294. * @return array
  295. */
  296. public function getConversation(array $data): array
  297. {
  298. $userId = $data['user_id'];
  299. $unreadMessages = ChatRecords::where('user_id', $userId)
  300. ->where('is_read', 0)
  301. ->leftJoin('user', 'chat_records.receiver_id', '=', 'user.id')
  302. ->leftJoin('chat_groups', 'chat_records.receiver_id', '=', 'chat_groups.id')
  303. ->select(
  304. 'receiver_id',
  305. DB::raw('COUNT(receiver_id) AS num'),
  306. DB::raw('MAX(chat_records.id) AS max_id'),
  307. 'user.user_name as user_name',
  308. 'user.avatar as avatar',
  309. 'user.mobile as mobile',
  310. 'chat_groups.group_name as group_name'
  311. )
  312. ->groupBy('receiver_id')
  313. ->orderBy(DB::raw('MAX(chat_records.id)'), 'desc')
  314. ->get();
  315. // 查询已读消息,并将 num 字段设置为 0
  316. $readMessages = ChatRecords::where('user_id', $userId)
  317. ->where('is_read', 1)
  318. ->leftJoin('user', 'chat_records.receiver_id', '=', 'user.id')
  319. ->leftJoin('chat_groups', 'chat_records.receiver_id', '=', 'chat_groups.id')
  320. ->select(
  321. 'receiver_id',
  322. DB::raw('0 AS num'),
  323. DB::raw('MAX(chat_records.id) AS max_id'),
  324. 'user.user_name as user_name',
  325. 'user.avatar as avatar',
  326. 'user.mobile as mobile',
  327. 'chat_groups.group_name as group_name'
  328. )
  329. ->groupBy('receiver_id')
  330. ->orderBy(DB::raw('MAX(chat_records.id)'), 'desc')
  331. ->get();
  332. // 合并未读消息和已读消息
  333. $allMessages = array_merge($unreadMessages->toArray(), $readMessages->toArray());
  334. // var_dump($allMessages);
  335. // 处理结果,判断是否是群聊
  336. $formattedMessages = [];
  337. foreach ($allMessages as $message) {
  338. $formattedMessage = [
  339. 'receiver_id' => $message['receiver_id'],
  340. 'num' => $message['num'],
  341. 'max_id' => $message['max_id'],
  342. 'user_name' => $message['user_name'],
  343. 'avatar' => $message['avatar'],
  344. 'mobile' => $message['mobile'],
  345. 'group_name' => $message['group_name'],
  346. ];
  347. if (strlen($message['receiver_id']) === 18) { // 判断是否是 UUID
  348. $formattedMessage['type'] = 'group';
  349. $formattedMessage['name'] = $message['group_name'];
  350. $formattedMessage['is_group'] = 1;
  351. } else {
  352. $formattedMessage['type'] = 'user';
  353. $formattedMessage['name'] = $message['user_name'];
  354. $formattedMessage['is_group'] = 0;
  355. }
  356. $formattedMessages[] = $formattedMessage;
  357. }
  358. if (!empty($formattedMessages)) {
  359. return Result::success($formattedMessages);
  360. } else {
  361. return Result::error('没有消息');
  362. }
  363. }
  364. /**
  365. * 获取聊天记录
  366. * @param array $data
  367. * @return array
  368. */
  369. public function getChatRecords(array $data): array
  370. {
  371. Db::beginTransaction();
  372. try {
  373. $userId = $data['user_id'];
  374. $friendId = $data['friend_id'];
  375. $result = ChatRecords::where(function ($query) use ($userId, $friendId) {
  376. $query->where('user_id', $userId)->where('receiver_id', $friendId);
  377. })
  378. // ->orWhere(function ($query) use ($userId, $friendId) {
  379. // $query->where('user_id', $friendId)->where('receiver_id', $userId);
  380. // })
  381. ->leftJoin('user as u1', 'chat_records.user_id', '=', 'u1.id')
  382. ->leftJoin('user as u2', 'chat_records.receiver_id', '=', 'u2.id')
  383. ->select('chat_records.*', 'u1.user_name as user_id_name', 'u1.avatar as user_avatar', 'u2.user_name as receiver_id_name', 'u2.avatar as receiver_avatar')
  384. ->orderBy('id', 'desc')->paginate(100);
  385. //更新聊天记录已读
  386. ChatRecords::where('user_id', $userId)
  387. ->where('receiver_id', $friendId)
  388. ->where('is_read', 0)
  389. ->where('talk_type', 1)
  390. ->update(['is_read' => 1]);
  391. Db::commit();
  392. } catch (\Throwable $ex) {
  393. Db::rollBack();
  394. var_dump($ex->getMessage());
  395. return Result::error("获取聊天记录失败", 0);
  396. }
  397. if ($result) {
  398. return Result::success($result);
  399. } else {
  400. return Result::error('没有聊天记录');
  401. }
  402. }
  403. /**
  404. * 获取群聊天记录
  405. * @param array $data
  406. * @return array
  407. */
  408. public function getGroupChatRecords(array $data): array
  409. {
  410. Db::beginTransaction();
  411. try {
  412. $userId = $data['user_id'];
  413. $group_id = $data['group_id'];
  414. $result = ChatRecords::where('receiver_id', $group_id)
  415. ->where('user_id', $userId)
  416. ->leftJoin('user as u1', 'chat_records.user_id', '=', 'u1.id')
  417. ->leftJoin('user as u2', 'chat_records.group_receiver_id', '=', 'u2.id')
  418. ->select('chat_records.*', 'u1.user_name as user_id_name', 'u1.avatar as user_avatar', 'u2.user_name as receiver_id_name', 'u2.avatar as receiver_avatar')
  419. ->orderBy('id', 'asc')->paginate(100);
  420. //更新群聊天记录
  421. ChatRecords::where('receiver_id', $group_id)
  422. ->where('user_id', $userId)
  423. ->update(['is_read' => 1]);
  424. Db::commit();
  425. } catch (\Throwable $ex) {
  426. Db::rollBack();
  427. var_dump($ex->getMessage());
  428. return Result::error("获取群聊天记录失败", 0);
  429. }
  430. if ($result) {
  431. return Result::success($result);
  432. } else {
  433. return Result::error('没有群消息');
  434. }
  435. }
  436. /**
  437. * 群组 - 创建群
  438. * @param array $data
  439. * @return array
  440. */
  441. public function addGroup(array $data): array
  442. {
  443. Db::beginTransaction();
  444. try {
  445. //创建群
  446. $groupData = [
  447. 'id' => PublicData::uuid(),
  448. 'creator_id' => $data['user_id'],
  449. 'group_name' => $data['group_name'],
  450. 'avatar' => $data['avatar'] ?? '',
  451. 'profile' => $data['profile'] ?? '',
  452. ];
  453. ChatGroups::insert($groupData);
  454. //创建群用户
  455. $groupMemberData = [];
  456. if ($data['group_member']) {
  457. foreach ($data['group_member'] as $key => $val) {
  458. $groupMemberData[$key] = [
  459. 'id' => PublicData::uuid(),
  460. 'group_id' => $groupData['id'],
  461. 'user_id' => $val,
  462. 'leader' => $data['user_id'] == $val ? 2 : 0,
  463. ];
  464. }
  465. }
  466. ChatGroupsMember::insert($groupMemberData);
  467. //插入一条消息
  468. $chatRecordsData = [
  469. 'user_id' => $data['user_id'],
  470. 'receiver_id' => $groupData['id'],
  471. 'content' => '我创建了一个群' . Date('Y-m-d H:i:s'),
  472. 'msg_type' => 1,
  473. 'is_read' => 0,
  474. 'talk_type' => 2,
  475. 'group_receiver_id' => $data['user_id'],
  476. ];
  477. ChatRecords::insert($chatRecordsData);
  478. Db::commit();
  479. } catch (\Throwable $ex) {
  480. Db::rollBack();
  481. var_dump($ex->getMessage());
  482. return Result::error("创建群失败", 0);
  483. }
  484. return Result::success([]);
  485. }
  486. /**
  487. * 群组 - 加入群
  488. * @param array $data
  489. * @return array
  490. */
  491. public function addGroupMember(array $data): array
  492. {
  493. $result = ChatGroupsMember::where(['group_id' => $data['group_id'], 'user_id' => $data['user_id']])->update(['leader' => 2]);
  494. if ($result) {
  495. return Result::success('修改成功');
  496. } else {
  497. return Result::error('修改失败');
  498. }
  499. }
  500. /**
  501. * 群组 - 群信息
  502. * @param array $data
  503. * @return array
  504. */
  505. public function getGroupInfo(array $data): array
  506. {
  507. $result = ChatGroups::where(['chat_groups.id' => $data['group_id']])
  508. ->join('user', 'chat_groups.creator_id', '=', 'user.id')
  509. ->select('chat_groups.*', 'user.user_name as user_name', 'user.avatar as avatar')
  510. ->first();
  511. return Result::success($result);
  512. }
  513. /**
  514. * 群组 - 删除群
  515. * @param array $data
  516. * @return array
  517. */
  518. public function delGroup(array $data): array
  519. {
  520. Db::beginTransaction();
  521. try {
  522. $groupMember = ChatGroupsMember::where(['group_id' => $data['group_id']])->delete();
  523. $result = ChatGroups::where(['id' => $data['group_id']])->delete();
  524. //群聊记录
  525. Db::commit();
  526. } catch (\Throwable $ex) {
  527. Db::rollBack();
  528. var_dump($ex->getMessage());
  529. return Result::error("删除群失败", 0);
  530. }
  531. if ($result) {
  532. return Result::success('删除成功');
  533. } else {
  534. return Result::error('删除失败');
  535. }
  536. }
  537. /**
  538. * 群组 - 退出群
  539. * @param array $data
  540. * @return array
  541. */
  542. public function quitGroup(array $data): array
  543. {
  544. $result = ChatGroupsMember::where(['group_id' => $data['group_id'], 'user_id' => $data['user_id']])->delete();
  545. if ($result) {
  546. return Result::success('退出成功');
  547. } else {
  548. return Result::error('退出失败');
  549. }
  550. }
  551. /**
  552. * 群组 - 我的群
  553. * @param array $data
  554. * @return array
  555. */
  556. public function getGroupList(array $data): array
  557. {
  558. $result = ChatGroupsMember::where(['user_id' => $data['user_id']])
  559. ->leftJoin('chat_groups', 'chat_groups_members.group_id', '=', 'chat_groups.id')
  560. ->select('chat_groups.*', 'chat_groups_members.group_id as group_id')
  561. ->orderBy('chat_groups.id', 'desc')
  562. ->paginate(100);
  563. return Result::success($result);
  564. }
  565. /**
  566. * 群组 - 删除群成员
  567. * @param array $data
  568. * @return array
  569. */
  570. public function delGroupMembers(array $data): array
  571. {
  572. $result = ChatGroupsMember::where(['group_id' => $data['group_id'], 'user_id' => $data['user_id']])->delete();
  573. if ($result) {
  574. return Result::success('删除成功');
  575. } else {
  576. return Result::error('删除失败');
  577. }
  578. }
  579. /**
  580. * 群组 - 更新群
  581. * @param array $data
  582. * @return array
  583. */
  584. public function updateGroup(array $data): array
  585. {
  586. // 提取需要的字段
  587. $groupId = $data['group_id'];
  588. $groupName = $data['group_name'] ?? null;
  589. $profile = $data['profile'] ?? null;
  590. $avatar = $data['avatar'] ?? null;
  591. // 查询群组
  592. $group = ChatGroups::find($groupId);
  593. if (!$group) {
  594. return Result::error('群组不存在');
  595. }
  596. // 更新群组信息
  597. if ($groupName !== null) {
  598. $group->group_name = $groupName;
  599. }
  600. if ($profile !== null) {
  601. $group->profile = $profile;
  602. }
  603. if ($avatar !== null) {
  604. $group->avatar = $avatar;
  605. }
  606. // 保存更改
  607. if ($group->save()) {
  608. return Result::success($group->toArray());
  609. } else {
  610. return Result::error('更新群组信息失败');
  611. }
  612. }
  613. /**
  614. * 群组 - 删除群
  615. * @param array $data
  616. * @return array
  617. */
  618. public function deleteGroup(array $data): array
  619. {
  620. $result = ChatGroups::where(['id' => $data['group_id']])->delete();
  621. if ($result) {
  622. return Result::success('删除成功');
  623. } else {
  624. return Result::error('删除失败');
  625. }
  626. }
  627. /**
  628. * 群组 - 群用户列表
  629. * @param array $data
  630. * @return array
  631. */
  632. public function getGroupMembers(array $data): array
  633. {
  634. $groupMember = ChatGroupsMember::where(['group_id' => $data['group_id']])
  635. ->leftJoin('user as u1', 'chat_groups_members.user_id', '=', 'u1.id')
  636. ->select('chat_groups_members.*', 'u1.user_name', 'u1.avatar')
  637. ->orderBy('id', 'desc')
  638. ->get();
  639. return Result::success($groupMember);
  640. }
  641. /**
  642. * 群组 - 创建群
  643. * @param array $data
  644. * @return array
  645. */
  646. public function addTalkGroup(array $data): array
  647. {
  648. Db::beginTransaction();
  649. try {
  650. //创建群
  651. $groupData = [
  652. 'id' => PublicData::uuid(),
  653. 'creator_id' => $data['user_id'],
  654. 'group_name' => $data['group_name'],
  655. ];
  656. TalkGroup::insert($groupData);
  657. //创建群用户
  658. $groupMemberData = [];
  659. if ($data['user_id_arr']) {
  660. foreach ($data['user_id_arr'] as $key => $val) {
  661. $groupMemberData[$key] = [
  662. 'id' => PublicData::uuid(),
  663. 'group_id' => $groupData['id'],
  664. 'user_id' => $val,
  665. 'leader' => $data['user_id'] == $val ? 2 : 0,
  666. ];
  667. }
  668. }
  669. TalkGroupMember::insert($groupMemberData);
  670. //创建会话
  671. $sessionData = [
  672. 'id' => PublicData::uuid(),
  673. 'talk_type' => '2',
  674. ];
  675. TalkSession::insertGetId($sessionData);
  676. //创建会话关系
  677. $talkSessionAssociationData = [];
  678. if ($data['user_id_arr']) {
  679. foreach ($data['user_id_arr'] as $key => $val) {
  680. $talkSessionAssociationData[$key] = [
  681. 'id' => PublicData::uuid(),
  682. 'user_id' => $val,
  683. 'to_user_id' => $groupData['id'],
  684. 'session_id' => $sessionData['id'],
  685. ];
  686. }
  687. }
  688. TalkSessionAssociation::insert($talkSessionAssociationData);
  689. Db::commit();
  690. } catch (\Throwable $ex) {
  691. Db::rollBack();
  692. var_dump($ex->getMessage());
  693. return Result::error("创建群失败", 0);
  694. }
  695. return Result::success([]);
  696. }
  697. /**
  698. * 群组 - 更新群
  699. * @param array $data
  700. * @return array
  701. */
  702. public function updateTalkGroup(array $data): array
  703. {
  704. $where = [
  705. 'id' => $data['id'],
  706. ];
  707. $result = TalkGroup::where($where)->update($data);
  708. if ($result) {
  709. return Result::success($data);
  710. } else {
  711. return Result::error($data);
  712. }
  713. }
  714. /**
  715. * 群组 - 删除群
  716. * @param array $data
  717. * @return array
  718. */
  719. public function delTalkGroup(array $data): array
  720. {
  721. $where = [
  722. 'id' => $data['id'],
  723. ];
  724. $result = TalkGroup::where($where)->delete();
  725. if ($result) {
  726. return Result::success($data);
  727. } else {
  728. return Result::error($data);
  729. }
  730. }
  731. /**
  732. * 群组 - 群用户列表
  733. * @param array $data
  734. * @return array
  735. */
  736. public function getTalkGroupMember(array $data): array
  737. {
  738. $where = [
  739. 'group_id' => $data['group_id'],
  740. ];
  741. $result = TalkGroupMember::where($where)->get();
  742. return Result::success($result);
  743. }
  744. /**
  745. * 群组 - 全部群用户列表
  746. * @param array $data
  747. * @return array
  748. */
  749. public function getAllTalkGroupMember(array $data): array
  750. {
  751. $where = [
  752. 'group_id' => $data['group_id'],
  753. ];
  754. $result = TalkGroupMember::where($where)->get();
  755. return Result::success($result);
  756. }
  757. /**
  758. * 群组 - 创建群用户
  759. * @param array $data
  760. * @return array
  761. */
  762. public function addTalkGroupMember(array $data): array
  763. {
  764. $result = TalkGroupMember::insertGetId($data);
  765. if ($result) {
  766. return Result::success($data);
  767. } else {
  768. return Result::error($data);
  769. }
  770. }
  771. /**
  772. * 群组 - 更新群用户
  773. * @param array $data
  774. * @return array
  775. */
  776. public function updateTalkGroupMember(array $data): array
  777. {
  778. $where = [
  779. 'id' => $data['id'],
  780. ];
  781. $result = TalkGroupMember::where($where)->update($data);
  782. if ($result) {
  783. return Result::success($data);
  784. } else {
  785. return Result::error($data);
  786. }
  787. }
  788. /**
  789. * 群组 - 删除群用户
  790. * @param array $data
  791. * @return array
  792. */
  793. public function delTalkGroupMember(array $data): array
  794. {
  795. $where = [
  796. 'id' => $data['id'],
  797. ];
  798. $result = TalkGroupMember::where($where)->delete();
  799. if ($result) {
  800. return Result::success($data);
  801. } else {
  802. return Result::error($data);
  803. }
  804. }
  805. /**
  806. * 群组 - 添加群
  807. * @param array $data
  808. * @return array
  809. */
  810. public function joinGroup(array $data): array
  811. {
  812. $group = ChatGroups::where(['id' => $data['group_id']])->first();
  813. if (empty($group)) {
  814. return Result::error("群不存在", 0);
  815. }
  816. $groupMember = ChatGroupsMember::where(['user_id' => $data['user_id'], 'group_id' => $data['group_id']])->first();
  817. if ($groupMember) {
  818. return Result::error("已加入群", 0);
  819. }
  820. $info = [
  821. 'id' => PublicData::uuid(),
  822. 'user_id' => $data['user_id'],
  823. 'group_id' => $data['group_id'],
  824. ];
  825. $result = ChatGroupsMember::insertGetId($info);
  826. if ($result) {
  827. return Result::success($data);
  828. } else {
  829. return Result::error($data);
  830. };
  831. }
  832. /**
  833. * 话题 - 列表
  834. * @param array $data
  835. * @return array
  836. */
  837. public function getTopicsList(array $data): array
  838. {
  839. $where = [];
  840. if (!empty($data['title'])) {
  841. $where[] = ['chat_topics.title', 'like', '%' . $data['title'] . '%'];
  842. }
  843. if (!empty($data['user_id'])) {
  844. $where[] = ['user_id', '=', $data['user_id']];
  845. }
  846. if (!empty($data['status'])) {
  847. $where[] = ['chat_topics.status', '=', $data['status']];
  848. }
  849. if (!empty($data['type'])) {
  850. $where[] = ['chat_topics.type', '=', $data['type']];
  851. }
  852. if (!empty($data['nickname'])) {
  853. $where[] = ['user.nickname', '=', $data['nickname']];
  854. }
  855. var_dump($where);
  856. $result = ChatTopic::where($where)
  857. ->leftJoin('user', 'user.id', '=', 'chat_topics.user_id')
  858. ->select('chat_topics.*', 'user.nickname', 'user.avatar', 'user.user_name')
  859. ->paginate($data['page_size']);
  860. return Result::success($result);
  861. }
  862. public function getTopic(array $data): array
  863. {
  864. $result = ChatTopic::where(['id' => $data['id']])->first();
  865. return Result::success($result);
  866. }
  867. public function addTopic(array $data): array
  868. {
  869. try {
  870. $result = ChatTopic::insertGetId($data);
  871. if ($result && $data['is_group'] == 1) {
  872. //chat_group
  873. $group_id = PublicData::uuid();
  874. $groupData = [
  875. 'id' => $group_id,
  876. 'creator_id' => $data['user_id'],
  877. 'group_name' => $data['group_name'] ?? '',
  878. 'profile' => $data['profile'] ?? 0,
  879. ];
  880. $groupResult = ChatGroups::insertGetId($groupData);
  881. $groupMemberData = [
  882. 'id' => PublicData::uuid(),
  883. 'user_id' => $data['user_id'],
  884. 'group_id' => $group_id,
  885. 'leader' => 2,
  886. ];
  887. $groupMemberResult = ChatGroupsMember::insertGetId($groupMemberData);
  888. //更新result的 group_id
  889. $data['group_id'] = $group_id;
  890. ChatTopic::where(['id' => $result])->update($data);
  891. // 查询 Chattopic 数据
  892. $chattopic = Chattopic::find($result);
  893. }
  894. Db::beginTransaction();
  895. Db::commit();
  896. } catch (\Exception $e) {
  897. Db::rollBack();
  898. return Result::error($data, $e->getMessage());
  899. }
  900. return Result::success($chattopic);
  901. }
  902. public function updateTopic(array $data): array
  903. {
  904. $result = ChatTopic::where(['id' => $data['id']])->update($data);
  905. if ($result) {
  906. return Result::success($data);
  907. } else {
  908. return Result::error($data);
  909. };
  910. }
  911. public function delTopic(array $data): array
  912. {
  913. $result = ChatTopic::where(['id' => $data['id']])->delete();
  914. //删除群和成员和聊天
  915. //删除话题回复
  916. if ($result) {
  917. return Result::success($data);
  918. } else {
  919. return Result::error('删除失败');
  920. };
  921. }
  922. public function getTopicInfo(array $data): array
  923. {
  924. $result = ChatTopic::where(['chat_topics.id' => $data['id']])
  925. ->leftJoin('user', 'user.id', '=', 'chat_topics.user_id')
  926. ->select('chat_topics.*', 'user.nickname', 'user.avatar', 'user.user_name')
  927. ->first();
  928. return Result::success($result);
  929. }
  930. public function addReply(array $data): array
  931. {
  932. $result = ChatTopic::where(['id' => $data['id']])->get();
  933. if ($result) {
  934. $replydata['content'] = $data['content'];
  935. $replydata['user_id'] = $data['user_id'];
  936. $replydata['topic_id'] = $data['id'];
  937. $re = ChatTopicsReply::insertGetId($replydata);
  938. }
  939. if ($re) {
  940. return Result::success($data);
  941. } else {
  942. return Result::error($data);
  943. }
  944. }
  945. public function getTopicReply(array $data): array
  946. {
  947. $result = ChatTopicsReply::where(['topic_id' => $data['id']])
  948. ->leftJoin('user', 'user.id', '=', 'chat_topics_reply.user_id')
  949. ->select('chat_topics_reply.*', 'user.nickname', 'user.avatar', 'user.user_name')
  950. ->paginate($data['page_size']);
  951. return Result::success($result);
  952. }
  953. /**------------------E
  954. * @param array $data
  955. * @return array
  956. */
  957. public function getChatChannelList(array $data): array
  958. {
  959. $result = ChatFriends::where($data)->get();
  960. return Result::success($result);
  961. }
  962. /**
  963. * @param array $data
  964. * @return array
  965. */
  966. public function delChatChannel(array $data): array
  967. {
  968. $result = ChatFriends::where(['fd' => $data['fd']])->delete();
  969. if ($result) {
  970. return Result::success($data);
  971. } else {
  972. return Result::error($data);
  973. }
  974. }
  975. /**
  976. * @param array $data
  977. * @return array
  978. */
  979. public function addChatChannel(array $data): array
  980. {
  981. $result = ChatFriends::insertGetId($data);
  982. if ($result) {
  983. return Result::success($data);
  984. } else {
  985. return Result::error($data);
  986. }
  987. }
  988. /**
  989. * 好友查询
  990. * @param array $data
  991. * @return array
  992. */
  993. public function getContactList(array $data): array
  994. {
  995. $where = [
  996. ['contact.status', '=', '1'],
  997. ['contact.user_id', '=', $data['user_id']],
  998. ];
  999. if (isset($data['pageSize'])) {
  1000. $result = Contact::where($where)
  1001. ->where(function ($query) use ($data) {
  1002. $query->where('user.nickname', 'like', '%' . $data['keyWord'] . '%')
  1003. ->orWhere('contact.remark', 'like', '%' . $data['keyWord'] . '%');
  1004. })
  1005. ->leftJoin('user', 'user.id', '=', 'contact.friend_id')
  1006. ->select('contact.*', 'user.nickname', 'user.avatar')
  1007. ->limit($data['pageSize'])->offset(($data['page'] - 1) * $data['pageSize'])->orderBy("contact.created_at", "desc")->get();
  1008. } else {
  1009. $result = Contact::where($where)
  1010. ->where(function ($query) use ($data) {
  1011. $query->where('user.nickname', 'like', '%' . $data['keyWord'] . '%')
  1012. ->orWhere('contact.remark', 'like', '%' . $data['keyWord'] . '%');
  1013. })
  1014. ->leftJoin('user', 'user.id', '=', 'contact.friend_id')
  1015. ->select('contact.*', 'user.nickname', 'user.avatar')
  1016. ->get();
  1017. }
  1018. $count = Contact::where($where)
  1019. ->where(function ($query) use ($data) {
  1020. $query->where('user.nickname', 'like', '%' . $data['keyWord'] . '%')
  1021. ->orWhere('contact.remark', 'like', '%' . $data['keyWord'] . '%');
  1022. })
  1023. ->leftJoin('user', 'user.id', '=', 'contact.friend_id')
  1024. ->count();
  1025. if (empty($result)) {
  1026. return Result::error("没有数据", 0);
  1027. }
  1028. $rep = $result->toArray();
  1029. $data = [
  1030. 'rows' => $rep,
  1031. 'count' => $count,
  1032. ];
  1033. return Result::success($data);
  1034. }
  1035. /**
  1036. * 添加好友
  1037. * @param array $data
  1038. * @return array
  1039. */
  1040. public function addContact(array $data): array
  1041. {
  1042. $result = Contact::insertGetId($data);
  1043. if ($result) {
  1044. return Result::success($data);
  1045. } else {
  1046. return Result::error($data);
  1047. }
  1048. }
  1049. /**
  1050. * 更新好友
  1051. * @param array $data
  1052. * @return array
  1053. */
  1054. public function updateContact(array $data): array
  1055. {
  1056. $where = [
  1057. 'id' => $data['id'],
  1058. ];
  1059. $result = Contact::where($where)->update($data);
  1060. if ($result) {
  1061. return Result::success($data);
  1062. } else {
  1063. return Result::error($data);
  1064. }
  1065. }
  1066. /**
  1067. * 会话列表
  1068. * @param array $data
  1069. * @return array
  1070. */
  1071. public function getTalkSessionList(array $data): array
  1072. {
  1073. $where = [
  1074. 'talk_session_association.status' => '1',
  1075. 'talk_session_association.user_id' => $data['user_id'],
  1076. ];
  1077. $result = TalkSessionAssociation::where($where)
  1078. ->leftJoin('talk_session', 'talk_session.id', 'talk_session_association.session_id')
  1079. ->leftJoin('user', 'user.id', 'talk_session_association.to_user_id')
  1080. ->leftJoin('talk_group', 'talk_group.id', 'talk_session_association.to_user_id')
  1081. ->select(
  1082. 'talk_session.talk_type',
  1083. 'talk_group.group_name',
  1084. 'talk_group.avatar as group_avatar',
  1085. 'user.avatar as user_avatar',
  1086. 'user.nickname',
  1087. 'talk_session.last_content',
  1088. 'user.user_name',
  1089. 'talk_session.id as session_id',
  1090. 'talk_session.talk_type',
  1091. 'user.id as user_id',
  1092. 'talk_group.id as group_id'
  1093. )
  1094. ->limit($data['pageSize'])->offset(($data['page'] - 1) * $data['pageSize'])->orderBy("talk_session.updated_at", "desc")->get();
  1095. $count = TalkSessionAssociation::where($where)
  1096. ->leftJoin('talk_session', 'talk_session.id', 'talk_session_association.session_id')
  1097. ->leftJoin('user', 'user.id', 'talk_session_association.to_user_id')
  1098. ->leftJoin('talk_group', 'talk_group.id', 'talk_session_association.to_user_id')
  1099. ->count();
  1100. $repData = [
  1101. 'row' => $result,
  1102. 'count' => $count,
  1103. ];
  1104. return Result::success($repData);
  1105. }
  1106. /**
  1107. * 添加会话
  1108. * @param array $data
  1109. * @return array
  1110. */
  1111. public function addTalkSession(array $data): array
  1112. {
  1113. $result = TalkSession::insert($data);
  1114. if ($result) {
  1115. return Result::success(['id' => $data['id']]);
  1116. } else {
  1117. return Result::error('创建会话失败');
  1118. }
  1119. }
  1120. /**
  1121. * 更新会话
  1122. * @param array $data
  1123. * @return array
  1124. */
  1125. public function updateTalkSession(array $data): array
  1126. {
  1127. $where = [
  1128. 'id' => $data['id'],
  1129. ];
  1130. $result = TalkSession::where($where)->update($data);
  1131. if ($result) {
  1132. return Result::success($data);
  1133. } else {
  1134. return Result::error($data);
  1135. }
  1136. }
  1137. /**
  1138. * 删除会话
  1139. * @param array $data
  1140. * @return array
  1141. */
  1142. public function delTalkSession(array $data): array
  1143. {
  1144. $where = [
  1145. 'id' => $data['id'],
  1146. ];
  1147. $result = TalkSession::where($where)->delete();
  1148. if ($result) {
  1149. return Result::success($data);
  1150. } else {
  1151. return Result::error($data);
  1152. }
  1153. }
  1154. /**
  1155. * 聊天内容-获取聊天内容列表
  1156. * @param array $data
  1157. * @return array
  1158. */
  1159. public function getTalkRecordsList(array $data): array
  1160. {
  1161. $talkSessionAssociationInfo = TalkSessionAssociation::where(['session_id' => $data['session_id'], 'to_user_id' => $data['user_id']])->first();
  1162. $where = [
  1163. 'talk_records.session_id' => $data['session_id'],
  1164. ];
  1165. if ($talkSessionAssociationInfo['status'] == 2) {
  1166. $where[] = ['talk_records.created_at', '>=', $talkSessionAssociationInfo['del_at']];
  1167. }
  1168. $result = TalkRecords::where($where)
  1169. ->leftJoin('user', 'user.id', 'talk_records.user_id')
  1170. ->select("user.avatar", "talk_records.*")
  1171. ->limit($data['pageSize'])
  1172. ->offset(($data['page'] - 1) * $data['pageSize'])
  1173. ->orderBy("talk_session.updated_at", "desc")
  1174. ->get();
  1175. return Result::success($result);
  1176. }
  1177. /**
  1178. * 更新聊天内容
  1179. * @param array $data
  1180. * @return array
  1181. */
  1182. public function updateTalkRecords(array $data): array
  1183. {
  1184. $where = [
  1185. 'id' => $data['id'],
  1186. ];
  1187. $result = TalkRecords::where($where)->update($data);
  1188. if ($result) {
  1189. return Result::success($data);
  1190. } else {
  1191. return Result::error($data);
  1192. }
  1193. }
  1194. /**
  1195. * 删除聊天内容
  1196. * @param array $data
  1197. * @return array
  1198. */
  1199. public function delTalkRecords(array $data): array
  1200. {
  1201. $where = [
  1202. 'id' => $data['id'],
  1203. ];
  1204. $result = TalkRecords::where($where)->delete();
  1205. if ($result) {
  1206. return Result::success($data);
  1207. } else {
  1208. return Result::error($data);
  1209. }
  1210. }
  1211. /**
  1212. * 聊天内容-附件列表
  1213. * @param array $data
  1214. * @return array
  1215. */
  1216. public function getTalkRecordsFileList(array $data): array
  1217. {
  1218. $result = TalkRecordsFile::get();
  1219. return Result::success($result);
  1220. }
  1221. /**
  1222. * 聊天内容-添加附件
  1223. * @param array $data
  1224. * @return array
  1225. */
  1226. public function addTalkRecordsFile(array $data): array
  1227. {
  1228. $result = TalkRecordsFile::insertGetId($data);
  1229. if ($result) {
  1230. return Result::success($data);
  1231. } else {
  1232. return Result::error($data);
  1233. }
  1234. }
  1235. /**
  1236. * 聊天内容 - 更新附件
  1237. * @param array $data
  1238. * @return array
  1239. */
  1240. public function updateTalkRecordsFile(array $data): array
  1241. {
  1242. $where = [
  1243. 'id' => $data['id'],
  1244. ];
  1245. $result = TalkRecordsFile::where($where)->update($data);
  1246. if ($result) {
  1247. return Result::success($data);
  1248. } else {
  1249. return Result::error($data);
  1250. }
  1251. }
  1252. /**
  1253. * 聊天内容 - 删除附件
  1254. * @param array $data
  1255. * @return array
  1256. */
  1257. public function delTalkRecordsFile(array $data): array
  1258. {
  1259. $where = [
  1260. 'id' => $data['id'],
  1261. ];
  1262. $result = TalkRecordsFile::where($where)->delete();
  1263. if ($result) {
  1264. return Result::success($data);
  1265. } else {
  1266. return Result::error($data);
  1267. }
  1268. }
  1269. /**
  1270. * 群组 - 群列表
  1271. * @param array $data
  1272. * @return array
  1273. */
  1274. public function getTalkGroupList(array $data): array
  1275. {
  1276. $result = TalkGroup::get();
  1277. return Result::success($result);
  1278. }
  1279. /**
  1280. * 更新 会话关系
  1281. * @param array $data
  1282. * @return array
  1283. */
  1284. public function updateTalkSessionAssociation(array $data): array
  1285. {
  1286. $where = [
  1287. 'id' => $data['id'],
  1288. ];
  1289. $result = TalkSessionAssociation::where($where)->update($data);
  1290. if ($result) {
  1291. return Result::success($data);
  1292. } else {
  1293. return Result::error($data);
  1294. }
  1295. }
  1296. /**
  1297. * 添加会话关系
  1298. * @param array $data
  1299. * @return array
  1300. */
  1301. public function addTalkSessionAssociation(array $data): array
  1302. {
  1303. var_dump($data);
  1304. $result = TalkSessionAssociation::insertGetId($data);
  1305. if ($result) {
  1306. return Result::success($data);
  1307. } else {
  1308. return Result::error($data);
  1309. }
  1310. }
  1311. /**
  1312. * 修改群成员
  1313. * @param array $data
  1314. * @return array
  1315. */
  1316. public function updateGroupMembers(array $data): array
  1317. {
  1318. $where = [
  1319. 'group_id' => $data['group_id'],
  1320. ];
  1321. $group_id = $data['group_id'];
  1322. //先删除群成员
  1323. $result = ChatGroupsMember::where($where)
  1324. ->where([["user_id",'!=',$data['user_id']]])->delete();
  1325. $groupMemberData = [];
  1326. foreach ($data['group_member'] as $value) {
  1327. $groupMemberData[] = [
  1328. 'id' => PublicData::uuid(),
  1329. 'user_id' => $value,
  1330. 'group_id' => $group_id,
  1331. 'leader' => 0,
  1332. ];
  1333. }
  1334. $result = ChatGroupsMember::where($where)->insert($groupMemberData);
  1335. // 获取群信息
  1336. $groupInfo = ChatGroups::where(['id'=>$group_id])->first();
  1337. if ($result) {
  1338. return Result::success($groupInfo);
  1339. } else {
  1340. return Result::error($data);
  1341. }
  1342. }
  1343. }