UserAddressService.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  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. * 业务流程:
  13. * 1. 验证用户状态
  14. * 2. 查询地址信息
  15. * 3. 验证地址归属
  16. * 4. 返回地址详情
  17. *
  18. * 数据验证:
  19. * - 用户状态检查
  20. * - 地址ID有效性
  21. * - 地址归属验证
  22. *
  23. * 异常处理:
  24. * - 用户状态异常
  25. * - 地址不存在
  26. * - 无权访问
  27. *
  28. * @param int $userId 用户ID
  29. * @param int $addressId 地址ID
  30. * @return \App\Models\UserAddress|null 地址详情
  31. * @throws \Exception 当验证失败时
  32. */
  33. public function detail($userId, $addressId)
  34. {
  35. // 根据用户编号查询用户数据
  36. $user = MemberUser::findOrFail($userId);
  37. abort_if($user->state != UserStatus::OPEN->value, 400, '用户状态异常');
  38. // 查询地址详情
  39. $address = $user->addresses()
  40. ->where('id', $addressId)
  41. ->first();
  42. abort_if(!$address, 404, '地址不存在');
  43. return $address;
  44. }
  45. /**
  46. * 获取默认地址
  47. *
  48. * 业务流程:
  49. * 1. 验证用户状态
  50. * 2. 查询用户默认地址
  51. * 3. 返回地址信息
  52. *
  53. * 数据验证:
  54. * - 用户状态检查
  55. *
  56. * 异常处理:
  57. * - 用户状态异常
  58. * - 查询失败
  59. *
  60. * @param int $userId 用户ID
  61. * @return array 默认地址信息
  62. */
  63. public function getDefault($userId)
  64. {
  65. try {
  66. // 根据用户编号查询用户数据
  67. $user = MemberUser::findOrFail($userId);
  68. if ($user->state != UserStatus::OPEN->value) {
  69. return ['code' => 400, 'message' => '用户状态异常'];
  70. }
  71. // 查询用户地址列表,返回用户默认地址
  72. $address = $user->addresses()
  73. ->where('is_default', 1)
  74. ->first();
  75. return ['code' => 200, 'message' => 'success', 'data' => $address];
  76. } catch (\Exception $e) {
  77. Log::error('获取默认地址失败', [
  78. 'user_id' => $userId,
  79. 'error' => $e->getMessage(),
  80. ]);
  81. return ['code' => 500, 'message' => '获取默认地址失败'];
  82. }
  83. }
  84. /**
  85. * 添加地址
  86. *
  87. * 业务流程:
  88. * 1. 验证用户状态
  89. * 2. 检查是否需要设为默认地址
  90. * 3. 创建新地址记录
  91. * 4. 更新默认地址状态
  92. *
  93. * 数据验证:
  94. * - 用户状态检查
  95. * - 地址数据验证
  96. *
  97. * 事务处理:
  98. * - 地址创建和默认状态更新在同一事务中
  99. *
  100. * @param int $userId 用户ID
  101. * @param array $data 地址数据
  102. * @return array 操作结果
  103. */
  104. public function store($userId, array $data)
  105. {
  106. DB::beginTransaction();
  107. try {
  108. // 根据用户编号查询用户数据
  109. $user = MemberUser::findOrFail($userId);
  110. if ($user->state != UserStatus::OPEN->value) {
  111. DB::rollBack();
  112. return ['code' => 400, 'message' => '用户状态异常'];
  113. }
  114. // 如果用户只有一个地址,或者传入的is_default为true,则设置为默认地址
  115. $isFirst = $user->addresses()->count() == 0 || ($data['is_default'] ?? false);
  116. if ($isFirst) {
  117. $data['is_default'] = 1;
  118. // 将用户其他地址设为非默认
  119. $user->addresses()->update(['is_default' => 0]);
  120. }
  121. // 保存用户地址
  122. $user->addresses()->create($data);
  123. DB::commit();
  124. return ['code' => 200, 'message' => '添加成功'];
  125. } catch (\Exception $e) {
  126. DB::rollBack();
  127. Log::error('添加地址失败', [
  128. 'user_id' => $userId,
  129. 'data' => $data,
  130. 'error' => $e->getMessage(),
  131. ]);
  132. return ['code' => 500, 'message' => '添加地址失败'];
  133. }
  134. }
  135. /**
  136. * 修改地址
  137. *
  138. * 业务流程:
  139. * 1. 验证用户状态和地址归属
  140. * 2. 检查是否需要设为默认地址
  141. * 3. 更新地址信息
  142. * 4. 更新默认地址状态
  143. *
  144. * 数据验证:
  145. * - 用户状态检查
  146. * - 地址归属验证
  147. * - 地址数据验证
  148. *
  149. * 事务处理:
  150. * - 地址更新和默认状态修改在同一事务中
  151. *
  152. * @param int $userId 用户ID
  153. * @param int $id 地址ID
  154. * @param array $data 地址数据
  155. * @return array 操作结果
  156. */
  157. public function update($userId, $id, array $data)
  158. {
  159. DB::beginTransaction();
  160. try {
  161. // 根据用户编号查询用户数据
  162. $user = MemberUser::findOrFail($userId);
  163. if ($user->state != UserStatus::OPEN->value) {
  164. DB::rollBack();
  165. return ['code' => 400, 'message' => '用户状态异常'];
  166. }
  167. // 根据地址编号查询地址数据
  168. $address = $user->addresses()
  169. ->where('id', $id)
  170. ->firstOrFail();
  171. // 如果用户只有一个地址,或者传入的is_default为true,则设置为默认地址
  172. $isFirst = $user->addresses()->count() == 1 || ($data['is_default'] ?? false);
  173. if ($isFirst) {
  174. $data['is_default'] = 1;
  175. // 将用户其他地址设为非默认
  176. $user->addresses()->update(['is_default' => 0]);
  177. }
  178. // 修改地址信息
  179. $address->update($data);
  180. DB::commit();
  181. return ['code' => 200, 'message' => '修改成功'];
  182. } catch (\Exception $e) {
  183. DB::rollBack();
  184. Log::error('修改地址失败', [
  185. 'user_id' => $userId,
  186. 'id' => $id,
  187. 'data' => $data,
  188. 'error' => $e->getMessage(),
  189. ]);
  190. return ['code' => 500, 'message' => '修改地址失败'];
  191. }
  192. }
  193. /**
  194. * 删除地址
  195. *
  196. * 业务流程:
  197. * 1. 验证用户状态和地址归属
  198. * 2. 删除地址记录
  199. *
  200. * 数据验证:
  201. * - 用户状态检查
  202. * - 地址归属验证
  203. *
  204. * 事务处理:
  205. * - 地址删除操作在事务中执行
  206. *
  207. * @param int $userId 用户ID
  208. * @param int $id 地址ID
  209. * @return array 操作结果
  210. */
  211. public function destroy($userId, $id)
  212. {
  213. DB::beginTransaction();
  214. try {
  215. // 根据用户编号查询用户数据
  216. $user = MemberUser::findOrFail($userId);
  217. if ($user->state != UserStatus::OPEN->value) {
  218. DB::rollBack();
  219. return ['code' => 400, 'message' => '用户状态异常'];
  220. }
  221. // 根据地址编号查询地址数据
  222. $address = $user->addresses()
  223. ->where('id', $id)
  224. ->firstOrFail();
  225. // 删除地址
  226. $address->delete();
  227. DB::commit();
  228. return ['code' => 200, 'message' => '删除成功'];
  229. } catch (\Exception $e) {
  230. DB::rollBack();
  231. Log::error('删除地址失败', [
  232. 'user_id' => $userId,
  233. 'id' => $id,
  234. 'error' => $e->getMessage(),
  235. ]);
  236. return ['code' => 500, 'message' => '删除地址失败'];
  237. }
  238. }
  239. /**
  240. * 设置默认地址
  241. *
  242. * 业务流程:
  243. * 1. 验证用户状态和地址归属
  244. * 2. 取消其他默认地址
  245. * 3. 设置新的默认地址
  246. *
  247. * 数据验证:
  248. * - 用户状态检查
  249. * - 地址归属验证
  250. *
  251. * 事务处理:
  252. * - 默认状态更新在事务中执行
  253. *
  254. * @param int $userId 用户ID
  255. * @param int $id 地址ID
  256. * @return array 操作结果
  257. */
  258. public function setDefault($userId, $id)
  259. {
  260. DB::beginTransaction();
  261. try {
  262. // 根据用户编号查询用户数据
  263. $user = MemberUser::findOrFail($userId);
  264. if ($user->state != UserStatus::OPEN->value) {
  265. DB::rollBack();
  266. return ['code' => 400, 'message' => '用户状态异常'];
  267. }
  268. // 根据地址编号查询地址数据
  269. $address = $user->addresses()
  270. ->where('id', $id)
  271. ->firstOrFail();
  272. // 将所有地址设为非默认
  273. $user->addresses()->update(['is_default' => 0]);
  274. // 设置为默认地址
  275. $address->update(['is_default' => 1]);
  276. DB::commit();
  277. return ['code' => 200, 'message' => '设置成功'];
  278. } catch (\Exception $e) {
  279. DB::rollBack();
  280. Log::error('设置默认地址失败', [
  281. 'user_id' => $userId,
  282. 'id' => $id,
  283. 'error' => $e->getMessage(),
  284. ]);
  285. return ['code' => 500, 'message' => '设置默认地址失败'];
  286. }
  287. }
  288. /**
  289. * 获取地址列表
  290. *
  291. * 业务流程:
  292. * 1. 验证用户状态
  293. * 2. 查询用户地址列表
  294. * 3. 按默认状态和ID排序
  295. * 4. 返回分页数据
  296. *
  297. * 数据验证:
  298. * - 用户状态检查
  299. *
  300. * 排序规则:
  301. * - 默认地址优先
  302. * - ID倒序排列
  303. *
  304. * @param int $userId 用户ID
  305. * @param int $perPage 每页数量
  306. * @return array 地址列表和分页信息
  307. */
  308. public function list($userId, $perPage = 15)
  309. {
  310. try {
  311. // 根据用户编号查询用户数据
  312. $user = MemberUser::findOrFail($userId);
  313. if ($user->state != UserStatus::OPEN->value) {
  314. return ['code' => 400, 'message' => '用户状态异常'];
  315. }
  316. // 查询用户地址列表并分页
  317. $addresses = $user->addresses()
  318. ->orderBy('is_default', 'desc')
  319. ->orderBy('id', 'desc')
  320. ->paginate($perPage);
  321. return [
  322. 'code' => 200,
  323. 'message' => 'success',
  324. 'data' => [
  325. 'items' => $addresses->items(),
  326. 'total' => $addresses->total(),
  327. ],
  328. ];
  329. } catch (\Exception $e) {
  330. Log::error('获取地址列表失败', [
  331. 'user_id' => $userId,
  332. 'error' => $e->getMessage(),
  333. ]);
  334. return ['code' => 500, 'message' => '获取地址列表失败'];
  335. }
  336. }
  337. }