ChatService.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720
  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. )
  276. ->limit($data['pageSize'])->offset(($data['page']-1)*$data['pageSize'])->orderBy("talk_session.updated_at","desc")->get();
  277. $count = TalkSessionAssociation::where($where)
  278. ->leftJoin('talk_session','talk_session.id','talk_session_association.session_id')
  279. ->leftJoin('user','user.id','talk_session_association.to_user_id')
  280. ->leftJoin('talk_group','talk_group.id','talk_session_association.to_user_id')
  281. ->count();
  282. $repData = [
  283. 'row'=>$result,
  284. 'count'=>$count
  285. ];
  286. return Result::success($repData);
  287. }
  288. /**
  289. * 添加会话
  290. * @param array $data
  291. * @return array
  292. */
  293. public function addTalkSession(array $data): array
  294. {
  295. $result = TalkSession::insert($data);
  296. if($result){
  297. return Result::success(['id'=>$data['id']]);
  298. }else{
  299. return Result::error('创建会话失败');
  300. }
  301. }
  302. /**
  303. * 更新会话
  304. * @param array $data
  305. * @return array
  306. */
  307. public function updateTalkSession(array $data): array
  308. {
  309. $where = [
  310. 'id'=>$data['id']
  311. ];
  312. $result = TalkSession::where($where)->update($data);
  313. if($result){
  314. return Result::success($data);
  315. }else{
  316. return Result::error($data);
  317. }
  318. }
  319. /**
  320. * 删除会话
  321. * @param array $data
  322. * @return array
  323. */
  324. public function delTalkSession(array $data): array
  325. {
  326. $where = [
  327. 'id'=>$data['id']
  328. ];
  329. $result = TalkSession::where($where)->delete();
  330. if($result){
  331. return Result::success($data);
  332. }else{
  333. return Result::error($data);
  334. }
  335. }
  336. /**
  337. * 聊天内容-获取聊天内容列表
  338. * @param array $data
  339. * @return array
  340. */
  341. public function getTalkRecordsList(array $data): array
  342. {
  343. $talkSessionAssociationInfo = TalkSessionAssociation::where(['session_id'=>$data['session_id'],'to_user_id'=>$data['user_id']])->first();
  344. $where = [
  345. 'talk_records.session_id' =>$data['session_id'],
  346. ];
  347. if($talkSessionAssociationInfo['status'] == 2){
  348. $where[] = ['talk_records.created_at','>=',$talkSessionAssociationInfo['del_at']];
  349. }
  350. $result = TalkRecords::where($where)
  351. ->leftJoin('user','user.id','talk_records.user_id')
  352. ->select("user.avatar","talk_records.*")
  353. ->limit($data['pageSize'])
  354. ->offset(($data['page']-1)*$data['pageSize'])
  355. ->orderBy("talk_session.updated_at","desc")
  356. ->get();
  357. return Result::success($result);
  358. }
  359. /**
  360. * 添加聊天内容
  361. * @param array $data
  362. * @return array
  363. */
  364. public function addTalkRecords(array $data): array
  365. {
  366. Db::beginTransaction();
  367. try{
  368. //添加会话内容
  369. $talkRecordsData = [
  370. 'id'=>PublicData::uuid(),
  371. 'msg_type'=>$data['msg_type']??0,
  372. 'user_id'=>$data['user_id']??0,
  373. 'session_id'=>$data['session_id']??'',
  374. 'talk_type'=>$data['talk_type']??0,
  375. 'content'=>$data['content']??'',
  376. ];
  377. TalkRecords::insert($talkRecordsData);
  378. $fileData = [
  379. 'id'=>PublicData::uuid(),
  380. 'record_id'=>$talkRecordsData['id']??'',
  381. 'user_id'=>$data['user_id']??0,
  382. 'source'=>$data['source']??'',
  383. 'type'=>$data['type']??0,
  384. 'drive'=>$data['drive']??'',
  385. 'original_name'=>$data['original_name']??'',
  386. 'suffix'=>$data['suffix']??'',
  387. 'size'=>$data['size']??0,
  388. 'path'=>$data['path']??'',
  389. ];
  390. TalkRecordsFile::insert($fileData);
  391. Db::commit();
  392. } catch(\Throwable $ex){
  393. Db::rollBack();
  394. var_dump($ex->getMessage());
  395. return Result::error("存储消息失败",0);
  396. }
  397. return Result::success([]);
  398. }
  399. /**
  400. * 更新聊天内容
  401. * @param array $data
  402. * @return array
  403. */
  404. public function updateTalkRecords(array $data): array
  405. {
  406. $where = [
  407. 'id'=>$data['id']
  408. ];
  409. $result = TalkRecords::where($where)->update($data);
  410. if($result){
  411. return Result::success($data);
  412. }else{
  413. return Result::error($data);
  414. }
  415. }
  416. /**
  417. * 删除聊天内容
  418. * @param array $data
  419. * @return array
  420. */
  421. public function delTalkRecords(array $data): array
  422. {
  423. $where = [
  424. 'id'=>$data['id']
  425. ];
  426. $result = TalkRecords::where($where)->delete();
  427. if($result){
  428. return Result::success($data);
  429. }else{
  430. return Result::error($data);
  431. }
  432. }
  433. /**
  434. * 聊天内容-附件列表
  435. * @param array $data
  436. * @return array
  437. */
  438. public function getTalkRecordsFileList(array $data): array
  439. {
  440. $result = TalkRecordsFile::get();
  441. return Result::success($result);
  442. }
  443. /**
  444. * 聊天内容-添加附件
  445. * @param array $data
  446. * @return array
  447. */
  448. public function addTalkRecordsFile(array $data): array
  449. {
  450. $result = TalkRecordsFile::insertGetId($data);
  451. if($result){
  452. return Result::success($data);
  453. }else{
  454. return Result::error($data);
  455. }
  456. }
  457. /**
  458. * 聊天内容 - 更新附件
  459. * @param array $data
  460. * @return array
  461. */
  462. public function updateTalkRecordsFile(array $data): array
  463. {
  464. $where = [
  465. 'id'=>$data['id']
  466. ];
  467. $result = TalkRecordsFile::where($where)->update($data);
  468. if($result){
  469. return Result::success($data);
  470. }else{
  471. return Result::error($data);
  472. }
  473. }
  474. /**
  475. * 聊天内容 - 删除附件
  476. * @param array $data
  477. * @return array
  478. */
  479. public function delTalkRecordsFile(array $data): array
  480. {
  481. $where = [
  482. 'id'=>$data['id']
  483. ];
  484. $result = TalkRecordsFile::where($where)->delete();
  485. if($result){
  486. return Result::success($data);
  487. }else{
  488. return Result::error($data);
  489. }
  490. }
  491. /**
  492. * 群组 - 群列表
  493. * @param array $data
  494. * @return array
  495. */
  496. public function getTalkGroupList(array $data): array
  497. {
  498. $result = TalkGroup::get();
  499. return Result::success($result);
  500. }
  501. /**
  502. * 群组 - 创建群
  503. * @param array $data
  504. * @return array
  505. */
  506. public function addTalkGroup(array $data): array
  507. {
  508. Db::beginTransaction();
  509. try{
  510. //创建群
  511. $groupData = [
  512. 'id' => PublicData::uuid(),
  513. 'creator_id'=>$data['user_id'],
  514. 'group_name'=>$data['group_name']
  515. ];
  516. TalkGroup::insert($groupData);
  517. //创建群用户
  518. $groupMemberData = [];
  519. if($data['user_id_arr']){
  520. foreach ($data['user_id_arr'] as $key=>$val){
  521. $groupMemberData[$key] = [
  522. 'id' => PublicData::uuid(),
  523. 'group_id' => $groupData['id'],
  524. 'user_id' =>$val,
  525. 'leader' =>$data['user_id'] == $val?2:0,
  526. ];
  527. }
  528. }
  529. TalkGroupMember::insert($groupMemberData);
  530. //创建会话
  531. $sessionData = [
  532. 'id' => PublicData::uuid(),
  533. 'talk_type' => '2'
  534. ];
  535. TalkSession::insertGetId($sessionData);
  536. //创建会话关系
  537. $talkSessionAssociationData = [];
  538. if($data['user_id_arr']){
  539. foreach ($data['user_id_arr'] as $key=>$val){
  540. $talkSessionAssociationData[$key] = [
  541. 'id' => PublicData::uuid(),
  542. 'user_id' => $val,
  543. 'to_user_id' => $groupData['id'],
  544. 'session_id' =>$sessionData['id']
  545. ];
  546. }
  547. }
  548. TalkSessionAssociation::insert($talkSessionAssociationData);
  549. Db::commit();
  550. } catch(\Throwable $ex){
  551. Db::rollBack();
  552. var_dump($ex->getMessage());
  553. return Result::error("创建群失败",0);
  554. }
  555. return Result::success([]);
  556. }
  557. /**
  558. * 群组 - 更新群
  559. * @param array $data
  560. * @return array
  561. */
  562. public function updateTalkGroup(array $data): array
  563. {
  564. $where = [
  565. 'id'=>$data['id']
  566. ];
  567. $result = TalkGroup::where($where)->update($data);
  568. if($result){
  569. return Result::success($data);
  570. }else{
  571. return Result::error($data);
  572. }
  573. }
  574. /**
  575. * 群组 - 删除群
  576. * @param array $data
  577. * @return array
  578. */
  579. public function delTalkGroup(array $data): array
  580. {
  581. $where = [
  582. 'id'=>$data['id']
  583. ];
  584. $result = TalkGroup::where($where)->delete();
  585. if($result){
  586. return Result::success($data);
  587. }else{
  588. return Result::error($data);
  589. }
  590. }
  591. /**
  592. * 群组 - 群用户列表
  593. * @param array $data
  594. * @return array
  595. */
  596. public function getTalkGroupMember(array $data): array
  597. {
  598. $result = TalkGroupMember::get();
  599. return Result::success($result);
  600. }
  601. /**
  602. * 群组 - 创建群用户
  603. * @param array $data
  604. * @return array
  605. */
  606. public function addTalkGroupMember(array $data): array
  607. {
  608. $result = TalkGroupMember::insertGetId($data);
  609. if($result){
  610. return Result::success($data);
  611. }else{
  612. return Result::error($data);
  613. }
  614. }
  615. /**
  616. * 群组 - 更新群用户
  617. * @param array $data
  618. * @return array
  619. */
  620. public function updateTalkGroupMember(array $data): array
  621. {
  622. $where = [
  623. 'id'=>$data['id']
  624. ];
  625. $result = TalkGroupMember::where($where)->update($data);
  626. if($result){
  627. return Result::success($data);
  628. }else{
  629. return Result::error($data);
  630. }
  631. }
  632. /**
  633. * 群组 - 删除群用户
  634. * @param array $data
  635. * @return array
  636. */
  637. public function delTalkGroupMember(array $data): array
  638. {
  639. $where = [
  640. 'id'=>$data['id']
  641. ];
  642. $result = TalkGroupMember::where($where)->delete();
  643. if($result){
  644. return Result::success($data);
  645. }else{
  646. return Result::error($data);
  647. }
  648. }
  649. /**
  650. * 更新 会话关系
  651. * @param array $data
  652. * @return array
  653. */
  654. public function updateTalkSessionAssociation(array $data): array
  655. {
  656. $where = [
  657. 'id'=>$data['id']
  658. ];
  659. $result = TalkSessionAssociation::where($where)->update($data);
  660. if($result){
  661. return Result::success($data);
  662. }else{
  663. return Result::error($data);
  664. }
  665. }
  666. /**
  667. * 添加会话关系
  668. * @param array $data
  669. * @return array
  670. */
  671. public function addTalkSessionAssociation(array $data): array
  672. {
  673. var_dump($data);
  674. $result = TalkSessionAssociation::insertGetId($data);
  675. if($result){
  676. return Result::success($data);
  677. }else{
  678. return Result::error($data);
  679. }
  680. }
  681. }