Browse Source

天气查询方法修改

shensong 5 years ago
parent
commit
c3362da4b1
1 changed files with 82 additions and 0 deletions
  1. 82 0
      app/OrderScript.php

+ 82 - 0
app/OrderScript.php

@@ -196,4 +196,86 @@ class OrderScript extends Model
196 196
 	    }
197 197
 	 }
198 198
 
199
+    /*更新城市天气信息*/
200
+    public static function updateWeather($order_id) {
201
+        $redisKey = 'seafood_order_city_weather';
202
+        //查询订单收件人所在的城市(过滤关键字 市)
203
+        $city = Order::where('id', $order_id)->pluck('receiverCity');
204
+        $city = str_replace('市','',$city);
205
+        $specialCity = array('朝阳区','嘉定区','海淀区','昌平区','密云区','大兴区','房山区','通州区','普陀区',);
206
+        if(in_array($city, $specialCity)) {
207
+            $city = str_replace('区','',$city);
208
+        }
209
+        //查询redis中是否有该键,若没有则查询
210
+        $weather = RedisModel::get($redisKey.'_'.$city);
211
+        if($weather) {
212
+            $sellerMemo = Order::where('id', $order_id)->pluck('sellerMemo');
213
+            if(strstr($sellerMemo, $city.'天气状况:'.$weather)) {
214
+                return true;
215
+            }
216
+            $sellerMemo = $sellerMemo.'  '.$city.'天气状况:'.$weather;
217
+            Log::scriptLog(['order_id'=>$order_id, 'city'=> $city , 'app_key'=>''],['weather'=>$weather],"order/weather",1,'');
218
+            Order::where('id', $order_id)->update(['sellerMemo'=>$sellerMemo]);
219
+        } else {
220
+            $appKey = self::getAppKey();
221
+            $url = 'http://apis.juhe.cn/simpleWeather/query?city='.urlencode($city).'&key='.$appKey;
222
+            $result = file_get_contents($url);
223
+            $result = json_decode($result, true);
224
+            if($result['error_code'] == '0') {
225
+                //将数据缓存到redis里
226
+                $today = date('Y-m-d',time());
227
+                $tomorrow = date('Y-m-d',strtotime('+1 days'));
228
+                $weather = '';
229
+                foreach ($result['result']['future'] as $value) {
230
+                    if($value['date'] == $today) {
231
+                        $weather .= $today.'日气温:'.$value['temperature'].';  ';
232
+                    }
233
+                    if($value['date'] == $tomorrow) {
234
+                        $weather .= $tomorrow.'日气温:'.$value['temperature'];
235
+                    }
236
+                }
237
+
238
+                RedisModel::set($redisKey.'_'.$city, $weather);
239
+                $endTime = strtotime(date('Y-m-d 00:00:00',strtotime('+1 days'))) -1;
240
+                $expire = $endTime - time();
241
+                RedisModel::expire($redisKey.'_'.$city, $expire);
242
+                $sellerMemo = Order::where('id', $order_id)->pluck('sellerMemo');
243
+                if(strstr($sellerMemo, $city.'天气状况:'.$weather)) {
244
+                    return true;
245
+                }
246
+                $sellerMemo = $sellerMemo.'  '.$city.'天气状况:'.$weather;
247
+                Log::scriptLog(['order_id'=>$order_id, 'city'=> $city , 'app_key'=>$appKey],['weather'=>$weather],"order/weather",1,'');
248
+                Order::where('id', $order_id)->update(['sellerMemo'=>$sellerMemo]);
249
+            } else if($result['error_code'] == '10012'){
250
+                //判断是否为第二个APPkey也用完了
251
+                $key = (string) RedisModel::get('seafood_order_city_weather_key');
252
+                if($key == '0') {
253
+                    //超过100次/天上限 更换APPKey
254
+                    RedisModel::set('seafood_order_city_weather_key', '1');
255
+                    $endTime = strtotime(date('Y-m-d 00:00:00',strtotime('+1 days'))) -1;
256
+                    $expire = $endTime - time();
257
+                    RedisModel::expire('seafood_order_city_weather_key', $expire);
258
+                    self::updateWeather($order_id);
259
+                }
260
+            }
261
+        }
262
+
263
+        return true;
264
+    }
265
+
266
+    public static function getAppKey() {
267
+        $redisKey = 'seafood_order_city_weather_key';
268
+        $appKeyArr = ['32c8f844f8055f70f702fc28ec930e52', '85bfc19adb25998b2559d7ceba950e13'];
269
+        $appKey = (string)RedisModel::get($redisKey);
270
+        if($appKey != '') {
271
+            return $appKeyArr[$appKey];
272
+        } else {
273
+            RedisModel::set($redisKey, '0');
274
+            $endTime = strtotime(date('Y-m-d 00:00:00',strtotime('+1 days'))) -1;
275
+            $expire = $endTime - time();
276
+            RedisModel::expire($redisKey, $expire);
277
+            return $appKeyArr['0'];
278
+        }
279
+    }
280
+
199 281
 }