220 lines
7.1 KiB
PHP
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'] ?? '',
|
|
];
|
|
}
|
|
}
|