all(); $status = request('status', 1); $supplyDemands = SupplyDemand::with([ 'user' => function ($query) { $query->select('id', 'nickname', 'name', 'headimgurl', 'username'); } ])->where(function ($query) use ($all, $status) { if($status){ $query->where('status', $status); } if (isset($all['type'])) { $query->where('type', $all['type']); } if (isset($all['keyword'])) { $query->where('content', 'like', '%' . $all['keyword'] . '%'); } if (isset($all['myself']) && $all['myself'] == 1) { $query->where('user_id', $this->getUserId()); } if (isset($all['expire_type'])) { $now = date('Y-m-d'); if ($all['expire_type'] == 1) { $query->where(function ($q) use ($now) { $q->whereNull('expire_time')->orWhere('expire_time', '')->orWhere('expire_time', '>', $now); }); } else { $query->where('expire_time', '<', $now); } } })->orderBy($all['sort_name'] ?? 'id', $all['sort_type'] ?? 'desc') ->paginate($all['page_size'] ?? 20); return $this->success(compact('supplyDemands')); } /** * @OA\Get( * path="/api/mobile/supply-demand/detail", * tags={"小程序-供需"}, * summary="详情", * @OA\Parameter(name="id", in="query", @OA\Schema(type="integer"), required=true, description="id"), * @OA\Response( * response=200, * description="操作成功" * ) * ) */ public function detail() { $all = \request()->all(); $messages = [ 'id.required' => 'Id必填', ]; $validator = Validator::make($all, [ 'id' => 'required' ], $messages); if ($validator->fails()) { return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } $detail = SupplyDemand::with([ 'user' => function ($query) { $query->select('id', 'nickname', 'name', 'headimgurl', 'username'); } ])->find($all['id']); // 增加view_count $detail->increment('view_count'); $detail->save(); // 判断是否发送过私信 $detail->messages_count = Message::where('supply_demand_id', $detail->id)->where('user_id', $this->getUserId())->count(); return $this->success($detail); } /** * @OA\Post( * path="/api/mobile/supply-demand/save", * tags={"小程序-供需"}, * summary="更新", * description="", * @OA\Parameter(name="id", in="query", @OA\Schema(type="integer"), required=false, description="需求供应表ID(存在则更新,不存在则新增)"), * @OA\Parameter(name="title", in="query", @OA\Schema(type="string"), required=false, description="标题"), * @OA\Parameter(name="type", in="query", @OA\Schema(type="integer"), required=false, description="分类1供应2需求"), * @OA\Parameter(name="content", in="query", @OA\Schema(type="string"), required=false, description="内容"), * @OA\Parameter(name="tag", in="query", @OA\Schema(type="string"), required=false, description="标签"), * @OA\Parameter(name="wechat", in="query", @OA\Schema(type="string"), required=false, description="微信号"), * @OA\Parameter(name="mobile", in="query", @OA\Schema(type="string"), required=false, description="电话"), * @OA\Parameter(name="email", in="query", @OA\Schema(type="string"), required=false, description="邮箱"), * @OA\Parameter(name="expire_time", in="query", @OA\Schema(type="string"), required=false, description="过期时间"), * @OA\Parameter(name="public_way", in="query", @OA\Schema(type="string"), required=false, description="公开模式1直接公开2私信后自动公开3不公开"), * @OA\Parameter(name="file_ids", in="query", @OA\Schema(type="string"), required=false, description="文件id数组"), * @OA\Parameter(name="contact_name", in="query", @OA\Schema(type="string"), required=false, description="联系人名字"), * @OA\Parameter(name="status", in="query", @OA\Schema(type="integer"), required=false, description="状态0待审核1通过2拒绝3退回修改4永久隐藏"), * @OA\Response( * response="200", * description="暂无" * ) * ) */ public function save() { $all = \request()->all(); DB::beginTransaction(); try { if (isset($all['id'])) { $model = SupplyDemand::where('user_id', $this->getUserId())->find($all['id']); if (empty($model)) { return $this->fail([ResponseCode::ERROR_BUSINESS, '数据不存在']); } } else { $model = new SupplyDemand(); $all['user_id'] = $this->getUserId(); // 短信通知 $supply_demand_mobile = Config::getValueByKey('supply_demand_mobile'); $supply_demand_mobile = explode(',', $supply_demand_mobile); $smsSign = Config::getValueByKey('sms_sign'); $content = "{$smsSign}【{$this->getUser()->name}】发布了一条新的供需信息"; foreach ($supply_demand_mobile as $mobile) { ymSms($mobile, $content); } } $model->fill($all); $model->save(); DB::commit(); return $this->success($model); } catch (\Exception $exception) { DB::rollBack(); return $this->fail([$exception->getCode(), $exception->getMessage()]); } } /** * @OA\Get( * path="/api/mobile/supply-demand/destroy", * tags={"小程序-供需"}, * summary="删除", * description="", * @OA\Parameter(name="id", in="query", @OA\Schema(type="string"), required=true, description="id"), * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"), * @OA\Response( * response="200", * description="暂无" * ) * ) */ public function destroy() { $all = \request()->all(); $messages = [ 'id.required' => 'Id必填', ]; $validator = Validator::make($all, [ 'id' => 'required' ], $messages); if ($validator->fails()) { return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } $model = SupplyDemand::find($all['id']); if (empty($model)) { return $this->fail([ResponseCode::ERROR_BUSINESS, '数据不存在']); } $model->delete(); return $this->success('删除成功'); } /** * @OA\Post( * path="/api/mobile/supply-demand/send-message", * tags={"小程序-供需"}, * summary="发送消息", * description="", * @OA\Parameter(name="supply_demand_id", in="query", @OA\Schema(type="string"), required=true, description="供需信息id(选填)"), * @OA\Parameter(name="content", in="query", @OA\Schema(type="string"), required=true, description="内容"), * @OA\Parameter(name="to_user_id", in="query", @OA\Schema(type="string"), required=true, description="接收人用户id"), * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"), * @OA\Response( * response="200", * description="暂无" * ) * ) */ public function sendMessage() { $all = \request()->all(); $messages = [ 'content.required' => '内容必填', 'to_user_id.required' => '接收人必填', ]; $validator = Validator::make($all, [ 'content' => 'required', 'to_user_id' => 'required' ], $messages); if ($validator->fails()) { return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } // 判断是否有会话,没有则创建 $dialogue = Dialogue::where(function ($query) use ($all) { $query->where('user_id', $this->getUserId())->where('to_user_id', $all['to_user_id']); })->orWhere(function ($query) use ($all) { $query->where('user_id', $all['to_user_id'])->where('to_user_id', $this->getUserId()); })->first(); if (empty($dialogue)) { // 创建一条会话 $dialogue = Dialogue::create([ 'user_id' => $this->getUserId(), 'to_user_id' => $all['to_user_id'], 'supply_demand_id' => $all['supply_demand_id'] ?? 0 ]); // 增加联系次数 SupplyDemand::where('id', $all['supply_demand_id'])->increment('contact_count'); } if (isset($all['supply_demand_id'])) { $now = date('Y-m-d'); // 过期数据不能私信 $supplyDemand = SupplyDemand::find($all['supply_demand_id']); if ($supplyDemand->expire_time > $now) { return $this->fail([ResponseCode::ERROR_BUSINESS, '该信息已过期,不能私信']); } } // 每天限制私信次数限制 $message_limit = Config::getValueByKey('message_limit'); $messageToday = Message::where('user_id', $this->getUserId()) ->where('created_at', 'like', '%' . date('Y-m-d') . '%') ->get(); if ($messageToday->count() > $message_limit) { return $this->fail([ResponseCode::ERROR_BUSINESS, '今天私信次数已达上限']); } // 有且仅有自己发的信息,则不能发再 $myMessage = Message::where('user_id', $this->getUserId()) ->where('to_user_id', $all['to_user_id']) ->where('dialogue_id', $dialogue->id) ->first(); // 对方的信息 $otherMessage = Message::where('user_id', $all['to_user_id']) ->where('to_user_id', $this->getUserId()) ->where('dialogue_id', $dialogue->id) ->first(); if ($myMessage && empty($otherMessage)) { return $this->fail([ResponseCode::ERROR_BUSINESS, '对方回复以后才可以再次发送消息']); } // 创建消息 Message::create([ 'dialogue_id' => $dialogue->id, 'user_id' => $this->getUserId(), 'to_user_id' => $all['to_user_id'], 'supply_demand_id' => $all['supply_demand_id'] ?? 0, 'content' => $all['content'], 'is_read' => 0 ]); // 更新会话最后发言 $dialogue->last_content = $all['content']; $dialogue->last_datetime = date('Y-m-d H:i:s'); $dialogue->save(); return $this->success('发送成功'); } /** * @OA\Get( * path="/api/mobile/supply-demand/message-list", * tags={"小程序-供需"}, * summary="消息列表", * description="", * @OA\Parameter(name="to_user_id", in="query", @OA\Schema(type="string"), required=true, description="对方的用户id"), * @OA\Parameter(name="page_size", in="query", @OA\Schema(type="string"), required=false, description="每页显示的条数"), * @OA\Parameter(name="page", in="query", @OA\Schema(type="string"), required=false, description="页码"), * @OA\Parameter(name="sort_name", in="query", @OA\Schema(type="string"), required=false, description="排序字段名字"), * @OA\Parameter(name="sort_type", in="query", @OA\Schema(type="string"), required=false, description="排序类型"), * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"), * @OA\Response( * response="200", * description="暂无" * ) * ) */ public function messageList() { $all = \request()->all(); $messages = [ 'to_user_id.required' => '接收人必填', ]; $validator = Validator::make($all, [ 'to_user_id' => 'required' ], $messages); if ($validator->fails()) { return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } // 获取会话id $dialogue = Dialogue::where('user_id', $this->getUserId()) ->where('to_user_id', $all['to_user_id']) ->first(); if (empty($dialogue)) { return $this->fail([ResponseCode::ERROR_BUSINESS, '会话不存在']); } $message = Message::with([ 'user' => function ($query) { $query->select('id', 'nickname', 'name', 'headimgurl', 'username'); }, 'toUser' => function ($query) { $query->select('id', 'nickname', 'name', 'headimgurl', 'username'); } ])->where(function ($query) use ($dialogue) { $query->where('dialogue_id', $dialogue->id); })->orderBy($all['sort_name'] ?? 'id', $all['sort_type'] ?? 'desc') ->paginate($all['page_size'] ?? 20); return $this->success(compact('message')); } /** * @OA\Get( * path="/api/mobile/supply-demand/dialogues", * tags={"小程序-供需"}, * summary="会话列表", * description="", * @OA\Parameter(name="page_size", in="query", @OA\Schema(type="string"), required=false, description="每页显示的条数"), * @OA\Parameter(name="page", in="query", @OA\Schema(type="string"), required=false, description="页码"), * @OA\Parameter(name="sort_name", in="query", @OA\Schema(type="string"), required=false, description="排序字段名字"), * @OA\Parameter(name="sort_type", in="query", @OA\Schema(type="string"), required=false, description="排序类型"), * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"), * @OA\Response( * response="200", * description="暂无" * ) * ) */ public function dialogues() { $all = \request()->all(); $dialogue = Dialogue::with(['supplyDemand', 'user' => function ($query) { $query->select('id', 'nickname', 'name', 'headimgurl', 'username'); }, 'toUser' => function ($query) { $query->select('id', 'nickname', 'name', 'headimgurl', 'username'); } ])->where(function ($query) use ($all) { $query->where('user_id', $this->getUserId())->orWhere('to_user_id', $this->getUserId()); })->orderBy($all['sort_name'] ?? 'id', $all['sort_type'] ?? 'desc') ->paginate($all['page_size'] ?? 20); return $this->success(compact('dialogue')); } /** * @OA\Get( * path="/api/mobile/supply-demand/keep-index", * tags={"小程序-供需"}, * summary="收藏列表", * description="", * @OA\Parameter(name="page_size", in="query", @OA\Schema(type="string"), required=false, description="每页显示的条数"), * @OA\Parameter(name="page", in="query", @OA\Schema(type="string"), required=false, description="页码"), * @OA\Parameter(name="sort_name", in="query", @OA\Schema(type="string"), required=false, description="排序字段名字"), * @OA\Parameter(name="sort_type", in="query", @OA\Schema(type="string"), required=false, description="排序类型"), * @OA\Response( * response="200", * description="暂无" * ) * ) */ public function keepIndex() { $all = request()->all(); $supplyDemands = SupplyDemandKeep::where('user_id', $this->getUserId()) ->orderBy($all['sort_name'] ?? 'id', $all['sort_type'] ?? 'desc') ->paginate($all['page_size'] ?? 20); return $this->success(compact('supplyDemands')); } /** * @OA\Post( * path="/api/mobile/supply-demand/keep-supply-demand", * tags={"小程序-供需"}, * summary="收藏供需帖子", * @OA\Parameter(name="supply_demand_id", in="query", @OA\Schema(type="integer"), required=true, description="供需帖子id"), * @OA\Response(response=200, description="操作成功") * ) */ public function keepSupplyDemand() { $all = \request()->all(); $messages = [ 'supply_demand_id.required' => '供需信息id必填' ]; $validator = Validator::make($all, [ 'supply_demand_id' => 'required', ], $messages); if ($validator->fails()) { return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } $data = [ 'user_id' => $this->getUserId(), 'supply_demand_id' => $all['supply_demand_id'] ]; SupplyDemandKeep::firstOrCreate($data); return $this->success('收藏成功'); } /** * @OA\Post( * path="/api/mobile/supply-demand/un-keep-supply-demand", * tags={"小程序-供需"}, * summary="取消收藏供需帖子", * @OA\Parameter(name="supply_demand_id", in="query", @OA\Schema(type="integer"), required=true, description="供需帖子id"), * @OA\Response(response=200, description="操作成功") * ) */ public function unKeepSupplyDemand() { $all = \request()->all(); $messages = [ 'supply_demand_id.required' => '供需信息id必填' ]; $validator = Validator::make($all, [ 'supply_demand_id' => 'required', ], $messages); if ($validator->fails()) { return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } $keep = SupplyDemandKeep::where('user_id', $this->getUserId())->where('supply_demand_id', $all['supply_demand_id'])->first(); if (empty($keep)) { return $this->fail([ResponseCode::ERROR_BUSINESS, '该信息没有收藏']); } $keep->delete(); return $this->success('取消收藏成功'); } }