BasePurchase.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. <?php
  2. namespace addons\Store\common\logic\order\purchase;
  3. use addons\Store\common\enums\StoreEnum;
  4. use addons\Store\common\models\Store;
  5. use addons\Store\common\services\StoreService;
  6. use common\enums\AddonsEnum;
  7. use common\enums\AppEnum;
  8. use common\enums\OrderSourceEnum;
  9. use common\enums\PreviewTypeEnum;
  10. use common\enums\ShippingTypeEnum;
  11. use common\enums\StatusEnum;
  12. use common\helpers\LocationHelper;
  13. use common\models\common\Region;
  14. use common\models\mall\Mall;
  15. use Exception;
  16. use yii\helpers\ArrayHelper;
  17. use yii\helpers\Json;
  18. // 支付方式接口
  19. abstract class BasePurchase extends \common\logic\order\purchase\BasePurchase
  20. {
  21. /**
  22. * @desc:
  23. * @Author: hua
  24. * @Date: 2021/12/15
  25. * @Time: 9:56
  26. * @Copyright: copyright (c) 2021 广东七件事集团
  27. * @param $form
  28. * @return mixed
  29. */
  30. abstract public function execute($form);
  31. /**
  32. * 获取下单类型
  33. * @Author bing
  34. * @DateTime 2021-09-23 09:48:45
  35. * @return string
  36. * @copyright: Copyright (c) 2020 广东七件事集团
  37. */
  38. abstract public static function getType(): string;
  39. public function afterExecute($form, string $type)
  40. {
  41. try {
  42. // 重组默认商品信息
  43. $order_goods = $form['order_goods'];
  44. $group_order_goods = [];
  45. $data = is_array($form->data) ? $form->data : Json::decode($form->data, true);
  46. $store = Store::findOne(['id' => $data['store_id'], 'mall_id' => $form->mall_id, 'status' => StatusEnum::ENABLED]);
  47. if(!$store) throw new Exception('门店已下线,请选择其他门店下单');
  48. if ($data['order_source'] !== OrderSourceEnum::SOURCE_RESERVE) {
  49. StoreService::checkBusinessTime($store);// 检测营业时间
  50. }
  51. $shipping_type = $data['shipping_type'] ?? 0;
  52. $mobile = $data['mobile']??0;
  53. if($form['action']== AppEnum::ACTION_CREATE){
  54. if($shipping_type==ShippingTypeEnum::PICKUP&&empty($mobile)){
  55. $mobile = $form->user['mobile'] ?? 0;// 不填写手机号默认使用用户授权的手机号
  56. }
  57. }
  58. if($shipping_type==ShippingTypeEnum::MERCHANT_DISTRIBUTION){
  59. if(empty($data['longitude'])||empty($data['latitude'])){
  60. throw new \yii\db\Exception('请输入经纬度');
  61. }
  62. }
  63. //supplier_type 供应者类型:0:自身;1:商城;2:o2o;3:多商户
  64. $address_id = $data['address_id']??0;
  65. $supplier_type0 = [];
  66. $supplier_type1 = [];
  67. $supplier_type2 = [];
  68. $supplier_type3 = [];
  69. $supplier_type3_list = [];
  70. $freight_type = [];
  71. foreach ($order_goods as $item) {
  72. switch ($item['supplier_type']) {
  73. case 0:
  74. $supplier_type0[] = $item['supplier_id'];
  75. break;
  76. case 1:
  77. $supplier_type1[] = $item['supplier_id'];
  78. break;
  79. case 2:
  80. $supplier_type2[] = $item['supplier_id'];
  81. break;
  82. case 3:
  83. $supplier_type3[] = $item['supplier_id'];
  84. break;
  85. }
  86. $freight_type = $item['freight_type'];
  87. }
  88. $select = 'id,longitude,latitude,province_id,city_id,district_id,store_name,intra_city_distribution,intra_city_distribution,address,shop_mobile';
  89. $supplier_type0_list = Store::lists(['where' => [['id' => $supplier_type0]], 'index' => 'id','select'=>$select]);
  90. $supplier_type1_list = Mall::lists(['where' => [['id' => $supplier_type1]], 'index' => 'id']);
  91. $supplier_type2_list = Store::lists(['where' => [['id' => $supplier_type2]], 'index' => 'id','select'=>$select]);
  92. $region_ids = array_column($supplier_type0_list, 'province_id');
  93. $region_ids = array_merge($region_ids, array_column($supplier_type0_list, 'city_id'));
  94. $region_ids = array_merge($region_ids, array_column($supplier_type0_list, 'district_id'));
  95. $region_ids = array_merge($region_ids, array_column($supplier_type2_list, 'province_id'));
  96. $region_ids = array_merge($region_ids, array_column($supplier_type2_list, 'city_id'));
  97. $region_ids = array_merge($region_ids, array_column($supplier_type2_list, 'district_id'));
  98. $region_list = Region::lists(['where' => [['id' => $region_ids]], 'index' => 'id', 'select' => 'id,name']);
  99. $store_address = '';
  100. $initial_delivery_amount = 0;
  101. $out_of_range = 0;
  102. foreach ($order_goods as $item) {
  103. $key = $item['supplier_type'] . '_' . $item['supplier_id'];//拆单key
  104. $mch_name = '';
  105. $store = null;
  106. if (!isset($group_order_goods[$key])) {
  107. switch ($item['supplier_type']) {
  108. case 0:
  109. case 2:
  110. $store = $supplier_type0_list[$item['supplier_id']];
  111. if($shipping_type==ShippingTypeEnum::MERCHANT_DISTRIBUTION){
  112. $intra_city_distribution = $store['intra_city_distribution'];
  113. $intra_city_distribution = json_decode($intra_city_distribution,true);
  114. if(!empty($intra_city_distribution['distribution_scope'])){
  115. $initial_delivery_amount = $intra_city_distribution['initial_delivery_amount'];
  116. $obj = new LocationHelper();
  117. $distance = $obj->getDistanceByGeo($store['latitude'],$store['longitude'], $data['latitude'], $data['longitude']);
  118. if($distance>$intra_city_distribution['distribution_scope']){
  119. $out_of_range = 1;
  120. // if($form['action']== AppEnum::ACTION_CREATE)throw new \yii\db\Exception('超出配送范围');
  121. }
  122. }
  123. }
  124. $mch_name = $supplier_type0_list[$item['supplier_id']]['store_name'];
  125. $province = $region_list[$supplier_type0_list[$item['supplier_id']]['province_id']]['name'];
  126. $city = $region_list[$supplier_type0_list[$item['supplier_id']]['city_id']]['name'];
  127. $district = $region_list[$supplier_type0_list[$item['supplier_id']]['district_id']]['name'];
  128. $store_address = $province.$city.$district.$supplier_type0_list[$item['supplier_id']]['address'];
  129. break;
  130. case 1:
  131. $mch_name = $supplier_type1_list[$item['supplier_id']]['name'];
  132. break;
  133. case 3:
  134. $mch_name = $supplier_type3_list[$item['supplier_id']]['name'];
  135. break;
  136. }
  137. $group_order_goods[$key]['mch_order_info']['mch_name'] = $mch_name;
  138. $group_order_goods[$key]['mch_order_info']['store'] = $store;
  139. $group_order_goods[$key]['mch_order_info']['mobile'] = $mobile;
  140. $group_order_goods[$key]['mch_order_info']['store_address'] = $store_address;
  141. // 主订单信息
  142. $group_order_goods[$key]['mch_order_info']['goods_id'] = $item['goods_id'];
  143. $group_order_goods[$key]['mch_order_info']['goods_attr_id'] = $item['goods_attr_id'];
  144. $group_order_goods[$key]['mch_order_info']['mall_id'] = $item['mall_id'];
  145. $group_order_goods[$key]['mch_order_info']['store_id'] = $item['store_id'];
  146. $group_order_goods[$key]['mch_order_info']['supplier_type'] = $item['supplier_type'];
  147. $group_order_goods[$key]['mch_order_info']['mch_id'] = $item['mch_id'];
  148. $group_order_goods[$key]['mch_order_info']['user_id'] = $item['user_id'];
  149. $group_order_goods[$key]['mch_order_info']['price'] = $item['price'];
  150. $group_order_goods[$key]['mch_order_info']['address_id'] = $address_id;
  151. $group_order_goods[$key]['mch_order_info']['shipping_type'] = $shipping_type;
  152. $group_order_goods[$key]['mch_order_info']['remark'] = $data['remark'][$item['mch_id']] ?? '';
  153. $group_order_goods[$key]['mch_order_info']['original_goods_price'] = $item['original_goods_price'] ?? 0;
  154. $group_order_goods[$key]['mch_order_info']['goods_price'] = $item['goods_price'];
  155. $group_order_goods[$key]['mch_order_info']['pay_money'] = $item['goods_price'];
  156. $group_order_goods[$key]['mch_order_info']['total_price'] = $item['goods_price'];
  157. $group_order_goods[$key]['mch_order_info']['total_pay_price'] = $item['goods_price'];
  158. $group_order_goods[$key]['mch_order_info']['num'] = $item['num'];
  159. $group_order_goods[$key]['mch_order_info']['goods_name'] = $item['goods_name'];
  160. $group_order_goods[$key]['mch_order_info']['goods_attr_name'] = $item['goods_attr_name'];
  161. $group_order_goods[$key]['mch_order_info']['pic_url'] = $item['pic_url'];
  162. }else{
  163. $group_order_goods[$key]['mch_order_info']['original_goods_price'] += $item['original_goods_price'] ?? 0;
  164. $group_order_goods[$key]['mch_order_info']['goods_price'] += $item['goods_price'];
  165. $group_order_goods[$key]['mch_order_info']['pay_money'] += $item['goods_price'];
  166. $group_order_goods[$key]['mch_order_info']['marketing_type'] = $data['marketing_type'] ?? '';
  167. }
  168. if (!isset($group_order_goods[$key]['goods'][$item['goods_id']])) {
  169. $group_order_goods[$key]['goods'][$item['goods_id']]['goods_id'] = $item['goods_id'];
  170. $group_order_goods[$key]['goods'][$item['goods_id']]['goods_price'] = 0;
  171. $group_order_goods[$key]['goods'][$item['goods_id']]['num'] = 0;
  172. $group_order_goods[$key]['goods'][$item['goods_id']]['goods_name'] = $item['goods_name'];
  173. $group_order_goods[$key]['goods'][$item['goods_id']]['goods_details'] = [];
  174. }
  175. $group_order_goods[$key]['goods'][$item['goods_id']]['goods_price'] += $item['goods_price'];
  176. if (!isset($group_order_goods[$key]['goods'][$item['goods_id']]['original_goods_price'])) {
  177. $group_order_goods[$key]['goods'][$item['goods_id']]['original_goods_price'] = 0;
  178. }
  179. $group_order_goods[$key]['goods'][$item['goods_id']]['original_goods_price'] += $item['original_goods_price'] ?? 0;
  180. $group_order_goods[$key]['goods'][$item['goods_id']]['num'] += $item['num'];
  181. $group_order_goods[$key]['goods'][$item['goods_id']]['goods_details'][] = $item;
  182. if(!empty($data['order_source']) && $data['order_source'] === OrderSourceEnum::SOURCE_RESERVE){
  183. // 预约订单单独处理
  184. $group_order_goods[$key]['goods'][$item['goods_id']]['order_source'] = OrderSourceEnum::SOURCE_RESERVE;
  185. // // dd($form->sku[$item['goods_id']]);
  186. $item['unit'] = $form->sku[$item['goods_id']]['goods']['unit'];
  187. $info = $form->sku[$item['goods_id']];
  188. $reserve = $info['reserve'] ? ArrayHelper::toArray($info['reserve']) : [];
  189. unset($info['reserve'],$info['goods']);
  190. $reserve['sku'] = $info;
  191. $group_order_goods[$key]['goods'][$item['goods_id']]['reserve'] = $reserve;
  192. }
  193. if ($form['type'] == PreviewTypeEnum::RESERVE_NOW) $group_order_goods[$key]['mch_order_info']['order_source'] = 'Reserve';
  194. if($item['supplier_type'] == StoreEnum::SELF_MALL_WUZHOU){
  195. $group_order_goods[$key]['mch_order_info']['order_source'] = AddonsEnum::ADDONS_NAME_WUZHOU_CHAIN;
  196. }
  197. }
  198. $form['group_order_goods'] = $group_order_goods;
  199. $form['address_id'] = $data['address_id'] ?? 0;
  200. $form['freight_type'] = $freight_type;
  201. $form['store_address'] = $store_address;
  202. $form['initial_delivery_amount'] = $initial_delivery_amount;
  203. $form['out_of_range'] = $out_of_range;
  204. return $form;
  205. } catch (Exception $e) {
  206. $this->setError($e->getMessage());
  207. return false;
  208. }
  209. }
  210. }