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; } } }