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

479 lines
19 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Events\OperationLoggedEvent;
use App\Exports\QuotaExport;
use App\Exports\QuotaLogExport;
use App\Facades\HttpService;
use App\Http\Controllers\Controller;
use App\Http\Response\ResponseJson;
use App\Models\AgentUser;
use App\Models\Collaborator;
use App\Models\Office;
use App\Models\Quota;
use App\Models\QuotaLog;
use App\Models\Station;
use App\Models\StationLog;
use App\Models\User;
use App\Validators\CollaboratorValidator;
use Exception;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator;
use Maatwebsite\Excel\Facades\Excel;
class CollaboratorsController extends Controller
{
use ResponseJson;
protected CollaboratorValidator $validator;
/**
* @param CollaboratorValidator $validator
*/
public function __construct(CollaboratorValidator $validator)
{
$this->validator = $validator;
}
/**
* 合作商列表
*
* @param Request $request
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
*/
public function index(Request $request)
{
$keyword = $request->input('keyword');
$status = $request->input('status',null);
$page_size = $request->input('page_size',15);
$type = $request->input('type');
$no_page = $request->input('no_page');
$query = Collaborator::query()
->when($status !== null,function ($query) use ($status) {
$query->where('status',$status);
})
->when(strlen($type) > 0,function ($query) use ($type) {
$query->where('type',$type);
})
->when($keyword,function ($query) use($keyword){
$query->where("name", 'like', '%'.$keyword.'%')
->orWhere('mobile', 'like', '%'.$keyword.'%');
})
->orderByDesc('updated_at')
->orderByDesc('id');
if($no_page){
$collaborator = $query->get();
}else{
$collaborator = $query->paginate($page_size);
}
foreach ($collaborator as $item){
$station = Station::where('user_id',$item->user_id)->first();
$item->office_name = '';
$item->office_id = '';
if($station){
$office = Office::where('id',$station->office_id)->first();
$item->office_name = $office->office_name;
$item->office_id = $office->office_id;
}
}
return $this->success('ok', $collaborator);
}
public function detail($id)
{
try {
$collaborator = Collaborator::query()->findOrFail($id);
$station = Station::where('user_id',$collaborator->user_id)->first();
if($station){
$office = Office::where('id',$station->office_id)->first();
}
$collaborator->office_id = $office->id??'';
$collaborator->office_name = $office->office_name??'';
$collaborator->station_id = $station->id??'';
$collaborator->station_number = $station->number??'';
return $this->success('ok',$collaborator);
}catch (ModelNotFoundException){
return $this->jsonResponse(1,'合作商不存在');
}
}
/**
* 修改合作商信息
*
* @param Request $request
* @param $id
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
*/
public function update(Request $request, $id)
{
DB::beginTransaction();
try {
//绑定工位
$office_id = $request->get('office_id');
if(!$office_id){
return $this->failure('请选择房间');
}
$data = $request->only(['avatar','name','mobile','intro','specialty','bio','protocols','diploma','type','id_card','agreement_number']);
$collaborator = Collaborator::query()->findOrFail($id);
if ($data['mobile'] && $data['mobile'] != $collaborator->mobile) {
$exist = Collaborator::where('mobile', $data['mobile'])->whereNot('id', $collaborator->id)->exists();
if ($exist)throw new Exception("手机号存在账号");
}
$collaborator->update($data);
//查看用户是否有工位
$user_station = Station::where('user_id',$collaborator->user_id)->first();
$station_id = $request->get('station_id');
if(!empty($user_station)){
$user_station->office_id = $office_id;
if(!$station_id){
//插入解绑记录
$log_unbind_map = [];
$log_unbind_map['station_id'] = $user_station->id;
$log_unbind_map['user_id'] = $collaborator->user_id;
$log_unbind_map['type'] = StationLog::TYPE_UNBIND;
$log_unbind_map['remark'] = '用户id:'.$collaborator->user_id.'解绑了工位:'.$user_station->number;
StationLog::create($log_unbind_map);
$user_station->number = Station::NO_FIXED_STATION;
$user_station->save();
//插入绑定记录
$log_map = [];
$log_map['station_id'] = $user_station->id;
$log_map['user_id'] = $collaborator->user_id;
$log_map['type'] = StationLog::TYPE_BIND;
$log_map['remark'] = '用户id:'.$collaborator->user_id.'绑定了工位:'.Station::NO_FIXED_STATION;
StationLog::create($log_map);
}else{
$station = Station::where('id',$station_id)->first();
if($station->user_id != $collaborator->user_id){
return $this->failure('该工位已绑定用户');
}
// $user_station->user_id = null;
// $user_station->save();
$log_unbind_map = [];
$log_unbind_map['station_id'] = $user_station->id;
$log_unbind_map['user_id'] = $collaborator->user_id;
$log_unbind_map['type'] = StationLog::TYPE_UNBIND;
$log_unbind_map['remark'] = '用户id:'.$collaborator->user_id.'解绑了工位:'.$user_station->number;
StationLog::create($log_unbind_map);
$station->user_id = $collaborator->user_id;
$station->save();
$log_map = [];
$log_map['station_id'] = $user_station->id;
$log_map['user_id'] = $collaborator->user_id;
$log_map['type'] = StationLog::TYPE_BIND;
$log_map['remark'] = '用户id:'.$collaborator->user_id.'绑定了工位:'.$station->number;
StationLog::create($log_map);
}
}else{
if(!$station_id){
$number = Station::NO_FIXED_STATION;
$model = Station::create(['office_id'=>$office_id,'number'=>$number,'user_id'=>$collaborator->user_id]);
}else{
$model = Station::where('id',$station_id)->first();
if(!empty($model->user_id)){
return $this->failure('该工位已绑定用户');
}
$number = $model->number;
$model->office_id = $office_id;
$model->user_id = $collaborator->user_id;
$model->save();
}
$log_map = [];
$log_map['station_id'] = $model->id;
$log_map['user_id'] = $collaborator->user_id;
$log_map['type'] = StationLog::TYPE_BIND;
$log_map['remark'] = '用户id:'.$collaborator->user_id.'绑定了工位:'.$number;
StationLog::create($log_map);
}
//操作记录
OperationLoggedEvent::dispatch("修改了合作商:$id 的信息");
DB::commit();
return $this->success('ok');
}catch (ModelNotFoundException){
return $this->jsonResponse(1,'合作商记录不存在');
}catch (Exception $e){
DB::rollBack();
return $this->jsonResponse(1,$e->getMessage());
}
}
/**
* 删除合作商
*
* @param $id
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
*/
public function destroy($id)
{
try {
$collaborator = Collaborator::query()->findOrFail($id);
$collaborator->delete();
return $this->success('ok');
}catch (ModelNotFoundException){
return $this->jsonResponse(1,'合作商记录不存在');
}catch (Exception $e){
return $this->jsonResponse(1,$e->getMessage());
}
}
/**
* 合作商审核
*
* @param Request $request
* @param $id
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
*/
public function audit(Request $request, $id)
{
DB::beginTransaction();
try {
$data = $request->only(['status','reason','type']);
$this->validator->scene('audit')->validate($data);
$collaborator = Collaborator::query()->findOrFail($id);
$collaborator->update($data);
//审核通过携带办公室id
$office_id = $request->input('office_id');
if(!empty($office_id)){
Station::create(['office_id'=>$office_id,'user_id'=>$collaborator->user_id,'number'=>Station::NO_FIXED_STATION]);
}
//审核通过以后更新用户表,先查看是否存在
if ($data['status'] == 1) {
User::updateServerUser($collaborator->mobile,$collaborator->user_id);
}
// if($data['status'] == Collaborator::STATUS_PASS && $data['type'] == Collaborator::TYPE_FULL_TIME){
// Station::create(['office_id'=>$office_id,'user_id'=>$collaborator->user_id,'number'=>Station::NO_FIXED_STATION]);
// }
//审核通过后加入服务用户表
// if ($data['status'] == 1) {
// //审核通过以后如果小程序有用户数据,则同步用户数据
// $user_data = User::getMpUser($collaborator->mobile);
// if($user_data){
// User::sameDataToUser($collaborator->user_id,$user_data->id);
// }
// }
User::where('id', $collaborator->user_id)->update(['name'=>$collaborator->name, 'mobile'=>$collaborator->mobile]);
//增加批发商
if ($data['status'] == 1 && $data['type'] == Collaborator::TYPE_FULL_TIME) //员工
{
//Mia说合作商审核和批发商角色没有关系
// AgentUser::changeLevel($collaborator->user_id, AgentUser::AgentStaff, "合作商员工审核", true);
}
DB::commit();
return $this->success('ok');
}catch (ModelNotFoundException){
return $this->jsonResponse(1,'合作商记录不存在');
}catch (Exception $e){
DB::rollBack();
return $this->jsonResponse(1,$e->getMessage());
}
}
public function add(Request $request){
DB::beginTransaction();
try {
//绑定工位
$office_id = $request->get('office_id');
if(!$office_id){
return $this->failure('请选择房间');
}
$data = $request->only(['avatar','name','mobile','intro','specialty','bio','protocols','diploma','type','id_card','agreement_number']);
$data['status'] = Collaborator::STATUS_PASS;
$data['type'] = Collaborator::TYPE_USER;
$exist = User::where('mobile',$data['mobile'])->exists();
if ($exist) return $this->failure('手机号已被注册');
$agreement_number = Collaborator::where('agreement_number', $data['agreement_number'])->exists();
if ($agreement_number) return $this->failure('协议号已存在');
$user_model = User::create(['name'=>$data['name'],'mobile'=>$data['mobile'],'avatar'=>$data['avatar']]);
$station = Station::create(['office_id'=>$office_id,'number'=>Station::NO_FIXED_STATION,'user_id'=>$user_model->id]);
StationLog::create(['station_id'=>$station->id,'user_id'=>$user_model->id,'type'=>StationLog::TYPE_BIND,'remark'=>'用户id:'.$user_model->id.'绑定了工位:'.Station::NO_FIXED_STATION]);
$data['user_id'] = $user_model->id;
Collaborator::create($data);
DB::commit();
return $this->success('ok');
}catch (\Exception $e){
DB::rollBack();
return $this->failure($e->getMessage());
}
}
public function addQuota(Request $request){
try {
$data = $request->only(['agency_id','collaborator_id','num','agreement_number']);
$validated = Validator::make($data, [
'collaborator_id' => 'required',
'num' => 'required',
], [
'collaborator_id.required' => '请选择人员',
'num.required' => '请填写名额',
]);
if ($validated->fails()) {
$errors = $validated->errors()->all();
$error = count($errors) ? $errors[0] : null;
return $this->failure($error);
}
$agency_id = $data['agency_id']??'';
$query = Quota::query();
$query->when($agency_id,function ($query) use($agency_id){
$query->where("agency_id", $agency_id);
});
$quota = $query->where('collaborator_id',$data['collaborator_id'])->where('agreement_number',$data['agreement_number'])->first();
$admin = auth()->user();
if($quota){
$quota->num = $quota->num+$data['num'];
$quota->operate_user_id = $admin->id;
$quota->operate_user_name = $admin->name;
$quota->save();
}else{
$data['operate_user_id'] = $admin->id;
$data['operate_user_name'] = $admin->name;
Quota::create($data);
}
return $this->success('ok');
}catch (\Exception $e){
Log::error('addAgreement:'.$e->getMessage());
return $this->failure($e->getMessage());
}
}
public function getQuotaList(Request $request){
try {
$keyword = $request->input('keyword');
$is_export = $request->input('is_export');
$no_page = $request->input('no_page');
if($is_export){
$no_page = true;
}
$id = $request->input('id');
$query = Quota::query()->with('collaboratorInfo','agencyInfo');
$query->when($keyword,function ($query) use ($keyword){
// $query->where('agreement_number','like',"%{$keyword}%");
// $query->whereHas('collaboratorInfo',function ($query) use ($keyword) {
// $query->where('name','like',"%{$keyword}%")->orWhere('mobile','like',"%{$keyword}%");
// });
$query->where(function ($query) use ($keyword) {
$query->where('agreement_number', 'like', "%{$keyword}%")
->orWhereHas('collaboratorInfo', function ($query) use ($keyword) {
$query->where('name', 'like', "%{$keyword}%")
->orWhere('mobile', 'like', "%{$keyword}%");
});
});
});
$query->when($id,function ($query) use ($id){
$query->where('collaborator_id',$id);
});
$query->orderByDesc('id');
if($no_page){
$list = $query->get();
}else{
$list = $query->paginate();
}
if($is_export){
return Excel::download(new QuotaExport($list), '名额.xlsx');
}
return $this->success('ok',$list);
}catch (\Exception $e){
Log::error('getQuotaList:'.$e->getMessage());
return $this->failure($e->getMessage());
}
}
public function getQuotaLogList(Request $request,$id){
try {
$keyword = $request->input('keyword');
$is_export = $request->input('is_export');
$query = QuotaLog::query()->with('orderInfo');
$query->when($keyword,function ($query) use ($keyword) {
$query->whereHas('orderInfo',function ($query) use ($keyword) {
$query->where('name','like',"%{$keyword}%");
});
});
$query->when($id,function ($query) use ($id){
$query->where('quota_id',$id);
});
$query->orderByDesc('id');
if($is_export){
$list = $query->get();
}else{
$list = $query->paginate();
}
if($is_export){
return Excel::download(new QuotaLogExport($list), '名额使用记录.xlsx');
}
return $this->success('ok',$list);
}catch (\Exception $e){
Log::error('getQuotaList:'.$e->getMessage());
return $this->failure($e->getMessage());
}
}
public function updateQuota(Request $request,$id,Quota $quota){
try {
$data = $request->only(['agency_id','collaborator_id','num','agreement_number']);
$quota_info = $quota->find($id);
$quota_info->update($data);
if(!empty($data['num']) && ($data['num'] != $quota_info->num)){
$admin = auth()->user();
QuotaLog::addQuotaLog($admin,0,$data['num'],$quota_info->id);
}
return $this->success('ok');
}catch (\Exception $e){
Log::error('updateQuota:'.$e->getMessage());
return $this->failure($e->getMessage());
}
}
public function delQuota($id,Quota $quota){
try {
$quota->where('id',$id)->delete();
return $this->success('ok');
}catch (\Exception $e){
Log::error('delQuota:'.$e->getMessage());
return $this->failure($e->getMessage());
}
}
}