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

535 lines
19 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Events\OperationLoggedEvent;
use App\Exports\AgencyExport;
use App\Exports\AgencyUserExport;
use App\Exports\CompanyPartnersExport;
use App\Exports\PartnersExport;
use App\Http\Controllers\Controller;
use App\Http\Response\ResponseJson;
use App\Models\Agency;
use App\Models\AgencyUser;
use App\Models\Coach;
use App\Models\Partner;
use App\Models\PartnerCommission;
use App\Models\PartnerWithdrawal;
use App\Models\Province;
use App\Models\Quota;
use App\Models\ServiceUser;
use Exception;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rules\In;
use Maatwebsite\Excel\Facades\Excel;
use function PHPUnit\Framework\isNull;
class PartnerController extends Controller
{
use ResponseJson;
public function partners(Request $request)
{
$keyword = $request->input('keyword');
$status = $request->input('status', null);
$partners = Partner::query()
->whereHas('user')
->when($status != null, function ($query) use ($status) {
$query->where('status', $status);
});
if ($keyword) {
$partners = $partners->where(function ($sql) use ($keyword) {
$sql->where("name", 'like', '%' . $keyword . '%')
->orWhere('mobile', 'like', '%' . $keyword . '%');
});
}
$nopage = $request->input('nopage');
if ($nopage) {
$partners = $partners->orderByDesc('updated_at')->orderByDesc('id')->limit(15)->get();
} else {
$partners = $partners->orderByDesc('updated_at')->orderByDesc('id')->paginate();
}
return $this->success('ok', $partners);
}
public function partnersExport()
{
return Excel::download(new PartnersExport(), '合作伙伴.xlsx');
}
public function companyPartners(Request $request)
{
$page_size = $request->get('page_size', 15);
$users = ServiceUser::with('roles', 'user:id,name,avatar')
->whereNotNull('user_id')
->when($request->filled('keyword'), function ($query) use ($request) {
$keyword = trim($request->input('keyword'));
$query->where(function ($query) use ($keyword) {
$query->where('name', 'like', "%{$keyword}%")
->orWhere('mobile', 'like', "%{$keyword}%");
});
})
->whereHas('roles', function ($query) {
$query->where('service_roles.id', 5);
})
->orderByDesc('id')
->paginate(perPage: $page_size);
$users->each(function ($user) {
$user->protocol = json_decode($user->protocol) ?: [];
});
return $this->success('ok', $users);
}
public function companyPartnersExport()
{
return Excel::download(new CompanyPartnersExport(), '渠道商.xlsx');
}
public function partner(Request $request, Partner $partner)
{
//代理
$agencies = $partner->agencies;
$service_role = $partner->service_roles;
return $this->success('ok', $partner);
}
public function updatePartner(Request $request, Partner $partner)
{
$name = $request->input("name");
if ($name && $name != $partner->name) {
$partner->name = $name;
}
$mobile = $request->input("mobile");
if ($mobile && $mobile != $partner->mobile) {
$exist = Partner::where('mobile', $mobile)->where('id', '<>', $partner->id)->exists();
if ($exist)
return $this->failure("手机号存在账号");
$partner->mobile = $mobile;
}
$pic = $request->input("pic");
if ($pic && $name != $partner->pic) {
$partner->pic = $pic;
}
$intro = $request->input("intro");
if ($intro && $name != $partner->intro) {
$partner->intro = $intro;
}
$specialty = $request->input("specialty");
if ($specialty && $specialty != json_encode($partner->specialty)) {
$partner->specialty = json_encode($specialty);
}
$protocols = $request->input("protocols");
if ($protocols && $protocols != json_encode($partner->protocols)) {
$partner->protocols = json_encode($protocols);
}
$partner->save();
//操作记录
OperationLoggedEvent::dispatch("修改了合作伙伴: $partner->id 的信息");
return $this->success('ok');
}
public function deletePartner(Request $request, Partner $partner)
{
$id = $partner->id;
$partner->delete();
//操作记录
OperationLoggedEvent::dispatch("删除了合作伙伴: $id");
return $this->success('ok');
}
public function agencies(Request $request, Agency $agency)
{
$keyword = $request->input('keyword');
$grade = $request->input('grade');
$nopage = request()->input('nopage', 0);
$is_export = $request->input('is_export');
if ($is_export) {
$nopage = true;
}
$query = $agency->query()->with('agencyUser.collaborator');
$query->when($grade, function ($query) use ($grade) {
$query->where('grade', $grade);
});
if ($keyword) {
$query->where(function ($sql) use ($keyword) {
$sql->where("province", 'like', '%' . $keyword . '%')
->orWhere('city', 'like', '%' . $keyword . '%');
});
}
$query->orderByDesc('id');
if ($nopage) {
$list = $query->get();
} else {
$list = $query->paginate();
}
if ($is_export) {
return Excel::download(new AgencyExport($list), '分公司.xlsx');
}
return $this->success('ok', $list);
}
/**
* 获取分公司列表
* @param Request $request
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse
*/
public function getAgentList(Request $request)
{
$agency = Agency::query()->with('quota.collaboratorInfo')
->orderByDesc('id')->get();
return $this->success('ok', $agency);
}
public function storeAgency(Request $request)
{
$agencies = $request->input('agencies');
foreach ($agencies as &$agency) {
if ($agency['grade'] == "C") {
$name = $agency['city'];
$exists = Agency::where('city', 'like', '%' . $agency['city'] . '%')->exists();
} else {
$name = $agency['province'];
$exists = Agency::where('province', 'like', '%' . $agency['province'] . '%')->exists();
}
if ($exists) {
return $this->failure($name . '分公司已存在');
}
$agency['created_at'] = $agency['updated_at'] = date("Y-m-d H:i:s");
}
Agency::insert($agencies);
return $this->success('ok');
}
public function getAgencyDetail($id)
{
$detail = Agency::find($id);
return $this->success('ok', $detail);
}
public function updateAgency(Request $request, $id, Agency $agency)
{
$data = $request->only(['grade', 'pro_id', 'city_id', 'province', 'city']);
// $detail = $agency->find($id);
$agency->where('id', $id)->update($data);
return $this->success('ok');
}
public function deleteAgency(Agency $agency, $id)
{
$agency->where('id', $id)->delete();
return $this->success('ok');
}
public function addAgencyUser(Request $request)
{
$collaborator_id = $request->input('collaborator_id');
$agency_id = $request->input('agency_id');
$is_leader = $request->input('is_leader');
AgencyUser::create(['agency_id' => $agency_id, 'collaborator_id' => $collaborator_id, 'is_leader' => $is_leader]);
return $this->success('ok');
}
public function delAgencyUser($id, AgencyUser $agencyUser)
{
$agencyUser->where('id', $id)->delete();
return $this->success('ok');
}
public function getAgencyUser(Request $request, $agency_id, AgencyUser $agencyUser)
{
$keyword = $request->get('keyword');
$is_export = $request->get('is_export');
$query = $agencyUser::query()->with('agency')->where('agency_user.agency_id', $agency_id)->join('collaborator as c', 'c.id', '=', 'agency_user.collaborator_id');
$query->when($keyword, function ($query) use ($keyword) {
$query->where('c.name', 'like', "%{$keyword}%");
});
$query->select('c.name', 'c.mobile', 'c.avatar', 'agency_user.*');
if ($is_export) {
$list = $query->get();
} else {
$list = $query->paginate();
}
foreach ($list as $item) {
$item->num = Quota::where('agency_id', $agency_id)->where('collaborator_id', $item->collaborator_id)->sum('num');
$item->patners = null;
if (!isset($item->agency->partner_id)) {
continue;
}
$item->patners = Partner::select('user_id', 'name', 'mobile', 'pic')->find($item->agency->partner_id);
}
if ($is_export) {
return Excel::download(new AgencyUserExport($list), '分公司人员.xlsx');
}
return $this->success('ok', $list);
}
public function getAgencyByUser(Request $request, AgencyUser $agencyUser)
{
$no_page = $request->get('no_page');
$collaborator_id = $request->get('collaborator_id');
$agency_ids = $agencyUser->where('collaborator_id', $collaborator_id)->pluck('agency_id');
$query = Agency::query()->whereIn('id', $agency_ids)->orderByDesc('id');
if ($no_page) {
$list = $query->get();
} else {
$list = $query->paginate();
}
return $this->success('ok', $list);
}
public function cities(Request $request)
{
$address = Province::with('cities')->get();
return $this->success('ok', $address);
}
/**
* 所有地区代理
* @param Request $request
*/
public function allAreaAgencies(Request $request)
{
$data = [];
$provinces = Province::with('agencies:partner_id,pro_id', 'agencies.partner', 'cities:city_id,city_name,pro_id', 'cities.agencies.partner')->select('pro_id', 'pro_name')->get();
foreach ($provinces as $province) {
$arr = [];
$arr['name'] = $province->pro_name;
$province_c = [];
foreach ($province->agencies as $agency) {
if ($agency->partner) {
$province_c[] = $agency->partner->name;
}
}
$arr['value']['province_c'] = $province_c;
$city_agency = [];
foreach ($province->cities as $city) {
if (count($city->agencies)) {
foreach ($city->agencies as $agency) {
$city_arr = [];
if ($agency->partner) {
$city_arr['name'] = $city->city_name;
$city_arr['value'] = $agency->partner->name;
$city_agency[] = $city_arr;
}
}
}
}
$arr['value']['city_c'] = $city_agency;
$data[] = $arr;
}
return $this->success('ok', $data);
}
public function coaches(Request $request)
{
$status = $request->input('status', null);
$coaches = Coach::with('partner:id,name,mobile')
->when($status != null, function ($query) use ($status) {
$query->where('status', $status);
})
->orderByDesc('id')
->paginate();
return $this->success('ok', $coaches);
}
public function partnerUrls(Request $request)
{
//正式环境
$data = [
'partner' => [
'url' => config('app.url') . '/api/h5/partner/official/auth',
'qrcode' => 'https://image.fulllinkai.com/202304/26/dedf7aff9563d6856d8d27440b1c7c50.png',
],
'coach' => [
'url' => config('app.url') . '/api/h5/coach/official/auth',
'qrcode' => 'https://image.fulllinkai.com/202304/26/9b038e6f31169257ca42a093dbe03be0.png',
],
'finance' => [
'url' => config('app.url') . '/api/h5/finance/official/auth',
'qrcode' => 'https://image.fulllinkai.com/202305/08/62d5e8f0cb13d67da6bc889ec5dcdf61.png',
],
'main_coach' => [
'url' => config('app.url') . '/api/h5/wechat/user/auth?target_path=chiefCoachInfo',
'qrcode' => 'https://image.fulllinkai.com/202305/25/chiefCoachInfo_bind_qrcode.svg',
],
'customer_service_user' => [
'url' => config('app.url') . '/api/h5/wechat/user/auth?target_path=serviceInfo',
'qrcode' => 'https://image.fulllinkai.com/202305/25/serviceInfo_bind_qrcode.svg',
],
'collaborator' => [
'url' => config('app.url') . '/api/h5/wechat/user/auth?target_path=partnerInfo',
'qrcode' => 'https://image.fulllinkai.com/202306/10/partnerInfo_bind_qrcode.svg',//todo::待生成合作商二维码
],
'moderator' => [
'url' => config('app.url') . '/api/h5/wechat/user/auth?target_path=emceeApplyFor',
'qrcode' => 'https://image.fulllinkai.com/202306/29/c4f379f46fdc5165a6f2ddb344ee0f5d.png',//todo::待生成合作商二维码
],
];
return $this->success('ok', $data);
}
public function audit(Request $request)
{
try {
//获取参数
$id = intval($request->get('id'));
$type = $request->get('type');
$data = $request->only(['status', 'refusal_reason']);
if (!$id)
throw new Exception('请选择要处理的申请');
DB::beginTransaction();
//根据类型获取审核模型
$user = match ($type) {
2 => new Coach(),
4 => new Partner(),
default => throw new Exception('操作类型错误'),
};
//查找申请信息
$user = $user->where('status', 0)->findOrFail($id);
//更新审核状态
$data['audit_at'] = now();
$user->update($data);
//审核通过后加入服务用户表
if ($data['status'] == 1) {
//服务用户信息
$partner = $user->{$type == 2 ? 'partner' : ''} ?? $user;
//检查小伙伴是否绑定用户
if (!$partner->user_id) {
$partner->user_id = $partner->wechat->user_id;
$partner->save();
}
//构建服务用户数据
$serviceUserInfo = [
'name' => $partner->name,
'mobile' => $partner->mobile,
'user_id' => $partner->user_id
];
//添加服务用户
$serviceUser = $partner->service_user()->first();
if (!$serviceUser) {
$serviceUser = $partner->service_user()->create($serviceUserInfo);
}
//添加对应角色
$roleExist = $serviceUser->service_roles()->where('role_id', $type)->exists();
if (!$roleExist) {
$roleData = ['user_id' => $partner->user_id];
$serviceUser->service_roles()->attach($type, $roleData);
}
}
DB::commit();
return $this->success('ok');
} catch (ModelNotFoundException) {
return $this->jsonResponse(1, '未找到要处理的申请');
} catch (Exception $exception) {
DB::rollBack();
return $this->jsonResponse(1, $exception->getMessage());
}
}
/**
* 获取收益记录
* @param Request $request
* @return \Illuminate\Http\JsonResponse|void
*/
public function getIncomeCheckList(Request $request)
{
try {
$status = $request->get('status', 0);
$type = $request->get('type', 1);
$is_export = $request->get('is_export');
$query = PartnerCommission::query()->with(['user']);
$query->when(strlen($status) > 0, function ($query) use ($status) {
$query->where('status', $status);
});
$query->when(strlen($type) > 0, function ($query) use ($type) {
$query->where('type', $type);
});
$query->orderByDesc('id');
if ($is_export) {
$list = $query->get();
} else {
$list = $query->paginate();
}
//导出数据
// if($is_export){
// if($list->isEmpty()){
// return $this->failure('暂无数据');
// }
// return Excel::download(new ContractExport($list), 'contract.xlsx');
// }
return $this->success('ok', $list);
} catch (\Exception $e) {
return $this->failure('getIncomeCheckList file:' . $e->getFile() . '|line:' . $e->getLine() . '|message:' . $e->getMessage());
}
}
public function checkIncome(Request $request, $id)
{
try {
DB::beginTransaction();
$detail = PartnerCommission::findOrFail($id);
if ($request->has('status')) {
$detail->status = $request->input('status');
}
if ($request->has('reason')) {
$detail->reason = $request->input('reason');
}
$detail->save();
if ($request->status == 1) {//通过审核,修改钱包
$wallet = $detail->user->wallets;
if (!$wallet) {
$wallet = [
'balance' => config('app.env') == 'production' ? 0 : 10000,
'frozen_amount' => 0,
'withdrawn_amount' => 0,
];
$wallet = $detail->user->wallets()->create($wallet);
}
$wallet->increment('balance', $detail->amount);
// $wallet->increment('withdrawn_amount', $detail->amount);
}
DB::commit();
return $this->success('ok');
} catch (\Exception $e) {
DB::rollBack();
return $this->failure('checkIncome file:' . $e->getFile() . '|line:' . $e->getLine() . '|message:' . $e->getMessage());
}
}
}