ufutx.dma/app/Http/Controllers/H5/ServiceUserController.php

604 lines
23 KiB
PHP
Raw Normal View History

2026-03-04 14:42:40 +08:00
<?php
namespace App\Http\Controllers\H5;
use App\Http\Controllers\Controller;
use App\Http\Response\ResponseJson;
use App\Jobs\AddErrorLog;
use App\Models\ChefUser;
use App\Models\Coach;
use App\Models\Collaborator;
use App\Models\CustomerServiceUser;
use App\Models\Group;
use App\Models\MainCoach;
use App\Models\Message;
use App\Models\Partner;
use App\Models\ServiceRole;
use App\Models\ServiceRoleOrder;
use App\Models\ServiceRoleUser;
use App\Models\ServiceUser;
use App\Models\ServiceUserBindRole;
use App\Models\User;
use App\Models\Wechat;
use App\Validators\ServiceUserValidator;
use Illuminate\Support\Facades\DB;
use Exception;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
class ServiceUserController extends Controller
{
use ResponseJson;
private Coach $coach;
private MainCoach $mainCoach;
private CustomerServiceUser $customerServiceUser;
private ServiceUserValidator $validator;
private ChefUser $chefUser;
private User $user;
private mixed $openid = '';
public function __construct(Coach $coach,MainCoach $mainCoach,CustomerServiceUser $customerServiceUser,ServiceUserValidator $validator,ChefUser $chefUser)
{
Log::info("ServiceUserController 初始化");
// $wechat_user = session('wechat_user');
// Log::info($wechat_user);
// $openid = $wechat_user['id']??null;
// Log::info("ServiceUserController 初始化1".$openid);
// //构造函数不能直接返回错误提示,这里返回会报错,微调一下
// if (config('app.env') == 'production') {
// if (empty($openid)){
//// $openid = $request->input('open_id');
// if (empty($openid)) return $this->jsonResponse(3,"微信授权失败");
//// if (empty($openid)) throw new \Exception("微信授权失败");;
//// $wechat_user['id'] = explode("?", $openid)[0];
// }
// }else {
// $wechat_user['id'] = 'o1by95wyeY3tBVWbtQSF8yJGCzi8';
// }
// Log::info("ServiceUserController 初始化2".$openid);
//
// $this->openid = $wechat_user['id'];
$this->coach = $coach;
$this->mainCoach = $mainCoach;
$this->customerServiceUser = $customerServiceUser;
$this->chefUser = $chefUser;
$this->validator = $validator;
Log::info("ServiceUserController 初始化3".$this->openid);
}
/**
* @throws Exception
*/
public function detail(Request $request)
{
try {
$user = auth()->user();
$openid = $user->officialWechat?$user->officialWechat->openid:null;
//获取用户信息
$user = $this->checkUserRoles($openid);
$role = $request->get('role',null);
if (!in_array($role,['main_coaches','coaches','customer_service_user','chef_user']))throw new Exception('参数错误');
//获取合作商信息
$collaborator = Collaborator::where('user_id',$user->id)->first();
//获取对应角色信息
$service_user_info = $user->$role;
$partner = $user->partner??new Partner([
'id'=>null,
'name'=>null,
'mobile'=>null,
'sex'=>0,
'birthday'=>date('Y-m-d'),
'weight'=>0,
]);
if (!$service_user_info){
$is_str = 'is_'.$role;
$user->service_user_info = [
'partner_id'=>$partner->id,
'openid'=>$openid,
'customer_num'=>0,
'agree_user'=>null,
'disagree_user'=>null,
'outlook'=>null,
'reason'=>null,
'think'=>null,
'idea'=>null,
'filing_at'=>date('Y-m-d'),
'status'=>$user->$is_str?1:3
];
}else{
$user->service_user_info = $user->$role;
unset($user->$role);
}
//调整结构
$user->sex = $partner->sex;
$user->birthday = $partner->birthday;
$user->name = $collaborator->name ?? $partner->name;
$user->mobile = $collaborator->mobile?? $partner->mobile;
$user->avatar = $collaborator->avatar?? $partner->pic;
$user->weight = $partner->weight;
$user->makeVisible('mobile');
unset($user->partner);
unset($user->service_roles);
return $this->success('ok', $user);
}catch (ModelNotFoundException){
return $this->jsonResponse(1,'未找到用户信息');
}catch (\Exception $e){
return $this->jsonResponse(1,$e->getMessage());
}
}
/**
* 保存
*
* @throws Exception
*/
public function store(Request $request)
{
try {
$user = auth()->user();
$openid = $user->officialWechat?$user->officialWechat->openid:null;
$role = $request->get('role',null);
if (!in_array($role,['main_coaches','coaches','customer_service_user','chef_user']))throw new Exception('参数错误');
//数据验证
$data = $request->all();
// $this->validator->scene($role)->validate($data);
//获取此用户合伙人信息
$user = $this->checkUserRoles($openid);
DB::beginTransaction();
$partner = [
'openid'=>$openid,
'name'=>$data['name'],
'mobile'=>$data['mobile'],
'pic'=>$data['pic']??'',
'sex'=>$data['sex']??0,
'birthday'=>$data['birthday']??'',
'weight'=>$data['weight']??0,
'intro'=>null,
'specialty'=>null,
'attach'=>null,
'status' => 1,
'user_id'=>$user->id
];
Partner::updateOrCreate(['openid'=>$openid],$partner);
//获取用户角色
$service_user = match ($role) {
"main_coaches" => new MainCoach(),
"coaches" => new Coach(),
"customer_service_user" => new CustomerServiceUser(),
"chef_user" => new ChefUser(),
};
$is_str = 'is_'.$role;
$service_user->updateOrCreate(
['openid' => $openid],
[
'partner_id'=>$user->partner->id,
'openid'=>$openid,
'customer_num'=>$data['customer_num']??0,
'agree_user'=>$request->get('agree_user'),
'disagree_user'=>$request->get('disagree_user'),
'outlook'=>$data['outlook']??'',
'reason'=>$data['reason'],
'think'=>$data['think']??'',
'idea'=>$data['idea']??'',
'status'=>$user->$is_str?1:0,
'filing_at'=>date('Y-m-d')
]
);
//同步修改合作商信息
$collaborator = Collaborator::where('user_id',$user->id)->first();
if($collaborator && $user->$is_str){
$collaborator->name = $data['name'];
$collaborator->mobile = $data['mobile'];
$collaborator->avatar = !empty($data['pic']) ? $data['pic'] : $collaborator->avatar;
$collaborator->save();
}
DB::commit();
return $this->success('ok');
}catch (ModelNotFoundException){
return $this->jsonResponse(1,'未找到用户信息');
}catch (Exception $e){
DB::rollBack();
return $this->jsonResponse(1,$e->getMessage());
}
}
/**
* 获取服务用户信息
*
* @param $service_user_id
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
*/
public function getServiceUserInfo($service_user_id)
{
try {
$user = auth()->user();
$openid = $user->officialWechat?$user->officialWechat->openid:null;
$service_user = ServiceUser::with(['service_roles'])->findOrFail($service_user_id);
$wechat = Wechat::where('openid',$openid)->first();
$user = $wechat->user;
$service_user->is_subscribe = $user->is_subscribe;
return $this->success("ok",$service_user);
}catch (ModelNotFoundException){
return $this->jsonResponse(1,'服务用户不存在');
}
}
/**
* 绑定服务用户
*
* @param Request $request
* @param $service_user_id
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
*/
public function bindServiceUser(Request $request, $service_user_id)
{
try {
$user = auth()->user();
$openid = $user->officialWechat?$user->officialWechat->openid:null;
$service_user = ServiceUser::with('service_roles')->findOrFail($service_user_id);
$wechat = Wechat::where('openid',$openid)->first();
DB::beginTransaction();
//查看此微信是否绑定其他服务人员
$wechat_service_uesr = ServiceUser::where('user_id',$wechat->user_id)->exists();
if ($wechat_service_uesr){
throw new Exception('此微信已绑定其他服务人员');
}
// $data = $request->all();
// $this->validator->scene('partner')->validate($data);
//更新合伙人信息
$partner = [
'openid'=>$openid,
'name'=>$service_user['name'],
'mobile'=>$service_user['mobile'],
'pic'=>null,
'sex'=>0,
'birthday'=>null,
'intro'=>null,
'specialty'=>null,
'attach'=>null,
'status' => 1,
'user_id'=>$wechat->user_id
];
Partner::updateOrCreate(['openid'=>$openid],$partner);
//绑定服务人员
$service_user->user_id = $wechat->user_id;
$service_user->save();
//同步服务人员角色信息
$role_ids = [];
foreach ($service_user->service_roles as $role){
$role_ids[] = $role->id;
}
$service_user->service_roles()->syncWithPivotValues($role_ids,['user_id'=>$wechat->user_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 $openid
* @return User
*/
private function checkUserRoles($openid)
{
//获取用户角色
$user = User::with('service_roles')
->whereHas('officialWechat', function ($query) use ($openid) {
$query->where('openid', $openid);
})
->firstOrFail();
$user->is_main_coaches = 0;
$user->is_coaches = 0;
$user->is_customer_service_user = 0;
$user->is_partner = 0;
$user->is_chef_user = 0;
$user->service_roles()->each(function ($service_role) use ($user) {
switch ($service_role->pivot->role_id){
case 1://主教练
$user->is_main_coaches = 1;
break;
case 2://副教练
$user->is_coaches = 1;
break;
case 3://客服
$user->is_customer_service_user = 1;
break;
case 4://小伙伴
$user->is_partner = 1;
break;
case 6://餐饮人员
$user->is_chef_user = 1;
break;
}
});
return $user;
}
/**
* 企业微信绑定服务人员
*/
public function bindWorkServiceUser(Request $request)
{
DB::beginTransaction();
try {
$mobile = $request->input('mobile');
if (empty($mobile)) throw new Exception("缺少参数mobile");
$service_user = ServiceUser::where('mobile', $mobile)->first();
$status = 0; //未注册服务人员
if (empty($service_user)) return $this->success("ok", compact('status'));
$work_id = $request->get('work_id');
if(!empty($work_id)){
$work_user_id = $work_id;
}else{
//用户企业微信信息
$work_wechat_user = session('work_wechat_user');
$work_user_id = $work_wechat_user['raw']['userid'];
}
//查看服务人员是否已存在
$is_exists = ServiceUser::where('work_user_id',$work_user_id)->whereNotNull('mobile')
->whereNotNull('name')->first();
if($is_exists){
return $this->success("ok", compact('status'));
}
//将旧的不存在手机号和姓名的账号更新并更新wechat表
$is_exists->update(['work_user_id'=>null]);
Wechat::where('openid',$work_user_id)->where('type','work')->update(['user_id'=>$service_user->user_id]);
$service_user->update(['work_user_id'=>$work_user_id]);
$status = 1; //绑定成功
DB::commit();
return $this->success('ok', compact('status'));
}catch (\Exception $e){
DB::rollBack();
return $this->success("ok", compact('status'));
}
}
public function workGroupRoles(Request $request)
{
$chat_id = $request->input('chat_id');
if(!$chat_id){
return $this->failure('参数chat_id不存在');
}
$service_user_id = $request->input('service_user_id');
if($service_user_id){
$group = Group::with('order')->where('im_chat_id', $chat_id)->first();
$service_user = ServiceUser::where("user_id", $service_user_id)->first();;
}else{
$group = Group::with('order')->where('chat_id', $chat_id)->first();
//服务角色信息
// $work_wechat_user = session('work_wechat_user');
// $work_user_id = $work_wechat_user['raw']['userid'];
// $service_user = ServiceUser::where("work_user_id", $work_user_id)->first();
$service_user = $request->service_user;
}
$roles = [];
if(!empty($group)){
$order = $group->order;
if (!empty($service_user)) {
$service_roles = $service_user->serviceRoleOrders()->with('role')->where('order_id', $order->id)->get();
foreach ($service_roles as $role) {
$roles[] = $role->role->name;
}
}
}else{
if (!empty($service_user)) {
$service_roles_ids = ServiceUserBindRole::where('chat_id',$chat_id)
->where('user_id',$service_user->user_id)
->select('role_id')
->get()
->toArray();
$roleName = ServiceRole::whereIn('id',$service_roles_ids)->select('name')->get();
foreach ($roleName as $name){
$roles[] = $name['name'];
}
}
}
return $this->success('ok', compact('roles', 'service_user'));
}
/**
* 绑定临时服务人员
* @param Request $request
* @return \Illuminate\Http\JsonResponse|void
*/
public function bindUserService(Request $request){
DB::beginTransaction();
try {
$data = $request->only(['name','avatar','mobile','code','intro', 'specialty', 'sex','customer_num','reason','weight','agree_user','disagree_user','outlook','think','idea']);
if(empty($data['mobile'])){
return $this->failure('手机号不为空');
}
//验证手机号和验证码
$res = Message::checkCode($data['mobile'], $data['code']);
if (empty($res)) return $this->failure("验证码无效");
$order_id = $request->input('order_id');
$role_id = $request->input('role');
$role = Partner::ROLE[$role_id]??null;
if(empty($role)){
return $this->failure('参数错误');
}
if (!in_array($role,['main_coaches','coaches','customer_service_user','chef_user'])) return $this->failure('参数错误');
$user = auth()->user();
$group = Group::where('order_id',$order_id)->first();
//先加入友福,自动通过
$openid = $user->officialWechat?$user->officialWechat->openid:null;
$user = $this->checkUserRoles($openid);
$is_collaborator = Collaborator::where('user_id',$user->id)->exists();
if(!$is_collaborator){
$collaborator = [
'user_id' => $user->id,
'openid' => $openid,
'avatar' => $data['avatar'],
'name' => $data['name'],
'mobile' => $data['mobile'],
'type' => Collaborator::TYPE_PART_TIME,
'intro' => $data['intro']??'',
'specialty' => $data['specialty']??null,
'status' => Collaborator::STATUS_PASS,
];
Collaborator::create($collaborator);
}
//再申请服务人员身份,自动通过
$is_partner = Partner::where('user_id',$user->id)->exists();
if(!$is_partner){
$partner = [
'openid'=>$openid,
'name'=>$data['name'],
'mobile'=>$data['mobile'],
'pic'=>$data['avatar']??'',
'sex'=>$data['sex']??0,
'birthday'=>$data['birthday']??'',
'weight'=>$data['weight']??0,
'intro'=>$data['intro']??'',
'specialty'=>$data['specialty']??null,
'status' => 1,
'user_id'=>$user->id
];
Partner::create($partner);
}
//获取用户角色
$service_user = match ($role) {
"main_coaches" => new MainCoach(),
"coaches" => new Coach(),
"customer_service_user" => new CustomerServiceUser(),
"chef_user" => new ChefUser(),
};
$is_service_user = $service_user->where('openid',$openid)->exists();
if(!$is_service_user){
$service_user->create(
[
'partner_id'=>$user->partner->id,
'openid'=>$openid,
'customer_num'=>$data['customer_num']??0,
'agree_user'=>$data['agree_user']??'',
'disagree_user'=>$data['disagree_user']??'',
'outlook'=>$data['outlook']??'',
'reason'=>$data['reason']??'',
'think'=>$data['think']??'',
'idea'=>$data['idea']??'',
'status'=>1,
'filing_at'=>date('Y-m-d')
]
);
}
$is_role = $service_user->where('openid',$openid)->first();
if($is_role){
$exists = ServiceRoleOrder::where('user_id',$user->id)
->where('role_id',$role_id)
->where('order_id',$order_id)
->exists();
if(!$exists){
ServiceRoleOrder::create(['order_id'=>$order_id,'user_id'=>$user->id,'role_id'=>$role_id]);
}
}
//查看服务人员表是否存在
$service_user_work = ServiceUser::where('user_id',$user->id)->first();
if(empty($service_user_work)){
$newServiceUserWork = ServiceUser::create(['user_id'=>$user->id,'name'=>$data['name'],'mobile'=>$data['mobile']]);
$service_user_work_id = $newServiceUserWork->id;
}else{
$service_user_work_id = $service_user_work->id;
}
//查看是否有角色
$service_role = ServiceRoleUser::where('user_id',$user->id)->where('role_id',$role_id)->first();
if(empty($service_role)){
ServiceRoleUser::create(['user_id'=>$user->id,'role_id'=>$role_id,'s_user_id'=>$service_user_work_id]);
}
//同步用户信息
// $user_data = User::getMpUser($data['mobile']);
// if($user_data && $user_data->id != $user->id){
// User::sameDataToUser($user->id,$user_data->id);
// }
DB::commit();
return $this->success('ok',$group->chat_qr_code??null);
}catch (\Exception $e) {
// 回滚事务
DB::rollback();
AddErrorLog::dispatch('bindUserService file:'.$e->getFile().' line:'.$e->getLine().' message:'.$e->getMessage())->onQueue('health');
return $this->failure("申请失败");
}
}
public function getGroup(Request $request){
$user = auth()->user();
$order_id = $request->get('order_id');
$role = $request->get('role');
$openid = $user->officialWechat?$user->officialWechat->openid:null;
$user = $this->checkUserRoles($openid);
$group = Group::where('order_id',$order_id)->first();
$role_mode = Partner::ROLE[$role]??null;
if(empty($role_mode)){
return $this->failure('参数错误');
}
//获取用户角色
$service_user = match ($role_mode) {
"main_coaches" => new MainCoach(),
"coaches" => new Coach(),
"customer_service_user" => new CustomerServiceUser(),
"chef_user" => new ChefUser(),
};
$is_role = $service_user->where('openid',$openid)->first();
if($is_role){
$exists = ServiceRoleOrder::where('user_id',$user->id)
->where('role_id',$role)
->where('order_id',$order_id)
->exists();
if(!$exists){
ServiceRoleOrder::create(['order_id'=>$order_id,'user_id'=>$user->id,'role_id'=>$role]);
}
}
return $this->success('ok',$group);
}
}