UserAddressService.php 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. <?php
  2. namespace App\Services\Client;
  3. use App\Enums\UserStatus;
  4. use App\Models\MemberUser;
  5. use Illuminate\Support\Facades\DB;
  6. use Illuminate\Support\Facades\Log;
  7. class UserAddressService
  8. {
  9. /**
  10. * 获取默认地址
  11. */
  12. public function getDefault($userId)
  13. {
  14. try {
  15. // 根据用户编号查询用户数据
  16. $user = MemberUser::findOrFail($userId);
  17. if ($user->state != UserStatus::OPEN->value) {
  18. return ['code' => 400, 'message' => '用户状态异常'];
  19. }
  20. // 查询用户地址列表,返回用户默认地址
  21. $address = $user->addresses()
  22. ->where('is_default', 1)
  23. ->first();
  24. return ['code' => 200, 'message' => 'success', 'data' => $address];
  25. } catch (\Exception $e) {
  26. Log::error('获取默认地址失败', [
  27. 'user_id' => $userId,
  28. 'error' => $e->getMessage(),
  29. ]);
  30. return ['code' => 500, 'message' => '获取默认地址失败'];
  31. }
  32. }
  33. /**
  34. * 添加地址
  35. */
  36. public function store($userId, array $data)
  37. {
  38. DB::beginTransaction();
  39. try {
  40. // 根据用户编号查询用户数据
  41. $user = MemberUser::findOrFail($userId);
  42. if ($user->state != UserStatus::OPEN->value) {
  43. DB::rollBack();
  44. return ['code' => 400, 'message' => '用户状态异常'];
  45. }
  46. // 如果用户只有一个地址,或者传入的is_default为true,则设置为默认地址
  47. $isFirst = $user->addresses()->count() == 0 || ($data['is_default'] ?? false);
  48. if ($isFirst) {
  49. $data['is_default'] = 1;
  50. // 将用户其他地址设为非默认
  51. $user->addresses()->update(['is_default' => 0]);
  52. }
  53. // 保存用户地址
  54. $user->addresses()->create($data);
  55. DB::commit();
  56. return ['code' => 200, 'message' => '添加成功'];
  57. } catch (\Exception $e) {
  58. DB::rollBack();
  59. Log::error('添加地址失败', [
  60. 'user_id' => $userId,
  61. 'data' => $data,
  62. 'error' => $e->getMessage(),
  63. ]);
  64. return ['code' => 500, 'message' => '添加地址失败'];
  65. }
  66. }
  67. /**
  68. * 修改地址
  69. */
  70. public function update($userId, $id, array $data)
  71. {
  72. DB::beginTransaction();
  73. try {
  74. // 根据用户编号查询用户数据
  75. $user = MemberUser::findOrFail($userId);
  76. if ($user->state != UserStatus::OPEN->value) {
  77. DB::rollBack();
  78. return ['code' => 400, 'message' => '用户状态异常'];
  79. }
  80. // 根据地址编号查询地址数据
  81. $address = $user->addresses()
  82. ->where('id', $id)
  83. ->firstOrFail();
  84. // 如果用户只有一个地址,或者传入的is_default为true,则设置为默认地址
  85. $isFirst = $user->addresses()->count() == 1 || ($data['is_default'] ?? false);
  86. if ($isFirst) {
  87. $data['is_default'] = 1;
  88. // 将用户其他地址设为非默认
  89. $user->addresses()->update(['is_default' => 0]);
  90. }
  91. // 修改地址信息
  92. $address->update($data);
  93. DB::commit();
  94. return ['code' => 200, 'message' => '修改成功'];
  95. } catch (\Exception $e) {
  96. DB::rollBack();
  97. Log::error('修改地址失败', [
  98. 'user_id' => $userId,
  99. 'id' => $id,
  100. 'data' => $data,
  101. 'error' => $e->getMessage(),
  102. ]);
  103. return ['code' => 500, 'message' => '修改地址失败'];
  104. }
  105. }
  106. /**
  107. * 删除地址
  108. */
  109. public function destroy($userId, $id)
  110. {
  111. DB::beginTransaction();
  112. try {
  113. // 根据用户编号查询用户数据
  114. $user = MemberUser::findOrFail($userId);
  115. if ($user->state != UserStatus::OPEN->value) {
  116. DB::rollBack();
  117. return ['code' => 400, 'message' => '用户状态异常'];
  118. }
  119. // 根据地址编号查询地址数据
  120. $address = $user->addresses()
  121. ->where('id', $id)
  122. ->firstOrFail();
  123. // 删除地址
  124. $address->delete();
  125. DB::commit();
  126. return ['code' => 200, 'message' => '删除成功'];
  127. } catch (\Exception $e) {
  128. DB::rollBack();
  129. Log::error('删除地址失败', [
  130. 'user_id' => $userId,
  131. 'id' => $id,
  132. 'error' => $e->getMessage(),
  133. ]);
  134. return ['code' => 500, 'message' => '删除地址失败'];
  135. }
  136. }
  137. /**
  138. * 设置默认地址
  139. */
  140. public function setDefault($userId, $id)
  141. {
  142. DB::beginTransaction();
  143. try {
  144. // 根据用户编号查询用户数据
  145. $user = MemberUser::findOrFail($userId);
  146. if ($user->state != UserStatus::OPEN->value) {
  147. DB::rollBack();
  148. return ['code' => 400, 'message' => '用户状态异常'];
  149. }
  150. // 根据地址编号查询地址数据
  151. $address = $user->addresses()
  152. ->where('id', $id)
  153. ->firstOrFail();
  154. // 将所有地址设为非默认
  155. $user->addresses()->update(['is_default' => 0]);
  156. // 设置为默认地址
  157. $address->update(['is_default' => 1]);
  158. DB::commit();
  159. return ['code' => 200, 'message' => '设置成功'];
  160. } catch (\Exception $e) {
  161. DB::rollBack();
  162. Log::error('设置默认地址失败', [
  163. 'user_id' => $userId,
  164. 'id' => $id,
  165. 'error' => $e->getMessage(),
  166. ]);
  167. return ['code' => 500, 'message' => '设置默认地址失败'];
  168. }
  169. }
  170. /**
  171. * 获取地址列表
  172. */
  173. public function list($userId, $perPage = 15)
  174. {
  175. try {
  176. // 根据用户编号查询用户数据
  177. $user = MemberUser::findOrFail($userId);
  178. if ($user->state != UserStatus::OPEN->value) {
  179. return ['code' => 400, 'message' => '用户状态异常'];
  180. }
  181. // 查询用户地址列表并分页
  182. $addresses = $user->addresses()
  183. ->orderBy('is_default', 'desc')
  184. ->orderBy('id', 'desc')
  185. ->paginate($perPage);
  186. return [
  187. 'code' => 200,
  188. 'message' => 'success',
  189. 'data' => [
  190. 'items' => $addresses->items(),
  191. 'total' => $addresses->total(),
  192. ],
  193. ];
  194. } catch (\Exception $e) {
  195. Log::error('获取地址列表失败', [
  196. 'user_id' => $userId,
  197. 'error' => $e->getMessage(),
  198. ]);
  199. return ['code' => 500, 'message' => '获取地址列表失败'];
  200. }
  201. }
  202. }