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' => '获取地址列表失败']; } } }