ChatService.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742
  1. <?php
  2. namespace App\JsonRpc;
  3. use App\Model\ChatChannel;
  4. use App\Model\ContactApply;
  5. use App\Model\Contact;
  6. use App\Model\TalkSession;
  7. use App\Model\TalkRecords;
  8. use App\Model\TalkRecordsFile;
  9. use App\Model\TalkGroup;
  10. use App\Model\TalkGroupMember;
  11. use App\Model\TalkSessionAssociation;
  12. use App\Tools\PublicData;
  13. use Hyperf\DbConnection\Db;
  14. use Hyperf\RpcServer\Annotation\RpcService;
  15. use App\Tools\Result;
  16. #[RpcService(name: "ChatService", protocol: "jsonrpc-http", server: "jsonrpc-http")]
  17. class ChatService implements ChatServiceInterface
  18. {
  19. /**
  20. * @param array $data
  21. * @return array
  22. */
  23. public function getChatChannelList(array $data): array
  24. {
  25. $result = ChatChannel::get();
  26. return Result::success($result);
  27. }
  28. /**
  29. * @param array $data
  30. * @return array
  31. */
  32. public function delChatChannel(array $data): array
  33. {
  34. $result = ChatChannel::where(['fd'=>$data['fd']])->delete();
  35. if($result){
  36. return Result::success($data);
  37. }else{
  38. return Result::error($data);
  39. }
  40. }
  41. /**
  42. * @param array $data
  43. * @return array
  44. */
  45. public function addChatChannel(array $data): array
  46. {
  47. $result = ChatChannel::insertGetId($data);
  48. if($result){
  49. return Result::success($data);
  50. }else{
  51. return Result::error($data);
  52. }
  53. }
  54. /**
  55. * 添加申请
  56. * @param array $data
  57. * @return array
  58. */
  59. public function addContactApply(array $data): array
  60. {
  61. $result = ContactApply::insertGetId($data);
  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 updateContactApply(array $data): array
  74. {
  75. $type = $data['type'];
  76. //判断同意还是不同意
  77. if($type == 1){
  78. Db::beginTransaction();
  79. try{
  80. //同意 双方互为好友 -添加好友关系
  81. $data1 = [
  82. 'user_id'=>$data['user_id'],
  83. 'friend_id'=>$data['friend_id'],
  84. ];
  85. Contact::insertGetId($data1);
  86. $data2 = [
  87. 'user_id'=>$data['friend_id'],
  88. 'friend_id'=>$data['user_id'],
  89. ];
  90. Contact::insertGetId($data2);
  91. $where1 = [
  92. 'friend_id'=>$data['user_id'],
  93. 'user_id'=>$data['friend_id'],
  94. ];
  95. ContactApply::where($where1)->delete();
  96. //创建会话
  97. $sessionData = [
  98. 'id'=>PublicData::uuid(),
  99. 'talk_type'=>'1',
  100. ];
  101. TalkSession::insert($sessionData);
  102. //添加会话关系
  103. $talkSessionAssociationData = [
  104. [
  105. 'id'=>PublicData::uuid(),
  106. 'user_id'=>$data['user_id'],
  107. 'to_user_id'=>$data['friend_id'],
  108. 'session_id'=>$sessionData['id']
  109. ]
  110. ,[
  111. 'id'=>PublicData::uuid(),
  112. 'user_id'=>$data['friend_id'],
  113. 'to_user_id'=>$data['user_id'],
  114. 'session_id'=>$sessionData['id']
  115. ]
  116. ];
  117. TalkSessionAssociation::insert($talkSessionAssociationData);
  118. Db::commit();
  119. } catch(\Throwable $ex){
  120. Db::rollBack();
  121. var_dump($ex->getMessage());
  122. return Result::error("同意添加为好友失败",0);
  123. }
  124. }else if($type == 2){
  125. Db::beginTransaction();
  126. try{
  127. $where1 = [
  128. 'friend_id'=>$data['user_id'],
  129. 'user_id'=>$data['friend_id'],
  130. ];
  131. ContactApply::where($where1)->delete();
  132. Db::commit();
  133. } catch(\Throwable $ex){
  134. Db::rollBack();
  135. var_dump($ex->getMessage());
  136. return Result::error("拒绝添加好友失败",0);
  137. }
  138. }
  139. return Result::success([]);
  140. }
  141. /**
  142. * 好友申请列表
  143. * @param array $data
  144. * @return array
  145. */
  146. public function getContactApplyList(array $data): array
  147. {
  148. $where = [
  149. 'friend_id'=>$data['user_id']
  150. ];
  151. $result = ContactApply::where($where)->get();
  152. return Result::success($result);
  153. }
  154. /**
  155. * 好有查询
  156. * @param array $data
  157. * @return array
  158. */
  159. public function getContactList(array $data): array
  160. {
  161. $where = [
  162. ['contact.status','=','1'],
  163. ['contact.user_id','=',$data['user_id']],
  164. ];
  165. if(isset($data['pageSize'])){
  166. $result = Contact::where($where)
  167. ->where(function ($query) use ($data) {
  168. $query->where('user.nickname', 'like','%'.$data['keyWord'].'%')
  169. ->orWhere('contact.remark', 'like','%'.$data['keyWord'].'%');
  170. })
  171. ->leftJoin('user', 'user.id', '=', 'contact.friend_id')
  172. ->select('contact.*', 'user.nickname','user.avatar')
  173. ->limit($data['pageSize'])->offset(($data['page']-1)*$data['pageSize'])->orderBy("contact.created_at","desc")->get();
  174. }else{
  175. $result = Contact::where($where)
  176. ->where(function ($query) use ($data) {
  177. $query->where('user.nickname', 'like','%'.$data['keyWord'].'%')
  178. ->orWhere('contact.remark', 'like','%'.$data['keyWord'].'%');
  179. })
  180. ->leftJoin('user', 'user.id', '=', 'contact.friend_id')
  181. ->select('contact.*', 'user.nickname','user.avatar')
  182. ->get();
  183. }
  184. $count = Contact::where($where)
  185. ->where(function ($query) use ($data) {
  186. $query->where('user.nickname', 'like','%'.$data['keyWord'].'%')
  187. ->orWhere('contact.remark', 'like','%'.$data['keyWord'].'%');
  188. })
  189. ->leftJoin('user', 'user.id', '=', 'contact.friend_id')
  190. ->count();
  191. if (empty($result)) {
  192. return Result::error("没有数据",0);
  193. }
  194. $rep = $result->toArray();
  195. $data = [
  196. 'rows'=>$rep,
  197. 'count'=>$count
  198. ];
  199. return Result::success($data);
  200. }
  201. /**
  202. * 添加好友
  203. * @param array $data
  204. * @return array
  205. */
  206. public function addContact(array $data): array
  207. {
  208. $result = Contact::insertGetId($data);
  209. if($result){
  210. return Result::success($data);
  211. }else{
  212. return Result::error($data);
  213. }
  214. }
  215. /**
  216. * 更新好友
  217. * @param array $data
  218. * @return array
  219. */
  220. public function updateContact(array $data): array
  221. {
  222. $where = [
  223. 'id'=>$data['id']
  224. ];
  225. $result = Contact::where($where)->update($data);
  226. if($result){
  227. return Result::success($data);
  228. }else{
  229. return Result::error($data);
  230. }
  231. }
  232. /**
  233. * 删除好友 -- 软删除
  234. * @param array $data
  235. * @return array
  236. */
  237. public function delContact(array $data): array
  238. {
  239. $where = [
  240. 'user_id'=>$data['user_id'],
  241. 'friend_id'=>$data['friend_id'],
  242. ];
  243. $result = Contact::where($where)->update(['status'=>2]);
  244. if($result){
  245. return Result::success($result);
  246. }else{
  247. return Result::error('删除失败');
  248. }
  249. }
  250. /**
  251. * 会话列表
  252. * @param array $data
  253. * @return array
  254. */
  255. public function getTalkSessionList(array $data): array
  256. {
  257. $where = [
  258. 'talk_session_association.status'=>'1',
  259. 'talk_session_association.user_id'=>$data['user_id']
  260. ];
  261. $result = TalkSessionAssociation::where($where)
  262. ->leftJoin('talk_session','talk_session.id','talk_session_association.session_id')
  263. ->leftJoin('user','user.id','talk_session_association.to_user_id')
  264. ->leftJoin('talk_group','talk_group.id','talk_session_association.to_user_id')
  265. ->select(
  266. 'talk_session.talk_type',
  267. 'talk_group.group_name',
  268. 'talk_group.avatar as group_avatar',
  269. 'user.avatar as user_avatar',
  270. 'user.nickname',
  271. 'talk_session.last_content',
  272. 'user.user_name',
  273. 'talk_session.id as session_id',
  274. 'talk_session.talk_type',
  275. 'user.id as user_id',
  276. 'talk_group.id as group_id'
  277. )
  278. ->limit($data['pageSize'])->offset(($data['page']-1)*$data['pageSize'])->orderBy("talk_session.updated_at","desc")->get();
  279. $count = TalkSessionAssociation::where($where)
  280. ->leftJoin('talk_session','talk_session.id','talk_session_association.session_id')
  281. ->leftJoin('user','user.id','talk_session_association.to_user_id')
  282. ->leftJoin('talk_group','talk_group.id','talk_session_association.to_user_id')
  283. ->count();
  284. $repData = [
  285. 'row'=>$result,
  286. 'count'=>$count
  287. ];
  288. return Result::success($repData);
  289. }
  290. /**
  291. * 添加会话
  292. * @param array $data
  293. * @return array
  294. */
  295. public function addTalkSession(array $data): array
  296. {
  297. $result = TalkSession::insert($data);
  298. if($result){
  299. return Result::success(['id'=>$data['id']]);
  300. }else{
  301. return Result::error('创建会话失败');
  302. }
  303. }
  304. /**
  305. * 更新会话
  306. * @param array $data
  307. * @return array
  308. */
  309. public function updateTalkSession(array $data): array
  310. {
  311. $where = [
  312. 'id'=>$data['id']
  313. ];
  314. $result = TalkSession::where($where)->update($data);
  315. if($result){
  316. return Result::success($data);
  317. }else{
  318. return Result::error($data);
  319. }
  320. }
  321. /**
  322. * 删除会话
  323. * @param array $data
  324. * @return array
  325. */
  326. public function delTalkSession(array $data): array
  327. {
  328. $where = [
  329. 'id'=>$data['id']
  330. ];
  331. $result = TalkSession::where($where)->delete();
  332. if($result){
  333. return Result::success($data);
  334. }else{
  335. return Result::error($data);
  336. }
  337. }
  338. /**
  339. * 聊天内容-获取聊天内容列表
  340. * @param array $data
  341. * @return array
  342. */
  343. public function getTalkRecordsList(array $data): array
  344. {
  345. $talkSessionAssociationInfo = TalkSessionAssociation::where(['session_id'=>$data['session_id'],'to_user_id'=>$data['user_id']])->first();
  346. $where = [
  347. 'talk_records.session_id' =>$data['session_id'],
  348. ];
  349. if($talkSessionAssociationInfo['status'] == 2){
  350. $where[] = ['talk_records.created_at','>=',$talkSessionAssociationInfo['del_at']];
  351. }
  352. $result = TalkRecords::where($where)
  353. ->leftJoin('user','user.id','talk_records.user_id')
  354. ->select("user.avatar","talk_records.*")
  355. ->limit($data['pageSize'])
  356. ->offset(($data['page']-1)*$data['pageSize'])
  357. ->orderBy("talk_session.updated_at","desc")
  358. ->get();
  359. return Result::success($result);
  360. }
  361. /**
  362. * 添加聊天内容
  363. * @param array $data
  364. * @return array
  365. */
  366. public function addTalkRecords(array $data): array
  367. {
  368. Db::beginTransaction();
  369. try{;
  370. //添加会话内容
  371. $talkRecordsData = [
  372. 'id'=>PublicData::uuid(),
  373. 'msg_type'=>$data['msg_type']??0,
  374. 'user_id'=>$data['user_id']??0,
  375. 'session_id'=>$data['session_id']??'',
  376. 'talk_type'=>$data['talk_type']??0,
  377. 'content'=>$data['content']??'',
  378. 'receiver_id'=>$data['receiver_id']??''
  379. ];
  380. TalkRecords::insert($talkRecordsData);
  381. $fileData = [
  382. 'id'=>PublicData::uuid(),
  383. 'record_id'=>$talkRecordsData['id']??'',
  384. 'user_id'=>$data['user_id']??0,
  385. 'source'=>$data['source']??'',
  386. 'type'=>$data['type']??0,
  387. 'drive'=>$data['drive']??'',
  388. 'original_name'=>$data['original_name']??'',
  389. 'suffix'=>$data['suffix']??'',
  390. 'size'=>$data['size']??0,
  391. 'path'=>$data['path']??'',
  392. ];
  393. var_dump($fileData);
  394. TalkRecordsFile::insert($fileData);
  395. Db::commit();
  396. } catch(\Throwable $ex){
  397. Db::rollBack();
  398. var_dump($ex->getMessage());
  399. return Result::error("存储消息失败",0);
  400. }
  401. return Result::success([]);
  402. }
  403. /**
  404. * 更新聊天内容
  405. * @param array $data
  406. * @return array
  407. */
  408. public function updateTalkRecords(array $data): array
  409. {
  410. $where = [
  411. 'id'=>$data['id']
  412. ];
  413. $result = TalkRecords::where($where)->update($data);
  414. if($result){
  415. return Result::success($data);
  416. }else{
  417. return Result::error($data);
  418. }
  419. }
  420. /**
  421. * 删除聊天内容
  422. * @param array $data
  423. * @return array
  424. */
  425. public function delTalkRecords(array $data): array
  426. {
  427. $where = [
  428. 'id'=>$data['id']
  429. ];
  430. $result = TalkRecords::where($where)->delete();
  431. if($result){
  432. return Result::success($data);
  433. }else{
  434. return Result::error($data);
  435. }
  436. }
  437. /**
  438. * 聊天内容-附件列表
  439. * @param array $data
  440. * @return array
  441. */
  442. public function getTalkRecordsFileList(array $data): array
  443. {
  444. $result = TalkRecordsFile::get();
  445. return Result::success($result);
  446. }
  447. /**
  448. * 聊天内容-添加附件
  449. * @param array $data
  450. * @return array
  451. */
  452. public function addTalkRecordsFile(array $data): array
  453. {
  454. $result = TalkRecordsFile::insertGetId($data);
  455. if($result){
  456. return Result::success($data);
  457. }else{
  458. return Result::error($data);
  459. }
  460. }
  461. /**
  462. * 聊天内容 - 更新附件
  463. * @param array $data
  464. * @return array
  465. */
  466. public function updateTalkRecordsFile(array $data): array
  467. {
  468. $where = [
  469. 'id'=>$data['id']
  470. ];
  471. $result = TalkRecordsFile::where($where)->update($data);
  472. if($result){
  473. return Result::success($data);
  474. }else{
  475. return Result::error($data);
  476. }
  477. }
  478. /**
  479. * 聊天内容 - 删除附件
  480. * @param array $data
  481. * @return array
  482. */
  483. public function delTalkRecordsFile(array $data): array
  484. {
  485. $where = [
  486. 'id'=>$data['id']
  487. ];
  488. $result = TalkRecordsFile::where($where)->delete();
  489. if($result){
  490. return Result::success($data);
  491. }else{
  492. return Result::error($data);
  493. }
  494. }
  495. /**
  496. * 群组 - 群列表
  497. * @param array $data
  498. * @return array
  499. */
  500. public function getTalkGroupList(array $data): array
  501. {
  502. $result = TalkGroup::get();
  503. return Result::success($result);
  504. }
  505. /**
  506. * 群组 - 创建群
  507. * @param array $data
  508. * @return array
  509. */
  510. public function addTalkGroup(array $data): array
  511. {
  512. Db::beginTransaction();
  513. try{
  514. //创建群
  515. $groupData = [
  516. 'id' => PublicData::uuid(),
  517. 'creator_id'=>$data['user_id'],
  518. 'group_name'=>$data['group_name']
  519. ];
  520. TalkGroup::insert($groupData);
  521. //创建群用户
  522. $groupMemberData = [];
  523. if($data['user_id_arr']){
  524. foreach ($data['user_id_arr'] as $key=>$val){
  525. $groupMemberData[$key] = [
  526. 'id' => PublicData::uuid(),
  527. 'group_id' => $groupData['id'],
  528. 'user_id' =>$val,
  529. 'leader' =>$data['user_id'] == $val?2:0,
  530. ];
  531. }
  532. }
  533. TalkGroupMember::insert($groupMemberData);
  534. //创建会话
  535. $sessionData = [
  536. 'id' => PublicData::uuid(),
  537. 'talk_type' => '2'
  538. ];
  539. TalkSession::insertGetId($sessionData);
  540. //创建会话关系
  541. $talkSessionAssociationData = [];
  542. if($data['user_id_arr']){
  543. foreach ($data['user_id_arr'] as $key=>$val){
  544. $talkSessionAssociationData[$key] = [
  545. 'id' => PublicData::uuid(),
  546. 'user_id' => $val,
  547. 'to_user_id' => $groupData['id'],
  548. 'session_id' =>$sessionData['id']
  549. ];
  550. }
  551. }
  552. TalkSessionAssociation::insert($talkSessionAssociationData);
  553. Db::commit();
  554. } catch(\Throwable $ex){
  555. Db::rollBack();
  556. var_dump($ex->getMessage());
  557. return Result::error("创建群失败",0);
  558. }
  559. return Result::success([]);
  560. }
  561. /**
  562. * 群组 - 更新群
  563. * @param array $data
  564. * @return array
  565. */
  566. public function updateTalkGroup(array $data): array
  567. {
  568. $where = [
  569. 'id'=>$data['id']
  570. ];
  571. $result = TalkGroup::where($where)->update($data);
  572. if($result){
  573. return Result::success($data);
  574. }else{
  575. return Result::error($data);
  576. }
  577. }
  578. /**
  579. * 群组 - 删除群
  580. * @param array $data
  581. * @return array
  582. */
  583. public function delTalkGroup(array $data): array
  584. {
  585. $where = [
  586. 'id'=>$data['id']
  587. ];
  588. $result = TalkGroup::where($where)->delete();
  589. if($result){
  590. return Result::success($data);
  591. }else{
  592. return Result::error($data);
  593. }
  594. }
  595. /**
  596. * 群组 - 群用户列表
  597. * @param array $data
  598. * @return array
  599. */
  600. public function getTalkGroupMember(array $data): array
  601. {
  602. $where = [
  603. 'group_id'=>$data['group_id']
  604. ];
  605. $result = TalkGroupMember::where($where)->get();
  606. return Result::success($result);
  607. }
  608. /**
  609. * 群组 - 全部群用户列表
  610. * @param array $data
  611. * @return array
  612. */
  613. public function getAllTalkGroupMember(array $data): array
  614. {
  615. $where = [
  616. 'group_id'=>$data['group_id']
  617. ];
  618. $result = TalkGroupMember::where($where)->get();
  619. return Result::success($result);
  620. }
  621. /**
  622. * 群组 - 创建群用户
  623. * @param array $data
  624. * @return array
  625. */
  626. public function addTalkGroupMember(array $data): array
  627. {
  628. $result = TalkGroupMember::insertGetId($data);
  629. if($result){
  630. return Result::success($data);
  631. }else{
  632. return Result::error($data);
  633. }
  634. }
  635. /**
  636. * 群组 - 更新群用户
  637. * @param array $data
  638. * @return array
  639. */
  640. public function updateTalkGroupMember(array $data): array
  641. {
  642. $where = [
  643. 'id'=>$data['id']
  644. ];
  645. $result = TalkGroupMember::where($where)->update($data);
  646. if($result){
  647. return Result::success($data);
  648. }else{
  649. return Result::error($data);
  650. }
  651. }
  652. /**
  653. * 群组 - 删除群用户
  654. * @param array $data
  655. * @return array
  656. */
  657. public function delTalkGroupMember(array $data): array
  658. {
  659. $where = [
  660. 'id'=>$data['id']
  661. ];
  662. $result = TalkGroupMember::where($where)->delete();
  663. if($result){
  664. return Result::success($data);
  665. }else{
  666. return Result::error($data);
  667. }
  668. }
  669. /**
  670. * 更新 会话关系
  671. * @param array $data
  672. * @return array
  673. */
  674. public function updateTalkSessionAssociation(array $data): array
  675. {
  676. $where = [
  677. 'id'=>$data['id']
  678. ];
  679. $result = TalkSessionAssociation::where($where)->update($data);
  680. if($result){
  681. return Result::success($data);
  682. }else{
  683. return Result::error($data);
  684. }
  685. }
  686. /**
  687. * 添加会话关系
  688. * @param array $data
  689. * @return array
  690. */
  691. public function addTalkSessionAssociation(array $data): array
  692. {
  693. var_dump($data);
  694. $result = TalkSessionAssociation::insertGetId($data);
  695. if($result){
  696. return Result::success($data);
  697. }else{
  698. return Result::error($data);
  699. }
  700. }
  701. }