You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

439 lines
18 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
/**
* 供需
*/
namespace App\Http\Controllers\Mobile;
use App\Helpers\ResponseCode;
use App\Models\AppointmentConfig;
use App\Models\AppointmentType;
use App\Models\Banner;
use App\Models\Config;
use App\Models\Dialogue;
use App\Models\Message;
use App\Models\SupplyDemand;
use App\Models\SupplyDemandKeep;
use App\Notifications\BirthdayNotify;
use App\Notifications\SupplyDemandNotify;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Notification;
use Illuminate\Support\Facades\Validator;
class SupplyDemandController extends CommonController
{
/**
* @OA\Get(
* path="/api/mobile/supply-demand/index",
* tags={"小程序-供需"},
* summary="供需列表",
* description="",
* @OA\Parameter(name="myself", in="query", @OA\Schema(type="integer"), required=true, description="是否只看自己的0否1是"),
* @OA\Parameter(name="type", in="query", @OA\Schema(type="integer"), required=true, description="类型"),
* @OA\Parameter(name="keyword", in="query", @OA\Schema(type="integer"), required=true, description="关键词"),
* @OA\Parameter(name="status", in="query", @OA\Schema(type="integer"), required=true, description="状态0待审核1通过2拒绝"),
* @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 index()
{
$all = request()->all();
$supplyDemands = SupplyDemand::where(function ($query) use ($all) {
if (isset($all['type'])) {
$query->where('type', $all['type']);
}
if (isset($all['status'])) {
$query->where('status', $all['status']);
}
if (isset($all['keyword'])) {
$query->where('content', 'like', '%' . $all['keyword'] . '%');
}
if (isset($all['myself']) && $all['myself'] == 1) {
$query->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\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');
}
])->find($all['id']);
// 增加view_count
$detail->increment('view_count');
$detail->save();
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="status", in="query", @OA\Schema(type="integer"), required=false, description="审核状态0待审核1通过2拒绝"),
* @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\Get(
* 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 = [
'supply_demand_id.required' => '供需信息id必填',
'content.required' => '内容必填',
'to_user_id.required' => '接收人必填',
];
$validator = Validator::make($all, [
'supply_demand_id' => 'required',
'content' => 'required',
'to_user_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, '供需数据不存在']);
}
// 增加view_count
$model->increment('contact_count');
$model->save();
// 判断是否有会话,没有则创建
$dialogue = Dialogue::where('user_id', $this->getUserId())
->where('supply_demand_id', $all['supply_demand_id'])
->first();
if (empty($dialogue)) {
// 创建一条会话
$dialogue = Dialogue::create([
'user_id' => $this->getUserId(),
'to_user_id' => $model->user_id,
'supply_demand_id' => $all['supply_demand_id']
]);
}
// 每天限制私信次数限制
$message_limit = Config::getValueByKey('message_limit');
$messageToday = Message::where('user_id', $this->getUserId())
->where('created_at', 'like', '%' . date('Y-m-d') . '%')
->get();
if ($messageToday > $message_limit) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '今天私信次数已达上限']);
}
// 有且仅有自己发的信息,则不能发再
$myMessage = Message::where('user_id', $this->getUserId())
->where('supply_demand_id', $all['supply_demand_id'])
->first();
// 对方的信息
$otherMessage = Message::where('user_id', $all['to_user_id'])
->where('supply_demand_id', $all['supply_demand_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'],
'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="dialogue_id", in="query", @OA\Schema(type="string"), required=true, description="会话id(二选一)"),
* @OA\Parameter(name="supply_demand_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();
$message = Message::with([
'user' => function ($query) {
$query->select('id', 'nickname', 'name', 'headimgurl');
},
'toUser' => function ($query) {
$query->select('id', 'nickname', 'name', 'headimgurl');
}
])->where(function ($query) use ($all) {
if (isset($all['dialogue_id'])) {
$query->where('dialogue_id', $all['dialogue_id']);
}
if (isset($all['supply_demand_id'])) {
$query->whereHas('dialogue', function ($query) use ($all) {
$query->where('supply_demand_id', $all['supply_demand_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');
},
'toUser' => function ($query) {
$query->select('id', 'nickname', 'name', 'headimgurl');
}
])->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('取消收藏成功');
}
}