ufutx.dma/app/Http/Controllers/Admin/OfficeController.php
2026-03-04 14:42:40 +08:00

639 lines
23 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Exports\ChefUserExport;
use App\Exports\MeetRoomExport;
use App\Exports\OfficeExport;
use App\Exports\StationExport;
use App\Http\Controllers\Controller;
use App\Http\Response\ResponseJson;
use App\Models\MeetRoom;
use App\Models\MeetRoomOwner;
use App\Models\MeetRoomReserve;
use App\Models\Office;
use App\Models\Partner;
use App\Models\ServiceUser;
use App\Models\Station;
use App\Models\StationLog;
use App\Models\Wechat;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Maatwebsite\Excel\Facades\Excel;
class OfficeController extends Controller
{
use ResponseJson;
/**
* 创建办公室
* @param Request $request
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
*/
public function addOffice(Request $request)
{
try {
$office_name = $request->input('office_name');
if(empty($office_name)){
return $this->failure('办公室名不为空');
}
$exists = Office::where('office_name',$office_name)->exists();
if($exists){
return $this->failure('办公室已存在');
}
$images = $request->input('images');
$detail_images = $request->input('detail_images');
$map = [];
$map['office_name'] = $office_name;
$map['images'] = $images;
$map['detail_images'] = $detail_images;
$res = Office::create($map);
return $this->success('ok',$res);
}catch (\Exception $e){
Log::error('addOffice:'.$e->getMessage());
return $this->jsonResponse(1,$e->getMessage());
}
}
/**
* 获取办公室列表
* @param Request $request
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
*/
public function getOfficeList(Request $request){
try {
$keyword = $request->get('keyword');
$no_page = $request->get('no_page');
$office = Office::query()->when($keyword, function ($query) use ($keyword) {
$query->where(function ($query) use ($keyword) {
$query->where('office_name', 'like', "%{$keyword}%");
});
})
->orderByDesc('id');
if($no_page){
$list = $office->get();
}else{
$list = $office->paginate();
}
return $this->success('ok',$list);
}catch (\Exception $e){
Log::error('getOfficeList:'.$e->getMessage());
return $this->jsonResponse(1,$e->getMessage());
}
}
/**
* 更新办公室信息
* @param Request $request
* @return \Illuminate\Http\JsonResponse|void
*/
public function updateOffice(Request $request){
try{
$id = $request->get('id');
if(empty($id)) return $this->failure('id不为空');
$office = Office::where('id',$id)->first();
$office_name = $request->get('office_name');
if(!empty($office_name)) $office->office_name = $office_name;
$exists = Office::where('office_name',$office_name)->exists();
if($exists){
return $this->failure('办公室已存在');
}
$images = $request->input('images');
if(!empty($images)) $office->images = $images;
$detail_images = $request->input('detail_images');
if(!empty($detail_images)) $office->detail_images = $detail_images;
$office->save();
return $this->success('ok');
}catch (\Exception $e){
Log::error('updateOffice:'.$e->getMessage());
return $this->jsonResponse(1,$e->getMessage());
}
}
/**
* 删除办公室
* @param Request $request
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
*/
public function deleteOffice(Request $request){
try {
$id = $request->get('id');
if(empty($id)) return $this->failure('id不为空');
$meetRoom = MeetRoom::where('office_id',$id)->exists();
if($meetRoom){
return $this->failure('请先删除办公室下会议室');
}
$station = Station::where('office_id',$id)->exists();
if($station){
return $this->failure('请先删除办公室下工位');
}
$res = Office::where('id',$id)->delete();
return $this->success('ok',$res);
}catch (\Exception $e){
Log::error('deleteOffice:'.$e->getMessage());
return $this->jsonResponse(1,$e->getMessage());
}
}
/**
* 添加会议室
* @param Request $request
* @return \Illuminate\Http\JsonResponse|void
*/
public function addMeetingRoom(Request $request){
DB::beginTransaction();
try {
$office_id = $request->input('office_id');
if(empty($office_id)) return $this->failure('请选择所属办公室');
$room_name = $request->input('room_name');
if(empty($room_name)) return $this->failure('会议室名称不为空');
$user_ids = $request->input('user_ids');
if(empty($user_ids)) return $this->failure('拥有者id不为空');
$type = $request->input('type',0);
$desc = $request->input('desc');
$images = $request->input('images');
$room_map = [];
$room_map['office_id'] = $office_id;
$room_map['room_name'] = $room_name;
$room_map['type'] = $type;
$room_map['desc'] = $desc;
$room_map['images'] = $images;
$model = MeetRoom::create($room_map);
//获取会议室id并添加拥有者
$room_id = $model->id;
foreach ($user_ids as $user_id){
$owner_map = [];
$user = ServiceUser::where('user_id',$user_id)->first();
$open_id = Wechat::where('user_id',$user_id)->where('type','official')->value('openid');
$owner_map['room_id'] = $room_id;
$owner_map['user_id'] = $user_id;
$owner_map['name'] = $user->name??'';
$owner_map['mobile'] = $user->mobile??'';
$owner_map['open_id'] = $open_id??0;
MeetRoomOwner::create($owner_map);
}
DB::commit();
return $this->success('ok');
}catch (\Exception $e){
DB::rollBack();
Log::error('addMeetingRoom:'.$e->getMessage());
return $this->jsonResponse(1,$e->getMessage());
}
}
/**
* 获取会议室列表
* @param Request $request
* @return \Illuminate\Http\JsonResponse|void
*/
public function getMeetRoomList(Request $request){
try {
$keyword = $request->get('keyword');
$list = MeetRoom::when($keyword, function ($query) use ($keyword) {
$query->where(function ($query) use ($keyword) {
$query->where('room_name', 'like', "%{$keyword}%");
});
})
->orderByDesc('id')
->paginate();
return $this->success('ok',$list);
}catch (\Exception $e){
Log::error('getMeetRoomList:'.$e->getMessage());
return $this->jsonResponse(1,$e->getMessage());
}
}
/**
* 获取拥有者数据
* @param Request $request
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
*/
public function getOwnerUser(Request $request){
try {
$room_id = $request->get('room_id');
if(empty($room_id)) return $this->failure('会议室id不能为空');
$list = MeetRoomOwner::where('room_id',$room_id)
->orderByDesc('id')
->get();
return $this->success('ok',$list);
}catch (\Exception $e){
Log::error('getOwnerUser:'.$e->getMessage());
return $this->jsonResponse(1,$e->getMessage());
}
}
/**
*获取预约记录
* @param Request $request
*/
public function getMeetRoomReserve(Request $request){
try {
$room_id = $request->get('room_id');
if(empty($room_id)) return $this->failure('会议室id不能为空');
$list = MeetRoomReserve::where('room_id',$room_id)
->orderByDesc('id')
->paginate();
foreach ($list as $item){
$item->room_name = MeetRoom::where('id',$item->room_id)->value('room_name');
}
return $this->success('ok',$list);
}catch (\Exception $e){
Log::error('getMeetRoomReserve:'.$e->getMessage());
return $this->jsonResponse(1,$e->getMessage());
}
}
/**
* 删除会议室
* @param Request $request
* @return \Illuminate\Http\JsonResponse|void
*/
public function deleteMeetRoom(Request $request){
DB::beginTransaction();
try {
$room_id = $request->get('room_id');
MeetRoom::where('id',$room_id)->delete();
MeetRoomOwner::where('room_id',$room_id)->delete();
DB::commit();
return $this->success('ok');
}catch (\Exception $e){
DB::rollBack();
Log::error('deleteMeetRoom:'.$e->getMessage());
return $this->jsonResponse(1,$e->getMessage());
}
}
/**
* 更新会议室信息
* @param Request $request
* @return \Illuminate\Http\JsonResponse|void
*/
public function updateMeetRoom(Request $request){
DB::beginTransaction();
try {
$room_id = $request->get('room_id');
if(empty($room_id)) return $this->failure('会议室id不能为空');
$room_info = MeetRoom::where('id',$room_id)->first();
$office_id = $request->get('office_id');
if(!empty($office_id)) $room_info->office_id = $office_id;
$room_name = $request->get('room_name');
if(!empty($room_name)) $room_info->room_name = $room_name;
$desc = $request->get('desc');
if(!empty($desc)) $room_info->desc = $desc;
$images = $request->get('images');
if(!empty($images)) $room_info->images = json_encode($images);
//删除旧拥有者,重新插入
MeetRoomOwner::where('room_id',$room_id)->delete();
$user_ids = $request->input('user_ids');
if(empty($user_ids)) return $this->failure('拥有者id不为空');
foreach ($user_ids as $user_id){
$owner_map = [];
$user = ServiceUser::where('user_id',$user_id)->first();
$open_id = Wechat::where('user_id',$user_id)->where('type','official')->value('openid');
$owner_map['room_id'] = $room_id;
$owner_map['user_id'] = $user_id;
$owner_map['name'] = $user->name??'';
$owner_map['mobile'] = $user->mobile??'';
$owner_map['open_id'] = $open_id??0;
MeetRoomOwner::create($owner_map);
}
$room_info->save();
DB::commit();
return $this->success('ok',$room_info);
}catch (\Exception $e){
DB::rollBack();
Log::error('updateMeetRoom:'.$e->getMessage());
return $this->jsonResponse(1,$e->getMessage());
}
}
/**
* 获取服务人员
* @param Request $request
*/
public function getServiceUser(Request $request){
try {
$keyword = $request->get('keyword');
$list = ServiceUser::when($keyword, function ($query) use ($keyword) {
$query->where(function ($query) use ($keyword) {
$query->where('name', 'like', "%{$keyword}%")->orWhere('mobile','like',"%{$keyword}%");
});
})
->orderByDesc('id')
->paginate();
foreach ($list as $item){
$partner = Partner::where('user_id',$item->user_id)->first();
$item->avatar = $partner->pic??'';
}
return $this->success('ok',$list);
}catch (\Exception $e){
Log::error('getServiceUser:'.$e->getMessage());
return $this->jsonResponse(1,$e->getMessage());
}
}
/**
* 添加工位
* @param Request $request
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
*/
public function addStation(Request $request){
DB::beginTransaction();
try {
$office_id = $request->input('office_id');
if(empty($office_id)) return $this->failure('请选择所属办公室');
$number = $request->input('number');
if(empty($number)) return $this->failure('编号不为空');
$exists = Station::where('office_id',$office_id)->where('number',$number)->exists();
if($exists){
return $this->failure('工位已存在');
}
$user_id = $request->input('user_id');
$map = [];
$map['office_id'] = $office_id;
$map['number'] = $number;
$map['user_id'] = $user_id;
$model = Station::create($map);
//增加绑定记录
if($user_id){
$log_map = [];
$log_map['station_id'] = $model->id;
$log_map['user_id'] = $user_id;
$log_map['type'] = StationLog::TYPE_BIND;
$log_map['remark'] = '用户id:'.$user_id.'绑定了工位';
StationLog::create($log_map);
}
DB::commit();
return $this->success('ok');
}catch (\Exception $e){
DB::rollBack();
Log::error('addStation:'.$e->getMessage());
return $this->jsonResponse(1,$e->getMessage());
}
}
/**
* 获取工位列表
* @param Request $request
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
*/
public function getStationList(Request $request){
try{
$keyword = $request->get('keyword');
$type = $request->get('type');
$office_id = $request->get('office_id');
$query = Station::query()->when($keyword, function ($query) use ($keyword) {
$query->where(function ($query) use ($keyword) {
$query->where('number', 'like', "%{$keyword}%");
});
});
if(!empty($office_id)){
$query->where('office_id',$office_id);
}
//查询没有绑定用户的工位
if($type){
$query->where('user_id',null);
}
$query->orderByDesc('id');
$no_page = $request->input('no_page');
if($no_page){
$list = $query->get();
}else{
$list = $query->paginate();
}
foreach ($list as $item){
$item->office_name = Office::where('id',$item->office_id)->value('office_name');
if($item->user_id){
$item->user_name = ServiceUser::where('user_id',$item->user_id)->value('name');
}
}
return $this->success('ok',$list);
}catch (\Exception $e){
Log::error('getStationList:'.$e->getMessage());
return $this->jsonResponse(1,$e->getMessage());
}
}
/**
* 删除工位
* @param Request $request
* @return \Illuminate\Http\JsonResponse|void
*/
public function deleteStation(Request $request){
try{
$id = $request->get('id');
if(empty($id)) return $this->failure('id不为空');
Station::where('id',$id)->delete();
return $this->success('ok');
}catch (\Exception $e){
Log::error('deleteStation:'.$e->getMessage());
return $this->jsonResponse(1,$e->getMessage());
}
}
/**
* 修改工位
* @param Request $request
*/
public function updateStation(Request $request){
DB::beginTransaction();
try {
$id = $request->get('id');
if(empty($id)) return $this->failure('id不为空');
$station = Station::where('id',$id)->first();
$office_id = $request->get('office_id');
if(!empty($office_id)) $station->office_id = $office_id;
$number = $request->get('number');
if($number != $station->number){
$exists = Station::where('office_id',$office_id)->where('number',$number)->exits();
if($exists){
return $this->failure('工位已存在');
}
}
if(!empty($number)) $station->number = $number;
$user_id = $request->get('user_id');
if($user_id && $station->user_id && $station->user_id != $user_id){
return $this->failure('已绑定用户');
}
//增加绑定记录
$log_map = [];
$log_map['station_id'] = $id;
if($user_id){
$log_map['user_id'] = $user_id;
$log_map['type'] = StationLog::TYPE_BIND;
$log_map['remark'] = '用户id:'.$user_id.'绑定了工位';
StationLog::create($log_map);
}else{
$log_map['user_id'] = $station->user_id;
$log_map['type'] = StationLog::TYPE_UNBIND;
$log_map['remark'] = '用户id:'.$user_id.'解绑了工位';
StationLog::create($log_map);
}
$station->user_id = $user_id;
$station->save();
DB::commit();
return $this->success('ok',$station);
}catch (\Exception $e){
DB::rollBack();
Log::error('updateStation:'.$e->getMessage());
return $this->jsonResponse(1,$e->getMessage());
}
}
/**
*h获取解绑记录
*/
public function getBindLog(Request $request){
try {
$keyword = $request->get('keyword');
$list = StationLog::join('station','station.id','=','station_log.station_id')
->when($keyword, function ($query) use ($keyword) {
$query->where(function ($query) use ($keyword) {
$query->where('station.number', 'like', "%{$keyword}%");
});
})
->select('station.number','station_log.*')
->orderByDesc('id')
->paginate();
foreach ($list as $item){
$item->user_name = ServiceUser::where('user_id',$item->user_id)->value('name');
$office_id = Station::where('id',$item->station_id)->value('office_id');
$item->office_name = Office::where('id',$office_id)->value('office_name');
}
return $this->success('ok',$list);
}catch (\Exception $e){
Log::error('getBindLog:'.$e->getMessage());
return $this->jsonResponse(1,$e->getMessage());
}
}
/**
* 导出办公室
* @param Request $request
* @return \Illuminate\Http\JsonResponse|void
*/
public function exportOffice(Request $request){
try {
$keyword = $request->get('keyword');
$office = Office::query()->when($keyword, function ($query) use ($keyword) {
$query->where(function ($query) use ($keyword) {
$query->where('office_name', 'like', "%{$keyword}%");
});
})
->orderByDesc('id');
$list = $office->get();
if($list->isEmpty()){
return $this->failure('暂无数据');
}
return Excel::download(new OfficeExport($list), 'office.xlsx');
}catch (\Exception $e){
Log::error('exportOffice:'.$e->getMessage());
return $this->jsonResponse(1,$e->getMessage());
}
}
/**
* 导出会议室
* @param Request $request
* @return \Illuminate\Http\JsonResponse|\Symfony\Component\HttpFoundation\BinaryFileResponse
*/
public function exportMeetRoom(Request $request){
try {
$keyword = $request->get('keyword');
$list = MeetRoom::when($keyword, function ($query) use ($keyword) {
$query->where(function ($query) use ($keyword) {
$query->where('room_name', 'like', "%{$keyword}%");
});
})
->orderByDesc('id')
->get();
if($list->isEmpty()){
return $this->failure('暂无数据');
}
return Excel::download(new MeetRoomExport($list), 'meet_room.xlsx');
}catch (\Exception $e){
Log::error('exportOffice:'.$e->getMessage());
return $this->jsonResponse(1,$e->getMessage());
}
}
/**
* 导出工位
* @param Request $request
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
*/
public function exportStation(Request $request){
try{
$keyword = $request->get('keyword');
$type = $request->get('type');
$office_id = $request->get('office_id');
$query = Station::query()->when($keyword, function ($query) use ($keyword) {
$query->where(function ($query) use ($keyword) {
$query->where('number', 'like', "%{$keyword}%");
});
});
if(!empty($office_id)){
$query->where('office_id',$office_id);
}
//查询没有绑定用户的工位
if($type){
$query->where('user_id',null);
}
$query->orderByDesc('id');
$list = $query->get();
foreach ($list as $item){
$item->office_name = Office::where('id',$item->office_id)->value('office_name');
if($item->user_id){
$item->user_name = ServiceUser::where('user_id',$item->user_id)->value('name');
}
}
return Excel::download(new StationExport($list), 'station.xlsx');
}catch (\Exception $e){
Log::error('getStationList:'.$e->getMessage());
return $this->jsonResponse(1,$e->getMessage());
}
}
}