diff --git a/app/Console/Commands/BiAng/DeviceLogSyncCommand.php b/app/Console/Commands/BiAng/DeviceLogSyncCommand.php index 64b58bd..3573ee9 100644 --- a/app/Console/Commands/BiAng/DeviceLogSyncCommand.php +++ b/app/Console/Commands/BiAng/DeviceLogSyncCommand.php @@ -7,10 +7,11 @@ use App\Enums\DeviceType; use App\Iot\BiAng\HttpClient; use App\Models\Device; use App\Models\DeviceLog; -use App\Models\InsecticidalLampReport; use App\Models\WormPhoto; use Illuminate\Console\Command; use Illuminate\Support\Arr; +use Illuminate\Support\Carbon; +use Illuminate\Support\Facades\Storage; use RuntimeException; use Throwable; @@ -135,16 +136,33 @@ class DeviceLogSyncCommand extends Command case DeviceType::Worm: case DeviceType::InsectSexLure: + $dir = "worm-photos/{$device->id}"; + + $disk = Storage::disk('public'); + $data = $httpClient->getWormPhotos($device->sn, $now->copy()->subHours(24), $now); - // foreach ($data['imgUrl'] as $item) { - // WormPhoto::firstOrCreate([ - // 'device_id' => $device->id, - // 'uploaded_at' => $item['time'], - // ], [ - // 'url' => $item['url'], - // ]); - // } + foreach ($data['imgUrl'] as $item) { + // 下载图片 + $name = md5($item['url']); + if ($ext = pathinfo($item['url'], PATHINFO_EXTENSION)) { + $name .= ".{$ext}"; + } + + $path = "{$dir}/{$name}"; + + $disk = Storage::disk('public'); + if (! $disk->exists($path)) { + $disk->put($path, file_get_contents($item['url'])); + } + + WormPhoto::updateOrCreate([ + 'device_id' => $device->id, + 'uploaded_at' => $item['time'], + ], [ + 'url' => $path, + ]); + } $device->update([ 'status' => count($data['imgUrl'] ?? []) > 0 ? DeviceStatus::Online : DeviceStatus::Offline, diff --git a/app/Console/Commands/BiAng/WormStatisticsSyncCommand.php b/app/Console/Commands/BiAng/WormStatisticsSyncCommand.php index 9b6c04b..d27658a 100644 --- a/app/Console/Commands/BiAng/WormStatisticsSyncCommand.php +++ b/app/Console/Commands/BiAng/WormStatisticsSyncCommand.php @@ -53,9 +53,9 @@ class WormStatisticsSyncCommand extends Command foreach ($devices as $device) { $this->info('=================================='); - $latestReportedAt = WormReport::Where('device_id', $device->id)->latest('reported_at')->value('reported_at'); + $latestReportedAt = WormReport::where('device_id', $device->id)->latest('reported_at')->value('reported_at'); - $start = $latestReportedAt ? $latestReportedAt->copy() : $today->copy()->subDays(179); + $start = $latestReportedAt ? $latestReportedAt->copy() : $today->copy(); $days = $start->diffInDays($today, false); diff --git a/app/Console/Commands/Linkos/WormReportCommand.php b/app/Console/Commands/Linkos/WormReportCommand.php new file mode 100644 index 0000000..80cd289 --- /dev/null +++ b/app/Console/Commands/Linkos/WormReportCommand.php @@ -0,0 +1,158 @@ +info('------------------------------------------'); + $this->info(now()); + try { + $this->sync(); + } catch (Throwable $e) { + report($e); + } + $this->info('------------------------------------------'); + } + + protected function sync(): void + { + // 接口接口限制,每分钟最多访问6次,因此每次访问后需休眠10秒 + $client = new FarmClient('xunwang', 'qwer1234'); + + $now = now(); + + /** @var \Illuminate\Database\Eloquent\Collection */ + $devices = Device::supplierBy('device-supplier-linkos') + ->where('type', DeviceType::Worm) + ->whereIn('status', [DeviceStatus::Online, DeviceStatus::Offline]) + ->get(); + + if ($devices->isEmpty()) { + $this->warn('没有找到虫情设备'); + return; + } + + $this->info('=================================='); + $this->info('尝试更新设备状态...'); + $realTimeData = $client->realTimeData($devices->pluck('sn')->all()); + foreach ($realTimeData as $item) { + foreach ($devices as $device) { + if ($item['deviceAddr'] != $device->sn) { + continue; + } + // 更新设备状态 + $device->update([ + 'state' => $item['status'] === 'online' ? DeviceStatus::Online : DeviceStatus::Offline, + ]); + } + } + $this->info("设备状态更新完成"); + + $this->info('=================================='); + + $this->info('尝试同步虫情区域统计...'); + for ($i=2; $i > 0; $i--) { + $reportedAt = $now->copy()->subDays($i); + + $statistics = collect( + $client->wormStatistics( + 'E05F10DAIB6F4I4977IB95FI82554A48DE7C', + $reportedAt->copy()->startOfDay(), + $reportedAt->copy()->endOfDay(), + ) + )->mapWithKeys(fn ($item) => [$item['deviceAddr'] => $item['wornData']]); + + foreach ($devices as $device) { + $data = $statistics[$device->sn] ?? []; + + WormReport::updateOrCreate([ + 'device_id' => $device->id, + 'reported_at' => $reportedAt->toDateString(), + ], [ + 'agricultural_base_id' => $device->agricultural_base_id, + 'worm_num' => collect($data)->sum('num'), + 'data' => $data, + ]); + } + } + $this->info("同步虫情区域统计完成"); + + $this->info('=================================='); + + // 接口请求次数 + $requests = 4; + + // 同步最近7天的分析报表记录 + $this->info('尝试同步分析报表记录...'); + foreach ($devices->pluck('sn') as $sn) { + $data = $client->wormAnalyseData($sn, $now->copy()->subDays(7), $now, 1, 100); + + foreach ($data['rows'] as $item) { + foreach ($devices as $device) { + if ($item['deviceAddr'] != $device->sn) { + continue; + } + + $url = $item['analyseCoordUrl'] ?: $item['imagesUrl']; + + // 下载图片 + $name = md5($url); + if ($ext = pathinfo($url, PATHINFO_EXTENSION)) { + $name .= ".{$ext}"; + } + + $path = "worm-photos/{$device->id}/{$name}"; + + $disk = Storage::disk('public'); + if (! $disk->exists($path)) { + $disk->put($path, file_get_contents($url)); + } + + WormPhoto::updateOrCreate([ + 'device_id' => $device->id, + 'uploaded_at' => $item['createTime'], + ], [ + 'url' => $path, + ]); + } + } + + $requests++; + // 接口请求频率: 每分钟6次 + if ($requests == 6) { + $requests = 0; + sleep(61); + } + } + $this->info("同步分析报表记录完成"); + } +} diff --git a/app/Console/Commands/LinkosDeviceLogArchiveCommand.php b/app/Console/Commands/LinkosDeviceLogArchiveCommand.php deleted file mode 100644 index ed87457..0000000 --- a/app/Console/Commands/LinkosDeviceLogArchiveCommand.php +++ /dev/null @@ -1,74 +0,0 @@ -get(); - - // 物联平台目前只有水质监测设备和气象监测设备 - LinkosDeviceLog::orderBy('reported_at', 'asc')->lazy()->each(function ($log) use ($devices, $linkosDeviceLogService) { - if (empty($log->data)) { - return; - } - - foreach ($devices as $device) { - if ($device->sn !== $log->device_id) { - continue; - } - - match ($device->type) { - DeviceType::Soil => $linkosDeviceLogService->handleSoilMonitoringLog($device, $log->data, $log->reported_at), - DeviceType::Meteorological => $linkosDeviceLogService->handleMeteorologicalMonitoringLog($device, $log->data, $log->reported_at), - DeviceType::WaterQuality => $linkosDeviceLogService->handleWaterQualityMonitoringLog($device, $log->data, $log->reported_at), - }; - } - }); - - $now = now(); - $date = Carbon::parse('2022-06-01'); - - while ($date->lt($now)) { - foreach ($devices as $device) { - match ($device->type) { - DeviceType::Soil => $linkosDeviceLogService->handleSoilMonitoringDailyLog($device, $date), - DeviceType::Meteorological => $linkosDeviceLogService->handleMeteorologicalMonitoringDailyLog($device, $date), - DeviceType::WaterQuality => $linkosDeviceLogService->handleWaterQualityMonitoringDailyLog($device, $date), - }; - } - - $date->addDay(); - } - - return Command::SUCCESS; - } -} diff --git a/app/Console/Commands/LinkosDeviceLogSyncCommand.php b/app/Console/Commands/LinkosDeviceLogSyncCommand.php deleted file mode 100644 index 6e59909..0000000 --- a/app/Console/Commands/LinkosDeviceLogSyncCommand.php +++ /dev/null @@ -1,197 +0,0 @@ -argument('device'); - - // 最近同步时间 - $lastDate = $this->getLastDate($device); - - do { - if ($lastDate === null) { - $lastDate = Carbon::parse('2022-06-01'); - } else { - $lastDate->addDay(); - } - - $start = $lastDate->copy()->startOfDay(); - - if ($start->gt($now)) { - throw new BizException('开始时间大约当前时间'); - } - - $end = $lastDate->copy()->endOfDay(); - - if ($end->gt($now)) { - $end = $now; - } - - $this->info('----------------------------------'); - $this->info('设备编号: '.$device); - $this->info('开始时间: '.$start->toDateTimeString()); - $this->info('结束时间: '.$end->toDateTimeString()); - $this->info('开始同步'); - $this->info('...'); - $this->synchronize($device, $start, $end); - $this->info('Done!'); - $this->info('----------------------------------'); - - if ($now->isSameDay($lastDate)) { - break; - } - - $this->setLastDate($device, $lastDate); - } while (true); - - return Command::SUCCESS; - } - - /** - * 同步设备历史数据 - * - * @param string $device - * @param \Carbon\Carbon $start - * @param \Carbon\Carbon $end - * @return void - */ - protected function synchronize(string $device, Carbon $start, Carbon $end) - { - // 分页页码 - $page = 0; - // 每页条数 - $size = 50; - // 开始时间戳 - $startTime = $start->unix() * 1000; - // 结束时间戳 - $endTime = $end->unix() * 1000; - - LinkosDeviceLog::where('device_id', $device)->whereBetween('reported_at', [$start, $end])->delete(); - - do { - $result = retry(5, function () use ($device, $page, $size, $startTime, $endTime) { - return $this->linkosService()->post('/deviceFlow/v1/list', [ - 'device_id' => $device, - 'start_time' => $startTime, - 'end_time' => $endTime, - 'pageable' => [ - 'page' => $page, - 'size' => $size, - ], - ]); - }, 100); - - $data = collect($result['data']['content']); - - $count = $data->count(); - - if ($count === 0) { - break; - } - - $time = now(); - - LinkosDeviceLog::insert( - $data->map(function ($item) use ($time) { - return [ - 'device_id' => $item['device_id'], - 'device_unit' => $item['device_unit'], - 'device_category' => $item['device_category'], - 'data' => ! empty($item['data']) ? json_encode($item['data']) : '{}', - 'reported_at' => $item['createTime'], - 'created_at' => $time->toDateTimeString(), - 'updated_at' => $time->toDateTimeString(), - ]; - })->toArray() - ); - - unset($result, $data); - - $page++; - } while ($count === $size); - } - - /** - * @return \App\Services\LinkosService - */ - protected function linkosService(): LinkosService - { - if ($this->linkosService === null) { - $this->linkosService = app(LinkosService::class); - } - - return $this->linkosService; - } - - /** - * 获取设备最后同步日期 - * - * @param string $device - * @return \Carbon\Carbon|null - */ - protected function getLastDate(string $device): ?Carbon - { - if (is_null($date = Cache::get($this->generateKey($device)))) { - return null; - } - - return Carbon::parse($date); - } - - /** - * 设置设备最后同步日期 - * - * @param string $device - * @param \Carbon\Carbon $date - * @return void - */ - protected function setLastDate(string $device, Carbon $date): void - { - Cache::put($this->generateKey($device), $date->toDateString(), 86400); - } - - /** - * @param string $device - * @return string - */ - protected function generateKey(string $device): string - { - return 'linkos_device_log:'.$device.'_last_sync_date'; - } -} diff --git a/app/Console/Commands/YunFei/DeviceLogDailyReportCommand.php b/app/Console/Commands/YunFei/DeviceLogDailyReportCommand.php new file mode 100644 index 0000000..e3b3b72 --- /dev/null +++ b/app/Console/Commands/YunFei/DeviceLogDailyReportCommand.php @@ -0,0 +1,96 @@ + is_numeric($seconds) ? $seconds : 300, $this->option('sleep')); + + while (true) { + /** @var \Illuminate\Database\Eloquent\Collection */ + $devices = Device::supplierBy('device-supplier-yunfei')->get(); + + foreach ($devices as $device) { + $this->createReport($device); + } + + sleep($seconds); + }; + } + + protected function createReport(Device $device): void + { + [$lastReportedAt, $latestReportedAt] = value(function (Device $device) { + $lastReportedAt = null; + + $latestReportedAt = null; + + switch ($device->type) { + case DeviceType::InsecticidalLamp: + $lastReportedAt = InsecticidalLampDailyReport::where('device_id', $device->id) + ->latest('reported_at') + ->value('reported_at'); + + $lastReportedAt ??= InsecticidalLampReport::where('device_id', $device->id) + ->oldest('reported_at') + ->value('reported_at'); + + if ($lastReportedAt) { + $latestReportedAt = InsecticidalLampReport::where('device_id', $device->id) + ->latest('reported_at') + ->value('reported_at'); + } + break; + } + + return [$lastReportedAt, $latestReportedAt]; + }, $device); + + if ($lastReportedAt === null || $latestReportedAt === null) { + return; + } + + $service = new YunFeiDeviceService(); + + /** @var \Carbon\Carbon */ + $startAt = $lastReportedAt->copy()->startOfDay(); + + do { + $service->createDailyReport($device, $startAt->copy()); + + $startAt->addDay(); + } while ($latestReportedAt->gte($startAt)); + } +} diff --git a/app/Console/Commands/YunFei/DeviceLogReportCommand.php b/app/Console/Commands/YunFei/DeviceLogReportCommand.php new file mode 100644 index 0000000..dec4e8c --- /dev/null +++ b/app/Console/Commands/YunFei/DeviceLogReportCommand.php @@ -0,0 +1,82 @@ + is_numeric($seconds) ? $seconds : 300, $this->option('sleep')); + + while (true) { + /** @var \Illuminate\Database\Eloquent\Collection */ + $devices = Device::supplierBy('device-supplier-yunfei')->get(); + + foreach ($devices as $device) { + $this->createReport($device); + } + + sleep($seconds); + }; + } + + /** + * 创建比昂设备报告 + */ + protected function createReport(Device $device): void + { + $lastReportedAt = match ($device->type) { + DeviceType::InsecticidalLamp => InsecticidalLampReport::where('device_id', $device->id)->latest('reported_at')->value('reported_at'), + default => null, + }; + + if (is_null($lastReportedAt ??= DeviceLog::where('device_id', $device->id)->oldest('reported_at')->value('reported_at'))) { + return; + } + + if (is_null($latestReportedAt = DeviceLog::where('device_id', $device->id)->latest('reported_at')->value('reported_at'))) { + return; + } + + $service = new YunFeiDeviceService(); + + /** @var \Carbon\Carbon */ + $startAt = $lastReportedAt->copy()->startOfHour(); + + do { + $service->createReport($device, $startAt->copy()); + + $startAt->addHour(); + } while ($latestReportedAt->gte($startAt)); + } +} diff --git a/app/Console/Commands/YunFei/WormReportCommand.php b/app/Console/Commands/YunFei/WormReportCommand.php new file mode 100644 index 0000000..4d6b88e --- /dev/null +++ b/app/Console/Commands/YunFei/WormReportCommand.php @@ -0,0 +1,1219 @@ + is_numeric($seconds) ? $seconds : 60, $this->option('sleep')); + + while (true) { + /** @var \Illuminate\Database\Eloquent\Collection */ + $devices = Device::with(['project']) + ->supplierBy('device-supplier-yunfei') + ->where('type', DeviceType::Worm) + ->get(); + + foreach ($devices as $device) { + $this->info('=================================='); + $this->createReport($device); + } + + sleep($seconds); + } + } + + /** + * 创建虫情报告 + */ + protected function createReport(Device $device): void + { + $latestReportedAt = WormReport::where('device_id', $device->id)->latest('reported_at')->value('reported_at'); + + if (is_null($latestReportedAt)) { + $latestReportedAt = DeviceLog::where('device_id', $device->id)->oldest('reported_at')->value('reported_at'); + } + + $this->info('设备编号: '.$device->sn); + + if (is_null($latestReportedAt)) { + $this->info('没有找到设备记录'); + return; + } + + // 昆虫列表 + $worms = $this->wormList(); + + $now = now(); + + /** @var \Carbon\Carbon */ + $reportedAt = $latestReportedAt->copy(); + + $this->info('开始日期: '.$reportedAt->toDateString()); + $this->info('结束日期: '.$now->toDateString()); + + do { + /** @var \Illuminate\Database\Eloquent\Collection */ + $logs = DeviceLog::where('device_id', $device->id) + ->whereBetween('reported_at', [$reportedAt->copy()->startOfDay(), $reportedAt->copy()->endOfDay()]) + ->get(); + + $data = $logs->reduce(function (array $data, DeviceLog $log) use ($worms) { + if (is_array($log->data)) { + $this->createWormPhoto($log); + + $result = (string) Arr::get($log->data, 'Result'); + + if (strpos($result, ',') !== false) { + foreach (explode('#', $result) as $item) { + [$j, $num] = explode(',', $item); + + $worm = $worms[$j] ?? '其它'; + + if (! array_key_exists($worm, $data)) { + $data[$worm] = 0; + } + + $data[$worm] += $num; + } + } + } + + return $data; + }, []); + + if (count($data) > 0) { + $data = collect($data)->map(fn ($v, $k) => ['name' => $k, 'num' => $v]); + + WormReport::updateOrCreate([ + 'device_id' => $device->id, + 'reported_at' => $reportedAt->toDateString(), + ], [ + 'agricultural_base_id' => $device->agricultural_base_id, + 'worm_num' => $data->sum('num'), + 'data' => $data->values(), + ]); + } elseif ($logs->isNotEmpty()) { + WormReport::updateOrCreate([ + 'device_id' => $device->id, + 'reported_at' => $reportedAt->toDateString(), + ], [ + 'agricultural_base_id' => $device->agricultural_base_id, + 'worm_num' => 0, + 'data' => [], + ]); + } + + $reportedAt->addDay(); + } while ($reportedAt->lt($now)); + + $this->info('虫情报告创建完成'); + } + + /** + * 创建虫情照片 + */ + protected function createWormPhoto(DeviceLog $log): void + { + $url = (string) Arr::get($log->data, 'Image'); + if ($url === '') { + return; + } + + $resultImage = (string) Arr::get($log->data, 'Result_image'); + if (preg_match('/^https?:\/\//', $resultImage) > 0) { + $url = $resultImage; + } + + // 下载图片 + $name = md5($url); + if ($ext = pathinfo($url, PATHINFO_EXTENSION)) { + $name .= ".{$ext}"; + } + + $path = "worm-photos/{$log->device_id}/{$name}"; + + $disk = Storage::disk('public'); + if (! $disk->exists($path)) { + $disk->put($path, file_get_contents($url)); + } + + WormPhoto::updateOrCreate([ + 'device_id' => $log->device_id, + 'uploaded_at' => $log->reported_at, + ], [ + 'url' => $path, + ]); + } + + /** + * 昆虫列表 + */ + protected function wormList(): array + { + return [ + '1' => '金龟子', + '2' => '夜蛾', + '3' => '二点委夜蛾', + '4' => '梨剑纹夜蛾', + '5' => '杨扇舟蛾', + '6' => '舟蛾', + '7' => '旋幽夜蛾', + '8' => '蝼蛄', + '9' => '歩甲', + '10' => '螟蛾', + '11' => '毛黄鳃金龟', + '12' => '尺蛾', + '13' => '剑纹夜蛾', + '14' => '粉缘钻夜蛾', + '15' => '夜蛾科', + '16' => '七星瓢虫', + '17' => '棉铃虫', + '18' => '蜻蜓', + '19' => '蚊', + '20' => '东方粘虫', + '21' => '叶蝉', + '22' => '春尺蠖', + '23' => '雄性春尺蠖', + '24' => '杨小舟蛾', + '25' => '甘蓝夜蛾', + '26' => '小地老虎', + '27' => '两点尼夜蛾', + '28' => '柳阴翅斑螟', + '29' => '桑褶翅尺蛾', + '30' => '宽胫夜蛾', + '31' => '尺蠖', + '32' => '一点钻夜蛾', + '33' => '天蛾', + '34' => '裳夜蛾', + '35' => '灯蛾', + '36' => '美国白蛾', + '37' => '八字白眉天蛾', + '38' => '陌夜蛾', + '39' => '豆天蛾', + '40' => '麦蛾', + '41' => '围连环夜蛾', + '42' => '亚美尺蛾', + '43' => '梨星毛虫', + '44' => '银锭夜蛾', + '45' => '黄臀灯蛾', + '46' => '大螟', + '47' => '燕尾舟蛾', + '48' => '榆津尺蛾', + '49' => '朽木夜蛾', + '50' => '黄地老虎', + '51' => '白钩粘夜蛾', + '52' => '桃蛀螟', + '53' => '甜菜夜蛾', + '54' => '斜纹夜蛾', + '55' => '蚀夜蛾', + '56' => '淡银锭夜蛾', + '57' => '齿美冬夜蛾', + '58' => '一点金刚钻', + '59' => '胡桃豹夜蛾', + '60' => '桑剑纹夜蛾', + '61' => '蓝目天蛾', + '62' => '黑绒鳃金龟', + '63' => '烟青虫', + '64' => '暗黑鳃金龟', + '65' => '中华绒金龟', + '66' => '八字地老虎', + '67' => '榆绿天蛾', + '68' => '红星雪灯蛾', + '69' => '雀纹天蛾', + '70' => '铜绿丽金龟', + '71' => '水龟虫/水龟', + '72' => '曲线尼夜蛾', + '73' => '粘虫', + '74' => '瘦银锭夜蛾', + '75' => '红天蛾', + '76' => '鳃金龟', + '77' => '大黑鳃金龟', + '78' => '大地老虎', + '79' => '玉米螟', + '80' => '赤角盲蝽', + '81' => '槐尺蛾', + '82' => '银纹夜蛾', + '83' => '天牛', + '84' => '乏夜蛾', + '85' => '丁香天蛾', + '86' => '构月天蛾', + '87' => '虎甲', + '88' => '劳氏粘虫', + '89' => '白薯天蛾', + '90' => '广鹿蛾', + '91' => '二十八星瓢虫', + '92' => '腮金龟', + '93' => '人纹污夜蛾', + '94' => '叩甲', + '95' => '楸蠹野螟', + '96' => '丝绵木金星尺蛾', + '97' => '红缘灯蛾', + '98' => '黄褐丽金龟', + '99' => '螟蛾科', + '100' => '红棕灰夜蛾', + '102' => '广鹿灯蛾', + '103' => '蝽', + '104' => '蜂', + '105' => '大造桥虫', + '106' => '童剑纹夜蛾', + '107' => '晃剑纹夜蛾', + '108' => '钩粘虫', + '109' => '直影夜蛾', + '110' => '毛黄绢金龟', + '111' => '乌氏小尾天蚕蛾', + '112' => '褐边绿刺蛾', + '113' => '广鹿舟蛾', + '115' => '龙虱', + '116' => '双带盘瓢虫', + '117' => '槲犹冬夜蛾', + '118' => '洋槐天蛾', + '119' => '弧角散纹夜蛾', + '120' => '黄脉天蛾', + '121' => '葡萄天蛾', + '122' => '桃六点天蛾', + '123' => '异色瓢虫', + '124' => '榆黄足毒蛾', + '125' => '客来夜蛾', + '126' => '桦尺蛾', + '127' => '草地螟', + '128' => '细条纹野螟', + '129' => '污灯蛾属', + '130' => '杨二尾舟蛾', + '131' => '克什杆野螟', + '132' => '筱客来夜蛾', + '133' => '栗六点天蛾', + '134' => '紫光盾天蛾', + '135' => '款冬玉米螟', + '136' => '草蛉', + '137' => '亚麻篱灯蛾', + '138' => '扁连环夜蛾', + '139' => '圣蜣螂', + '140' => '白钩粘虫', + '141' => '苇实夜蛾', + '142' => '姬蜂', + '143' => '秘夜蛾', + '144' => '织网夜蛾', + '145' => '深色白眉天蛾', + '146' => '短扇舟蛾', + '147' => '白须天蛾', + '148' => '歌梦尼夜蛾', + '149' => '海安夜蛾', + '150' => '满丫纹夜蛾', + '151' => '蟋蟀', + '152' => '双斑青步甲', + '153' => '白条夜蛾', + '154' => '蟪蛄', + '155' => '负子蝽', + '156' => '脊青步甲', + '157' => '宽斑青步甲', + '158' => '稻纵卷叶螟', + '159' => '淡剑夜蛾', + '160' => '甜菜白带野螟', + '161' => '樗蚕', + '162' => '蒙古寒蝉', + '163' => '中带三角夜蛾', + '164' => '蝗虫', + '165' => '多色异丽金龟', + '166' => '白色小卷蛾', + '167' => '狭边青步甲', + '168' => '棉卷叶野螟', + '169' => '豆荚野螟', + '170' => '麻小食心虫', + '171' => '星斑虎甲', + '172' => '黄缘龙虱', + '173' => '无斑弧丽金龟', + '174' => '白额鹰翅天蛾', + '175' => '日本真龙虱', + '176' => '山东云斑螟', + '177' => '小文夜蛾', + '178' => '三条蛀野螟', + '179' => '榆掌舟蛾', + '180' => '刺槐掌舟蛾', + '181' => '星绒天蛾', + '182' => '杨剑舟蛾', + '183' => '刀夜蛾', + '184' => '红节天蛾', + '185' => '星白雪灯蛾', + '186' => '桃剑纹夜蛾', + '187' => '谐夜蛾', + '188' => '小剑纹夜蛾', + '189' => '鸣鸣蝉', + '190' => '姬夜蛾', + '191' => '落叶松毛虫', + '192' => '苹六点天蛾', + '193' => '四斑绢野螟', + '194' => '甘薯天蛾', + '195' => '小线角木蠹蛾', + '196' => '三斑蕊夜蛾', + '197' => '白雪灯蛾', + '198' => '黄刺蛾', + '199' => '茶翅蝽', + '200' => '杨树枯叶蛾', + '201' => '标瑙夜蛾', + '202' => '瓜绢野螟', + '203' => '稻绿蝽', + '204' => '杨雪毒蛾', + '205' => '榆白边舟蛾', + '206' => '扁刺蛾', + '207' => '绒黏夜蛾', + '208' => '庸肖毛翅夜蛾', + '209' => '中华婪步甲', + '210' => '褐黄前锹甲', + '211' => '旱柳原野螟', + '212' => '巨影夜蛾', + '213' => '食蚜蝇', + '214' => '双斑葬甲', + '215' => '黄毒蛾', + '216' => '婪步甲', + '217' => '土甲', + '218' => '中华真地鳖', + '219' => '紫线夜蛾', + '220' => '小黄鳃金龟', + '221' => '中华真土鳖', + '222' => '云斑虎甲', + '223' => '中华黧尺蛾', + '224' => '中华绿刺蛾', + '225' => '巨豹纹尺蛾', + '226' => '多斑豹蠹蛾', + '227' => '桑尺蛾', + '228' => '灰直纹螟', + '229' => '中国绿刺蛾', + '230' => '云杉梢斑螟', + '231' => '桑绢野螟', + '232' => '黄杨绢野螟', + '233' => '突背斑红蝽', + '234' => '高粱条螟', + '235' => '小麦负泥虫', + '236' => '苹掌舟蛾', + '237' => '绒粘夜蛾', + '238' => '灰白灯蛾', + '239' => '隐丫纹夜蛾', + '240' => '满纹夜蛾', + '241' => '黑剑狼夜蛾', + '242' => '蜣螂', + '243' => '福婆鳃金龟', + '244' => '雨尺蛾', + '245' => '优美苔蛾', + '246' => '黄斑野螟', + '247' => '疆夜蛾', + '248' => '六点天蛾', + '249' => '斜线夜蛾', + '250' => '石榴巾夜蛾', + '251' => '绒星天蛾', + '252' => '霜天蛾', + '253' => '大田鳖', + '254' => '灰双纹螟', + '255' => '青尺蛾', + '256' => '二线绿尺蛾', + '257' => '散纹夜蛾', + '258' => '红双线尺蛾', + '259' => '胞短栉夜蛾', + '260' => '飞虱科', + '261' => '桃多斑野螟', + '262' => '甜菜青野螟', + '263' => '核桃鹰翅天蛾', + '264' => '角顶尺蛾', + '265' => '葡萄缺角天蛾', + '266' => '绿尾大蚕蛾', + '267' => '杨褐枯叶蝶', + '268' => '双云尺蛾', + '269' => '斑拟兜夜蛾', + '270' => '阿莎尺蛾', + '271' => '榄绿岐角螟', + '272' => '青革土蝽', + '273' => '核桃美舟蛾', + '274' => '斑点卷叶螟', + '275' => '黄褐箩纹蛾', + '276' => '白环红天蛾', + '277' => '白腹网丛螟', + '278' => '枯叶蛾', + '279' => '丹日明夜蛾', + '280' => '仿白边舟蛾', + '281' => '槐羽舟蛾', + '282' => '草地贪夜蛾', + '283' => '环夜蛾', + '284' => '尘尺蛾', + '285' => '黄二星舟蛾', + '286' => '榆木蠹蛾', + '287' => '水黾', + '288' => '银装冬夜蛾', + '289' => '饰奇尺蛾', + '290' => '枯叶蝶', + '291' => '步甲', + '292' => '阔胸禾犀金龟', + '293' => '眼斑钩蛾', + '294' => '三开蜣螂', + '295' => '金星步甲', + '296' => '残夜蛾', + '297' => '野蚕蛾', + '298' => '芦苇豹蠹蛾', + '299' => '华晓扁犀金龟', + '300' => '灰胸突鳃金龟', + '301' => '龟纹瓢虫', + '302' => '麻皮蝽', + '303' => '斑须蝽', + '304' => '斜斑虎甲', + '305' => '地鳖', + '306' => '叶甲', + '307' => '燕夜蛾', + '308' => '黑纹北灯蛾', + '309' => '网夜蛾', + '310' => '棘翅夜蛾', + '311' => '规尺蛾', + '312' => '苜蓿银纹夜蛾', + '313' => '拟扇舟蛾', + '314' => '丁目大蚕蛾', + '315' => '金黄蛾', + '316' => '黄星雪灯蛾', + '317' => '暗纹紫褐螟', + '318' => '白眉天蛾', + '319' => '黄板盘瓢虫', + '320' => '玫岐角螟', + '321' => '枯黄贡尺蛾', + '322' => '小豆长喙天蛾', + '323' => '橙拟灯蛾', + '324' => '粉蝶灯蛾', + '325' => '纹散丽灯蛾', + '326' => '雪尾尺蛾', + '327' => '鹰翅天蛾', + '328' => '波纹蛾', + '329' => '黑条灰灯蛾', + '330' => '八点灰灯蛾', + '331' => '间纹弦夜蛾', + '332' => '缤夜蛾', + '333' => '樟蚕', + '334' => '乌夜蛾', + '335' => '亮棲夜蛾', + '336' => '鸟嘴壶夜蛾', + '337' => '榕透翅毒蛾', + '338' => '四星负葬甲', + '339' => '魔目夜蛾', + '340' => '华尾天蚕蛾', + '341' => '洋麻钩蛾', + '342' => '旋皮夜蛾', + '343' => '奇尺蛾', + '344' => '土元', + '345' => '肯髯须夜蛾', + '346' => '苹果卷叶蛾', + '347' => '矛夜蛾', + '348' => '斜线燕蛾', + '349' => '红秘夜蛾', + '350' => '桃红猎夜蛾', + '351' => '帕委夜蛾', + '352' => '奚毛胫夜蛾', + '353' => '委夜蛾', + '354' => '角翅舟蛾', + '355' => '戟盗毒蛾', + '356' => '瓢虫', + '357' => '隐尺蛾', + '359' => '金龟', + '360' => '花金龟', + '361' => '白褐缘尾尺蛾', + '362' => '金黄螟', + '363' => '云斑白条天牛', + '364' => '瓦矛夜蛾', + '365' => '二化螟', + '366' => '菜粉蝶', + '367' => '杨枯叶蛾', + '368' => '淡剑纹夜蛾', + '369' => '焰夜蛾', + '370' => '二点织螟', + '371' => '白钩小卷蛾', + '372' => '女贞天蛾', + '373' => '锹甲', + '374' => '艾锥额野螟', + '375' => '白星花金龟', + '376' => '毒蛾', + '377' => '二点织蛾', + '378' => '萝藦艳情尺蛾', + '379' => '苹枯叶蛾', + '380' => '哈展尺蛾', + '381' => '中金弧夜蛾', + '382' => '黄斑盘瓢虫', + '383' => '缘黄毒蛾', + '384' => '蠹蛾', + '385' => '土鳖', + '386' => '人纹污灯蛾', + '387' => '松黑天蛾', + '388' => '蚜虫', + '389' => '萝藦艳青尺蛾', + '390' => '苹蚂舟蛾', + '391' => '木橑尺蛾', + '392' => '红蝽', + '393' => '掌尺蛾', + '394' => '肖浑黄灯蛾', + '395' => '阳污灯蛾', + '396' => '黄缘苔蛾', + '397' => '丽金龟', + '398' => '犀金龟', + '399' => '卷蛾', + '400' => '钩蛾', + '401' => '红尾大蚕蛾', + '402' => '刺蛾', + '403' => '玫瑰巾夜蛾', + '404' => '双委夜蛾', + '405' => '油松毛虫', + '406' => '朝鲜东蚁蛉', + '407' => '焦边尺蛾', + '408' => '黾蝽', + '409' => '苔蛾', + '411' => '蜚蠊', + '412' => '小蠹', + '413' => '桔小实蝇', + '414' => '水龟甲', + '415' => '大蚊', + '416' => '华北蝼蛄', + '417' => '豹纹卷野螟', + '418' => '长蝽', + '419' => '蠼螋', + '420' => '缘蝽', + '421' => '粪金龟', + '422' => '隐翅虫', + '423' => '象甲', + '424' => '猎蝽', + '425' => '东方蝼蛄', + '426' => '油葫芦', + '427' => '阔胫鰓金龟', + '428' => '棉大造桥虫', + '429' => '绒毛曲斑青地甲', + '430' => '葬甲', + '431' => '珀蝽', + '432' => '怀羽舟蛾', + '433' => '大云鳃金龟', + '434' => '赏夜蛾', + '435' => '甜菜夜螟', + '436' => '红带新鹿蛾', + '437' => '亚洲玉米螟', + '438' => '白肩天蛾', + '439' => '双斑辉尺蛾', + '441' => '构星天蛾', + '442' => '双叉犀牛龟', + '444' => '蚁', + '445' => '金黄娟金龟', + '446' => '黑色蔗龟', + '447' => '蝇', + '448' => '石蛾', + '449' => '螳螂', + '450' => '胡蜂', + '451' => '蝉', + '452' => '大斑波纹蛾', + '453' => '黑图夜蛾', + '454' => '黄星尺灯蛾', + '455' => '天蚕蛾', + '457' => '揪野螟', + '458' => '蚁蛉', + '459' => '绿盲蝽', + '460' => '丝棉木金星大尺蛾', + '461' => '蛱蝶', + '462' => '毛黄金龟', + '464' => '蚙', + '465' => '叩头甲', + '466' => '褐蛉', + '467' => '谷蠧', + '468' => '吉丁虫', + '469' => '东亚飞蝗', + '470' => '白雪灰灯蛾', + '471' => '泛尺蛾', + '472' => '蚊科', + '473' => '摇蚊', + '474' => '野螟', + '475' => '草螟', + '476' => '拟步甲', + '477' => '麦蝽', + '478' => '黑带食蚜蝇', + '479' => '东方蜜蜂', + '481' => '吉丁甲', + '482' => '金边龙虱', + '483' => '划蝽', + '484' => '叶蜂', + '485' => '中华扁锹', + '486' => '浮金龟', + '487' => '杂似谷盗', + '488' => '双齿蝼步甲', + '489' => '大团扇春蜓', + '490' => '爪哇异食蚜蝇', + '491' => '夹竹桃天蛾', + '492' => '大水龟甲', + '493' => '桑天牛', + '494' => '红脊长蝽', + '495' => '豆娘', + '496' => '蝼步甲', + '497' => '仰泳蝽', + '498' => '蝽蜓', + '499' => '印度谷螟', + '500' => '叶甲科', + '501' => '棉大卷叶螟', + '502' => '伪叶甲', + '503' => '屁步甲', + '504' => '异粉蝶灯蛾', + '505' => '白禾螟', + '506' => '棕色腮金龟', + '507' => '芋双线天蛾', + '508' => '盲蝽', + '509' => '鲜黄鳃金龟', + '511' => '红腹白灯蛾', + '512' => '长缘天蛾', + '514' => '箩纹蛾', + '515' => '叉斜带毒蛾', + '516' => '丝绵木尺蛾', + '517' => '绿刺蛾', + '518' => '谷类大蚊', + '519' => '臭椿皮夜蛾', + '521' => '星白灯蛾', + '522' => '白蜡绢野螟', + '523' => '蟑螂(蜚蠊,标号:411)', + '524' => '枣六点天蛾', + '525' => '虻', + '526' => '紫斑谷螟', + '527' => '豆荚斑螟', + '528' => '红缘翅斑蛾', + '529' => '柳毒蛾', + '530' => '兀鲁夜蛾', + '531' => '蜜蜂', + '532' => '麦牧野螟', + '533' => '紫线尺蛾', + '534' => '内夜蛾', + '535' => '粉纹夜蛾', + '536' => '金黄绢金龟', + '537' => '掌舟蛾', + '538' => '丝棉木尺蛾', + '539' => '绢金龟', + '540' => '枣桃六点天蛾', + '541' => '黏虫', + '542' => '条背天蛾', + '543' => '臭椿皮蛾', + '544' => '甘薯绮夜蛾', + '545' => '茶黄毒蛾', + '546' => '葡萄透翅蛾', + '547' => '白二尾舟蛾', + '548' => '八点灯蛾', + '549' => '绿尾天蚕蛾', + '550' => '萝纹蛾', + '551' => '豹纹木蠧蛾', + '552' => '舞虻', + '553' => '茎蜂', + '554' => '大草蛉', + '555' => '胡麻斑星尺蛾', + '556' => '蜉蝣', + '557' => '尖尾尺蛾', + '558' => '黄扬绢野螟', + '559' => '蚕蛾', + '562' => '琴纹尺蛾', + '563' => '双斜线尺蛾', + '564' => '白夜蛾', + '565' => '黄褐丽金闹', + '566' => '谷盗', + '567' => '三化螟', + '568' => '绿尺蛾', + '569' => '昏舟蛾', + '570' => '柳干蠹蛾', + '571' => '霜尺蛾', + '572' => '斑虻', + '573' => '银光草螟', + '574' => '菜蛾', + '575' => '豆荚螟', + '576' => '苜蓿夜蛾', + '577' => '白肾夜蛾', + '578' => '白肾灰夜蛾', + '579' => '纯白草螟', + '580' => '茸喙丽金龟', + '581' => '蛇蛉', + '582' => '巨蝼步甲', + '583' => '蜣蝇', + '584' => '贯众伸喙尺蛾', + '585' => '小褐髯须夜蛾', + '586' => '泰山簇斑螟', + '587' => '白桦角须野螟', + '588' => '红黄野螟', + '589' => '黑点蚀叶野螟', + '590' => '木蠹蛾', + '591' => '白线散纹夜蛾', + '592' => '灰蝶尺蛾', + '593' => '杠柳原野螟', + '594' => '幔折线尺蛾', + '595' => '丽蝇', + '596' => '并脉岐角螟蛾', + '597' => '柿星尺蛾', + '598' => '黑斑蚀叶野螟', + '599' => '黄连木尺蠖', + '601' => '黑皱鳃金龟', + '602' => '中华薄翅天牛', + '603' => '锈红金龟', + '604' => '盾天蛾', + '605' => '短斑普猎蝽', + '606' => '线委夜蛾', + '607' => '云纹虎甲', + '608' => '漆黑污灯蛾', + '609' => '松毛虫', + '610' => '紫带姬尺蛾', + '611' => '螳蛉', + '612' => '花胫绿纹蝗', + '613' => '东北巾夜蛾', + '614' => '柯基纹丛螟', + '615' => '菜氏猛叩甲', + '616' => '星尺蛾', + '617' => '华扁犀金龟', + '618' => '环纹夜蛾', + '619' => '金星尺蛾', + '620' => '旅游瓢虫', + '621' => '鼠天蛾', + '622' => '紫条尺蛾', + '623' => '明痣苔蛾', + '624' => '褐网尺蛾', + '625' => '三叉地老虎', + '626' => '肖二线绿尺蛾', + '627' => '四星尺蛾', + '628' => '红黏夜蛾', + '629' => '小花波尺蛾', + '630' => '朽木甲', + '631' => '灰猎夜蛾', + '632' => '稻巢草螟', + '633' => '指角麦蛾', + '634' => '金盅尺蛾', + '635' => '截翅尺蛾', + '636' => '双线尺蛾', + '637' => '平紫脖夜蛾', + '638' => '沤泊波纹蛾', + '639' => '白污灯蛾', + '641' => '格庶尺蛾', + '642' => '斑蛾', + '643' => '羽舟蛾', + '644' => '苹小卷叶蛾', + '645' => '稻水螟', + '646' => '苹烟尺蛾', + '647' => '蚕豆紫脖蛾', + '648' => '平夜蛾', + '649' => '焚紫脖夜蛾', + '650' => '贯众伸喙野螟', + '651' => '尖瓣灰纹卷蛾', + '652' => '摊巨冬夜蛾', + '653' => '草莓尺蛾', + '654' => '白缘苇野螟', + '655' => '核桃星尺蛾', + '656' => '郭公虫', + '657' => '明纹柏松毛虫', + '658' => '褐线尺蛾', + '659' => '旋歧夜蛾', + '660' => '黄山松毛虫', + '661' => '直紫脖夜蛾', + '662' => '红云翅斑螟', + '663' => '黄灯蛾', + '664' => '家蝇', + '665' => '黄翅缀叶野螟', + '666' => '枣核六点天蛾', + '668' => '长眉眼尺蛾', + '669' => '夏枯草展须野螟', + '670' => '白背飞虱', + '671' => '灰飞虱', + '672' => '褐飞虱', + '673' => '网纹夜蛾', + '674' => '斑螟', + '675' => '核桃目尺蛾', + '676' => '灰棕金羽蛾', + '677' => '艾棕麦蛾', + '678' => '蝶角蛉', + '679' => '豹蠹蛾', + '681' => '云星黄毒蛾', + '682' => '锯线尺蛾', + '683' => '紫斑黄带蛾', + '684' => '绿蝇', + '685' => '大云斑鳃金龟', + '686' => '血红雪苔蛾', + '687' => '果蝇', + '688' => '纹散灯蛾', + '689' => '排点灯蛾', + '690' => '白钩黏夜蛾', + '691' => '黄毛赛金龟', + '692' => '新林舟蛾', + '693' => '井夜蛾', + '694' => '花实夜蛾', + '695' => '棉褐带卷蛾', + '696' => '卷叶蛾', + '697' => '王氏樗蛾', + '698' => '刺槐外斑尺蛾', + '699' => '懈毛胫夜蛾', + '700' => '糜夜蛾', + '701' => '东方小垫甲', + '702' => '蚁形甲', + '703' => '十二斑褐菌瓢虫', + '704' => '明治苔蛾', + '705' => '葡萄卷叶野螟', + '706' => '大青叶蝉', + '707' => '绢野螟', + '708' => '柳圆叶甲', + '709' => '蜘蛛', + '710' => '隐翅甲', + '711' => '钩月天蛾', + '712' => '寄生蜂', + '713' => '苍蝇', + '714' => '灰直纵螟', + '715' => '倭委夜蛾', + '716' => '小菜蛾', + '717' => '小地老虎螟', + '718' => '中黑盲蝽', + '719' => '粪蜣', + '721' => '壶夜蛾', + '722' => '螽斯', + '723' => '食叶', + '724' => '平台珠蝼步甲', + '725' => '李枯叶蛾', + '726' => '春蜓', + '727' => '点斑雪灯蛾', + '728' => '黄臂灯蛾', + '729' => '旅裳夜蛾', + '730' => '三角夜蛾', + '731' => '蠋步甲', + '732' => '红羽舟蛾', + '733' => '黑蚱蝉', + '734' => '中华黛尺蛾', + '735' => '苜蓿尺蛾', + '736' => '沤伯波纹蛾', + '737' => '灰灯蛾', + '738' => '双裂类荚斑螟', + '739' => '蓝纹尾蟌', + '740' => '莴苣冬夜蛾', + '741' => '两色绮夜蛾', + '742' => '豹灯蛾', + '743' => '四眼尺蛾', + '744' => '核桃六点天蛾', + '746' => '黄柄脉锦斑蛾', + '747' => '甜菜白带螟', + '748' => '大隐翅虫', + '749' => '羽蛾', + '750' => '灰褐带蛾', + '751' => '带蛾', + '752' => '窗胸萤', + '753' => '蝶灯蛾', + '754' => '黄蜻', + '755' => '伊贝鹿蛾', + '756' => '褐顶毒蛾', + '757' => '愕蚕蛾', + '758' => '黄野螟', + '759' => '云尺蛾', + '761' => '马蜂', + '762' => '赤条黄带蛾', + '764' => '猩红雪苔蛾', + '765' => '齿蛉', + '766' => '草蝉', + '767' => '鬼脸天蛾', + '768' => '小造桥虫', + '769' => '异美苔蛾', + '770' => '旋目夜蛾', + '771' => '稻飞虱', + '772' => '小阔胫鳃金龟', + '773' => '杨卷叶螟', + '774' => '龟纹夜蛾', + '776' => '白灯蛾', + '777' => '绿翠尺蛾', + '779' => '食虫虻', + '780' => '邑蝽', + '781' => '青翅毒隐翅甲', + '782' => '黑条灰天蛾', + '783' => '黄腹鹿蛾', + '784' => '蓟马', + '785' => '蚂蚁', + '786' => '啮虫', + '787' => '小蜂', + '788' => '粉虱', + '789' => '蛾蠓', + '790' => '跳甲', + '791' => '木虱', + '792' => '黑带灰灯蛾', + '793' => '水鼓甲', + '794' => '细蜂', + '795' => '网蝽', + '796' => '鹿蛾', + '797' => '茧蜂', + '798' => '实蝇', + '799' => '茎甲', + '801' => '浩波纹蛾', + '802' => '红尾天蚕蛾', + '803' => '槐黑星虎天牛', + '804' => '赤巢螟', + '805' => '日愕蚕蛾', + '806' => '变色夜蛾', + '807' => '掌夜蛾', + '808' => '宽夜蛾', + '809' => '二尾舟蛾', + '810' => '茶须野螟', + '811' => '白带符夜蛾', + '812' => '白蚁', + '813' => '中华鼻蜡蝉', + '814' => '黄斑青步甲', + '815' => '茶柄脉锦斑蛾', + '816' => '双斑天蛾', + '817' => '中华斑杧', + '818' => '污刺胸猎蝽', + '819' => '奇裂附步甲', + '820' => '大光蠊', + '821' => '蚱蜢', + '822' => '纹眼尺蛾', + '823' => '栉尾尺蛾', + '824' => '木撩尺蛾', + '825' => '黄灰网尺蛾', + '826' => '幕僚尺蛾', + '827' => '青球箩纹蛾', + '828' => '暗脉艳苔蛾', + '829' => '窄黄缘绿刺蛾', + '830' => '黄星尺蛾', + '831' => '锤角细蜂', + '832' => '行军蚁', + '833' => '沫蝉', + '834' => '赭黄长须蛾', + '835' => '稻摇蚊', + '836' => '稻盲蝽', + '837' => '基黑纹丛螟', + '838' => '蚜蝇', + '839' => '枯叶夜蛾', + '841' => '负泥虫', + '842' => '蛾蜡蝉', + '843' => '粤豹大蚕蛾', + '844' => '东北栎枯叶蛾', + '845' => '仰蝽', + '846' => '毒隐翅甲', + '847' => '黄曲条跳甲', + '848' => '蚊幼虫', + '849' => '黑带污灯蛾', + '850' => '黄褐枯叶蝶', + '851' => '莹叶甲', + '852' => '拟叩甲', + '853' => '泥蜂', + '854' => '蜉蝣幼虫', + '855' => '单鲁夜蛾', + '856' => '干纹夜蛾', + '857' => '斑头蝉', + '858' => '大三角鲁夜蛾', + '859' => '中华岱蝽', + '860' => '豇豆荚螟', + '861' => '中华鹿蛾', + '862' => '三线钩蛾', + '863' => '竹节虫', + '864' => '枯黄惑尺蛾', + '865' => '棘趾野螟', + '866' => '尖锥额野螟', + '868' => '丽刺小卷蛾', + '869' => '日球箩纹蛾', + '870' => '半鲁夜蛾', + '871' => '间纹德夜蛾', + '873' => '贡尺蛾', + '874' => '忍冬双斜卷蛾', + '875' => '瓜夜蛾', + '876' => '褐卷蛾', + '877' => '绿黄毛虫', + '878' => '赭翅臂花金龟', + '879' => '黄痣苔蛾', + '881' => '浅褐彩丽金龟', + '882' => '斑黑麦蛾', + '883' => '褐斑虎丽灯蛾', + '884' => '耳斑蟠尺蛾', + '885' => '北李褐枯叶蛾', + '886' => '纹岐角螟', + '887' => '银二星舟蛾', + '888' => '著蕊尾舟蛾', + '889' => '黄褐网尺蛾', + '890' => '丸尺蛾', + '891' => '粉蝶', + '892' => '乌桕巨天蚕蛾', + '893' => '黑长喙天蛾', + '894' => '伞双突野螟', + '895' => '瘿蚊', + '896' => '芫菁', + '897' => '较高', + '898' => '鹰尺蛾', + '899' => '三环狭野螟', + '900' => '姬蠊', + '901' => '朝尺蛾', + '902' => '紫光箩纹蛾', + '903' => '短啄夜蛾', + '904' => '碧伟蜓', + '905' => '核桃美州蛾', + '906' => '梨娜刺蛾', + '907' => '枯球箩纹蛾', + '908' => '蜓', + '909' => '二星舟蛾', + '910' => '朝线夜蛾', + '911' => '明裙剑夜蛾', + '912' => '白点暗野螟', + '913' => '麟角希夜蛾', + '914' => '眼尺蛾', + '915' => '黄双线尺蛾', + '916' => '联梦尼夜蛾', + '917' => '栎毛虫', + '918' => '宏遗夜蛾', + '919' => '太波纹蛾', + '921' => '小斑红蝽', + '922' => '柳沟胸跳甲', + '923' => '田鳖', + '924' => '条螽', + '925' => '角石蛾', + '926' => '缺叉等翅石蛾', + '927' => '尖双突野螟', + '928' => '锈色负子蝽', + '929' => '茶白毒蛾', + '930' => '硃美苔蛾', + '931' => '齿缘龙虱', + '932' => '醋栗尺蛾', + '933' => '强污灯蛾', + '934' => '稻弄蝶', + '935' => '妃夜蛾', + '936' => '白鳃角金龟', + '937' => '棉褐环野螟', + '938' => '暗褐卷蛾', + '939' => '梯斑谷蛾', + '940' => '点线脉褐蛉', + '941' => '桃展足蛾', + '942' => '草小卷蛾', + '943' => '中黑灰夜蛾', + '944' => '小瘿斑蛾', + '945' => '马铃薯瓢虫', + '946' => '点线锦织蛾', + '947' => '圆臀大黾蝽', + '948' => '双红线兔尺蛾', + '949' => '腰带燕尾舟蛾', + '950' => '密云草蛾', + '951' => '女贞首夜蛾', + '952' => '星天蛾', + '953' => '红毛花萤', + '954' => '库蚊', + '955' => '鲁夜蛾', + '956' => '黄粉甲', + '957' => '赞青尺蛾', + '958' => '窄肾长须夜蛾', + '959' => '污灯蛾', + '961' => '波纹小灰蝶', + '962' => '透翅蛾', + '963' => '苜蓿盲蝽', + '964' => '扭拟灯蛾', + '965' => '安土苔蛾', + '966' => '日污灯蛾', + '967' => '柞褐叶螟', + '968' => '乌柏黄毒蛾', + '969' => '黄绒野螟', + '970' => '浅黄箩舟蛾', + '971' => '半带黄毒蛾', + '972' => '钩翅大蚕蛾', + '973' => '肖叶甲', + '974' => '切叶蜂', + '975' => '女贞尺蛾', + '976' => '单斑多形长角纹石蛾', + '977' => '格蔗尺蛾', + '978' => '象蜡蝉', + '979' => '丽美苔蛾', + '980' => '苹小卷蛾', + '981' => '合欢双条天牛', + '982' => '折带黄毒蛾', + '983' => '齿翅三线天蛾', + '984' => '广屁步甲', + '985' => '栎掌天蛾', + '986' => '异螋', + '987' => '中国假蜉', + '988' => '犬蚊', + '989' => '暗步甲', + '990' => '栗山天牛', + '991' => '净污灯蛾', + '992' => '毛颊斑虎甲', + '993' => '优草螽', + '994' => '斑雅尺蛾', + '995' => '肿须隐翅虫', + '996' => '金盏供肩网蛾', + '997' => '绿翅绢野螟', + '998' => '蚱蝉', + '999' => '八点污灯蛾', + '1001' => '联纹小叶春蜓', + '1002' => '奇烈跗步甲', + '1003' => '尖突水龟虫', + '1004' => '长蠹', + '1005' => '黄足猎蝽', + '1006' => '脊冠叶蝉', + '1007' => '珀色毒蛾', + '1008' => '长角水叶甲', + '1009' => '稻蝗', + '1010' => '白线野蚕蛾', + '1011' => '赤双纹螟', + '1012' => '峦文夜蛾', + '1013' => '草螽', + '1014' => '扶桑四点野螟', + '1015' => '大鳖土蝽', + '1016' => '赤梗天牛', + '1017' => '连星污灯蛾', + '1018' => '华星天牛', + '1019' => '紫苑沟胫野螟', + '1020' => '栎鹰翅天蛾', + '1021' => '折无疆青尺蛾', + '1022' => '一点拟灯蛾', + '1023' => '蜡斑甲', + '1024' => '细蛾', + '1025' => '滨尸葬甲', + '1026' => '白雪苔蛾', + '1027' => '横线镰翅野螟', + '1028' => '褐翅棘趾野螟', + '1029' => '甜菜白带夜蛾', + '1030' => '梨叶斑蛾', + '1031' => '钩白肾夜蛾', + '1032' => '红晕散纹夜蛾', + '1033' => '蜡蝉', + '1034' => '肾纹绿尺蛾', + '1035' => '条螟', + '1036' => '双斑黄毒蛾', + '1037' => '大绿异丽金龟', + '1038' => '双带褐褶龙虱', + '1039' => '金色悦野螟', + '1041' => '槐刺外斑尺蛾', + '1042' => '金斑虎甲', + '1043' => '油桐尺蛾', + '1044' => '元参棘趾野螟', + '1045' => '铜绿异丽金龟', + '1046' => '绿蝽', + '1047' => '黑织叶野螟', + '1048' => '黄斑长朽木甲', + '1049' => '元岑棘趾野螟', + '1050' => '窄吉丁', + '1051' => '美雪苔蛾', + '1052' => '散白蚁', + '1053' => '四斑露尾甲', + '1054' => '红点唇瓢虫', + '1055' => '平烟尺蛾', + '1056' => '白蜡卷须野螟', + '1057' => '印度斑谷螟', + '1058' => '杨芦伸啄野螟', + '1059' => '井脉歧角螟蛾', + '1060' => '菜螟', + '1061' => '苹果蠹蛾', + '1062' => '梨小食心虫', + '1063' => '棉小造桥虫', + '1064' => '龟背天牛', + '1065' => '松墨天牛', + '1066' => '星天牛', + ]; + } +} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 4e8a7ea..ebb58f0 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -18,6 +18,10 @@ class Kernel extends ConsoleKernel $schedule->command(Commands\BiAng\WormStatisticsSyncCommand::class) ->hourly() ->runInBackground(); + + $schedule->command(Commands\Linkos\WormReportCommand::class) + ->hourlyAt(15) + ->runInBackground(); } /** diff --git a/app/Exceptions/LinkosFarmException.php b/app/Exceptions/LinkosFarmException.php new file mode 100644 index 0000000..7c51807 --- /dev/null +++ b/app/Exceptions/LinkosFarmException.php @@ -0,0 +1,9 @@ +input('device_type', DeviceType::Meteorological); $list = Device::where([ 'agricultural_base_id' => $agriculturalBasic->id, @@ -152,4 +153,11 @@ class AgriculturalBaseController extends Controller ])->orderBy('sort', 'desc')->get()->pluck('monitoring_point', 'id')->toArray(); return $this->json($list); } + + public function basePoints(Request $request) + { + $devices = Device::filter($request->input())->orderBy('sort', 'desc')->get(); + + return DeviceResource::collection($devices); + } } diff --git a/app/Http/Controllers/Callback/YunFeiController.php b/app/Http/Controllers/Callback/YunFeiController.php index 52b4c0f..8763674 100644 --- a/app/Http/Controllers/Callback/YunFeiController.php +++ b/app/Http/Controllers/Callback/YunFeiController.php @@ -7,1047 +7,10 @@ use App\Http\Controllers\Controller; use App\Models\Device; use App\Models\DeviceLog; use Illuminate\Http\Request; -use Illuminate\Support\Arr; use Illuminate\Support\Carbon; class YunFeiController extends Controller { - protected $worms = [ - '1' => '金龟子', - '2' => '夜蛾', - '3' => '二点委夜蛾', - '4' => '梨剑纹夜蛾', - '5' => '杨扇舟蛾', - '6' => '舟蛾', - '7' => '旋幽夜蛾', - '8' => '蝼蛄', - '9' => '歩甲', - '10' => '螟蛾', - '11' => '毛黄鳃金龟', - '12' => '尺蛾', - '13' => '剑纹夜蛾', - '14' => '粉缘钻夜蛾', - '15' => '夜蛾科', - '16' => '七星瓢虫', - '17' => '棉铃虫', - '18' => '蜻蜓', - '19' => '蚊', - '20' => '东方粘虫', - '21' => '叶蝉', - '22' => '春尺蠖', - '23' => '雄性春尺蠖', - '24' => '杨小舟蛾', - '25' => '甘蓝夜蛾', - '26' => '小地老虎', - '27' => '两点尼夜蛾', - '28' => '柳阴翅斑螟', - '29' => '桑褶翅尺蛾', - '30' => '宽胫夜蛾', - '31' => '尺蠖', - '32' => '一点钻夜蛾', - '33' => '天蛾', - '34' => '裳夜蛾', - '35' => '灯蛾', - '36' => '美国白蛾', - '37' => '八字白眉天蛾', - '38' => '陌夜蛾', - '39' => '豆天蛾', - '40' => '麦蛾', - '41' => '围连环夜蛾', - '42' => '亚美尺蛾', - '43' => '梨星毛虫', - '44' => '银锭夜蛾', - '45' => '黄臀灯蛾', - '46' => '大螟', - '47' => '燕尾舟蛾', - '48' => '榆津尺蛾', - '49' => '朽木夜蛾', - '50' => '黄地老虎', - '51' => '白钩粘夜蛾', - '52' => '桃蛀螟', - '53' => '甜菜夜蛾', - '54' => '斜纹夜蛾', - '55' => '蚀夜蛾', - '56' => '淡银锭夜蛾', - '57' => '齿美冬夜蛾', - '58' => '一点金刚钻', - '59' => '胡桃豹夜蛾', - '60' => '桑剑纹夜蛾', - '61' => '蓝目天蛾', - '62' => '黑绒鳃金龟', - '63' => '烟青虫', - '64' => '暗黑鳃金龟', - '65' => '中华绒金龟', - '66' => '八字地老虎', - '67' => '榆绿天蛾', - '68' => '红星雪灯蛾', - '69' => '雀纹天蛾', - '70' => '铜绿丽金龟', - '71' => '水龟虫/水龟', - '72' => '曲线尼夜蛾', - '73' => '粘虫', - '74' => '瘦银锭夜蛾', - '75' => '红天蛾', - '76' => '鳃金龟', - '77' => '大黑鳃金龟', - '78' => '大地老虎', - '79' => '玉米螟', - '80' => '赤角盲蝽', - '81' => '槐尺蛾', - '82' => '银纹夜蛾', - '83' => '天牛', - '84' => '乏夜蛾', - '85' => '丁香天蛾', - '86' => '构月天蛾', - '87' => '虎甲', - '88' => '劳氏粘虫', - '89' => '白薯天蛾', - '90' => '广鹿蛾', - '91' => '二十八星瓢虫', - '92' => '腮金龟', - '93' => '人纹污夜蛾', - '94' => '叩甲', - '95' => '楸蠹野螟', - '96' => '丝绵木金星尺蛾', - '97' => '红缘灯蛾', - '98' => '黄褐丽金龟', - '99' => '螟蛾科', - '100' => '红棕灰夜蛾', - '102' => '广鹿灯蛾', - '103' => '蝽', - '104' => '蜂', - '105' => '大造桥虫', - '106' => '童剑纹夜蛾', - '107' => '晃剑纹夜蛾', - '108' => '钩粘虫', - '109' => '直影夜蛾', - '110' => '毛黄绢金龟', - '111' => '乌氏小尾天蚕蛾', - '112' => '褐边绿刺蛾', - '113' => '广鹿舟蛾', - '115' => '龙虱', - '116' => '双带盘瓢虫', - '117' => '槲犹冬夜蛾', - '118' => '洋槐天蛾', - '119' => '弧角散纹夜蛾', - '120' => '黄脉天蛾', - '121' => '葡萄天蛾', - '122' => '桃六点天蛾', - '123' => '异色瓢虫', - '124' => '榆黄足毒蛾', - '125' => '客来夜蛾', - '126' => '桦尺蛾', - '127' => '草地螟', - '128' => '细条纹野螟', - '129' => '污灯蛾属', - '130' => '杨二尾舟蛾', - '131' => '克什杆野螟', - '132' => '筱客来夜蛾', - '133' => '栗六点天蛾', - '134' => '紫光盾天蛾', - '135' => '款冬玉米螟', - '136' => '草蛉', - '137' => '亚麻篱灯蛾', - '138' => '扁连环夜蛾', - '139' => '圣蜣螂', - '140' => '白钩粘虫', - '141' => '苇实夜蛾', - '142' => '姬蜂', - '143' => '秘夜蛾', - '144' => '织网夜蛾', - '145' => '深色白眉天蛾', - '146' => '短扇舟蛾', - '147' => '白须天蛾', - '148' => '歌梦尼夜蛾', - '149' => '海安夜蛾', - '150' => '满丫纹夜蛾', - '151' => '蟋蟀', - '152' => '双斑青步甲', - '153' => '白条夜蛾', - '154' => '蟪蛄', - '155' => '负子蝽', - '156' => '脊青步甲', - '157' => '宽斑青步甲', - '158' => '稻纵卷叶螟', - '159' => '淡剑夜蛾', - '160' => '甜菜白带野螟', - '161' => '樗蚕', - '162' => '蒙古寒蝉', - '163' => '中带三角夜蛾', - '164' => '蝗虫', - '165' => '多色异丽金龟', - '166' => '白色小卷蛾', - '167' => '狭边青步甲', - '168' => '棉卷叶野螟', - '169' => '豆荚野螟', - '170' => '麻小食心虫', - '171' => '星斑虎甲', - '172' => '黄缘龙虱', - '173' => '无斑弧丽金龟', - '174' => '白额鹰翅天蛾', - '175' => '日本真龙虱', - '176' => '山东云斑螟', - '177' => '小文夜蛾', - '178' => '三条蛀野螟', - '179' => '榆掌舟蛾', - '180' => '刺槐掌舟蛾', - '181' => '星绒天蛾', - '182' => '杨剑舟蛾', - '183' => '刀夜蛾', - '184' => '红节天蛾', - '185' => '星白雪灯蛾', - '186' => '桃剑纹夜蛾', - '187' => '谐夜蛾', - '188' => '小剑纹夜蛾', - '189' => '鸣鸣蝉', - '190' => '姬夜蛾', - '191' => '落叶松毛虫', - '192' => '苹六点天蛾', - '193' => '四斑绢野螟', - '194' => '甘薯天蛾', - '195' => '小线角木蠹蛾', - '196' => '三斑蕊夜蛾', - '197' => '白雪灯蛾', - '198' => '黄刺蛾', - '199' => '茶翅蝽', - '200' => '杨树枯叶蛾', - '201' => '标瑙夜蛾', - '202' => '瓜绢野螟', - '203' => '稻绿蝽', - '204' => '杨雪毒蛾', - '205' => '榆白边舟蛾', - '206' => '扁刺蛾', - '207' => '绒黏夜蛾', - '208' => '庸肖毛翅夜蛾', - '209' => '中华婪步甲', - '210' => '褐黄前锹甲', - '211' => '旱柳原野螟', - '212' => '巨影夜蛾', - '213' => '食蚜蝇', - '214' => '双斑葬甲', - '215' => '黄毒蛾', - '216' => '婪步甲', - '217' => '土甲', - '218' => '中华真地鳖', - '219' => '紫线夜蛾', - '220' => '小黄鳃金龟', - '221' => '中华真土鳖', - '222' => '云斑虎甲', - '223' => '中华黧尺蛾', - '224' => '中华绿刺蛾', - '225' => '巨豹纹尺蛾', - '226' => '多斑豹蠹蛾', - '227' => '桑尺蛾', - '228' => '灰直纹螟', - '229' => '中国绿刺蛾', - '230' => '云杉梢斑螟', - '231' => '桑绢野螟', - '232' => '黄杨绢野螟', - '233' => '突背斑红蝽', - '234' => '高粱条螟', - '235' => '小麦负泥虫', - '236' => '苹掌舟蛾', - '237' => '绒粘夜蛾', - '238' => '灰白灯蛾', - '239' => '隐丫纹夜蛾', - '240' => '满纹夜蛾', - '241' => '黑剑狼夜蛾', - '242' => '蜣螂', - '243' => '福婆鳃金龟', - '244' => '雨尺蛾', - '245' => '优美苔蛾', - '246' => '黄斑野螟', - '247' => '疆夜蛾', - '248' => '六点天蛾', - '249' => '斜线夜蛾', - '250' => '石榴巾夜蛾', - '251' => '绒星天蛾', - '252' => '霜天蛾', - '253' => '大田鳖', - '254' => '灰双纹螟', - '255' => '青尺蛾', - '256' => '二线绿尺蛾', - '257' => '散纹夜蛾', - '258' => '红双线尺蛾', - '259' => '胞短栉夜蛾', - '260' => '飞虱科', - '261' => '桃多斑野螟', - '262' => '甜菜青野螟', - '263' => '核桃鹰翅天蛾', - '264' => '角顶尺蛾', - '265' => '葡萄缺角天蛾', - '266' => '绿尾大蚕蛾', - '267' => '杨褐枯叶蝶', - '268' => '双云尺蛾', - '269' => '斑拟兜夜蛾', - '270' => '阿莎尺蛾', - '271' => '榄绿岐角螟', - '272' => '青革土蝽', - '273' => '核桃美舟蛾', - '274' => '斑点卷叶螟', - '275' => '黄褐箩纹蛾', - '276' => '白环红天蛾', - '277' => '白腹网丛螟', - '278' => '枯叶蛾', - '279' => '丹日明夜蛾', - '280' => '仿白边舟蛾', - '281' => '槐羽舟蛾', - '282' => '草地贪夜蛾', - '283' => '环夜蛾', - '284' => '尘尺蛾', - '285' => '黄二星舟蛾', - '286' => '榆木蠹蛾', - '287' => '水黾', - '288' => '银装冬夜蛾', - '289' => '饰奇尺蛾', - '290' => '枯叶蝶', - '291' => '步甲', - '292' => '阔胸禾犀金龟', - '293' => '眼斑钩蛾', - '294' => '三开蜣螂', - '295' => '金星步甲', - '296' => '残夜蛾', - '297' => '野蚕蛾', - '298' => '芦苇豹蠹蛾', - '299' => '华晓扁犀金龟', - '300' => '灰胸突鳃金龟', - '301' => '龟纹瓢虫', - '302' => '麻皮蝽', - '303' => '斑须蝽', - '304' => '斜斑虎甲', - '305' => '地鳖', - '306' => '叶甲', - '307' => '燕夜蛾', - '308' => '黑纹北灯蛾', - '309' => '网夜蛾', - '310' => '棘翅夜蛾', - '311' => '规尺蛾', - '312' => '苜蓿银纹夜蛾', - '313' => '拟扇舟蛾', - '314' => '丁目大蚕蛾', - '315' => '金黄蛾', - '316' => '黄星雪灯蛾', - '317' => '暗纹紫褐螟', - '318' => '白眉天蛾', - '319' => '黄板盘瓢虫', - '320' => '玫岐角螟', - '321' => '枯黄贡尺蛾', - '322' => '小豆长喙天蛾', - '323' => '橙拟灯蛾', - '324' => '粉蝶灯蛾', - '325' => '纹散丽灯蛾', - '326' => '雪尾尺蛾', - '327' => '鹰翅天蛾', - '328' => '波纹蛾', - '329' => '黑条灰灯蛾', - '330' => '八点灰灯蛾', - '331' => '间纹弦夜蛾', - '332' => '缤夜蛾', - '333' => '樟蚕', - '334' => '乌夜蛾', - '335' => '亮棲夜蛾', - '336' => '鸟嘴壶夜蛾', - '337' => '榕透翅毒蛾', - '338' => '四星负葬甲', - '339' => '魔目夜蛾', - '340' => '华尾天蚕蛾', - '341' => '洋麻钩蛾', - '342' => '旋皮夜蛾', - '343' => '奇尺蛾', - '344' => '土元', - '345' => '肯髯须夜蛾', - '346' => '苹果卷叶蛾', - '347' => '矛夜蛾', - '348' => '斜线燕蛾', - '349' => '红秘夜蛾', - '350' => '桃红猎夜蛾', - '351' => '帕委夜蛾', - '352' => '奚毛胫夜蛾', - '353' => '委夜蛾', - '354' => '角翅舟蛾', - '355' => '戟盗毒蛾', - '356' => '瓢虫', - '357' => '隐尺蛾', - '359' => '金龟', - '360' => '花金龟', - '361' => '白褐缘尾尺蛾', - '362' => '金黄螟', - '363' => '云斑白条天牛', - '364' => '瓦矛夜蛾', - '365' => '二化螟', - '366' => '菜粉蝶', - '367' => '杨枯叶蛾', - '368' => '淡剑纹夜蛾', - '369' => '焰夜蛾', - '370' => '二点织螟', - '371' => '白钩小卷蛾', - '372' => '女贞天蛾', - '373' => '锹甲', - '374' => '艾锥额野螟', - '375' => '白星花金龟', - '376' => '毒蛾', - '377' => '二点织蛾', - '378' => '萝藦艳情尺蛾', - '379' => '苹枯叶蛾', - '380' => '哈展尺蛾', - '381' => '中金弧夜蛾', - '382' => '黄斑盘瓢虫', - '383' => '缘黄毒蛾', - '384' => '蠹蛾', - '385' => '土鳖', - '386' => '人纹污灯蛾', - '387' => '松黑天蛾', - '388' => '蚜虫', - '389' => '萝藦艳青尺蛾', - '390' => '苹蚂舟蛾', - '391' => '木橑尺蛾', - '392' => '红蝽', - '393' => '掌尺蛾', - '394' => '肖浑黄灯蛾', - '395' => '阳污灯蛾', - '396' => '黄缘苔蛾', - '397' => '丽金龟', - '398' => '犀金龟', - '399' => '卷蛾', - '400' => '钩蛾', - '401' => '红尾大蚕蛾', - '402' => '刺蛾', - '403' => '玫瑰巾夜蛾', - '404' => '双委夜蛾', - '405' => '油松毛虫', - '406' => '朝鲜东蚁蛉', - '407' => '焦边尺蛾', - '408' => '黾蝽', - '409' => '苔蛾', - '411' => '蜚蠊', - '412' => '小蠹', - '413' => '桔小实蝇', - '414' => '水龟甲', - '415' => '大蚊', - '416' => '华北蝼蛄', - '417' => '豹纹卷野螟', - '418' => '长蝽', - '419' => '蠼螋', - '420' => '缘蝽', - '421' => '粪金龟', - '422' => '隐翅虫', - '423' => '象甲', - '424' => '猎蝽', - '425' => '东方蝼蛄', - '426' => '油葫芦', - '427' => '阔胫鰓金龟', - '428' => '棉大造桥虫', - '429' => '绒毛曲斑青地甲', - '430' => '葬甲', - '431' => '珀蝽', - '432' => '怀羽舟蛾', - '433' => '大云鳃金龟', - '434' => '赏夜蛾', - '435' => '甜菜夜螟', - '436' => '红带新鹿蛾', - '437' => '亚洲玉米螟', - '438' => '白肩天蛾', - '439' => '双斑辉尺蛾', - '441' => '构星天蛾', - '442' => '双叉犀牛龟', - '444' => '蚁', - '445' => '金黄娟金龟', - '446' => '黑色蔗龟', - '447' => '蝇', - '448' => '石蛾', - '449' => '螳螂', - '450' => '胡蜂', - '451' => '蝉', - '452' => '大斑波纹蛾', - '453' => '黑图夜蛾', - '454' => '黄星尺灯蛾', - '455' => '天蚕蛾', - '457' => '揪野螟', - '458' => '蚁蛉', - '459' => '绿盲蝽', - '460' => '丝棉木金星大尺蛾', - '461' => '蛱蝶', - '462' => '毛黄金龟', - '464' => '蚙', - '465' => '叩头甲', - '466' => '褐蛉', - '467' => '谷蠧', - '468' => '吉丁虫', - '469' => '东亚飞蝗', - '470' => '白雪灰灯蛾', - '471' => '泛尺蛾', - '472' => '蚊科', - '473' => '摇蚊', - '474' => '野螟', - '475' => '草螟', - '476' => '拟步甲', - '477' => '麦蝽', - '478' => '黑带食蚜蝇', - '479' => '东方蜜蜂', - '481' => '吉丁甲', - '482' => '金边龙虱', - '483' => '划蝽', - '484' => '叶蜂', - '485' => '中华扁锹', - '486' => '浮金龟', - '487' => '杂似谷盗', - '488' => '双齿蝼步甲', - '489' => '大团扇春蜓', - '490' => '爪哇异食蚜蝇', - '491' => '夹竹桃天蛾', - '492' => '大水龟甲', - '493' => '桑天牛', - '494' => '红脊长蝽', - '495' => '豆娘', - '496' => '蝼步甲', - '497' => '仰泳蝽', - '498' => '蝽蜓', - '499' => '印度谷螟', - '500' => '叶甲科', - '501' => '棉大卷叶螟', - '502' => '伪叶甲', - '503' => '屁步甲', - '504' => '异粉蝶灯蛾', - '505' => '白禾螟', - '506' => '棕色腮金龟', - '507' => '芋双线天蛾', - '508' => '盲蝽', - '509' => '鲜黄鳃金龟', - '511' => '红腹白灯蛾', - '512' => '长缘天蛾', - '514' => '箩纹蛾', - '515' => '叉斜带毒蛾', - '516' => '丝绵木尺蛾', - '517' => '绿刺蛾', - '518' => '谷类大蚊', - '519' => '臭椿皮夜蛾', - '521' => '星白灯蛾', - '522' => '白蜡绢野螟', - '523' => '蟑螂(蜚蠊,标号:411)', - '524' => '枣六点天蛾', - '525' => '虻', - '526' => '紫斑谷螟', - '527' => '豆荚斑螟', - '528' => '红缘翅斑蛾', - '529' => '柳毒蛾', - '530' => '兀鲁夜蛾', - '531' => '蜜蜂', - '532' => '麦牧野螟', - '533' => '紫线尺蛾', - '534' => '内夜蛾', - '535' => '粉纹夜蛾', - '536' => '金黄绢金龟', - '537' => '掌舟蛾', - '538' => '丝棉木尺蛾', - '539' => '绢金龟', - '540' => '枣桃六点天蛾', - '541' => '黏虫', - '542' => '条背天蛾', - '543' => '臭椿皮蛾', - '544' => '甘薯绮夜蛾', - '545' => '茶黄毒蛾', - '546' => '葡萄透翅蛾', - '547' => '白二尾舟蛾', - '548' => '八点灯蛾', - '549' => '绿尾天蚕蛾', - '550' => '萝纹蛾', - '551' => '豹纹木蠧蛾', - '552' => '舞虻', - '553' => '茎蜂', - '554' => '大草蛉', - '555' => '胡麻斑星尺蛾', - '556' => '蜉蝣', - '557' => '尖尾尺蛾', - '558' => '黄扬绢野螟', - '559' => '蚕蛾', - '562' => '琴纹尺蛾', - '563' => '双斜线尺蛾', - '564' => '白夜蛾', - '565' => '黄褐丽金闹', - '566' => '谷盗', - '567' => '三化螟', - '568' => '绿尺蛾', - '569' => '昏舟蛾', - '570' => '柳干蠹蛾', - '571' => '霜尺蛾', - '572' => '斑虻', - '573' => '银光草螟', - '574' => '菜蛾', - '575' => '豆荚螟', - '576' => '苜蓿夜蛾', - '577' => '白肾夜蛾', - '578' => '白肾灰夜蛾', - '579' => '纯白草螟', - '580' => '茸喙丽金龟', - '581' => '蛇蛉', - '582' => '巨蝼步甲', - '583' => '蜣蝇', - '584' => '贯众伸喙尺蛾', - '585' => '小褐髯须夜蛾', - '586' => '泰山簇斑螟', - '587' => '白桦角须野螟', - '588' => '红黄野螟', - '589' => '黑点蚀叶野螟', - '590' => '木蠹蛾', - '591' => '白线散纹夜蛾', - '592' => '灰蝶尺蛾', - '593' => '杠柳原野螟', - '594' => '幔折线尺蛾', - '595' => '丽蝇', - '596' => '并脉岐角螟蛾', - '597' => '柿星尺蛾', - '598' => '黑斑蚀叶野螟', - '599' => '黄连木尺蠖', - '601' => '黑皱鳃金龟', - '602' => '中华薄翅天牛', - '603' => '锈红金龟', - '604' => '盾天蛾', - '605' => '短斑普猎蝽', - '606' => '线委夜蛾', - '607' => '云纹虎甲', - '608' => '漆黑污灯蛾', - '609' => '松毛虫', - '610' => '紫带姬尺蛾', - '611' => '螳蛉', - '612' => '花胫绿纹蝗', - '613' => '东北巾夜蛾', - '614' => '柯基纹丛螟', - '615' => '菜氏猛叩甲', - '616' => '星尺蛾', - '617' => '华扁犀金龟', - '618' => '环纹夜蛾', - '619' => '金星尺蛾', - '620' => '旅游瓢虫', - '621' => '鼠天蛾', - '622' => '紫条尺蛾', - '623' => '明痣苔蛾', - '624' => '褐网尺蛾', - '625' => '三叉地老虎', - '626' => '肖二线绿尺蛾', - '627' => '四星尺蛾', - '628' => '红黏夜蛾', - '629' => '小花波尺蛾', - '630' => '朽木甲', - '631' => '灰猎夜蛾', - '632' => '稻巢草螟', - '633' => '指角麦蛾', - '634' => '金盅尺蛾', - '635' => '截翅尺蛾', - '636' => '双线尺蛾', - '637' => '平紫脖夜蛾', - '638' => '沤泊波纹蛾', - '639' => '白污灯蛾', - '641' => '格庶尺蛾', - '642' => '斑蛾', - '643' => '羽舟蛾', - '644' => '苹小卷叶蛾', - '645' => '稻水螟', - '646' => '苹烟尺蛾', - '647' => '蚕豆紫脖蛾', - '648' => '平夜蛾', - '649' => '焚紫脖夜蛾', - '650' => '贯众伸喙野螟', - '651' => '尖瓣灰纹卷蛾', - '652' => '摊巨冬夜蛾', - '653' => '草莓尺蛾', - '654' => '白缘苇野螟', - '655' => '核桃星尺蛾', - '656' => '郭公虫', - '657' => '明纹柏松毛虫', - '658' => '褐线尺蛾', - '659' => '旋歧夜蛾', - '660' => '黄山松毛虫', - '661' => '直紫脖夜蛾', - '662' => '红云翅斑螟', - '663' => '黄灯蛾', - '664' => '家蝇', - '665' => '黄翅缀叶野螟', - '666' => '枣核六点天蛾', - '668' => '长眉眼尺蛾', - '669' => '夏枯草展须野螟', - '670' => '白背飞虱', - '671' => '灰飞虱', - '672' => '褐飞虱', - '673' => '网纹夜蛾', - '674' => '斑螟', - '675' => '核桃目尺蛾', - '676' => '灰棕金羽蛾', - '677' => '艾棕麦蛾', - '678' => '蝶角蛉', - '679' => '豹蠹蛾', - '681' => '云星黄毒蛾', - '682' => '锯线尺蛾', - '683' => '紫斑黄带蛾', - '684' => '绿蝇', - '685' => '大云斑鳃金龟', - '686' => '血红雪苔蛾', - '687' => '果蝇', - '688' => '纹散灯蛾', - '689' => '排点灯蛾', - '690' => '白钩黏夜蛾', - '691' => '黄毛赛金龟', - '692' => '新林舟蛾', - '693' => '井夜蛾', - '694' => '花实夜蛾', - '695' => '棉褐带卷蛾', - '696' => '卷叶蛾', - '697' => '王氏樗蛾', - '698' => '刺槐外斑尺蛾', - '699' => '懈毛胫夜蛾', - '700' => '糜夜蛾', - '701' => '东方小垫甲', - '702' => '蚁形甲', - '703' => '十二斑褐菌瓢虫', - '704' => '明治苔蛾', - '705' => '葡萄卷叶野螟', - '706' => '大青叶蝉', - '707' => '绢野螟', - '708' => '柳圆叶甲', - '709' => '蜘蛛', - '710' => '隐翅甲', - '711' => '钩月天蛾', - '712' => '寄生蜂', - '713' => '苍蝇', - '714' => '灰直纵螟', - '715' => '倭委夜蛾', - '716' => '小菜蛾', - '717' => '小地老虎螟', - '718' => '中黑盲蝽', - '719' => '粪蜣', - '721' => '壶夜蛾', - '722' => '螽斯', - '723' => '食叶', - '724' => '平台珠蝼步甲', - '725' => '李枯叶蛾', - '726' => '春蜓', - '727' => '点斑雪灯蛾', - '728' => '黄臂灯蛾', - '729' => '旅裳夜蛾', - '730' => '三角夜蛾', - '731' => '蠋步甲', - '732' => '红羽舟蛾', - '733' => '黑蚱蝉', - '734' => '中华黛尺蛾', - '735' => '苜蓿尺蛾', - '736' => '沤伯波纹蛾', - '737' => '灰灯蛾', - '738' => '双裂类荚斑螟', - '739' => '蓝纹尾蟌', - '740' => '莴苣冬夜蛾', - '741' => '两色绮夜蛾', - '742' => '豹灯蛾', - '743' => '四眼尺蛾', - '744' => '核桃六点天蛾', - '746' => '黄柄脉锦斑蛾', - '747' => '甜菜白带螟', - '748' => '大隐翅虫', - '749' => '羽蛾', - '750' => '灰褐带蛾', - '751' => '带蛾', - '752' => '窗胸萤', - '753' => '蝶灯蛾', - '754' => '黄蜻', - '755' => '伊贝鹿蛾', - '756' => '褐顶毒蛾', - '757' => '愕蚕蛾', - '758' => '黄野螟', - '759' => '云尺蛾', - '761' => '马蜂', - '762' => '赤条黄带蛾', - '764' => '猩红雪苔蛾', - '765' => '齿蛉', - '766' => '草蝉', - '767' => '鬼脸天蛾', - '768' => '小造桥虫', - '769' => '异美苔蛾', - '770' => '旋目夜蛾', - '771' => '稻飞虱', - '772' => '小阔胫鳃金龟', - '773' => '杨卷叶螟', - '774' => '龟纹夜蛾', - '776' => '白灯蛾', - '777' => '绿翠尺蛾', - '779' => '食虫虻', - '780' => '邑蝽', - '781' => '青翅毒隐翅甲', - '782' => '黑条灰天蛾', - '783' => '黄腹鹿蛾', - '784' => '蓟马', - '785' => '蚂蚁', - '786' => '啮虫', - '787' => '小蜂', - '788' => '粉虱', - '789' => '蛾蠓', - '790' => '跳甲', - '791' => '木虱', - '792' => '黑带灰灯蛾', - '793' => '水鼓甲', - '794' => '细蜂', - '795' => '网蝽', - '796' => '鹿蛾', - '797' => '茧蜂', - '798' => '实蝇', - '799' => '茎甲', - '801' => '浩波纹蛾', - '802' => '红尾天蚕蛾', - '803' => '槐黑星虎天牛', - '804' => '赤巢螟', - '805' => '日愕蚕蛾', - '806' => '变色夜蛾', - '807' => '掌夜蛾', - '808' => '宽夜蛾', - '809' => '二尾舟蛾', - '810' => '茶须野螟', - '811' => '白带符夜蛾', - '812' => '白蚁', - '813' => '中华鼻蜡蝉', - '814' => '黄斑青步甲', - '815' => '茶柄脉锦斑蛾', - '816' => '双斑天蛾', - '817' => '中华斑杧', - '818' => '污刺胸猎蝽', - '819' => '奇裂附步甲', - '820' => '大光蠊', - '821' => '蚱蜢', - '822' => '纹眼尺蛾', - '823' => '栉尾尺蛾', - '824' => '木撩尺蛾', - '825' => '黄灰网尺蛾', - '826' => '幕僚尺蛾', - '827' => '青球箩纹蛾', - '828' => '暗脉艳苔蛾', - '829' => '窄黄缘绿刺蛾', - '830' => '黄星尺蛾', - '831' => '锤角细蜂', - '832' => '行军蚁', - '833' => '沫蝉', - '834' => '赭黄长须蛾', - '835' => '稻摇蚊', - '836' => '稻盲蝽', - '837' => '基黑纹丛螟', - '838' => '蚜蝇', - '839' => '枯叶夜蛾', - '841' => '负泥虫', - '842' => '蛾蜡蝉', - '843' => '粤豹大蚕蛾', - '844' => '东北栎枯叶蛾', - '845' => '仰蝽', - '846' => '毒隐翅甲', - '847' => '黄曲条跳甲', - '848' => '蚊幼虫', - '849' => '黑带污灯蛾', - '850' => '黄褐枯叶蝶', - '851' => '莹叶甲', - '852' => '拟叩甲', - '853' => '泥蜂', - '854' => '蜉蝣幼虫', - '855' => '单鲁夜蛾', - '856' => '干纹夜蛾', - '857' => '斑头蝉', - '858' => '大三角鲁夜蛾', - '859' => '中华岱蝽', - '860' => '豇豆荚螟', - '861' => '中华鹿蛾', - '862' => '三线钩蛾', - '863' => '竹节虫', - '864' => '枯黄惑尺蛾', - '865' => '棘趾野螟', - '866' => '尖锥额野螟', - '868' => '丽刺小卷蛾', - '869' => '日球箩纹蛾', - '870' => '半鲁夜蛾', - '871' => '间纹德夜蛾', - '873' => '贡尺蛾', - '874' => '忍冬双斜卷蛾', - '875' => '瓜夜蛾', - '876' => '褐卷蛾', - '877' => '绿黄毛虫', - '878' => '赭翅臂花金龟', - '879' => '黄痣苔蛾', - '881' => '浅褐彩丽金龟', - '882' => '斑黑麦蛾', - '883' => '褐斑虎丽灯蛾', - '884' => '耳斑蟠尺蛾', - '885' => '北李褐枯叶蛾', - '886' => '纹岐角螟', - '887' => '银二星舟蛾', - '888' => '著蕊尾舟蛾', - '889' => '黄褐网尺蛾', - '890' => '丸尺蛾', - '891' => '粉蝶', - '892' => '乌桕巨天蚕蛾', - '893' => '黑长喙天蛾', - '894' => '伞双突野螟', - '895' => '瘿蚊', - '896' => '芫菁', - '897' => '较高', - '898' => '鹰尺蛾', - '899' => '三环狭野螟', - '900' => '姬蠊', - '901' => '朝尺蛾', - '902' => '紫光箩纹蛾', - '903' => '短啄夜蛾', - '904' => '碧伟蜓', - '905' => '核桃美州蛾', - '906' => '梨娜刺蛾', - '907' => '枯球箩纹蛾', - '908' => '蜓', - '909' => '二星舟蛾', - '910' => '朝线夜蛾', - '911' => '明裙剑夜蛾', - '912' => '白点暗野螟', - '913' => '麟角希夜蛾', - '914' => '眼尺蛾', - '915' => '黄双线尺蛾', - '916' => '联梦尼夜蛾', - '917' => '栎毛虫', - '918' => '宏遗夜蛾', - '919' => '太波纹蛾', - '921' => '小斑红蝽', - '922' => '柳沟胸跳甲', - '923' => '田鳖', - '924' => '条螽', - '925' => '角石蛾', - '926' => '缺叉等翅石蛾', - '927' => '尖双突野螟', - '928' => '锈色负子蝽', - '929' => '茶白毒蛾', - '930' => '硃美苔蛾', - '931' => '齿缘龙虱', - '932' => '醋栗尺蛾', - '933' => '强污灯蛾', - '934' => '稻弄蝶', - '935' => '妃夜蛾', - '936' => '白鳃角金龟', - '937' => '棉褐环野螟', - '938' => '暗褐卷蛾', - '939' => '梯斑谷蛾', - '940' => '点线脉褐蛉', - '941' => '桃展足蛾', - '942' => '草小卷蛾', - '943' => '中黑灰夜蛾', - '944' => '小瘿斑蛾', - '945' => '马铃薯瓢虫', - '946' => '点线锦织蛾', - '947' => '圆臀大黾蝽', - '948' => '双红线兔尺蛾', - '949' => '腰带燕尾舟蛾', - '950' => '密云草蛾', - '951' => '女贞首夜蛾', - '952' => '星天蛾', - '953' => '红毛花萤', - '954' => '库蚊', - '955' => '鲁夜蛾', - '956' => '黄粉甲', - '957' => '赞青尺蛾', - '958' => '窄肾长须夜蛾', - '959' => '污灯蛾', - '961' => '波纹小灰蝶', - '962' => '透翅蛾', - '963' => '苜蓿盲蝽', - '964' => '扭拟灯蛾', - '965' => '安土苔蛾', - '966' => '日污灯蛾', - '967' => '柞褐叶螟', - '968' => '乌柏黄毒蛾', - '969' => '黄绒野螟', - '970' => '浅黄箩舟蛾', - '971' => '半带黄毒蛾', - '972' => '钩翅大蚕蛾', - '973' => '肖叶甲', - '974' => '切叶蜂', - '975' => '女贞尺蛾', - '976' => '单斑多形长角纹石蛾', - '977' => '格蔗尺蛾', - '978' => '象蜡蝉', - '979' => '丽美苔蛾', - '980' => '苹小卷蛾', - '981' => '合欢双条天牛', - '982' => '折带黄毒蛾', - '983' => '齿翅三线天蛾', - '984' => '广屁步甲', - '985' => '栎掌天蛾', - '986' => '异螋', - '987' => '中国假蜉', - '988' => '犬蚊', - '989' => '暗步甲', - '990' => '栗山天牛', - '991' => '净污灯蛾', - '992' => '毛颊斑虎甲', - '993' => '优草螽', - '994' => '斑雅尺蛾', - '995' => '肿须隐翅虫', - '996' => '金盏供肩网蛾', - '997' => '绿翅绢野螟', - '998' => '蚱蝉', - '999' => '八点污灯蛾', - '1001' => '联纹小叶春蜓', - '1002' => '奇烈跗步甲', - '1003' => '尖突水龟虫', - '1004' => '长蠹', - '1005' => '黄足猎蝽', - '1006' => '脊冠叶蝉', - '1007' => '珀色毒蛾', - '1008' => '长角水叶甲', - '1009' => '稻蝗', - '1010' => '白线野蚕蛾', - '1011' => '赤双纹螟', - '1012' => '峦文夜蛾', - '1013' => '草螽', - '1014' => '扶桑四点野螟', - '1015' => '大鳖土蝽', - '1016' => '赤梗天牛', - '1017' => '连星污灯蛾', - '1018' => '华星天牛', - '1019' => '紫苑沟胫野螟', - '1020' => '栎鹰翅天蛾', - '1021' => '折无疆青尺蛾', - '1022' => '一点拟灯蛾', - '1023' => '蜡斑甲', - '1024' => '细蛾', - '1025' => '滨尸葬甲', - '1026' => '白雪苔蛾', - '1027' => '横线镰翅野螟', - '1028' => '褐翅棘趾野螟', - '1029' => '甜菜白带夜蛾', - '1030' => '梨叶斑蛾', - '1031' => '钩白肾夜蛾', - '1032' => '红晕散纹夜蛾', - '1033' => '蜡蝉', - '1034' => '肾纹绿尺蛾', - '1035' => '条螟', - '1036' => '双斑黄毒蛾', - '1037' => '大绿异丽金龟', - '1038' => '双带褐褶龙虱', - '1039' => '金色悦野螟', - '1041' => '槐刺外斑尺蛾', - '1042' => '金斑虎甲', - '1043' => '油桐尺蛾', - '1044' => '元参棘趾野螟', - '1045' => '铜绿异丽金龟', - '1046' => '绿蝽', - '1047' => '黑织叶野螟', - '1048' => '黄斑长朽木甲', - '1049' => '元岑棘趾野螟', - '1050' => '窄吉丁', - '1051' => '美雪苔蛾', - '1052' => '散白蚁', - '1053' => '四斑露尾甲', - '1054' => '红点唇瓢虫', - '1055' => '平烟尺蛾', - '1056' => '白蜡卷须野螟', - '1057' => '印度斑谷螟', - '1058' => '杨芦伸啄野螟', - '1059' => '井脉歧角螟蛾', - '1060' => '菜螟', - '1061' => '苹果蠹蛾', - '1062' => '梨小食心虫', - '1063' => '棉小造桥虫', - '1064' => '龟背天牛', - '1065' => '松墨天牛', - '1066' => '星天牛', - ]; - /** * 杀虫灯回调通知 */ diff --git a/app/Http/Controllers/DeviceController.php b/app/Http/Controllers/DeviceController.php index ee54770..146ee9c 100644 --- a/app/Http/Controllers/DeviceController.php +++ b/app/Http/Controllers/DeviceController.php @@ -8,6 +8,7 @@ use App\Enums\OperationType; use App\Helpers\Paginator; use App\Http\Requestes\DeviceRequest; use App\Http\Resources\DeviceResource; +use App\Http\Resources\WormPhotoResource; use App\Models\AgriculturalBase; use App\Models\Device; use App\Models\InsecticidalLampDailyReport; @@ -671,19 +672,22 @@ class DeviceController extends Controller ]); } - $device = Device::findOrFail($id); - - $wormReports = WormReport::where('device_id', $device->id) + $wormReports = WormReport::where('device_id', $id) ->whereBetween('reported_at', [$startTime->toDateString(), $endTime->toDateString()]) ->pluck('worm_num', 'reported_at'); $data = []; - do { - $key = $startTime->toDateString(); - $data[$key] = $wormReports->get($key); - $startTime->addDay(); - } while ($startTime->lte($endTime)); + if ($startTime->lte($endTime)) { + do { + // 日期 + $date = $startTime->toDateString(); + + $data[$date] = $wormReports->get($date); + + $startTime->addDay(); + } while ($startTime->lte($endTime)); + } return $this->json($data); } @@ -714,40 +718,11 @@ class DeviceController extends Controller fn () => $endTime->copy()->startOfDay(), ); - if ($startTime->gt($endTime)) { - throw ValidationException::withMessages([ - 'start_time' => ['开始时间不能大于结束时间'], - ]); - } - - $device = Device::findOrFail($id); - - $data = []; - - switch ($device->supplier_key) { - case 'device-supplier-biang': - $result = $biAngDeviceService->getWormPhotos( - $device, - Carbon::parse($request->input('start_time')), - Carbon::parse($request->input('end_time')), - ); - $data = $result['imgUrl']; - break; - - default: - $wormPhotos = WormPhoto::where('device_id', $device->id) + $wormPhotos = WormPhoto::where('device_id', $id) ->whereBetween('uploaded_at', [$startTime, $endTime]) ->latest('uploaded_at') - ->get(); + ->paginate($request->input('per_page', 20)); - $data = $wormPhotos->map(fn ($item) => [ - 'id' => $item->id, - 'url' => $item->url, - 'time' => $item->created_at->toDateTimeString(), - ]); - break; - } - - return $this->json($data); + return WormPhotoResource::collection($wormPhotos); } } diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 563310e..67c6fc7 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -39,7 +39,7 @@ class Kernel extends HttpKernel ], 'api' => [ - \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, + // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, 'throttle:600,1', \Illuminate\Routing\Middleware\SubstituteBindings::class, \App\Http\Middleware\FormatJsonResponse::class, diff --git a/app/Http/Resources/WormPhotoResource.php b/app/Http/Resources/WormPhotoResource.php new file mode 100644 index 0000000..d46ea9c --- /dev/null +++ b/app/Http/Resources/WormPhotoResource.php @@ -0,0 +1,17 @@ + $this->id, + 'url' => $this->image_url, + 'time' => $this->uploaded_at->toDateTimeString(), + ]; + } +} diff --git a/app/Iot/Linkos/FarmClient.php b/app/Iot/Linkos/FarmClient.php new file mode 100644 index 0000000..f32e752 --- /dev/null +++ b/app/Iot/Linkos/FarmClient.php @@ -0,0 +1,153 @@ +get('/api/v2.0/entrance/device/getsysUserDevice', [ + 'groupId' => $groupId, + 'deviceType' => $deviceType, + ]); + + return $result['data']; + } + + /** + * 获取用户区域 + */ + public function groups(?string $groupName = null): array + { + $result = $this->get('/api/v2.0/entrance/group/getsysUserGroup', [ + 'groupName' => $groupName, + ]); + + return $result['data']; + } + + /** + * 获取设备实时数据 + */ + public function realTimeData(array $devices = []): array + { + $result = $this->get('/api/v2.0/entrance/device/getRealTimeData', [ + 'deviceAddrs' => implode(',', $devices), + ]); + + return $result['data']; + } + + /** + * 虫情区域统计 + */ + public function wormStatistics(string $groupId, Carbon $beginTime, Carbon $endTime): array + { + $result = $this->get('/api/v2.0/worm/deviceData/getWormStatisticsByGroup', [ + 'groupId' => $groupId, + 'beginTime' => $beginTime->toDateTimeString(), + 'endTime' => $endTime->toDateTimeString(), + ]); + + return $result['data']; + } + + /** + * 虫情设备分析报表 + */ + public function wormAnalyseData(string $device, Carbon $beginTime, Carbon $endTime, int $pages, int $limit = 100): array + { + $result = $this->get('/api/v2.0/worm/deviceData/getWormDataList', [ + 'deviceAddr' => $device, + 'beginTime' => $beginTime->toDateTimeString(), + 'endTime' => $endTime->toDateTimeString(), + 'pages' => $pages, + 'limit' => $limit, + ]); + + return $result['data']; + } + + public function get(string $url, array $query = []): array + { + return $this->request('GET', $url, [ + 'query' => $query, + ]); + } + + public function post(string $url, array $data = []): array + { + return $this->request('POST', $url, [ + 'json' => $data, + ]); + } + + protected function request(string $method, string $url, array $options = []): array + { + $headers = [ + 'Content-Type' => 'application/json', + ]; + if ($url !== '/api/v2.0/entrance/user/userLogin') { + $headers['token'] = $this->token(); + } + + /** @var \Illuminate\Http\Client\Response */ + $response = Http::withHeaders($headers)->baseUrl(self::ENDPOINT_URL)->send($method, $url, $options); + + $json = $response->throw()->json(); + + if (data_get($json, 'code') === 1000) { + return $json; + } + + throw new LinkosFarmException( + data_get($json, 'message', '出错啦'), + data_get($json, 'code', 0), + ); + } + + protected function token(): string + { + if ($this->token && $this->expires > now()->unix() + 30) { + return $this->token; + } + + $result = $this->post('/api/v2.0/entrance/user/userLogin', [ + 'loginName' => $this->loginName, + 'loginPwd' => $this->loginPwd, + ]); + + $this->expires = $result['data']['expDate']; + + return $this->token = $result['data']['token']; + } +} diff --git a/app/Models/WormPhoto.php b/app/Models/WormPhoto.php index 2499bd8..574d2db 100644 --- a/app/Models/WormPhoto.php +++ b/app/Models/WormPhoto.php @@ -2,8 +2,10 @@ namespace App\Models; +use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Facades\Storage; class WormPhoto extends Model { @@ -16,4 +18,16 @@ class WormPhoto extends Model protected $fillable = [ 'device_id', 'url', 'uploaded_at', ]; + + public function imageUrl(): Attribute + { + return Attribute::make( + get: function(mixed $value, array $attributes) { + if (preg_match('/^https?:\/\//', $attributes['url']) > 0) { + return $attributes['url']; + } + return Storage::disk('public')->url($attributes['url']); + }, + ); + } } diff --git a/app/Services/YunFeiDeviceService.php b/app/Services/YunFeiDeviceService.php new file mode 100644 index 0000000..63f6fed --- /dev/null +++ b/app/Services/YunFeiDeviceService.php @@ -0,0 +1,211 @@ +type) { + case DeviceType::InsecticidalLamp: + $this->createInsecticidalLampReport($device, $time); + break; + } + } + + /** + * 创建杀虫灯设备报告 + */ + protected function createInsecticidalLampReport(Device $device, Carbon $time): void + { + $reportedAt = $time->copy()->startOfHour(); + + /** @var \Illuminate\Database\Eloquent\Collection */ + $logs = DeviceLog::where('device_id', $device->id) + ->whereBetween('reported_at', [$reportedAt, $reportedAt->copy()->endOfHour()]) + ->oldest('reported_at') + ->get(); + + if ($logs->isEmpty()) { + return; + } + + $attributes = value(function ($logs) { + $data = [ + 'battery_vol' => ['sum' => 0, 'count' => 0], + 'charging_vol' => ['sum' => 0, 'count' => 0], + 'killed_num' => ['sum' => 0, 'count' => 0], + 'air_temperature' => ['sum' => 0, 'count' => 0], + 'air_humidity' => ['sum' => 0, 'count' => 0], + ]; + + /** @var \App\Models\DeviceLog */ + foreach ($logs as $log) { + if (! is_array($log->data)) { + continue; + } + + foreach ($data as $key => $item) { + switch ($key) { + // 电池电压 + case 'battery_vol': + if (! is_null($bv = Arr::get($log->data, 'bv'))) { + $item['sum'] = bcadd($item['sum'], $bv, 2); + $item['count'] += 1; + } + break; + + // 充电电压 + case 'charging_vol': + if (! is_null($cv = Arr::get($log->data, 'cv'))) { + $item['sum'] = bcadd($item['sum'], $cv, 2); + $item['count'] += 1; + } + break; + + // 杀虫数 + case 'killed_num': + if (! is_null($ct = Arr::get($log->data, 'ct'))) { + $item['sum'] += $ct; + $item['count'] += 1; + } + break; + + // 温度 + case 'air_temperature': + if (! is_null($at = Arr::get($log->data, 'at'))) { + $item['sum'] = bcadd($item['sum'], $at, 2); + $item['count'] += 1; + } + break; + + // 湿度 + case 'air_humidity': + if (! is_null($ah = Arr::get($log->data, 'ah'))) { + $item['sum'] = bcadd($item['sum'], $ah, 2); + $item['count'] += 1; + } + break; + } + + $data[$key] = $item; + } + } + + $attributes = []; + + foreach ($data as $key => $item) { + if ($item['count'] > 0) { + if ($key === 'killed_num') { + $attributes[$key] = (int) $item['sum']; + } else { + $attributes[$key] = round(bcdiv($item['sum'], $item['count'], 2), 2); + } + } else { + $attributes[$key] = null; + } + } + + return $attributes; + }, $logs); + + /** @var \App\Models\InsecticidalLampReport */ + $insecticidalLampReport = InsecticidalLampReport::firstOrNew([ + 'device_id' => $device->id, + 'reported_at' => $reportedAt, + ], [ + 'agricultural_base_id' => $device->agricultural_base_id, + ]); + + $insecticidalLampReport->fill($attributes)->save(); + } + + /** + * 创建设备每日报告 + */ + public function createDailyReport(Device $device, Carbon $time): void + { + switch ($device->type) { + case DeviceType::InsecticidalLamp: + $this->createInsecticidalLampDailyReport($device, $time); + break; + } + } + + /** + * 杀虫灯每日报告 + */ + protected function createInsecticidalLampDailyReport(Device $device, Carbon $date): void + { + /** @var \Illuminate\Database\Eloquent\Collection */ + $insecticidalLampReports = InsecticidalLampReport::where('device_id', $device->id) + ->whereDate('reported_at', $date) + ->oldest('reported_at') + ->get(); + + if ($insecticidalLampReports->isEmpty()) { + return; + } + + $attributes = value(function ($insecticidalLampReports) { + $data = [ + 'battery_vol' => ['sum' => 0, 'count' => 0], + 'charging_vol' => ['sum' => 0, 'count' => 0], + 'killed_num' => ['sum' => 0, 'count' => 0], + 'air_temperature' => ['sum' => 0, 'count' => 0], + 'air_humidity' => ['sum' => 0, 'count' => 0], + 'high_vol' => ['sum' => 0, 'count' => 0], + ]; + + foreach ($insecticidalLampReports as $insecticidalLampReport) { + foreach ($data as $k => $item) { + if (is_null($v = $insecticidalLampReport->{$k})) { + continue; + } + + $item['sum'] = bcadd($item['sum'], $v, 2); + $item['count']++; + + $data[$k] = $item; + } + } + + $attributes = []; + + foreach ($data as $key => $item) { + if ($item['count'] > 0) { + if ($key === 'killed_num') { + $attributes[$key] = (int) $item['sum']; + } else { + $attributes[$key] = round(bcdiv($item['sum'], $item['count'], 2), 2); + } + } else { + $attributes[$key] = null; + } + } + + return $attributes; + }, $insecticidalLampReports); + + /** @var \App\Models\InsecticidalLampDailyReport */ + $insecticidalLampDailyReport = InsecticidalLampDailyReport::firstOrNew([ + 'device_id' => $device->id, + 'reported_at' => $date->format('Y-m-d'), + ], [ + 'agricultural_base_id' => $device->agricultural_base_id, + ]); + + $insecticidalLampDailyReport->fill($attributes)->save(); + } +} diff --git a/routes/api.php b/routes/api.php index cde88fb..12d019a 100644 --- a/routes/api.php +++ b/routes/api.php @@ -41,6 +41,7 @@ Route::group([ Route::apiResource('town-street', AgriculturalBaseController::class)->names('town_street');//镇街 Route::get('agricultural-device-basic', [AgriculturalBaseController::class, 'deviceBase'])->name('agricultural_basic.device_bases'); //通过设备类型查询基地 Route::get('agricultural-device-point/{agricultural_basic}', [AgriculturalBaseController::class, 'basePointList']);//获取基地对应监控点 + Route::get('agricultural-device-points', [AgriculturalBaseController::class, 'basePoints']); //农作物 Route::apiResource('crops', CropController::class)->names('crops');//基地农作物