'ID', 'mall_id' => 'Mall ID', 'store_id' => 'Store ID', 'goods_id' => 'Goods ID', 'price' => 'Price', 'original_price' => 'Original Price', 'cost_price' => 'Cost Price', 'reserve_date_type' => 'Reserve Date Type', 'reserve_week' => 'Reserve Week', 'reserve_date' => 'Reserve Date', 'reserve_time_range_type' => 'Reserve Time Range Type', 'time_slot_type' => 'Time Slot Type', 'reserve_time_slot' => 'Reserve Time Slot', 'reserve_price_type' => 'Reserve Price Type', 'reserve_time_slot_price' => 'Reserve Time Slot Price', 'reserve_max_buy' => 'Reserve Max Buy', 'reserve_advance_hourse' => 'Reserve Advance Hourse', 'reserve_days_range' => 'Reserve Days Range', 'cancel_type' => 'Cancel Type', 'cancel_rule' => 'Cancel Rule', 'expired_handle_type' => 'Expired Handle Type', 'province_id' => 'Province ID', 'city_id' => 'City ID', 'district_id' => 'District ID', 'detail' => 'Detail', 'lat' => 'Lat', 'lng' => 'Lng', 'region_name' => 'Region Name', 'service_type' => 'Service Type', 'created_at' => 'Created At', 'updated_at' => 'Updated At', 'ordering_information' => 'Ordering Information', 'information_detail' => 'Information Detail', 'reserve_type' => 'Reserve Type', 'appointments_number' => 'appointments_number', ]; } public function getSkus() { return $this->hasMany(StoreGoodsReserveSku::class, ['goods_id' => 'goods_id']); } public function getGoods() { return $this->hasOne(StoreGoods::class, ['id' => 'goods_id']); } // 预约商品 /** * @param array $goods * @param array $params * @return StoreGoodsReserve|false|null */ public static function setData(&$goods, $params) { try { $model = self::findOne(['goods_id' => $goods['id']]); if (empty($model)) { $model = new self(); $model->loadDefaultValues(); } $goodsAttributes = [ 'mall_id' => $goods['mall_id'], 'mch_id' => $goods['mch_id'], 'store_id' => $goods['store_id'], 'goods_id' => $goods['id'], 'price' => $goods['price'] ?? min(array_column($params['skus'], "price")), 'original_price' => $goods['original_price'] ?? min(array_column($params['skus'], "original_price")), 'cost_price' => $goods['cost_price'] ?? min(array_column($params['skus'], !empty($params['skus'][0]["cost_price"]) ? "cost_price" : "price")), ]; $params['information_detail'] = $params['information_detail'] ?? ''; $params['ordering_information'] = $params['ordering_information'] ?? ''; $params['district_id'] = empty($params['district_id']) ? 0 : intval($params['district_id']); $params['province_id'] = empty($params['province_id']) ? 0 : intval($params['province_id']); $params['city_id'] = empty($params['city_id']) ? 0 : intval($params['city_id']); $params['reserve_advance_hourse'] = empty($params['reserve_advance_hourse']) ? 0 : intval($params['reserve_advance_hourse']); $params['distance'] = empty($params['distance']) ? 0 : intval($params['distance']); $params['service_min'] = empty($params['service_min']) ? 0 : intval($params['service_min']); $params['appointments_number'] = empty($params['appointments_number']) ? 0 : intval($params['appointments_number']); if (!empty($params['province_id'])) { $params['region_name'] = implode(" ", Region::find() ->where(['id' => [$params['province_id'], $params['city_id'], $params['district_id']]]) ->orderBy('id asc')->select('name')->column()); } if (empty($goods['is_attr'])) { // 是单规格 将商品设置到规格中 $attributes = array_merge($params, $goodsAttributes); } else { $attributes = array_merge($goodsAttributes, $params); } is_array($attributes['reserve_week']) && $attributes['reserve_week'] = implode(',',$attributes['reserve_week']); is_array($attributes['reserve_date']) && $attributes['reserve_date'] = json_encode($attributes['reserve_date'],JSON_UNESCAPED_SLASHES); is_array($attributes['reserve_time_slot']) && $attributes['reserve_time_slot'] = json_encode($attributes['reserve_time_slot'],JSON_UNESCAPED_SLASHES); is_array($attributes['reserve_time_slot_price']) && $attributes['reserve_time_slot_price'] = json_encode($attributes['reserve_time_slot_price'],JSON_UNESCAPED_SLASHES); is_array($attributes['cancel_rule']) && $attributes['cancel_rule'] = json_encode($attributes['cancel_rule'],JSON_UNESCAPED_SLASHES); //($attributes['service_type'] ?? false) && $attributes['service_type'] = json_encode($attributes['service_type'],JSON_UNESCAPED_SLASHES); if (!$model->load($attributes, '') || !$model->save()) { throw new Exception($model->getErrorMessage()); } // 处理预约商品规格 $reserveGoods = ArrayHelper::toArray($model); if($goods['is_attr'] == 1){ // 多规格预约商品 $skus = $params['skus']; // 因为预约商品按天设置时商品售价存储位置不同,所以需要单独处理 $is_day = true; $timeSlotPriceList = []; foreach ($skus as $item) { if ($item['reserve_price_type'] == 2 || $item['reserve_price_type'] == 1) { $timeSlotPriceList = array_merge($timeSlotPriceList, array_values($item['reserve_time_slot_price'])); } else { $is_day = false; } } if (!empty($timeSlotPriceList) && $is_day) { $timeSkusGoods = array_column($timeSlotPriceList, 'price'); $timeMinSkusGoods = array_search(min($timeSkusGoods), $timeSkusGoods); $timeSlotPriceList = $timeSlotPriceList[$timeMinSkusGoods] ?? []; } $skusGoods = array_column($skus, 'price'); $minSkusGoods = array_search(min($skusGoods), $skusGoods); $reserveSkusGoods = $skus[$minSkusGoods] ?? []; $goodsModel = StoreGoods::findOne($goods['id']); if (!empty($goodsModel)) { // 赋值给主商品对应的商品 if ($is_day) { $goodsModel->price = $timeSlotPriceList['price'] ?? 0; $goodsModel->original_price = $timeSlotPriceList['original_price'] ?? 0; } else { $goodsModel->price = $reserveSkusGoods['price'] ?? 0; $goodsModel->original_price = $reserveSkusGoods['original_price'] ?? 0; } $goodsModel->save(); } $res = StoreGoodsReserveSku::setSkus($goods, $skus, $model); }else{ $reserveGoods['service_min'] = $params['service_min']; $reserveGoods['unit'] = $goods['unit'] ?? ''; is_array($reserveGoods['reserve_time_slot_price']) && $reserveGoods['reserve_time_slot_price'] = Json::encode($reserveGoods['reserve_time_slot_price']); $reserveGoods['price'] = $goodsAttributes['price']; $reserveGoods['name'] = ''; $res = StoreGoodsReserveSku::setSku($reserveGoods); } if($res === false) throw new Exception('处理预约商品规格出现异常,msg:'.StoreGoodsReserveSku::getStaticError()); return $model; } catch (Exception $e) { if (isset($trans)) $trans->rollback(); self::$static_error = $e->getMessage(); return false; } } }