ChatService.php 21 KB

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