123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381 |
- <?php
- namespace App\Services\Client;
- use App\Enums\UserStatus;
- use App\Models\MemberUser;
- use Illuminate\Support\Facades\DB;
- use Illuminate\Support\Facades\Log;
- class UserAddressService
- {
- /**
- * 获取地址详情
- *
- * 业务流程:
- * 1. 验证用户状态
- * 2. 查询地址信息
- * 3. 验证地址归属
- * 4. 返回地址详情
- *
- * 数据验证:
- * - 用户状态检查
- * - 地址ID有效性
- * - 地址归属验证
- *
- * 异常处理:
- * - 用户状态异常
- * - 地址不存在
- * - 无权访问
- *
- * @param int $userId 用户ID
- * @param int $addressId 地址ID
- * @return \App\Models\UserAddress|null 地址详情
- * @throws \Exception 当验证失败时
- */
- public function detail($userId, $addressId)
- {
- // 根据用户编号查询用户数据
- $user = MemberUser::findOrFail($userId);
- abort_if($user->state != UserStatus::OPEN->value, 400, '用户状态异常');
- // 查询地址详情
- $address = $user->addresses()
- ->where('id', $addressId)
- ->first();
- abort_if(!$address, 404, '地址不存在');
- return $address;
- }
- /**
- * 获取默认地址
- *
- * 业务流程:
- * 1. 验证用户状态
- * 2. 查询用户默认地址
- * 3. 返回地址信息
- *
- * 数据验证:
- * - 用户状态检查
- *
- * 异常处理:
- * - 用户状态异常
- * - 查询失败
- *
- * @param int $userId 用户ID
- * @return array 默认地址信息
- */
- public function getDefault($userId)
- {
- try {
- // 根据用户编号查询用户数据
- $user = MemberUser::findOrFail($userId);
- if ($user->state != UserStatus::OPEN->value) {
- return ['code' => 400, 'message' => '用户状态异常'];
- }
- // 查询用户地址列表,返回用户默认地址
- $address = $user->addresses()
- ->where('is_default', 1)
- ->first();
- return ['code' => 200, 'message' => 'success', 'data' => $address];
- } catch (\Exception $e) {
- Log::error('获取默认地址失败', [
- 'user_id' => $userId,
- 'error' => $e->getMessage(),
- ]);
- return ['code' => 500, 'message' => '获取默认地址失败'];
- }
- }
- /**
- * 添加地址
- *
- * 业务流程:
- * 1. 验证用户状态
- * 2. 检查是否需要设为默认地址
- * 3. 创建新地址记录
- * 4. 更新默认地址状态
- *
- * 数据验证:
- * - 用户状态检查
- * - 地址数据验证
- *
- * 事务处理:
- * - 地址创建和默认状态更新在同一事务中
- *
- * @param int $userId 用户ID
- * @param array $data 地址数据
- * @return array 操作结果
- */
- public function store($userId, array $data)
- {
- DB::beginTransaction();
- try {
- // 根据用户编号查询用户数据
- $user = MemberUser::findOrFail($userId);
- if ($user->state != UserStatus::OPEN->value) {
- DB::rollBack();
- return ['code' => 400, 'message' => '用户状态异常'];
- }
- // 如果用户只有一个地址,或者传入的is_default为true,则设置为默认地址
- $isFirst = $user->addresses()->count() == 0 || ($data['is_default'] ?? false);
- if ($isFirst) {
- $data['is_default'] = 1;
- // 将用户其他地址设为非默认
- $user->addresses()->update(['is_default' => 0]);
- }
- // 保存用户地址
- $user->addresses()->create($data);
- DB::commit();
- return ['code' => 200, 'message' => '添加成功'];
- } catch (\Exception $e) {
- DB::rollBack();
- Log::error('添加地址失败', [
- 'user_id' => $userId,
- 'data' => $data,
- 'error' => $e->getMessage(),
- ]);
- return ['code' => 500, 'message' => '添加地址失败'];
- }
- }
- /**
- * 修改地址
- *
- * 业务流程:
- * 1. 验证用户状态和地址归属
- * 2. 检查是否需要设为默认地址
- * 3. 更新地址信息
- * 4. 更新默认地址状态
- *
- * 数据验证:
- * - 用户状态检查
- * - 地址归属验证
- * - 地址数据验证
- *
- * 事务处理:
- * - 地址更新和默认状态修改在同一事务中
- *
- * @param int $userId 用户ID
- * @param int $id 地址ID
- * @param array $data 地址数据
- * @return array 操作结果
- */
- public function update($userId, $id, array $data)
- {
- DB::beginTransaction();
- try {
- // 根据用户编号查询用户数据
- $user = MemberUser::findOrFail($userId);
- if ($user->state != UserStatus::OPEN->value) {
- DB::rollBack();
- return ['code' => 400, 'message' => '用户状态异常'];
- }
- // 根据地址编号查询地址数据
- $address = $user->addresses()
- ->where('id', $id)
- ->firstOrFail();
- // 如果用户只有一个地址,或者传入的is_default为true,则设置为默认地址
- $isFirst = $user->addresses()->count() == 1 || ($data['is_default'] ?? false);
- if ($isFirst) {
- $data['is_default'] = 1;
- // 将用户其他地址设为非默认
- $user->addresses()->update(['is_default' => 0]);
- }
- // 修改地址信息
- $address->update($data);
- DB::commit();
- return ['code' => 200, 'message' => '修改成功'];
- } catch (\Exception $e) {
- DB::rollBack();
- Log::error('修改地址失败', [
- 'user_id' => $userId,
- 'id' => $id,
- 'data' => $data,
- 'error' => $e->getMessage(),
- ]);
- return ['code' => 500, 'message' => '修改地址失败'];
- }
- }
- /**
- * 删除地址
- *
- * 业务流程:
- * 1. 验证用户状态和地址归属
- * 2. 删除地址记录
- *
- * 数据验证:
- * - 用户状态检查
- * - 地址归属验证
- *
- * 事务处理:
- * - 地址删除操作在事务中执行
- *
- * @param int $userId 用户ID
- * @param int $id 地址ID
- * @return array 操作结果
- */
- public function destroy($userId, $id)
- {
- DB::beginTransaction();
- try {
- // 根据用户编号查询用户数据
- $user = MemberUser::findOrFail($userId);
- if ($user->state != UserStatus::OPEN->value) {
- DB::rollBack();
- return ['code' => 400, 'message' => '用户状态异常'];
- }
- // 根据地址编号查询地址数据
- $address = $user->addresses()
- ->where('id', $id)
- ->firstOrFail();
- // 删除地址
- $address->delete();
- DB::commit();
- return ['code' => 200, 'message' => '删除成功'];
- } catch (\Exception $e) {
- DB::rollBack();
- Log::error('删除地址失败', [
- 'user_id' => $userId,
- 'id' => $id,
- 'error' => $e->getMessage(),
- ]);
- return ['code' => 500, 'message' => '删除地址失败'];
- }
- }
- /**
- * 设置默认地址
- *
- * 业务流程:
- * 1. 验证用户状态和地址归属
- * 2. 取消其他默认地址
- * 3. 设置新的默认地址
- *
- * 数据验证:
- * - 用户状态检查
- * - 地址归属验证
- *
- * 事务处理:
- * - 默认状态更新在事务中执行
- *
- * @param int $userId 用户ID
- * @param int $id 地址ID
- * @return array 操作结果
- */
- public function setDefault($userId, $id)
- {
- DB::beginTransaction();
- try {
- // 根据用户编号查询用户数据
- $user = MemberUser::findOrFail($userId);
- if ($user->state != UserStatus::OPEN->value) {
- DB::rollBack();
- return ['code' => 400, 'message' => '用户状态异常'];
- }
- // 根据地址编号查询地址数据
- $address = $user->addresses()
- ->where('id', $id)
- ->firstOrFail();
- // 将所有地址设为非默认
- $user->addresses()->update(['is_default' => 0]);
- // 设置为默认地址
- $address->update(['is_default' => 1]);
- DB::commit();
- return ['code' => 200, 'message' => '设置成功'];
- } catch (\Exception $e) {
- DB::rollBack();
- Log::error('设置默认地址失败', [
- 'user_id' => $userId,
- 'id' => $id,
- 'error' => $e->getMessage(),
- ]);
- return ['code' => 500, 'message' => '设置默认地址失败'];
- }
- }
- /**
- * 获取地址列表
- *
- * 业务流程:
- * 1. 验证用户状态
- * 2. 查询用户地址列表
- * 3. 按默认状态和ID排序
- * 4. 返回分页数据
- *
- * 数据验证:
- * - 用户状态检查
- *
- * 排序规则:
- * - 默认地址优先
- * - ID倒序排列
- *
- * @param int $userId 用户ID
- * @param int $perPage 每页数量
- * @return array 地址列表和分页信息
- */
- public function list($userId, $perPage = 15)
- {
- try {
- // 根据用户编号查询用户数据
- $user = MemberUser::findOrFail($userId);
- if ($user->state != UserStatus::OPEN->value) {
- return ['code' => 400, 'message' => '用户状态异常'];
- }
- // 查询用户地址列表并分页
- $addresses = $user->addresses()
- ->orderBy('is_default', 'desc')
- ->orderBy('id', 'desc')
- ->paginate($perPage);
- return [
- 'code' => 200,
- 'message' => 'success',
- 'data' => [
- 'items' => $addresses->items(),
- 'total' => $addresses->total(),
- ],
- ];
- } catch (\Exception $e) {
- Log::error('获取地址列表失败', [
- 'user_id' => $userId,
- 'error' => $e->getMessage(),
- ]);
- return ['code' => 500, 'message' => '获取地址列表失败'];
- }
- }
- }
|