423 lines
9.8 KiB
PHP
423 lines
9.8 KiB
PHP
<?php
|
|
// +----------------------------------------------------------------------
|
|
// | SentCMS [ WE CAN DO IT JUST THINK IT ]
|
|
// +----------------------------------------------------------------------
|
|
// | Copyright (c) 2024 http://www.tensent.cn All rights reserved.
|
|
// +----------------------------------------------------------------------
|
|
// | Author: molong <molong@tensent.cn> <http://www.tensent.cn>
|
|
// +----------------------------------------------------------------------
|
|
namespace Modules\Account\Services;
|
|
|
|
use Illuminate\Http\Request;
|
|
use Modules\Account\Models\Family;
|
|
use Modules\Account\Models\FamilyMember;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Str;
|
|
|
|
class AdminFamilyService {
|
|
|
|
/**
|
|
* @title 获取家庭列表
|
|
*
|
|
* @param Request $request
|
|
* @return void
|
|
*/
|
|
public function getDataList($request) {
|
|
$map = [];
|
|
|
|
// 名称搜索
|
|
if ($request->filled('name')) {
|
|
$map[] = ['name', 'like', '%' . $request->input('name') . '%'];
|
|
}
|
|
|
|
// 家主筛选
|
|
if ($request->filled('owner_id')) {
|
|
$map[] = ['owner_id', '=', $request->input('owner_id')];
|
|
}
|
|
|
|
// 邀请码筛选
|
|
if ($request->filled('invite_code')) {
|
|
$map[] = ['invite_code', '=', $request->input('invite_code')];
|
|
}
|
|
|
|
// 日期范围筛选
|
|
if ($request->filled('start_date')) {
|
|
$map[] = ['created_at', '>=', $request->input('start_date')];
|
|
}
|
|
if ($request->filled('end_date')) {
|
|
$map[] = ['created_at', '<=', $request->input('end_date')];
|
|
}
|
|
|
|
$query = Family::with(['owner:uid,nickname,username', 'members:uid,nickname,username']);
|
|
|
|
$query->where($map);
|
|
|
|
// 排序
|
|
$query->orderBy($request->input('order', 'created_at'), $request->input('sort', 'desc'));
|
|
|
|
// 分页
|
|
if ($request->filled('page')) {
|
|
$data = [
|
|
'total' => $query->count(),
|
|
'page' => $request->input('page', 1),
|
|
'data' => $query->offset($request->input('offset', 0))
|
|
->limit($request->input('limit', 10))
|
|
->get(),
|
|
];
|
|
} else {
|
|
$data = $query->get();
|
|
}
|
|
|
|
// 添加成员数量统计
|
|
if ($request->filled('page')) {
|
|
foreach ($data['data'] as $family) {
|
|
$family->member_count = $family->members->count();
|
|
}
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* @title 创建家庭
|
|
*
|
|
* @param Request $request
|
|
* @return void
|
|
*/
|
|
public function create($request) {
|
|
$request->validate([
|
|
'name' => 'required|string|max:50',
|
|
'owner_id' => 'required|integer'
|
|
], [
|
|
'name.required' => '请输入家庭名称',
|
|
'owner_id.required' => '请选择家主'
|
|
]);
|
|
|
|
$data = $request->all();
|
|
|
|
// 生成10位邀请码
|
|
do {
|
|
$inviteCode = strtoupper(substr(str_shuffle('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'), 0, 10));
|
|
} while (Family::where('invite_code', $inviteCode)->exists());
|
|
|
|
$data['invite_code'] = $inviteCode;
|
|
|
|
DB::beginTransaction();
|
|
try {
|
|
$family = Family::create($data);
|
|
|
|
// 家主自动加入家庭
|
|
FamilyMember::create([
|
|
'family_id' => $family->id,
|
|
'user_id' => $data['owner_id']
|
|
]);
|
|
|
|
DB::commit();
|
|
|
|
return $family;
|
|
} catch (\Exception $e) {
|
|
DB::rollBack();
|
|
throw $e;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @title 更新家庭
|
|
*
|
|
* @param Request $request
|
|
* @return void
|
|
*/
|
|
public function update($request) {
|
|
$request->validate([
|
|
'id' => 'required|integer',
|
|
'name' => 'required|string|max:50',
|
|
'owner_id' => 'required|integer'
|
|
], [
|
|
'id.required' => '请提供家庭ID',
|
|
'name.required' => '请输入家庭名称',
|
|
'owner_id.required' => '请选择家主'
|
|
]);
|
|
|
|
$family = Family::findOrFail($request->input('id'));
|
|
$data = $request->all();
|
|
|
|
unset($data['id']);
|
|
|
|
$family->update($data);
|
|
|
|
return $family;
|
|
}
|
|
|
|
/**
|
|
* @title 删除家庭
|
|
*
|
|
* @param Request $request
|
|
* @return void
|
|
*/
|
|
public function delete($request) {
|
|
if ($request->filled('id')) {
|
|
try {
|
|
$family = Family::findOrFail($request->input('id'));
|
|
DB::beginTransaction();
|
|
try {
|
|
// 删除家庭成员
|
|
FamilyMember::where('family_id', $family->id)->delete();
|
|
// 删除家庭
|
|
$family->delete();
|
|
DB::commit();
|
|
} catch (\Throwable $th) {
|
|
DB::rollBack();
|
|
throw $th;
|
|
}
|
|
} catch (\Throwable $th) {
|
|
throw new \Exception("家庭不存在!", 1);
|
|
}
|
|
}
|
|
|
|
if ($request->filled('ids')) {
|
|
try {
|
|
$families = Family::whereIn('id', $request->input('ids'))->get();
|
|
DB::beginTransaction();
|
|
try {
|
|
foreach ($families as $family) {
|
|
// 删除家庭成员
|
|
FamilyMember::where('family_id', $family->id)->delete();
|
|
}
|
|
// 删除家庭
|
|
$families->each->delete();
|
|
DB::commit();
|
|
} catch (\Throwable $th) {
|
|
DB::rollBack();
|
|
throw $th;
|
|
}
|
|
} catch (\Throwable $th) {
|
|
throw new \Exception($th->getMessage(), 1);
|
|
}
|
|
}
|
|
|
|
return $family;
|
|
}
|
|
|
|
/**
|
|
* @title 家庭详情
|
|
*
|
|
* @param Request $request
|
|
* @return void
|
|
*/
|
|
public function detail($request) {
|
|
$id = $request->input('id');
|
|
|
|
$family = Family::with(['owner:uid,nickname,username', 'members:uid,nickname,username,email'])
|
|
->findOrFail($id);
|
|
|
|
// 添加成员数量
|
|
$family->member_count = $family->members->count();
|
|
|
|
// 添加统计信息
|
|
$billCount = DB::table('account_bills')->where('family_id', $family->id)->count();
|
|
$totalExpense = DB::table('account_bills')
|
|
->where('family_id', $family->id)
|
|
->where('type', 'expense')
|
|
->sum('amount');
|
|
$totalIncome = DB::table('account_bills')
|
|
->where('family_id', $family->id)
|
|
->where('type', 'income')
|
|
->sum('amount');
|
|
|
|
$family->statistics = [
|
|
'bill_count' => $billCount,
|
|
'total_expense' => (float)$totalExpense,
|
|
'total_income' => (float)$totalIncome,
|
|
'total_balance' => (float)($totalIncome - $totalExpense)
|
|
];
|
|
|
|
return $family;
|
|
}
|
|
|
|
/**
|
|
* @title 获取家庭成员列表
|
|
*
|
|
* @param Request $request
|
|
* @return void
|
|
*/
|
|
public function getMembers($request) {
|
|
$familyId = $request->input('family_id');
|
|
|
|
if (!$familyId) {
|
|
throw new \Exception('请提供家庭ID');
|
|
}
|
|
|
|
$family = Family::findOrFail($familyId);
|
|
|
|
$members = FamilyMember::with('user:uid,nickname,username,email')
|
|
->where('family_id', $familyId)
|
|
->get();
|
|
|
|
return [
|
|
'family_id' => $familyId,
|
|
'family_name' => $family->name,
|
|
'owner_id' => $family->owner_id,
|
|
'members' => $members->map(function($member) use ($family) {
|
|
return [
|
|
'id' => $member->id,
|
|
'user_id' => $member->user_id,
|
|
'name' => $member->user->nickname ?? $member->user->username,
|
|
'username' => $member->user->username,
|
|
'email' => $member->user->email,
|
|
'is_owner' => $family->owner_id == $member->user_id,
|
|
'joined_at' => $member->created_at
|
|
];
|
|
})->toArray(),
|
|
'total' => $members->count()
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @title 添加家庭成员
|
|
*
|
|
* @param Request $request
|
|
* @return void
|
|
*/
|
|
public function addMember($request) {
|
|
$request->validate([
|
|
'family_id' => 'required|integer',
|
|
'user_id' => 'required|integer'
|
|
], [
|
|
'family_id.required' => '请提供家庭ID',
|
|
'user_id.required' => '请选择用户'
|
|
]);
|
|
|
|
$familyId = $request->input('family_id');
|
|
$userId = $request->input('user_id');
|
|
|
|
// 检查家庭是否存在
|
|
$family = Family::findOrFail($familyId);
|
|
|
|
// 检查用户是否已在家庭中
|
|
$existingMember = FamilyMember::where('family_id', $familyId)
|
|
->where('user_id', $userId)
|
|
->first();
|
|
|
|
if ($existingMember) {
|
|
throw new \Exception('该用户已在家庭中');
|
|
}
|
|
|
|
// 检查用户是否已在其他家庭中
|
|
$userInOtherFamily = FamilyMember::where('user_id', $userId)->first();
|
|
if ($userInOtherFamily) {
|
|
throw new \Exception('该用户已在其他家庭中');
|
|
}
|
|
|
|
// 添加家庭成员
|
|
FamilyMember::create([
|
|
'family_id' => $familyId,
|
|
'user_id' => $userId
|
|
]);
|
|
|
|
return ['message' => '成员已添加'];
|
|
}
|
|
|
|
/**
|
|
* @title 移除家庭成员
|
|
*
|
|
* @param Request $request
|
|
* @return void
|
|
*/
|
|
public function removeMember($request) {
|
|
$request->validate([
|
|
'family_id' => 'required|integer',
|
|
'user_id' => 'required|integer'
|
|
], [
|
|
'family_id.required' => '请提供家庭ID',
|
|
'user_id.required' => '请提供用户ID'
|
|
]);
|
|
|
|
$familyId = $request->input('family_id');
|
|
$userId = $request->input('user_id');
|
|
|
|
// 检查家庭是否存在
|
|
$family = Family::findOrFail($familyId);
|
|
|
|
// 不能移除家主
|
|
if ($family->owner_id == $userId) {
|
|
throw new \Exception('不能移除家主,请先转让家主');
|
|
}
|
|
|
|
// 移除成员
|
|
$member = FamilyMember::where('family_id', $familyId)
|
|
->where('user_id', $userId)
|
|
->first();
|
|
|
|
if (!$member) {
|
|
throw new \Exception('该用户不在家庭中');
|
|
}
|
|
|
|
$member->delete();
|
|
|
|
return ['message' => '成员已移除'];
|
|
}
|
|
|
|
/**
|
|
* @title 重新生成邀请码
|
|
*
|
|
* @param Request $request
|
|
* @return void
|
|
*/
|
|
public function regenerateInviteCode($request) {
|
|
$familyId = $request->input('family_id');
|
|
|
|
if (!$familyId) {
|
|
throw new \Exception('请提供家庭ID');
|
|
}
|
|
|
|
$family = Family::findOrFail($familyId);
|
|
|
|
// 生成新邀请码
|
|
do {
|
|
$inviteCode = strtoupper(substr(str_shuffle('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'), 0, 10));
|
|
} while (Family::where('invite_code', $inviteCode)->exists());
|
|
|
|
$family->update(['invite_code' => $inviteCode]);
|
|
|
|
return [
|
|
'invite_code' => $inviteCode,
|
|
'family_name' => $family->name
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @title 转让家主
|
|
*
|
|
* @param Request $request
|
|
* @return void
|
|
*/
|
|
public function transferOwner($request) {
|
|
$request->validate([
|
|
'family_id' => 'required|integer',
|
|
'user_id' => 'required|integer'
|
|
], [
|
|
'family_id.required' => '请提供家庭ID',
|
|
'user_id.required' => '请提供用户ID'
|
|
]);
|
|
|
|
$familyId = $request->input('family_id');
|
|
$userId = $request->input('user_id');
|
|
|
|
$family = Family::findOrFail($familyId);
|
|
|
|
// 目标用户必须在家庭中
|
|
$targetMember = FamilyMember::where('family_id', $familyId)
|
|
->where('user_id', $userId)
|
|
->first();
|
|
|
|
if (!$targetMember) {
|
|
throw new \Exception('该用户不在家庭中');
|
|
}
|
|
|
|
// 转让家主
|
|
$family->update(['owner_id' => $userId]);
|
|
|
|
return ['message' => '家主已转让'];
|
|
}
|
|
}
|