Chat.php 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | A3Mall
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2020 http://www.a3-mall.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Author: xzncit <158373108@qq.com>
  8. // +----------------------------------------------------------------------
  9. namespace app\api\service;
  10. use app\common\exception\BaseException;
  11. use app\common\library\utils\Image;
  12. use app\common\models\Attachments as AttachmentsModel;
  13. use app\common\models\goods\Goods as GoodsModel;
  14. use app\common\models\chat\ChatService as ChatServiceModel;
  15. use app\common\models\chat\ChatMessage as ChatMessageModel;
  16. use GatewayWorker\Lib\Gateway;
  17. use mall\basic\Users;
  18. use mall\utils\CString;
  19. use mall\utils\Tool;
  20. use think\facade\Config;
  21. use app\common\service\upload\Uploadfiy as UploadfiyService;
  22. class Chat extends Service {
  23. public static function getList($data){
  24. $size = Config::get("website.pageSize");
  25. $page = $data["page"]??1;
  26. $count = ChatServiceModel::where('is_del',0)->where("status",0)->count();
  27. $result = ChatServiceModel::field("id,nickname,avatar")->where(["is_del"=>0,"status"=>0])->page($page,$size)->select()->toArray();
  28. $array = [ "list"=>array_map(function ($rs){
  29. $rs["avatar"] = Image::avatar($rs["avatar"]);
  30. $rs["count"] = ChatMessageModel::where(["send_type"=>0,"service_id"=>$rs["id"],"user_id"=>Users::get("id"),"is_read"=>0])->count();
  31. $message = ChatMessageModel::where(["service_id"=>$rs["id"],"user_id"=>Users::get("id")])->order("id","desc")->find();
  32. if(!empty($message)){
  33. switch($message["type"]){
  34. case "image":
  35. $rs["message"] = "[图片]";
  36. break;
  37. case "order":
  38. $rs["message"] = "[订单推送]";
  39. break;
  40. case "goods":
  41. $rs["message"] = "[商品推送]";
  42. break;
  43. case "text":
  44. $rs["message"] = CString::msubstr($message["content"],50,false);
  45. break;
  46. }
  47. $rs["last_time"] = date("H:i:s",strtotime($message["create_time"]));
  48. }
  49. return $rs;
  50. },$result), "page"=>$page, "total"=>0, "size"=>$size ];
  51. $total = ceil($count / $size);
  52. $array["total"] = $total;
  53. if($total == $page -1){
  54. throw new BaseException("没有数据了哦!",-1,$array);
  55. }
  56. return $array;
  57. }
  58. /**
  59. * 获取消息数据
  60. * @param $data
  61. * @return array
  62. * @throws BaseException
  63. * @throws \think\db\exception\DataNotFoundException
  64. * @throws \think\db\exception\DbException
  65. * @throws \think\db\exception\ModelNotFoundException
  66. */
  67. public static function getMessageList($data){
  68. $size = Config::get("website.pageSize");
  69. $page = $data["page"]??1;
  70. $kf_id = intval($data["kf_id"])??0;
  71. if(empty($kf_id)){
  72. throw new BaseException("ok",-1,[]);
  73. }
  74. $condition = "(service_id=" . $kf_id . " AND user_id=" . Users::get("id") . ")";
  75. if($page > 0){
  76. $condition .= " AND id < " . $page;
  77. }
  78. $result = ChatMessageModel::where($condition)->page($page,$size)->order("id","desc")->select()->toArray();
  79. $service = ChatServiceModel::where("id",$kf_id)->find();
  80. $data = [];
  81. foreach($result as $key=>$item){
  82. switch($item["type"]){
  83. case "goods":
  84. $goods = GoodsModel::where(["status"=>0,"id"=>$item["goods_id"]])->find();
  85. if(!empty($goods)){
  86. $data[] = [
  87. "id"=>$item["id"],
  88. "type"=>"goods",
  89. "avatar"=>Image::avatar($item["send_type"] == 1 ? Users::get("avatar") : $service["avatar"]),
  90. "goods_id"=>$item["goods_id"],
  91. "sClass"=>$item["send_type"] == 1 ? "r" : "l",
  92. "goods"=>[
  93. "id"=>$goods["id"],
  94. "goods_name"=>$goods["title"],
  95. "sell_price"=>$goods["sell_price"],
  96. "store_nums"=>$goods["store_nums"],
  97. "sale"=>$goods["sale"],
  98. "photo"=>Tool::thumb($goods["photo"],"medium",true)
  99. ]
  100. ];
  101. }
  102. break;
  103. case "text":
  104. $data[] = [
  105. "id"=>$item["id"],
  106. "type"=>"text",
  107. "avatar"=>Image::avatar($item["send_type"] == 1 ? Users::get("avatar") : $service["avatar"]),
  108. "content"=>$item["content"],
  109. "sClass"=>$item["send_type"] == 1 ? "r" : "l"
  110. ];
  111. break;
  112. case "image":
  113. $data[] = [
  114. "id"=>$item["id"],
  115. "type"=>"image",
  116. "avatar"=>Image::avatar($item["send_type"] == 1 ? Users::get("avatar") : $service["avatar"]),
  117. "content"=>Tool::thumb($item["content"],null,true),
  118. "sClass"=>$item["send_type"] == 1 ? "r" : "l"
  119. ];
  120. break;
  121. }
  122. }
  123. return array_reverse($data);
  124. }
  125. /**
  126. * 更新信息状态
  127. * @param $kf_id
  128. * @return bool
  129. * @throws \Exception
  130. */
  131. public static function updateMessage($kf_id){
  132. if(empty($kf_id)){
  133. throw new \Exception("ok",0);
  134. }
  135. ChatMessageModel::where(["service_id"=>$kf_id,"user_id"=>Users::get("id"),"send_type"=>0])->update([ "is_read"=>1 ]);
  136. return true;
  137. }
  138. /**
  139. * 上传图片
  140. * @param $kf_id
  141. * @return bool
  142. * @throws \Exception
  143. */
  144. public static function upload($kf_id){
  145. $client_id = Gateway::getClientIdByUid($kf_id."@".Users::get("id"));
  146. if(empty($client_id[0])){
  147. throw new \Exception("您还没有登录,请先登录。",0);
  148. }
  149. $dataInfo = UploadfiyService::upload("file",true,"public",["jpg","png","gif","jpeg"]);
  150. AttachmentsModel::create(array_merge($dataInfo,[
  151. "module"=>'chat',
  152. "method"=>'',
  153. "cat_id"=>'0'
  154. ]));
  155. $session = Gateway::getSession($client_id[0]);
  156. $message = [
  157. "type"=>"image",
  158. "service_id"=>$session["service_id"],
  159. "content"=>Tool::thumb('/'.trim($dataInfo["path"],"/"))
  160. ];
  161. $create_time = time();
  162. $message["id"] = ChatMessageModel::create(array_merge($message,[
  163. "send_type"=>1,
  164. "user_id"=>Users::get("id"),"is_read"=>0,"create_time"=>$create_time
  165. ]))->id;
  166. $message["content"] = Tool::thumb('/'.trim($dataInfo["path"],"/"),null,true);
  167. $message["avatar"] = Image::avatar(Users::get("avatar"));
  168. Gateway::sendToClient($client_id[0],json_encode(["type"=>"say","info"=>"ok","status"=>1,"data"=>array_merge($message,["sClass"=>"r"])],JSON_UNESCAPED_UNICODE));
  169. if(Gateway::isUidOnline("kf_".$session["service_id"])){
  170. Gateway::sendToUid("kf_".$session["service_id"],json_encode(["type"=>"say","info"=>"ok","status"=>1,"data"=>array_merge($message,[
  171. "user_id"=>$session["user_id"],"create_time"=>$create_time,"sClass"=>"l"
  172. ])],JSON_UNESCAPED_UNICODE));
  173. }
  174. return true;
  175. }
  176. }