优化虫情统计和虫情照片

dev
Jing Li 2023-08-30 12:12:54 +08:00
parent a723e40d25
commit a037f82a5f
5 changed files with 69 additions and 50 deletions

View File

@ -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,28 @@ 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->put($path, file_get_contents($item['url']));
WormPhoto::firstOrCreate([
'device_id' => $device->id,
'uploaded_at' => $item['time'],
], [
'url' => $path,
]);
}
$device->update([
'status' => count($data['imgUrl'] ?? []) > 0 ? DeviceStatus::Online : DeviceStatus::Offline,

View File

@ -53,7 +53,7 @@ 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);

View File

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

View File

@ -0,0 +1,17 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class WormPhotoResource extends JsonResource
{
public function toArray($request)
{
return [
'id' => $this->id,
'url' => $this->image_url,
'time' => $this->created_at->toDateTimeString(),
];
}
}

View File

@ -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']);
},
);
}
}