PreOrderAddress.php 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: shenyang
  5. * Date: 2017/9/4
  6. * Time: 下午5:00
  7. */
  8. namespace app\frontend\modules\dispatch\models;
  9. use app\common\models\Address;
  10. use app\common\models\DispatchType;
  11. use app\frontend\models\OrderAddress;
  12. use app\frontend\modules\member\services\MemberService;
  13. use app\frontend\modules\order\models\PreOrder;
  14. use app\frontend\repositories\MemberAddressRepository;
  15. use app\common\exceptions\AppException;
  16. use app\common\exceptions\ShopException;
  17. use app\common\models\Street;
  18. use Illuminate\Foundation\Validation\ValidatesRequests;
  19. class PreOrderAddress extends OrderAddress
  20. {
  21. /**
  22. * @var PreOrder
  23. */
  24. public $order;
  25. private $memberAddress;
  26. /**
  27. * @param PreOrder $order
  28. * @throws ShopException
  29. */
  30. public function setOrder(PreOrder $order)
  31. {
  32. $this->order = $order;
  33. $order->setRelation('orderAddress', $this);
  34. $this->_init();
  35. }
  36. /**
  37. * @throws ShopException
  38. */
  39. protected function _init()
  40. {
  41. $this->fill($this->getOrderAddress()->toArray());
  42. }
  43. public function validateAddress()
  44. {
  45. if (!$this->order->isNeedAddress()) {
  46. if (empty(trim($this->address))) {
  47. throw new AppException("收货地址不能为空",['address_error'=> 404]);
  48. }
  49. if ($this->isRegion()) {
  50. $address = $this->getMemberAddress();
  51. if (empty($this->province_id)) {
  52. throw new AppException("收货地址有误,省份[{$address->province}]不存在",['address_error'=> 404]);
  53. }
  54. if (empty($this->city_id)) {
  55. throw new AppException("收货地址有误,城市[{$address->city}]不存在",['address_error'=> 404]);
  56. }
  57. if (empty($this->district_id)) {
  58. throw new AppException("收货地址有误,区县[{$address->district}]不存在",['address_error'=> 404]);
  59. }
  60. }
  61. }
  62. }
  63. /**
  64. * @return OrderAddress
  65. * @throws ShopException
  66. */
  67. protected function getOrderAddress()
  68. {
  69. if (!isset($this->memberAddress)) {
  70. // $this->memberAddress = $this->_getMemberAddress();
  71. $this->memberAddress = $this->isRegion() ? $this->_getMemberAddress() : $this->_getAddress();
  72. $this->setDeliveryTime();
  73. }
  74. return $this->memberAddress;
  75. }
  76. /**
  77. * @return bool true 需要;false 不
  78. */
  79. protected function isRegion()
  80. {
  81. $is_region = \Setting::get('shop.trade.is_region');
  82. return !$is_region;
  83. }
  84. protected function setDeliveryTime()
  85. {
  86. if (\Setting::get('shop.trade.delivery_time')) {
  87. $this->memberAddress->delivery_day = request()->delivery_day;
  88. $this->memberAddress->delivery_time = request()->delivery_time;
  89. }
  90. return null;
  91. }
  92. /**
  93. * 不需要区域的下单地址
  94. */
  95. private function _getAddress()
  96. {
  97. $member_address = $this->getMemberAddress();
  98. $orderAddress = new OrderAddress();
  99. $orderAddress->order_id = $this->order->id;
  100. $orderAddress->mobile = $member_address->mobile;
  101. if ($member_address->mobile && $member_address->country_code) {
  102. MemberService::mobileValidate([
  103. 'mobile' => $member_address->mobile,
  104. 'state' => $member_address->country_code,
  105. ]);
  106. }
  107. $orderAddress->realname = $member_address->username;
  108. $province_id = $member_address->province_id ?: Address::where('areaname', $member_address->province)->where('level', 1)->value('id');
  109. $city_id = $member_address->city_id ?: Address::where('areaname', $member_address->city)->where('parentid', $province_id)->value('id');
  110. $district_id = $member_address->district_id ?: Address::where('areaname', $member_address->district)->where('parentid', $city_id)->value('id');
  111. $orderAddress->province_id = $province_id ?: 0;
  112. $orderAddress->city_id = $city_id ?: 0;
  113. $orderAddress->district_id = $district_id ?: 0;
  114. if (isset($member_address->street)) {
  115. $orderAddress->street_id = Street::where('areaname', $member_address->street)->where('parentid', $orderAddress->district_id)->value('id') ?: 0;
  116. }
  117. $orderAddress->province = $member_address->province ?: '';
  118. $orderAddress->city = $member_address->city ?: '';
  119. $orderAddress->district = $member_address->district ?: '';
  120. $orderAddress->street = $member_address->street ?: '';
  121. $orderAddress->longitude = $member_address->longitude ?: '';
  122. $orderAddress->latitude = $member_address->latitude ?: '';
  123. $orderAddress->address = implode(' ', array_filter([$member_address->province, $member_address->city, $member_address->district, $orderAddress->street, $member_address->address]));
  124. $orderAddress->country_code = $member_address->country_code ?: '';
  125. return $orderAddress;
  126. }
  127. /**
  128. * 获取用户配送地址模型
  129. * @return mixed
  130. * @throws AppException
  131. */
  132. private function _getMemberAddress()
  133. {
  134. $member_address = $this->getMemberAddress();
  135. $orderAddress = new OrderAddress();
  136. $orderAddress->order_id = $this->order->id;
  137. $orderAddress->mobile = $member_address->mobile;
  138. if ($member_address->mobile && $member_address->country_code) {
  139. MemberService::mobileValidate([
  140. 'mobile' => $member_address->mobile,
  141. 'state' => $member_address->country_code,
  142. ]);
  143. }
  144. if ($member_address->province) {
  145. $orderAddress->province_id = $member_address->province_id ?: Address::where('areaname', 'like', $member_address->province . '%')->where('level', 1)->value('id');
  146. } else {
  147. $orderAddress->province_id = $member_address->province_id ?: null;
  148. }
  149. $orderAddress->city_id = $member_address->city_id ?: Address::where('areaname', $member_address->city)->where('parentid', $orderAddress->province_id)->value('id');
  150. $orderAddress->district_id = $member_address->district_id ?: Address::where('areaname', $member_address->district)->where('parentid', $orderAddress->city_id)->value('id');
  151. $orderAddress->address = implode(' ', [$member_address->province, $member_address->city, $member_address->district, $member_address->address]);
  152. //todo 修复前端传street等于空字符串时会报错
  153. if (!empty($member_address->street) && $member_address->street != '其他') {
  154. $orderAddress->street_id = Street::where('areaname', $member_address->street)->where('parentid', $orderAddress->district_id)->value('id');
  155. if (!isset($orderAddress->street_id)) {
  156. throw new AppException('收货地址有误请重新保存收货地址',['address_error'=> 404]);
  157. }
  158. $orderAddress->street = $member_address->street;
  159. $orderAddress->address = implode(' ', [$member_address->province, $member_address->city, $member_address->district, $orderAddress->street, $member_address->address]);
  160. }
  161. $orderAddress->realname = $member_address->username;
  162. $orderAddress->province = $member_address->province;
  163. $orderAddress->city = $member_address->city;
  164. $orderAddress->district = $member_address->district;
  165. $orderAddress->longitude = $member_address->longitude ?: '';
  166. $orderAddress->latitude = $member_address->latitude ?: '';
  167. $orderAddress->country_code = $member_address->country_code ?: '';
  168. return $orderAddress;
  169. }
  170. /**
  171. * 获取用户配送地址模型
  172. * @return mixed
  173. * @throws AppException
  174. */
  175. public function getMemberAddress()
  176. {
  177. $address = json_decode(urldecode($this->order->getRequest()->input('address', '[]')), true);
  178. if (count($address)) {
  179. //$request->input('address');
  180. $this->validate($address, [
  181. 'address' => 'required',
  182. 'mobile' => 'required',
  183. 'username' => 'required',
  184. //province' => 'required',
  185. //'city' => 'required',
  186. // 'zipcode' => '',
  187. //'district' => 'required'
  188. ]
  189. );
  190. $memberAddress = app(MemberAddressRepository::class)->fill($address);
  191. return $memberAddress;
  192. }
  193. $defaultAddress = $this->order->belongsToMember->defaultAddress;
  194. // if (empty($defaultAddress)) {
  195. // $defaultAddress = app(MemberAddressRepository::class)->getStaticModel()->where('uid', $this->order->uid)->first();
  196. // }
  197. return $defaultAddress;
  198. }
  199. public function beforeSaving()
  200. {
  201. return parent::beforeSaving(); // TODO: Change the autogenerated stub
  202. }
  203. public function save(array $options = [])
  204. {
  205. if ($this->order->isNeedAddress()) {
  206. \Log::info('---订单编号:' . $this->order->order_sn . '不需要地址----------');
  207. return true;
  208. }
  209. return parent::save($options); // TODO: Change the autogenerated stub
  210. }
  211. }