Files
anxinyan/server-api/app/controller/app/AddressesController.php
wushumin 9aac78b8da first
2026-05-11 15:28:27 +08:00

220 lines
7.1 KiB
PHP

<?php
namespace app\controller\app;
use support\Request;
use support\think\Db;
class AddressesController
{
public function index(Request $request)
{
$userId = app_user_id($request);
$rows = Db::name('user_addresses')
->where('user_id', $userId)
->order('is_default', 'desc')
->order('id', 'desc')
->select()
->toArray();
return api_success([
'list' => array_map(fn (array $item) => $this->formatAddress($item), $rows),
]);
}
public function detail(Request $request)
{
$id = (int)$request->input('id', 0);
if ($id <= 0) {
return api_error('地址 ID 不能为空', 422);
}
$address = Db::name('user_addresses')->where('id', $id)->where('user_id', app_user_id($request))->find();
if (!$address) {
return api_error('地址不存在', 404);
}
return api_success($this->formatAddress($address));
}
public function save(Request $request)
{
$userId = app_user_id($request);
$id = (int)$request->input('id', 0);
$consignee = trim((string)$request->input('consignee', ''));
$mobile = trim((string)$request->input('mobile', ''));
$province = trim((string)$request->input('province', ''));
$city = trim((string)$request->input('city', ''));
$district = trim((string)$request->input('district', ''));
$detailAddress = trim((string)$request->input('detail_address', ''));
$isDefault = (bool)$request->input('is_default', false);
if ($consignee === '' || $mobile === '' || $province === '' || $city === '' || $district === '' || $detailAddress === '') {
return api_error('请完整填写地址信息', 422);
}
$now = date('Y-m-d H:i:s');
Db::startTrans();
try {
$existing = null;
if ($id > 0) {
$existing = Db::name('user_addresses')->where('id', $id)->where('user_id', $userId)->find();
if (!$existing) {
Db::rollback();
return api_error('地址不存在', 404);
}
}
$addressCount = (int)Db::name('user_addresses')->where('user_id', $userId)->count();
$shouldSetDefault = $isDefault || $addressCount === 0 || ($existing && (bool)$existing['is_default']);
if ($shouldSetDefault) {
Db::name('user_addresses')->where('user_id', $userId)->update([
'is_default' => 0,
'updated_at' => $now,
]);
}
$payload = [
'user_id' => $userId,
'consignee' => $consignee,
'mobile' => $mobile,
'province' => $province,
'city' => $city,
'district' => $district,
'detail_address' => $detailAddress,
'is_default' => $shouldSetDefault ? 1 : 0,
'updated_at' => $now,
];
if ($existing) {
Db::name('user_addresses')->where('id', $id)->update($payload);
$addressId = $id;
} else {
$payload['created_at'] = $now;
$addressId = (int)Db::name('user_addresses')->insertGetId($payload);
}
Db::commit();
} catch (\Throwable $e) {
Db::rollback();
return api_error('地址保存失败', 500, [
'detail' => $e->getMessage(),
]);
}
$address = Db::name('user_addresses')->where('id', $addressId)->where('user_id', $userId)->find();
return api_success([
'id' => $addressId,
'address' => $this->formatAddress($address ?: []),
], '地址已保存');
}
public function setDefault(Request $request)
{
$id = (int)$request->input('id', 0);
if ($id <= 0) {
return api_error('地址 ID 不能为空', 422);
}
$address = Db::name('user_addresses')->where('id', $id)->where('user_id', app_user_id($request))->find();
if (!$address) {
return api_error('地址不存在', 404);
}
$now = date('Y-m-d H:i:s');
Db::startTrans();
try {
Db::name('user_addresses')->where('user_id', app_user_id($request))->update([
'is_default' => 0,
'updated_at' => $now,
]);
Db::name('user_addresses')->where('id', $id)->where('user_id', app_user_id($request))->update([
'is_default' => 1,
'updated_at' => $now,
]);
Db::commit();
} catch (\Throwable $e) {
Db::rollback();
return api_error('默认地址设置失败', 500, [
'detail' => $e->getMessage(),
]);
}
return api_success([
'id' => $id,
], '已设为默认地址');
}
public function delete(Request $request)
{
$id = (int)$request->input('id', 0);
if ($id <= 0) {
return api_error('地址 ID 不能为空', 422);
}
$address = Db::name('user_addresses')->where('id', $id)->where('user_id', app_user_id($request))->find();
if (!$address) {
return api_error('地址不存在', 404);
}
Db::startTrans();
try {
Db::name('user_addresses')->where('id', $id)->where('user_id', app_user_id($request))->delete();
if ((bool)$address['is_default']) {
$next = Db::name('user_addresses')
->where('user_id', app_user_id($request))
->order('id', 'desc')
->find();
if ($next) {
Db::name('user_addresses')->where('id', $next['id'])->update([
'is_default' => 1,
'updated_at' => date('Y-m-d H:i:s'),
]);
}
}
Db::commit();
} catch (\Throwable $e) {
Db::rollback();
return api_error('地址删除失败', 500, [
'detail' => $e->getMessage(),
]);
}
return api_success([
'id' => $id,
], '地址已删除');
}
private function formatAddress(array $item): array
{
return [
'id' => (int)($item['id'] ?? 0),
'consignee' => $item['consignee'] ?? '',
'mobile' => $item['mobile'] ?? '',
'province' => $item['province'] ?? '',
'city' => $item['city'] ?? '',
'district' => $item['district'] ?? '',
'detail_address' => $item['detail_address'] ?? '',
'full_address' => trim(sprintf(
'%s%s%s%s',
$item['province'] ?? '',
$item['city'] ?? '',
$item['district'] ?? '',
$item['detail_address'] ?? ''
)),
'is_default' => (bool)($item['is_default'] ?? false),
'created_at' => $item['created_at'] ?? '',
'updated_at' => $item['updated_at'] ?? '',
];
}
}