| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- <?php
- namespace addons\Store\common\logic\order\purchase;
- use addons\Store\common\enums\StoreEnum;
- use addons\Store\common\models\Store;
- use addons\Store\common\services\StoreService;
- use common\enums\AddonsEnum;
- use common\enums\AppEnum;
- use common\enums\OrderSourceEnum;
- use common\enums\PreviewTypeEnum;
- use common\enums\ShippingTypeEnum;
- use common\enums\StatusEnum;
- use common\helpers\LocationHelper;
- use common\models\common\Region;
- use common\models\mall\Mall;
- use Exception;
- use yii\helpers\ArrayHelper;
- use yii\helpers\Json;
- // 支付方式接口
- abstract class BasePurchase extends \common\logic\order\purchase\BasePurchase
- {
- /**
- * @desc:
- * @Author: hua
- * @Date: 2021/12/15
- * @Time: 9:56
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @param $form
- * @return mixed
- */
- abstract public function execute($form);
- /**
- * 获取下单类型
- * @Author bing
- * @DateTime 2021-09-23 09:48:45
- * @return string
- * @copyright: Copyright (c) 2020 广东七件事集团
- */
- abstract public static function getType(): string;
- public function afterExecute($form, string $type)
- {
- try {
- // 重组默认商品信息
- $order_goods = $form['order_goods'];
- $group_order_goods = [];
- $data = is_array($form->data) ? $form->data : Json::decode($form->data, true);
- $store = Store::findOne(['id' => $data['store_id'], 'mall_id' => $form->mall_id, 'status' => StatusEnum::ENABLED]);
- if(!$store) throw new Exception('门店已下线,请选择其他门店下单');
- if ($data['order_source'] !== OrderSourceEnum::SOURCE_RESERVE) {
- StoreService::checkBusinessTime($store);// 检测营业时间
- }
- $shipping_type = $data['shipping_type'] ?? 0;
- $mobile = $data['mobile']??0;
- if($form['action']== AppEnum::ACTION_CREATE){
- if($shipping_type==ShippingTypeEnum::PICKUP&&empty($mobile)){
- $mobile = $form->user['mobile'] ?? 0;// 不填写手机号默认使用用户授权的手机号
- }
- }
- if($shipping_type==ShippingTypeEnum::MERCHANT_DISTRIBUTION){
- if(empty($data['longitude'])||empty($data['latitude'])){
- throw new \yii\db\Exception('请输入经纬度');
- }
- }
- //supplier_type 供应者类型:0:自身;1:商城;2:o2o;3:多商户
- $address_id = $data['address_id']??0;
- $supplier_type0 = [];
- $supplier_type1 = [];
- $supplier_type2 = [];
- $supplier_type3 = [];
- $supplier_type3_list = [];
- $freight_type = [];
- foreach ($order_goods as $item) {
- switch ($item['supplier_type']) {
- case 0:
- $supplier_type0[] = $item['supplier_id'];
- break;
- case 1:
- $supplier_type1[] = $item['supplier_id'];
- break;
- case 2:
- $supplier_type2[] = $item['supplier_id'];
- break;
- case 3:
- $supplier_type3[] = $item['supplier_id'];
- break;
- }
- $freight_type = $item['freight_type'];
- }
- $select = 'id,longitude,latitude,province_id,city_id,district_id,store_name,intra_city_distribution,intra_city_distribution,address,shop_mobile';
- $supplier_type0_list = Store::lists(['where' => [['id' => $supplier_type0]], 'index' => 'id','select'=>$select]);
- $supplier_type1_list = Mall::lists(['where' => [['id' => $supplier_type1]], 'index' => 'id']);
- $supplier_type2_list = Store::lists(['where' => [['id' => $supplier_type2]], 'index' => 'id','select'=>$select]);
- $region_ids = array_column($supplier_type0_list, 'province_id');
- $region_ids = array_merge($region_ids, array_column($supplier_type0_list, 'city_id'));
- $region_ids = array_merge($region_ids, array_column($supplier_type0_list, 'district_id'));
- $region_ids = array_merge($region_ids, array_column($supplier_type2_list, 'province_id'));
- $region_ids = array_merge($region_ids, array_column($supplier_type2_list, 'city_id'));
- $region_ids = array_merge($region_ids, array_column($supplier_type2_list, 'district_id'));
- $region_list = Region::lists(['where' => [['id' => $region_ids]], 'index' => 'id', 'select' => 'id,name']);
- $store_address = '';
- $initial_delivery_amount = 0;
- $out_of_range = 0;
- foreach ($order_goods as $item) {
- $key = $item['supplier_type'] . '_' . $item['supplier_id'];//拆单key
- $mch_name = '';
- $store = null;
- if (!isset($group_order_goods[$key])) {
- switch ($item['supplier_type']) {
- case 0:
- case 2:
- $store = $supplier_type0_list[$item['supplier_id']];
- if($shipping_type==ShippingTypeEnum::MERCHANT_DISTRIBUTION){
- $intra_city_distribution = $store['intra_city_distribution'];
- $intra_city_distribution = json_decode($intra_city_distribution,true);
- if(!empty($intra_city_distribution['distribution_scope'])){
- $initial_delivery_amount = $intra_city_distribution['initial_delivery_amount'];
- $obj = new LocationHelper();
- $distance = $obj->getDistanceByGeo($store['latitude'],$store['longitude'], $data['latitude'], $data['longitude']);
- if($distance>$intra_city_distribution['distribution_scope']){
- $out_of_range = 1;
- // if($form['action']== AppEnum::ACTION_CREATE)throw new \yii\db\Exception('超出配送范围');
- }
- }
- }
- $mch_name = $supplier_type0_list[$item['supplier_id']]['store_name'];
- $province = $region_list[$supplier_type0_list[$item['supplier_id']]['province_id']]['name'];
- $city = $region_list[$supplier_type0_list[$item['supplier_id']]['city_id']]['name'];
- $district = $region_list[$supplier_type0_list[$item['supplier_id']]['district_id']]['name'];
- $store_address = $province.$city.$district.$supplier_type0_list[$item['supplier_id']]['address'];
- break;
- case 1:
- $mch_name = $supplier_type1_list[$item['supplier_id']]['name'];
- break;
- case 3:
- $mch_name = $supplier_type3_list[$item['supplier_id']]['name'];
- break;
- }
- $group_order_goods[$key]['mch_order_info']['mch_name'] = $mch_name;
- $group_order_goods[$key]['mch_order_info']['store'] = $store;
- $group_order_goods[$key]['mch_order_info']['mobile'] = $mobile;
- $group_order_goods[$key]['mch_order_info']['store_address'] = $store_address;
- // 主订单信息
- $group_order_goods[$key]['mch_order_info']['goods_id'] = $item['goods_id'];
- $group_order_goods[$key]['mch_order_info']['goods_attr_id'] = $item['goods_attr_id'];
- $group_order_goods[$key]['mch_order_info']['mall_id'] = $item['mall_id'];
- $group_order_goods[$key]['mch_order_info']['store_id'] = $item['store_id'];
- $group_order_goods[$key]['mch_order_info']['supplier_type'] = $item['supplier_type'];
- $group_order_goods[$key]['mch_order_info']['mch_id'] = $item['mch_id'];
- $group_order_goods[$key]['mch_order_info']['user_id'] = $item['user_id'];
- $group_order_goods[$key]['mch_order_info']['price'] = $item['price'];
- $group_order_goods[$key]['mch_order_info']['address_id'] = $address_id;
- $group_order_goods[$key]['mch_order_info']['shipping_type'] = $shipping_type;
- $group_order_goods[$key]['mch_order_info']['remark'] = $data['remark'][$item['mch_id']] ?? '';
- $group_order_goods[$key]['mch_order_info']['original_goods_price'] = $item['original_goods_price'] ?? 0;
- $group_order_goods[$key]['mch_order_info']['goods_price'] = $item['goods_price'];
- $group_order_goods[$key]['mch_order_info']['pay_money'] = $item['goods_price'];
- $group_order_goods[$key]['mch_order_info']['total_price'] = $item['goods_price'];
- $group_order_goods[$key]['mch_order_info']['total_pay_price'] = $item['goods_price'];
- $group_order_goods[$key]['mch_order_info']['num'] = $item['num'];
- $group_order_goods[$key]['mch_order_info']['goods_name'] = $item['goods_name'];
- $group_order_goods[$key]['mch_order_info']['goods_attr_name'] = $item['goods_attr_name'];
- $group_order_goods[$key]['mch_order_info']['pic_url'] = $item['pic_url'];
- }else{
- $group_order_goods[$key]['mch_order_info']['original_goods_price'] += $item['original_goods_price'] ?? 0;
- $group_order_goods[$key]['mch_order_info']['goods_price'] += $item['goods_price'];
- $group_order_goods[$key]['mch_order_info']['pay_money'] += $item['goods_price'];
- $group_order_goods[$key]['mch_order_info']['marketing_type'] = $data['marketing_type'] ?? '';
- }
- if (!isset($group_order_goods[$key]['goods'][$item['goods_id']])) {
- $group_order_goods[$key]['goods'][$item['goods_id']]['goods_id'] = $item['goods_id'];
- $group_order_goods[$key]['goods'][$item['goods_id']]['goods_price'] = 0;
- $group_order_goods[$key]['goods'][$item['goods_id']]['num'] = 0;
- $group_order_goods[$key]['goods'][$item['goods_id']]['goods_name'] = $item['goods_name'];
- $group_order_goods[$key]['goods'][$item['goods_id']]['goods_details'] = [];
- }
- $group_order_goods[$key]['goods'][$item['goods_id']]['goods_price'] += $item['goods_price'];
- if (!isset($group_order_goods[$key]['goods'][$item['goods_id']]['original_goods_price'])) {
- $group_order_goods[$key]['goods'][$item['goods_id']]['original_goods_price'] = 0;
- }
- $group_order_goods[$key]['goods'][$item['goods_id']]['original_goods_price'] += $item['original_goods_price'] ?? 0;
- $group_order_goods[$key]['goods'][$item['goods_id']]['num'] += $item['num'];
- $group_order_goods[$key]['goods'][$item['goods_id']]['goods_details'][] = $item;
- if(!empty($data['order_source']) && $data['order_source'] === OrderSourceEnum::SOURCE_RESERVE){
- // 预约订单单独处理
- $group_order_goods[$key]['goods'][$item['goods_id']]['order_source'] = OrderSourceEnum::SOURCE_RESERVE;
- // // dd($form->sku[$item['goods_id']]);
- $item['unit'] = $form->sku[$item['goods_id']]['goods']['unit'];
- $info = $form->sku[$item['goods_id']];
- $reserve = $info['reserve'] ? ArrayHelper::toArray($info['reserve']) : [];
- unset($info['reserve'],$info['goods']);
- $reserve['sku'] = $info;
- $group_order_goods[$key]['goods'][$item['goods_id']]['reserve'] = $reserve;
- }
- if ($form['type'] == PreviewTypeEnum::RESERVE_NOW) $group_order_goods[$key]['mch_order_info']['order_source'] = 'Reserve';
- if($item['supplier_type'] == StoreEnum::SELF_MALL_WUZHOU){
- $group_order_goods[$key]['mch_order_info']['order_source'] = AddonsEnum::ADDONS_NAME_WUZHOU_CHAIN;
- }
- }
- $form['group_order_goods'] = $group_order_goods;
- $form['address_id'] = $data['address_id'] ?? 0;
- $form['freight_type'] = $freight_type;
- $form['store_address'] = $store_address;
- $form['initial_delivery_amount'] = $initial_delivery_amount;
- $form['out_of_range'] = $out_of_range;
- return $form;
- } catch (Exception $e) {
- $this->setError($e->getMessage());
- return false;
- }
- }
- }
|