ChatController.php 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Http\Controllers\Api\Repositories\WxContRepositories;
  4. use App\Jobs\System\ChatExpandTypeCheckJob;
  5. use App\Jobs\UserInputSafeCheckJob;
  6. use App\Models\Circle\WxCircle;
  7. use App\Models\Pets\WxPetsAdoption;
  8. use App\Models\Pets\WxPetsAdoptionApply;
  9. use App\Models\Posts\WxComment;
  10. use App\Models\Posts\WxPost;
  11. use App\Models\Shop\WxShopGoods;
  12. use App\Models\Shop\WxShopOrderGoods;
  13. use App\Models\Shop\WxShopService;
  14. use App\Models\Used\WxUsedGood;
  15. use App\Models\User\WxUserContactApply;
  16. use App\Models\User\WxUserStudentCertify;
  17. use App\Models\Voter\WxVoter;
  18. use App\Models\Voter\WxVoterPlayer;
  19. use App\Models\WxAuthentication;
  20. use App\Models\WxChat;
  21. use App\Models\User\WxUser;
  22. use App\Wen\Utils\CircleUtils;
  23. use App\Wen\Utils\CommentUtils;
  24. use App\Wen\Utils\FieldUtils;
  25. use App\Wen\Utils\GatewayUtils;
  26. use App\Wen\Utils\PetUtils;
  27. use App\Wen\Utils\PostUtils;
  28. use App\Wen\Utils\Settings;
  29. use App\Wen\Utils\ShopUtils;
  30. use App\Wen\Utils\UserUtils;
  31. use App\Wen\Utils\Utils;
  32. use Illuminate\Http\Request;
  33. use Illuminate\Support\Facades\DB;
  34. class ChatController extends BaseController
  35. {
  36. public function massages_process(Request $request) {
  37. $type = _empty_default_($request->type, '');
  38. if($type == 'review_object'){
  39. return $this->review_object($request);
  40. }
  41. }
  42. private function review_object(Request &$request){
  43. $chat_id = _empty_default_($request->chat_id, 0);
  44. if(_empty_($chat_id)){
  45. return $this->fail(200001);
  46. }
  47. $chat = WxChat::find($chat_id);
  48. if(!$chat){
  49. return $this->fail(200003);
  50. }
  51. // 101: 笔记审核 102:评论审核 103:组局审核 104:选票审核 105:选手审核 106:闲置审核 107:圈子审核 108:学生认证审核 109:身份认证审核 110 俱乐部审核
  52. if(!in_array($chat->expand_type, [101, 102, 103, 104, 105, 106, 107, 108, 109, 110])){
  53. return $this->fail(200004);
  54. }
  55. global $__MINI_GLOBAL_IS_ADMIN_SUPER__,$__MINI_GLOBAL_CURRENT_USER_ID__;
  56. if(!$__MINI_GLOBAL_IS_ADMIN_SUPER__){
  57. if($chat->expand_type == 105){
  58. $voter_id = WxVoterPlayer::where('id', $chat->expand_id)->value('voter_id');
  59. if(_empty_($voter_id)){
  60. return $this->fail(200000);
  61. }
  62. if(WxVoter::where('id', $voter_id)->value('user_id') != $__MINI_GLOBAL_CURRENT_USER_ID__){
  63. return $this->fail(200000);
  64. }
  65. }else{
  66. return $this->fail(200000);
  67. }
  68. }
  69. $flag = _empty_default_($request->flag, 0);
  70. if(!in_array($flag, [1, 2])){
  71. return $this->fail(200004);
  72. }
  73. if($chat->expand_type == 101){
  74. //expand_id
  75. $the_object = WxPost::where('is_examine', 0)->where('id', $chat->expand_id)->first();
  76. if($the_object){
  77. PostUtils::post_pass($the_object, $flag);
  78. return $this->success();
  79. }else{
  80. WxChat::where('id', $chat->id)->forceDelete();
  81. return $this->fail(200003);
  82. }
  83. }else if($chat->expand_type == 102){
  84. $the_object = WxComment::where('comment_state', 0)->where('id', $chat->expand_id)->first();
  85. if($the_object){
  86. CommentUtils::comment_pass($the_object, $flag);
  87. return $this->success();
  88. }else{
  89. WxChat::where('id', $chat->id)->forceDelete();
  90. return $this->fail(200003);
  91. }
  92. }else if($chat->expand_type == 104){
  93. $the_object = WxVoter::find($chat->expand_id);
  94. if($the_object){
  95. if($flag == 1){
  96. if($the_object->status == 0){
  97. $the_object->status = 1;
  98. $the_object->save();
  99. UserUtils::add_user_experience($the_object->user_id, 16, 20);
  100. }
  101. }else{
  102. if($the_object->status == 1){
  103. $the_object->status = 0;
  104. $the_object->save();
  105. }
  106. }
  107. return $this->success();
  108. }else{
  109. WxChat::where('id', $chat->id)->forceDelete();
  110. return $this->fail(200003);
  111. }
  112. }else if($chat->expand_type == 105){
  113. $the_object = WxVoterPlayer::find($chat->expand_id);
  114. if($the_object){
  115. if($flag == 1){
  116. if($the_object->status == 0){
  117. $the_object->status = 1;
  118. $the_object->save();
  119. UserUtils::add_user_experience($the_object->user_id, 19, 20);
  120. }
  121. }else{
  122. if($the_object->status == 1){
  123. $the_object->status = 0;
  124. $the_object->save();
  125. }
  126. }
  127. return $this->success();
  128. }else{
  129. WxChat::where('id', $chat->id)->forceDelete();
  130. return $this->fail(200003);
  131. }
  132. }else if($chat->expand_type == 106){
  133. $the_object = WxUsedGood::find($chat->expand_id);
  134. if($the_object){
  135. if($flag == 1){
  136. if($the_object->status == 0){
  137. $the_object->status = 1;
  138. $the_object->save();
  139. UserUtils::add_user_experience($the_object->user_id, 106, 30);
  140. }
  141. }else{
  142. if($the_object->status == 1){
  143. $the_object->status = 99;
  144. $the_object->save();
  145. }
  146. }
  147. return $this->success();
  148. }else{
  149. WxChat::where('id', $chat->id)->forceDelete();
  150. return $this->fail(200003);
  151. }
  152. }else if($chat->expand_type == 107){
  153. $the_object = WxCircle::where('circle_state', 0)->where('id', $chat->expand_id)->first();
  154. if($the_object){
  155. if($flag == 1){
  156. CircleUtils::circle_pass($the_object, 1, '');
  157. }else{
  158. CircleUtils::circle_pass($the_object, 2, '');
  159. }
  160. return $this->success();
  161. }else{
  162. WxChat::where('id', $chat->id)->forceDelete();
  163. return $this->fail(200003);
  164. }
  165. }else if($chat->expand_type == 108){
  166. $the_object = WxUserStudentCertify::find($chat->expand_id);
  167. if($the_object){
  168. if($flag == 1){
  169. if($the_object->status == 0){
  170. $the_object->status = 1;
  171. $the_object->save();
  172. UserUtils::add_user_experience($the_object->user_id, 18, 30);
  173. }
  174. }else{
  175. if($the_object->status == 1){
  176. $the_object->status = 0;
  177. $the_object->save();
  178. }
  179. }
  180. return $this->success();
  181. }else{
  182. WxChat::where('id', $chat->id)->forceDelete();
  183. return $this->fail(200003);
  184. }
  185. }else if($chat->expand_type == 109){
  186. $the_object = WxAuthentication::where('authentication_state', 0)->where('id', $chat->expand_id)->first();
  187. if($the_object){
  188. if($flag == 1){
  189. UserUtils::authenticate_pass($the_object, 1, '');
  190. }else{
  191. UserUtils::authenticate_pass($the_object, 2, '');
  192. }
  193. return $this->success();
  194. }else{
  195. WxChat::where('id', $chat->id)->forceDelete();
  196. return $this->fail(200003);
  197. }
  198. }else if($chat->expand_type == 110){
  199. $the_object = WxClub::find($chat->expand_id);
  200. if($the_object){
  201. if($flag == 1){
  202. if($the_object->status == 0){
  203. $the_object->status = 1;
  204. $the_object->save();
  205. }
  206. }else{
  207. if($the_object->status == 1){
  208. $the_object->status = 0;
  209. $the_object->save();
  210. }
  211. }
  212. return $this->success();
  213. }else{
  214. WxChat::where('id', $chat->id)->forceDelete();
  215. return $this->fail(200003);
  216. }
  217. }
  218. }
  219. private function after_sale_message(Request &$request){
  220. }
  221. /**
  222. * 用户发起聊天
  223. * @param Request $request
  224. * @return \Illuminate\Http\JsonResponse
  225. */
  226. public function addChat(Request $request)
  227. {
  228. $uid = $request->uid;
  229. $oid = $request->oid;
  230. if($uid == $oid){
  231. return $this->fail(200040);
  232. }
  233. _limit_user('chat', $uid, 30);
  234. if(!UserUtils::is_user_can_speak($uid)){
  235. return $this->fail(200043, [
  236. 'title' => '禁言中,无法言论',
  237. 'content' => '是否前往解除限制',
  238. 'confirmText' => '去解除',
  239. 'target_type' => 6,
  240. 'target_id' => '/pagesA/mine/unlock/unlock?user_id='.$uid
  241. ], '您当前处于禁言期间,无法言论');
  242. }
  243. $chat_content = $request->input('chat_content', '');
  244. $chat_image = $request->input('chat_image', '');
  245. $chat_audio_url = $request->input('chat_audio_url', '');
  246. $chat_audio_length = $request->input('chat_audio_length', '');
  247. $refer_id = $request->input('refer_id', 0);
  248. $shop_good_id = $request->input('shop_good_id', 0);
  249. $voter_id = _abs(_empty_default_($request->voter_id, 0));
  250. $ask_order_id = _abs(_empty_default_($request->ask_order_id, 0));
  251. if(_empty_($uid) || _empty_($oid)){
  252. return $this->fail(200001);
  253. }
  254. if(_empty_($shop_good_id)){
  255. $shop_good_id = 0;
  256. }else{
  257. $shop_good_id = _abs($shop_good_id);
  258. }
  259. if($shop_good_id > 0){
  260. // 比较特殊,需要转换身份,由商家发送
  261. $tmp_ = $oid;
  262. $oid = $uid;
  263. $uid = $tmp_;
  264. $last_chat = WxChat::where('user_id', $uid)->where('object_id', $oid)->orderByDesc('id')->first();
  265. if($last_chat && $last_chat->expand_type == 4 && $last_chat->expand_id == $shop_good_id){
  266. return $this->success();
  267. }
  268. }
  269. if(_empty_($refer_id)){
  270. $refer_id = 0;
  271. }else{
  272. $refer_id = _abs($refer_id);
  273. }
  274. if(_empty_($refer_id) && _empty_($shop_good_id) && _empty_($voter_id)){
  275. if(_empty_($chat_content) && _empty_($chat_image) && (_empty_($chat_audio_url) || _empty_($chat_audio_length))){
  276. return $this->fail(200001);
  277. }
  278. }
  279. if(!UserUtils::is_user_can_chat($uid)){
  280. return $this->fail(200000, [], '抱歉,您没有聊天权限');
  281. }
  282. $model = WxContRepositories::add($uid, $oid, $chat_content, $chat_image, $chat_audio_url, $chat_audio_length, $refer_id, 0, 0, $shop_good_id, null, 0, $voter_id,$ask_order_id); //通用聊天
  283. if($model){
  284. $websocket_id = GatewayUtils::uid2client_id($oid);
  285. if($websocket_id){
  286. GatewayUtils::success($websocket_id, 5, ['chat_content'=>_mini_emoji($chat_content, true), 'chat_image'=>$chat_image,
  287. 'from_user'=>UserUtils::get_cached_user($uid) ]);
  288. }
  289. $model->type = 'user';
  290. $imgList = array();
  291. array_push($imgList, ['img_url' => $model->chat_image]);
  292. $model->imgList = $imgList;
  293. $model->user = WxUser::where('id', $model->user_id)->first(FieldUtils::userInfoColums());
  294. $model->datetime = format_datetime($model->created_at);
  295. if($model->chat_audio_url && $model->chat_audio_length){
  296. $model->mode = 'audio';
  297. }else if($model->chat_image){
  298. $model->mode = 'img';
  299. }else if($model->refer_id){
  300. $model->mode = 'refer';
  301. }else{
  302. $model->mode = 'text';
  303. }
  304. if(!_empty_($model->chat_audio_length)){
  305. $min = (int)($model->chat_audio_length / 60);
  306. if($min < 10){
  307. $min = '0'.$min;
  308. }
  309. $sec = $model->chat_audio_length % 60;
  310. if($sec < 10){
  311. $sec = '0'.$sec;
  312. }
  313. $model->chat_audio_length = $min.':'.$sec;
  314. }
  315. }
  316. UserInputSafeCheckJob::dispatch($uid, _mini_emoji($chat_content, true));
  317. if($chat_image || $chat_audio_url){
  318. Utils::image_state_change([$chat_image, $chat_audio_url], 1);
  319. }
  320. return $this->success($model);
  321. }
  322. /**
  323. * 查询用户聊天记录
  324. * @param Request $request
  325. * @return \Illuminate\Http\JsonResponse
  326. */
  327. public function getUserChat(Request $request, $limit = 6)
  328. {
  329. $uid = $request->uid;
  330. $oid = $request->oid;
  331. if(_empty_($uid) || _empty_($oid)){
  332. return $this->fail(200001);
  333. }
  334. $data = WxChat::where(function($query) use ($uid, $oid) {
  335. $query->where(function ($query) use ($uid, $oid) {
  336. $query->where('user_id', $uid)
  337. ->where('object_id', $oid);
  338. })
  339. ->orWhere(function ($query) use ($uid, $oid) {
  340. $query->where('user_id', $oid)
  341. ->where('object_id', $uid);
  342. });
  343. })
  344. ->where('expand_type','!=',9) //排除问答聊天,因为要独立
  345. ->orderByRaw('id DESC')
  346. ->simplePaginate($limit);
  347. $data->map(function ($v) use ($uid){
  348. $v->type = 'user';
  349. $imgList = array();
  350. array_push($imgList, ['img_url' => $v->chat_image]);
  351. $v->imgList = $imgList;
  352. $v->user = WxUser::where('id', $v->user_id)->first(FieldUtils::userInfoColums());
  353. $v->datetime = format_datetime($v->created_at);
  354. if($v->chat_audio_url && $v->chat_audio_length){
  355. $v->mode = 'audio';
  356. }else if($v->chat_image){
  357. $v->mode = 'img';
  358. }else if($v->refer_id){
  359. $v->mode = 'refer';
  360. if($v->expand_type != 1 || $v->expand_id != $v->refer_id){
  361. ChatExpandTypeCheckJob::dispatch();
  362. }
  363. }else if($v->adoption_apply_id){
  364. $v->mode = 'adoption_reply';
  365. if($v->expand_type != 3 || $v->expand_id != $v->adoption_apply_id){
  366. ChatExpandTypeCheckJob::dispatch();
  367. }
  368. }else if($v->contact_apply_id){
  369. $v->mode = 'contact_apply';
  370. if($v->expand_type != 2 || $v->expand_id != $v->contact_apply_id){
  371. ChatExpandTypeCheckJob::dispatch();
  372. }
  373. }else{
  374. if($v->expand_type > 0){
  375. if($v->expand_type == 1){
  376. $v->mode = 'refer';
  377. $v->refer_id = $v->expand_id;
  378. }else if($v->expand_type == 2){
  379. $v->mode = 'contact_apply';
  380. $v->contact_apply_id = $v->expand_id;
  381. }else if($v->expand_type == 3){
  382. $v->mode = 'adoption_reply';
  383. $v->adoption_apply_id = $v->expand_id;
  384. }else if($v->expand_type == 4){
  385. $v->mode = 'shop_good';
  386. $v->shop_good_id = $v->expand_id;
  387. }else if($v->expand_type == 5){
  388. $v->mode = 'used_good';
  389. $v->used_good_id = $v->expand_id;
  390. }else if($v->expand_type == 8){
  391. $v->mode = 'voter';
  392. $v->voter_id = $v->expand_id;
  393. }else if($v->expand_type == 9){
  394. //仅占用
  395. $v->mode = 'ask_order';
  396. $v->ask_order_id = $v->expand_id;
  397. }else if(in_array($v->expand_type, [101, 102, 103, 104, 105, 106, 107, 108, 109, 110])){
  398. $v->mode = 'review';
  399. }else{
  400. // 101: 笔记审核 102:评论审核 103:组局审核 104:选票审核 105:选手审核 106:闲置审核
  401. return $this->fail(200006, [], '数据库expand_type不合法');
  402. }
  403. }else{
  404. $v->mode = 'text';
  405. }
  406. }
  407. if($v->mode == 'review'){
  408. if($v->expand_type == 101){
  409. $the_post = WxPost::find($v->expand_id);
  410. if($the_post){
  411. $posts_content = $the_post->posts_content;
  412. if($posts_content){
  413. $s_content = preg_replace("/<(img|video).*?src[^\'\"]+[\'\"]([^\"\']+)[^>]+>/is", '', $posts_content);
  414. $s_content =trim_all_space(strip_tags(html_entity_decode($s_content)), true);
  415. }
  416. $v->chat_content = $the_post->posts_title ?: PostUtils::get_the_title($s_content, $the_post->id);
  417. PostUtils::mediaProcess($the_post, $uid, 90003, 0, true);
  418. $v->chat_image = Utils::imgWithStyle($the_post->img, 0, false, true);
  419. $v->review = [
  420. 'target_type' => 1,
  421. 'target_id' => $v->expand_id,
  422. 'state' => $the_post->is_examine,
  423. 'title_tip' => '笔记',
  424. 'state_tip' => [0=>'待审核', 1=>'审核通过', 2=>'驳回'][$the_post->is_examine],
  425. 'can_refuse' => 1,
  426. 'user' => UserUtils::get_cached_user($the_post->user_id),
  427. ];
  428. }else{
  429. WxChat::where('id', $v->id)->forceDelete();
  430. }
  431. }else if($v->expand_type == 102){
  432. $the_comment = WxComment::find($v->expand_id);
  433. if($the_comment){
  434. $v->chat_image = $the_comment->comment_img_url;
  435. $v->chat_content = $the_comment->comment_content;
  436. $v->review = [
  437. 'target_type' => 25,
  438. 'target_id' => '评论不可跳转',
  439. 'state' => $the_comment->comment_state,
  440. 'title_tip' => '笔记评论',
  441. 'state_tip' => [0=>'待审核', 1=>'审核通过', 2=>'驳回'][$the_comment->comment_state],
  442. 'can_refuse' => 1,
  443. 'user' => UserUtils::get_cached_user($the_comment->user_id),
  444. ];
  445. }else{
  446. WxChat::where('id', $v->id)->forceDelete();
  447. }
  448. }else if($v->expand_type == 104){
  449. $the_voter = WxVoter::find($v->expand_id);
  450. if($the_voter){
  451. $v->chat_content = $the_voter->title;
  452. if($the_voter->banners){
  453. $v->chat_image = _array_key($the_voter->banners, 0, '');
  454. }
  455. $v->review = [
  456. 'target_type' => 33,
  457. 'target_id' => $v->expand_id,
  458. 'state' => $the_voter->status,
  459. 'title_tip' => '选票',
  460. 'state_tip' => [0=>'审核中', 1=>'推送中', 2=>'驳回'][$the_voter->status],
  461. 'can_refuse' => 0,
  462. 'user' => UserUtils::get_cached_user($the_voter->user_id),
  463. ];
  464. }else{
  465. WxChat::where('id', $v->id)->forceDelete();
  466. }
  467. }else if($v->expand_type == 105){
  468. $player = WxVoterPlayer::find($v->expand_id);
  469. if($player){
  470. $v->chat_content = $player->show_name;
  471. if($player->img_urls){
  472. $v->chat_image = _array_key($player->img_urls, 0, '');
  473. }
  474. $v->review = [
  475. 'target_type' => 6,
  476. 'target_id' => '/pagesV/voter/detail/player?id='.$v->expand_id,
  477. 'state' => $player->status,
  478. 'title_tip' => '选票选手',
  479. 'state_tip' => [0=>'审核中', 1=>'推送中', 2=>'驳回'][$player->status],
  480. 'can_refuse' => 0,
  481. 'user' => UserUtils::get_cached_user($player->user_id),
  482. ];
  483. }else{
  484. WxChat::where('id', $v->id)->forceDelete();
  485. }
  486. }else if($v->expand_type == 106){
  487. $the_used = WxUsedGood::find($v->expand_id);
  488. if($the_used){
  489. $v->chat_content = $the_used->title;
  490. if($the_used->image_urls){
  491. $v->chat_image = _array_key($the_used->image_urls[0], 'url', '');
  492. }
  493. $v->review = [
  494. 'target_type' => 28,
  495. 'target_id' => $v->expand_id,
  496. 'state' => $the_used->status == 99 ? 2 : ($the_used->status === 0 ? 0 : 1),
  497. 'title_tip' => '闲置商品',
  498. 'state_tip' => FieldUtils::usedGoodState()[$the_used->status],
  499. 'can_refuse' => 1,
  500. 'user' => UserUtils::get_cached_user($the_used->user_id),
  501. ];
  502. }else{
  503. WxChat::where('id', $v->id)->forceDelete();
  504. }
  505. }else if($v->expand_type == 107){
  506. $the_circle = WxCircle::find($v->expand_id);
  507. if($the_circle){
  508. $v->chat_content = $the_circle->circle_name;
  509. $v->chat_image = $the_circle->head_portrait;
  510. $v->review = [
  511. 'target_type' => 2,
  512. 'target_id' => $v->expand_id,
  513. 'state' => $the_circle->circle_state,
  514. 'title_tip' => '新建圈子',
  515. 'state_tip' => [0=>'审核中', 1=>'推送中', 2=>'驳回'][$the_circle->circle_state],
  516. 'can_refuse' => 1,
  517. 'user' => UserUtils::get_cached_user($the_circle->user_id),
  518. ];
  519. }else{
  520. WxChat::where('id', $v->id)->forceDelete();
  521. }
  522. }else if($v->expand_type == 108){
  523. $student = WxUserStudentCertify::where('user_id', $v->expand_id)->first();
  524. if($student){
  525. $v->chat_content = $student->school;
  526. $v->chat_image = $student->picture;
  527. $v->review = [
  528. 'target_type' => 25,
  529. 'target_id' => '学生认证暂不可跳转',
  530. 'state' => $student->status,
  531. 'title_tip' => '学生认证',
  532. 'state_tip' => [0=>'待审核', 1=>'已通过', 2=>'驳回'][$student->status],
  533. 'can_refuse' => 0,
  534. 'user' => UserUtils::get_cached_user($student->user_id),
  535. ];
  536. }else{
  537. WxChat::where('id', $v->id)->forceDelete();
  538. }
  539. }else if($v->expand_type == 109){
  540. $authentication = WxAuthentication::find($v->expand_id);
  541. if($authentication){
  542. $v->chat_content = $authentication->name;
  543. $v->chat_image = $authentication->identity_picture;
  544. $v->review = [
  545. 'target_type' => 25,
  546. 'target_id' => '身份认证暂不可跳转',
  547. 'state' => $authentication->authentication_state,
  548. 'title_tip' => '身份认证',
  549. 'state_tip' => [0=>'审核中', 1=>'已通过', 2=>'驳回'][$authentication->authentication_state],
  550. 'can_refuse' => 0,
  551. 'user' => UserUtils::get_cached_user($authentication->user_id),
  552. ];
  553. }else{
  554. WxChat::where('id', $v->id)->forceDelete();
  555. }
  556. }else if($v->expand_type == 110){
  557. $club = WxClub::where('id', $v->expand_id)->first();
  558. if($club){
  559. $v->chat_content = _empty_default_($club->name_tmp, $club->name);
  560. $v->chat_image = _empty_default_($club->avatar_tmp, $club->avatar);
  561. $v->review = [
  562. 'target_type' => 35,
  563. 'target_id' => $v->expand_id,
  564. 'state' => $club->status,
  565. 'title_tip' => '俱乐部审核',
  566. 'state_tip' => [0=>'待审核', 1=>'已通过', 2=>'驳回'][$club->status],
  567. 'can_refuse' => 0,
  568. 'user' => UserUtils::get_cached_user($club->user_id),
  569. ];
  570. }else{
  571. WxChat::where('id', $v->id)->forceDelete();
  572. }
  573. }
  574. if(_empty_($v->chat_image)){
  575. $v->chat_image = Settings::get('img_default', '').'?imageMogr2/thumbnail/200x200/crop/200x200/gravity/center/format/jpg/interlace/0/quality/100';
  576. }else{
  577. $v->chat_image = $v->chat_image.'?imageMogr2/thumbnail/200x200/crop/200x200/gravity/center/format/jpg/interlace/0/quality/100';
  578. }
  579. }
  580. if(!_empty_($v->chat_audio_length)){
  581. $min = (int)($v->chat_audio_length / 60);
  582. if($min < 10){
  583. $min = '0'.$min;
  584. }
  585. $sec = $v->chat_audio_length % 60;
  586. if($sec < 10){
  587. $sec = '0'.$sec;
  588. }
  589. $v->chat_audio_length = $min.':'.$sec;
  590. }
  591. if(!_empty_($v->refer_id)){
  592. if($v->refer_id && $v->refer_id > 0){
  593. $refer_post = WxPost::find($v->refer_id);
  594. if($refer_post){
  595. PostUtils::mediaProcess($refer_post, $uid, 15, 0, true);
  596. if($refer_post->posts_content_raw){
  597. $refer_post->posts_content_raw = strip_tags($refer_post->posts_content_raw);
  598. }
  599. $v->refer = $refer_post;
  600. }else{
  601. WxChat::where('id', $v->id)->delete();
  602. }
  603. }else{
  604. $v->refer = null;
  605. }
  606. }
  607. if(!_empty_($v->adoption_apply_id)){
  608. if($v->adoption_apply_id && $v->adoption_apply_id > 0){
  609. $adoption_reply = WxPetsAdoptionApply::find($v->adoption_apply_id);
  610. if($adoption_reply){
  611. $v->adoption_reply = PetUtils::adoption_apply_process($adoption_reply, $uid);
  612. $v->adoption_reply->adoption = PetUtils::adoption_process(WxPetsAdoption::find($adoption_reply->pet_adoption_id));
  613. }else{
  614. WxChat::where('id', $v->id)->delete();
  615. }
  616. }else{
  617. $v->adoption_reply = null;
  618. }
  619. }
  620. if(!_empty_($v->used_good_id)){
  621. $user_good = WxUsedGood::where('id', $v->used_good_id)->first();
  622. if($user_good){
  623. ShopUtils::used_process($user_good);
  624. if($user_good->pic){
  625. $user_good->pic = $user_good->pic.'?imageMogr2/quality/100/format/webp/interlace/0/crop/200x200/gravity/center/thumbnail/200x';
  626. }
  627. $user_good->servicer_word = '亲,想要可以直接拍';
  628. $v->used_good = $user_good;
  629. }else{
  630. WxChat::where('id', $v->id)->delete();
  631. }
  632. }
  633. if(!_empty_($v->voter_id)){
  634. $voter = WxVoter::where('id', $v->voter_id)->first();
  635. if($voter){
  636. if($voter->banners){
  637. $voter->pic = $voter->banners[0];
  638. }
  639. $v->voter = $voter;
  640. }else{
  641. WxChat::where('id', $v->id)->delete();
  642. }
  643. }
  644. if(!_empty_($v->ask_order_id)){
  645. //仅占用
  646. }
  647. if(!_empty_($v->shop_good_id)){
  648. $data = WxShopGoods::where('id', $v->shop_good_id)->first()->toArray();
  649. if($data) {
  650. // 服务
  651. if (isset($data['service_id'])) {
  652. $service_tip = '';
  653. $data['service'] = WxShopService::whereIn('id', json_decode($data['service_id'], true))->get(['name', 'intro'])->map(function ($s) use (&$service_tip){
  654. if(_empty_($service_tip)){
  655. $service_tip .= '"'.$s->name.'"';
  656. }else{
  657. $service_tip .= ',' . '"'.$s->name.'"';
  658. }
  659. return $s;
  660. });
  661. if($service_tip){
  662. $service_tip = '亲,我们这款商品的服务为' . $service_tip . '~';
  663. }
  664. $data['service_tip'] = $service_tip;
  665. if($data['pic'] && is_array($data['pic']) && count($data['pic']) > 0){
  666. $data['pic'][0] = $data['pic'][0].'?imageMogr2/quality/100/format/webp/interlace/0/crop/200x200/gravity/center/thumbnail/200x';
  667. }
  668. } else {
  669. $data['service'] = null;
  670. $data['service_tip'] = '';
  671. }
  672. $data['user_purchase'] = ShopUtils::user_buy_goods_times($uid, $data['id']);
  673. $v->shop_good = $data;
  674. }
  675. }
  676. if(!_empty_($v->contact_apply_id)){
  677. if($v->contact_apply_id && $v->contact_apply_id > 0){
  678. $contact_apply = WxUserContactApply::find($v->contact_apply_id);
  679. if($contact_apply){
  680. if($contact_apply->user_id == $uid){
  681. // 己方发送
  682. $title = '申请查看对方的';
  683. if($contact_apply->is_phone == 1){
  684. $title .= '手机号';
  685. }
  686. if($contact_apply->is_wechat_account == 1){
  687. if($contact_apply->is_phone == 1){
  688. $title .= '、微信号';
  689. }else{
  690. $title .= '微信号';
  691. }
  692. }
  693. $contact_apply->title = $title;
  694. }else{
  695. $title = '我申请查看你的';
  696. if($contact_apply->is_phone == 1){
  697. $title .= '手机号';
  698. }
  699. if($contact_apply->is_wechat_account == 1){
  700. if($contact_apply->is_phone == 1){
  701. $title .= '、微信号';
  702. }else{
  703. $title .= '微信号';
  704. }
  705. }
  706. $contact_apply->title = $title;
  707. }
  708. $contact_apply->status_tip = '申请中';
  709. if($contact_apply->status == 1){
  710. $contact_apply->status_tip = '已同意';
  711. }else if($contact_apply->status == 2){
  712. $contact_apply->status_tip = '已过期';
  713. }
  714. $v->contact_apply = $contact_apply;
  715. }else{
  716. $v->contact_apply = null;
  717. }
  718. }else{
  719. $v->contact_apply = null;
  720. }
  721. }
  722. $allowable[] = [
  723. 'text' => '复制',
  724. 'type' => 'copy',
  725. 'id' => $v->id,
  726. 'raw' => strip_tags($v->chat_content),
  727. 'icon' => 'mini-icon mini-fuzhi'
  728. ];
  729. $v->allowable = $allowable;
  730. return $v;
  731. });
  732. return $this->success($data);
  733. }
  734. /**
  735. * 查询用户问答订单聊天记录
  736. * @param Request $request
  737. * @return \Illuminate\Http\JsonResponse
  738. */
  739. public function getUserAskOrderChat(Request $request, $limit = 6)
  740. {
  741. $uid = $request->uid;
  742. $oid = $request->oid;
  743. $ask_order_id = $request->ask_order_id;
  744. if(_empty_($uid) || _empty_($oid)){
  745. return $this->fail(200001);
  746. }
  747. $data = WxChat::where(function($query) use ($uid, $oid) {
  748. $query->where(function ($query) use ($uid, $oid) {
  749. $query->where('user_id', $uid)
  750. ->where('object_id', $oid);
  751. })
  752. ->orWhere(function ($query) use ($uid, $oid) {
  753. $query->where('user_id', $oid)
  754. ->where('object_id', $uid);
  755. });
  756. })
  757. ->where('expand_type',9) //只要问答订单的
  758. ->where('expand_id',$ask_order_id) //只要问答订单的
  759. ->orderByRaw('id DESC')
  760. ->simplePaginate($limit);
  761. $data->map(function ($v) use ($uid){
  762. $v->type = 'user';
  763. $imgList = array();
  764. array_push($imgList, ['img_url' => $v->chat_image]);
  765. $v->imgList = $imgList;
  766. $v->user = WxUser::where('id', $v->user_id)->first(FieldUtils::userInfoColums());
  767. $v->datetime = format_datetime($v->created_at);
  768. if($v->chat_audio_url && $v->chat_audio_length){
  769. $v->mode = 'audio';
  770. }else if($v->chat_image){
  771. $v->mode = 'img';
  772. }else{
  773. $v->mode = 'text';
  774. }
  775. if(!_empty_($v->chat_audio_length)){
  776. $min = (int)($v->chat_audio_length / 60);
  777. if($min < 10){
  778. $min = '0'.$min;
  779. }
  780. $sec = $v->chat_audio_length % 60;
  781. if($sec < 10){
  782. $sec = '0'.$sec;
  783. }
  784. $v->chat_audio_length = $min.':'.$sec;
  785. }
  786. $allowable[] = [
  787. 'text' => '复制',
  788. 'type' => 'copy',
  789. 'id' => $v->id,
  790. 'raw' => strip_tags($v->chat_content),
  791. 'icon' => 'mini-icon mini-fuzhi'
  792. ];
  793. $v->allowable = $allowable;
  794. return $v;
  795. });
  796. return $this->success($data);
  797. }
  798. /**
  799. * 已读对应用户信息
  800. * @param Request $request
  801. * @return \Illuminate\Http\JsonResponse
  802. */
  803. public function readUserChat(Request $request)
  804. {
  805. $uid = $request->uid;
  806. $oid = $request->oid;
  807. if(_empty_($oid)){
  808. return $this->fail(200001);
  809. }
  810. $data = WxChat::where([['user_id','=', $oid],['object_id', '=', $uid]])->update(['is_read' => 1]);
  811. return $this->success($data);
  812. }
  813. /**
  814. * 用户删除聊天记录
  815. */
  816. public function userDelMessage(Request $request)
  817. {
  818. $uid = $request->uid;
  819. $userid = $request->userid;
  820. $data = WxChat::where(function ($query) use ($uid, $userid) {
  821. $query->where('user_id', $uid)
  822. ->where('object_id', $userid);
  823. })
  824. ->orWhere(function ($query) use ($uid, $userid) {
  825. $query->where('user_id', $userid)
  826. ->where('object_id', $uid);
  827. })->update(['chat_state' => 1]);
  828. return $this->success($data);
  829. }
  830. }