You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
154 lines
4.3 KiB
154 lines
4.3 KiB
<?php
|
|
|
|
namespace api\logic;
|
|
|
|
|
|
use backend\modules\shop\models\ars\Address;
|
|
use Yii;
|
|
use yii\base\BaseObject;
|
|
use yii\db\Exception;
|
|
use yii\web\BadRequestHttpException;
|
|
use yii\web\NotFoundHttpException;
|
|
use yii\web\ServerErrorHttpException;
|
|
|
|
/**
|
|
* @author iron
|
|
* @email weiriron@gmail.com
|
|
* @package api\logic
|
|
*/
|
|
class AddressLogic extends BaseObject
|
|
{
|
|
const SET_DEFAULT_ADDRESS = 1;
|
|
public $viewAction = 'view';
|
|
|
|
/**
|
|
* @return Address|null
|
|
* 获取默认地址
|
|
*/
|
|
public function getDefault()
|
|
{
|
|
return $this->findDefault();
|
|
}
|
|
|
|
/**
|
|
* @return Address
|
|
* @throws BadRequestHttpException
|
|
* @throws ServerErrorHttpException
|
|
* 创建地址
|
|
*/
|
|
public function create()
|
|
{
|
|
$data = $this->getParams();
|
|
$address = new Address();
|
|
$address->user_id = Yii::$app->user->getId();
|
|
$address->load($data, '');
|
|
if (!$address->save()) {
|
|
throw new ServerErrorHttpException('地址添加失败');
|
|
}
|
|
if (!$this->findDefault()) {
|
|
$this->setDefaultAddress($address);
|
|
}
|
|
Helper::createdResponse($address, $this->viewAction);
|
|
return $address;
|
|
}
|
|
|
|
/**
|
|
* @return bool
|
|
* @throws BadRequestHttpException
|
|
* @throws NotFoundHttpException
|
|
* @throws ServerErrorHttpException
|
|
* 更新地址
|
|
*/
|
|
public function update()
|
|
{
|
|
$type = Yii::$app->request->getBodyParam('type');
|
|
$address = $this->findAddress();
|
|
if ($type == self::SET_DEFAULT_ADDRESS) {
|
|
return $this->setDefaultAddress($address);
|
|
}
|
|
$data = $this->getParams();
|
|
$address->load($data, '');
|
|
if (!$address->save()) {
|
|
throw new ServerErrorHttpException('服务器更新地址失败');
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* @param Address $address
|
|
* @return bool
|
|
* @throws ServerErrorHttpException
|
|
* 设置默认地址
|
|
*/
|
|
private function setDefaultAddress($address)
|
|
{
|
|
$tra = Yii::$app->db->beginTransaction();
|
|
try {
|
|
$oldDefault = $this->findDefault();
|
|
if ($oldDefault) {
|
|
$oldDefault->status = Address::STATUS_NOT_DEFAULT;
|
|
if (!$oldDefault->save()) {
|
|
throw new Exception('服务器取消默认地址失败');
|
|
}
|
|
}
|
|
$address->status = Address::STATUS_DEFAULT;
|
|
if (!$address->save()) {
|
|
throw new Exception('服务器设置默认地址失败');
|
|
}
|
|
$tra->commit();
|
|
return true;
|
|
} catch (\Exception $e) {
|
|
$tra->rollBack();
|
|
throw new ServerErrorHttpException($e->getMessage());
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* @return mixed
|
|
* @throws BadRequestHttpException
|
|
*/
|
|
private function getParams()
|
|
{
|
|
$data['consignee'] = Yii::$app->request->getBodyParam('consignee');
|
|
$data['phone'] = Yii::$app->request->getBodyParam('phone');
|
|
$data['province'] = Yii::$app->request->getBodyParam('province');
|
|
$data['city'] = Yii::$app->request->getBodyParam('city');
|
|
$data['area'] = Yii::$app->request->getBodyParam('area');
|
|
$data['address'] = Yii::$app->request->getBodyParam('address');
|
|
if (empty($data['consignee']) || empty($data['phone']) || empty($data['province']) ||
|
|
empty($data['city']) || empty($data['area']) || empty($data['address'])) {
|
|
throw new BadRequestHttpException(Helper::REQUEST_BAD_PARAMS);
|
|
}
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* @return array|Address|null
|
|
* @throws NotFoundHttpException
|
|
*/
|
|
private function findAddress()
|
|
{
|
|
$id = Yii::$app->request->getQueryParam('id');
|
|
$address = Address::find()
|
|
->where(['id' => $id])
|
|
->andWhere(['user_id' => Yii::$app->user->getId()])
|
|
->one();
|
|
if (!$address) {
|
|
throw new NotFoundHttpException('地址未找到');
|
|
}
|
|
return $address;
|
|
}
|
|
|
|
/**
|
|
* @return array|Address|null
|
|
*/
|
|
private function findDefault()
|
|
{
|
|
return Address::find()
|
|
->where(['user_id' => Yii::$app->user->getId()])
|
|
->andWhere(['status' => Address::STATUS_DEFAULT])
|
|
->one();
|
|
}
|
|
|
|
}
|