MemberAddressController.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * Author: 芸众商城 www.yunzshop.com
  5. * Date: 2017/3/2
  6. * Time: 下午8:40
  7. */
  8. namespace app\frontend\modules\member\controllers;
  9. use app\common\components\ApiController;
  10. use app\common\exceptions\ShopException;
  11. use app\common\models\member\Address;
  12. use app\common\models\Street;
  13. use app\frontend\modules\member\services\MemberService;
  14. use app\frontend\repositories\MemberAddressRepository;
  15. class MemberAddressController extends ApiController
  16. {
  17. protected $publicAction = ['address', 'street'];
  18. private $memberAddressRepository;
  19. public function preAction()
  20. {
  21. parent::preAction();
  22. $this->memberAddressRepository = app(MemberAddressRepository::class);
  23. }
  24. /*
  25. * 会员收货地址列表
  26. *
  27. * */
  28. public function index()
  29. {
  30. $memberId = \YunShop::app()->getMemberId();
  31. // dd(get_class($this->memberAddressRepository->makeModel()));
  32. // exit;
  33. $addressList = $this->memberAddressRepository->getAddressList($memberId);
  34. // dd($addressList);
  35. //获取省市ID
  36. if ($addressList) {
  37. app('db')->cacheSelect = true;
  38. $address = Address::getAllAddress();
  39. app('db')->cacheSelect = false;
  40. $addressList = $this->addressServiceForIndex($addressList, $address);
  41. }
  42. $msg = "获取列表成功";
  43. return $this->successJson($msg, $addressList);
  44. }
  45. //获取下单页要编辑的地址信息 &route=member.member-address.get-one-address
  46. public function getOneAddress()
  47. {
  48. $id = \YunShop::request()->address_id;
  49. if (empty($id)) {
  50. return $this->errorJson('参数为空');
  51. }
  52. $address = $this->memberAddressRepository->getAddressById($id);
  53. if (empty($address)) {
  54. return $this->errorJson('地址不存在');
  55. }
  56. $address = $this->getAddressId($address);
  57. return $this->successJson('信息', $address);
  58. }
  59. //通过地址名换取id
  60. protected function getAddressId($member_address)
  61. {
  62. if (\Setting::get('shop.trade.is_street')) {
  63. $member_address->province_id = Address::where('areaname', $member_address->province)->value('id');
  64. $member_address->city_id = Address::where('areaname', $member_address->city)->where('parentid', $member_address->province_id)->value('id');
  65. $member_address->district_id = Address::where('areaname', $member_address->district)->where('parentid', $member_address->city_id)->value('id');
  66. $member_address->street_id = Street::where('areaname', $member_address->street)->where('parentid', $member_address->district_id)->value('id');
  67. } else {
  68. $member_address->province_id = Address::where('areaname', $member_address->province)->value('id');
  69. $member_address->city_id = Address::where('areaname', $member_address->city)->where('parentid', $member_address->province_id)->value('id');
  70. $member_address->district_id = Address::where('areaname', $member_address->district)->where('parentid', $member_address->city_id)->value('id');
  71. }
  72. return $member_address;
  73. }
  74. public function street(){
  75. app('db')->cacheSelect = true;
  76. $districtId = \YunShop::request()->get('district_id');
  77. $default_street[] = [
  78. 'id' => 0,
  79. 'areaname' => "其他",
  80. 'parentid' => -1,
  81. 'level' => 4
  82. ];
  83. if (\Setting::get('shop.trade.is_street')) {
  84. // 开启街道设置
  85. $street = Street::getStreetByParentId($districtId);
  86. $street = !empty($street->toArray()) ? $street : $default_street;
  87. } else {
  88. $street = [];
  89. }
  90. if ($street) {
  91. return $this->successJson('获取街道数据成功!', $street);
  92. }
  93. return $this->successJson('获取数据失败!', $street);
  94. }
  95. /*
  96. * 地址JSON数据接口
  97. *
  98. * */
  99. public function address()
  100. {
  101. app('db')->cacheSelect = true;
  102. $address = Address::getAllAddress();
  103. if (!$address) {
  104. return $this->errorJson('数据获取失败,请联系管理员!');
  105. }
  106. $msg = '数据获取成功';
  107. return $this->successJson($msg, $this->addressService($address));
  108. }
  109. /*
  110. * 修改默认收货地址
  111. *
  112. * */
  113. public function setDefault()
  114. {
  115. $memberId = \YunShop::app()->getMemberId();
  116. $addressModel = $this->memberAddressRepository->getAddressById(\YunShop::request()->address_id);
  117. if ($addressModel) {
  118. if ($addressModel->isdefault) {
  119. return $this->errorJson('默认地址不支持取消,请编辑或修改其他默认地址');
  120. }
  121. $addressModel->isdefault = 1;
  122. $this->memberAddressRepository->cancelDefaultAddress($memberId);
  123. if ($addressModel->save()) {
  124. return $this->successJson('修改默认地址成功');
  125. } else {
  126. return $this->errorJson('修改失败,请刷新重试!');
  127. }
  128. }
  129. return $this->errorJson('未找到数据或已删除,请重试!');
  130. }
  131. public function isRegion()
  132. {
  133. $is_region = \Setting::get('shop.trade.is_region');
  134. $region_hide = \Setting::get('shop.trade.region_hide');
  135. $is_region = $is_region?0:1;
  136. $region_hide = $region_hide? 1 :0;
  137. return $this->successJson('是否不填写区域', ['is_region' => $is_region,'region_hide' => $region_hide]);
  138. }
  139. protected function needRegion()
  140. {
  141. $is_region = \Setting::get('shop.trade.is_region');
  142. return !$is_region;
  143. }
  144. /*
  145. * 添加会员收获地址
  146. *
  147. * */
  148. public function store()
  149. {
  150. $requestAddress = \YunShop::request();
  151. if (!\YunShop::request()->username) {
  152. return $this->errorJson('收件人不能为空');
  153. }
  154. try {
  155. MemberService::mobileValidate([
  156. 'mobile' => request()->mobile,
  157. 'state' => request()->country_code,
  158. ]);
  159. } catch (ShopException $exception) {
  160. return $this->errorJson($exception->getMessage());
  161. }
  162. if ($this->needRegion()) {
  163. if (!\YunShop::request()->province) {
  164. return $this->errorJson('请选择省份');
  165. }
  166. if (!\YunShop::request()->city) {
  167. return $this->errorJson('请选择城市');
  168. }
  169. if (!\YunShop::request()->district) {
  170. return $this->errorJson('请选择区域');
  171. }
  172. }
  173. if (!\YunShop::request()->address) {
  174. return $this->errorJson('请输入详细地址');
  175. }
  176. if ($requestAddress) {
  177. $data = array(
  178. 'username' => \YunShop::request()->username,
  179. 'mobile' => \YunShop::request()->mobile,
  180. 'zipcode' => '',
  181. 'isdefault' => \YunShop::request()->isdefault ?: 0,
  182. 'province' => \YunShop::request()->province ?: '',
  183. 'city' => \YunShop::request()->city ?: '',
  184. 'district' => \YunShop::request()->district ?: '',
  185. 'address' => \YunShop::request()->address ?: '',
  186. 'latitude' => \YunShop::request()->latitude ?: '',
  187. 'longitude' => \YunShop::request()->longitude ?: '',
  188. 'country_code' => \YunShop::request()->country_code ?: '',
  189. );
  190. if (\Setting::get('shop.trade.is_street')) {
  191. $data['street'] = \YunShop::request()->street ?: '';
  192. }
  193. $addressModel = $this->memberAddressRepository->fill($data);
  194. $memberId = \YunShop::app()->getMemberId();
  195. if ($addressModel->isdefault) {
  196. //修改默认收货地址
  197. $this->memberAddressRepository->cancelDefaultAddress($memberId);
  198. }
  199. $addressModel->uid = $memberId;
  200. $addressModel->uniacid = \YunShop::app()->uniacid;
  201. $validator = $addressModel->validator($addressModel->getAttributes());
  202. if ($validator->fails()) {
  203. return $this->errorJson($this->returnMsg($validator->messages()->toArray()));
  204. }
  205. if ($addressModel->save()) {
  206. return $this->successJson('新增地址成功', $addressModel->toArray());
  207. } else {
  208. return $this->errorJson("数据写入出错,请重试!");
  209. }
  210. }
  211. return $this->errorJson("未获取到数据,请重试!");
  212. }
  213. //处理返回表单验证信息
  214. public function returnMsg($msgArr)
  215. {
  216. foreach ($msgArr as $item){
  217. foreach($item as $em){
  218. if($em){
  219. return $em;
  220. }
  221. }
  222. }
  223. }
  224. /*
  225. * 修改会员收获地址
  226. *
  227. * */
  228. public function update()
  229. {
  230. $addressModel = $this->memberAddressRepository->getAddressAndUserById(\YunShop::request()->address_id, \YunShop::app()->getMemberId());
  231. if (!$addressModel) {
  232. return $this->errorJson("未找到数据或已删除");
  233. }
  234. if (!\YunShop::request()->username) {
  235. return $this->errorJson('收件人不能为空');
  236. }
  237. try {
  238. MemberService::mobileValidate([
  239. 'mobile' => request()->mobile,
  240. 'state' => request()->country_code,
  241. ]);
  242. } catch (ShopException $exception) {
  243. return $this->errorJson($exception->getMessage());
  244. }
  245. if ($this->needRegion()) {
  246. if (!\YunShop::request()->province) {
  247. return $this->errorJson('请选择省份');
  248. }
  249. if (!\YunShop::request()->city) {
  250. return $this->errorJson('请选择城市');
  251. }
  252. if (!\YunShop::request()->district) {
  253. return $this->errorJson('请选择区域');
  254. }
  255. }
  256. if (!\YunShop::request()->address) {
  257. return $this->errorJson('请输入详细地址');
  258. }
  259. $requestAddress = array(
  260. 'username' => \YunShop::request()->username,
  261. 'mobile' => \YunShop::request()->mobile,
  262. 'zipcode' => '',
  263. 'province' => \YunShop::request()->province ?: '',
  264. 'city' => \YunShop::request()->city ?: '',
  265. 'district' => \YunShop::request()->district ?: '',
  266. 'address' => \YunShop::request()->address ?: '',
  267. 'latitude' => \YunShop::request()->latitude ?: '',
  268. 'longitude' => \YunShop::request()->longitude ?: '',
  269. 'country_code' => \YunShop::request()->country_code ?: '',
  270. );
  271. if (\Setting::get('shop.trade.is_street')) {
  272. $requestAddress['street'] = \YunShop::request()->street ?: '';
  273. }
  274. $addressModel->fill($requestAddress);
  275. $validator = $addressModel->validator($addressModel->getAttributes());
  276. if ($validator->fails()) {
  277. return $this->errorJson($this->returnMsg($validator->messages()->toArray()));
  278. }
  279. if (empty($addressModel->isdefault) && \YunShop::request()->isdefault) {
  280. $addressModel->isdefault = 1;
  281. //todo member_id 未附值
  282. $this->memberAddressRepository->cancelDefaultAddress(\YunShop::app()->getMemberId());
  283. }
  284. if ($addressModel->save()) {
  285. return $this->successJson('修改收货地址成功', $addressModel->toArray());
  286. } else {
  287. return $this->errorJson("写入数据出错,请重试!");
  288. }
  289. }
  290. /*
  291. * 移除会员收货地址
  292. *
  293. * */
  294. public function destroy()
  295. {
  296. $addressId = \YunShop::request()->address_id;
  297. $addressModel = $this->memberAddressRepository->getAddressById($addressId);
  298. if (!$addressModel || $addressModel->uid != \YunShop::app()->getMemberId()) {
  299. return $this->errorJson("未找到数据或已删除");
  300. }
  301. //todo 需要考虑删除默认地址选择其他地址改为默认
  302. $result = $this->memberAddressRepository->destroyAddress($addressId);
  303. if ($result) {
  304. return $this->successJson();
  305. } else {
  306. return $this->errorJson("数据写入出错,删除失败!");
  307. }
  308. }
  309. /*
  310. * 服务列表数据 index() 增加省市区ID值
  311. * */
  312. private function addressServiceForIndex($addressList = [], $address)
  313. {
  314. $i = 0;
  315. foreach ($addressList as $list) {
  316. foreach ($address as $key) {
  317. if ($list['province'] == $key['areaname'] && $key['level'] == 1) {
  318. $addressList[$i]['province_id'] = $key['id'];
  319. }
  320. if ($list['city'] == $key['areaname'] && $addressList[$i]['province_id'] == $key['parentid']) {
  321. $addressList[$i]['city_id'] = $key['id'];
  322. }
  323. if ($list['district'] == $key['areaname'] && $addressList[$i]['city_id'] == $key['parentid']) {
  324. $addressList[$i]['district_id'] = $key['id'];
  325. }
  326. }
  327. $i++;
  328. }
  329. return $addressList;
  330. }
  331. /*
  332. * 服务地址接口数据重构
  333. * */
  334. private function addressService($address)
  335. {
  336. $province = [];
  337. $city = [];
  338. $district = [];
  339. foreach ($address as $key) {
  340. if ($key['parentid'] == 0 && $key['level'] == 1) {
  341. $province[] = $key;
  342. } elseif ($key['parentid'] != 0 && $key['level'] == 2) {
  343. $city[] = $key;
  344. } else {
  345. $district[] = $key;
  346. }
  347. }
  348. return array(
  349. 'province' => $province,
  350. 'city' => $city,
  351. 'district' => $district,
  352. );
  353. }
  354. public function getStreet()
  355. {
  356. //member.member-address.get-street
  357. $districtId = \YunShop::request()->get('district_id');
  358. if (\Setting::get('shop.trade.is_street')) {
  359. // 开启街道设置
  360. $street = Street::getStreetByParentId($districtId);
  361. } else {
  362. $street = [];
  363. }
  364. if ($street) {
  365. return $this->successJson('获取街道数据成功!', $street);
  366. }
  367. return $this->successJson('获取数据失败!', $street);
  368. }
  369. /**
  370. * 修改地理位置(经纬度)接口 ps同城配送使用
  371. * request address_id 地址ID
  372. * request latitude 纬度
  373. * request longitude 经度
  374. * @return \Illuminate\Http\JsonResponse
  375. */
  376. public function updateLocation()
  377. {
  378. $addressModel = $this->memberAddressRepository->getAddressAndUserById(\YunShop::request()->address_id, \YunShop::app()->getMemberId());
  379. $addressModel->latitude = \YunShop::request()->latitude ?: '';
  380. $addressModel->longitude = \YunShop::request()->longitude ?: '';
  381. if ($addressModel->save()) {
  382. return $this->successJson('修改地理位置成功', $addressModel->toArray());
  383. } else {
  384. return $this->errorJson("写入数据出错,请重试!");
  385. }
  386. }
  387. }