dev
Jing Li 2023-08-12 21:52:47 +08:00
parent 5c28b8c093
commit 550ea41ab7
1 changed files with 170 additions and 107 deletions

View File

@ -10,6 +10,8 @@ use App\Http\Requestes\DeviceRequest;
use App\Http\Resources\DeviceResource; use App\Http\Resources\DeviceResource;
use App\Models\AgriculturalBase; use App\Models\AgriculturalBase;
use App\Models\Device; use App\Models\Device;
use App\Models\InsecticidalLampDailyReport;
use App\Models\InsecticidalLampReport;
use App\Models\MeteorologicalMonitoringDailyLog; use App\Models\MeteorologicalMonitoringDailyLog;
use App\Models\MeteorologicalMonitoringLog; use App\Models\MeteorologicalMonitoringLog;
use App\Models\SoilMonitoringDailyLog; use App\Models\SoilMonitoringDailyLog;
@ -21,6 +23,7 @@ use App\Services\OperationLogService;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Carbon; use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Validation\ValidationException;
use Peidikeji\Setting\Models\Setting; use Peidikeji\Setting\Models\Setting;
class DeviceController extends Controller class DeviceController extends Controller
@ -416,48 +419,46 @@ class DeviceController extends Controller
} }
} }
/** public function timeZoneList(Request $request)
* 查询设备今天(按天),近一周(按天),近一个月(按天) {
*/ $request->validate([
public function timeZoneList(Request $request){ 'device_id' => ['bail', 'required'],
$deviceId = $request->input('device_id'); 'start_time' => ['bail', 'nullable', 'date_format:Y-m-d'],
//不传开始时间,结束时间,则默认是查当天(按小时) 'end_time' => ['bail', 'nullable', 'date_format:Y-m-d'],
$startTime = $request->input('start_time'); ]);
$endTime = $request->input('end_time');
$diffDays = 0; $isSameDay = true;
$day = date('Y-m-d');
//如果传了开始时间和结束时间,计算中间天数 if ($request->filled('start_time') && $request->filled('end_time')) {
if($startTime && $endTime){ $startTime = Carbon::parse($request->input('start_time'))->startOfDay();
if($startTime == $endTime){//查询某一天 $endTime = Carbon::parse($request->input('end_time'))->startOfDay();
$day = $startTime;
}else{ if ($startTime->gt($endTime)) {
$startDay = Carbon::parse($startTime); throw ValidationException::withMessages([
$endDay = Carbon::parse($endTime); 'start_time' => ['开始时间不能大于结束时间'],
$diffDays = $startDay->diffInDays($endDay, false); ]);
} }
// 如果开始时间和结束时间是同一天
if ($startTime->eq($endTime)) {
$endTime = $startTime->isToday() ? now() : $startTime->copy()->endOfDay();
} else {
$isSameDay = false;
}
} else {
$endTime = now();
$startTime = $endTime->copy()->startOfDay();
} }
$xKeys = []; $device = Device::findOrFail($request->input('device_id'));
if($diffDays){
for ($i = 0; $i<=$diffDays; $i++) { $fields = [];
$xKeys[] =(clone $startDay)->addDays($i)->startOfDay()->format('Y-m-d H:i:s'); $monitoringLogs = collect();
}
}else{
//调整截至到当前小时
$h = 23;
if($day == date('Y-m-d')){
$h = date('H');
}
for ($i = 0; $i < ($h+1); $i++) {
$xKeys[] = $day.' '.str_pad($i, 2, '0', STR_PAD_LEFT).':00:00';
}
}
$device = Device::find($deviceId);
$modelQuery = null;
$getArr = [];
switch ($device->type) { switch ($device->type) {
case DeviceType::Meteorological://气象设备 // 气象设备
$getArr = [ case DeviceType::Meteorological:
$fields = [
'wind_speed', 'wind_speed',
'wind_direction', 'wind_direction',
'wind_degree', 'wind_degree',
@ -469,17 +470,34 @@ class DeviceController extends Controller
'illumination', 'illumination',
'pm25', 'pm25',
'pm10', 'pm10',
'rainfall',
]; ];
if($diffDays) { /** @var \Illuminate\Support\Collection */
$getArr[] = 'daily_rainfall'; $monitoringLogs = (
$modelQuery = MeteorologicalMonitoringDailyLog::query()->whereBetween('monitored_at', [$startTime, $endTime]); $isSameDay
}else{ ? MeteorologicalMonitoringLog::query()
$getArr[] = 'current_rainfall'; : MeteorologicalMonitoringDailyLog::query()
$modelQuery = MeteorologicalMonitoringLog::query()->whereDate('monitored_at', $day); )
} ->where('device_id', $device->id)
->whereBetween('monitored_at', [$startTime, $endTime])
->get()
->mapWithKeys(function ($item) use ($fields) {
$key = $item->monitored_at->toDateTimeString();
$data = collect($fields)->mapWithKeys(fn ($field) => [$field => $field !== 'rainfall' ? $item[$field] : null])->all();
if ($item instanceof MeteorologicalMonitoringDailyLog) {
$data['rainfall'] = $item->daily_rainfall;
} else {
$data['rainfall'] = $item->current_rainfall;
}
return [$key => $data];
});
break; break;
case DeviceType::Soil://土壤设备
$getArr = [ // 土壤设备
case DeviceType::Soil:
$fields = [
'conductivity', 'conductivity',
'humidity', 'humidity',
'temperature', 'temperature',
@ -487,14 +505,25 @@ class DeviceController extends Controller
'p', 'p',
'k', 'k',
]; ];
if($diffDays) { /** @var \Illuminate\Support\Collection */
$modelQuery = SoilMonitoringDailyLog::query()->whereBetween('monitored_at', [$startTime, $endTime]); $monitoringLogs = (
}else{ $isSameDay
$modelQuery = SoilMonitoringLog::query()->whereDate('monitored_at', $day); ? SoilMonitoringLog::query()
} : SoilMonitoringDailyLog::query()
)
->where('device_id', $device->id)
->whereBetween('monitored_at', [$startTime, $endTime])
->get()
->mapWithKeys(function ($item) use ($fields) {
$key = $item->monitored_at->toDateTimeString();
$data = collect($fields)->mapWithKeys(fn ($field) => [$field => $item[$field]])->all();
return [$key => $data];
});
break; break;
case DeviceType::WaterQuality://水质设备
$getArr = [ // 水质设备
case DeviceType::WaterQuality:
$fields = [
'chlorine', 'chlorine',
'conductivity', 'conductivity',
'oxygen', 'oxygen',
@ -502,62 +531,96 @@ class DeviceController extends Controller
'temperature', 'temperature',
'turbidity', 'turbidity',
]; ];
if($diffDays) { /** @var \Illuminate\Support\Collection */
$modelQuery = WaterQualityMonitoringDailyLog::query()->whereBetween('monitored_at', [$startTime, $endTime]); $monitoringLogs = (
}else{ $isSameDay
$modelQuery = WaterQualityMonitoringLog::query()->whereDate('monitored_at', $day); ? WaterQualityMonitoringLog::query()
} : WaterQualityMonitoringDailyLog::query()
)
->where('device_id', $device->id)
->whereBetween('monitored_at', [$startTime, $endTime])
->get()
->mapWithKeys(function ($item) use ($fields) {
$key = $item->monitored_at->toDateTimeString();
$data = collect($fields)->mapWithKeys(fn ($field) => [$field => $item[$field]])->all();
return [$key => $data];
});
break;
// 杀虫灯
case DeviceType::InsecticidalLamp:
$fields = [
'battery_vol',
'killed_num',
'air_temperature',
'air_humidity',
'solar_panel_vol',
'high_vol',
];
/** @var \Illuminate\Support\Collection */
$monitoringLogs = (
$isSameDay
? InsecticidalLampReport::query()
: InsecticidalLampDailyReport::query()
)
->where('device_id', $device->id)
->whereBetween('reported_at', [$startTime, $endTime])
->get()
->mapWithKeys(function ($item) use ($fields) {
$key = $item->reported_at->toDateTimeString();
$data = collect($fields)->mapWithKeys(fn ($field) => [$field => $item[$field]])->all();
return [$key => $data];
});
break; break;
} }
if($modelQuery){
$datalist = $modelQuery->where('device_id', $deviceId)->get()->keyBy('monitored_at')->toArray(); return $this->json(
} collect($fields)->mapWithKeys(function ($field) use ($device, $monitoringLogs, $isSameDay, $startTime, $endTime) {
$data = []; $data = [];
foreach ($getArr as $column){
$data[$column] = []; $beginTime = $startTime->copy();
$_value = null;
foreach($xKeys as $key){ do {
if($device->type == DeviceType::WaterQuality){//如果是水质设备,则写死假数据 $key = $beginTime->toDateTimeString();
switch($column){
case 'chlorine': $monitoringLog = $monitoringLogs->get($key);
$data[$column][$key] = 0.016;
break; if (is_null($monitoringLog)) {
case 'conductivity': // 如果是水质设备,则写死假数据
$data[$column][$key] = 563 ;//电导率 if($device->type == DeviceType::WaterQuality){
break; switch($field){
case 'oxygen': case 'chlorine':
$data[$column][$key] = 0.09;//含氧量 $data[$key] = 0.016;
break; break;
case 'ph': case 'conductivity':
$data[$column][$key] = rand(750, 770) / 100; $data[$key] = rand(560, 565);//电导率
break; break;
case 'temperature': case 'oxygen':
$data[$column][$key] = rand(2400, 2600) / 100; $data[$key] = 0.09;//含氧量
break; break;
case 'turbidity': case 'ph':
$data[$column][$key] = 0.33; $data[$key] = rand(750, 770) / 100;
break; break;
case 'temperature':
$data[$key] = rand(2400, 2600) / 100;
break;
case 'turbidity':
$data[$key] = 0.33;
break;
}
} else {
$data[$key] = null;
}
} else {
$data[$key] = $monitoringLog[$field];
} }
}else{
// if($datalist[$key][$column] ?? null){//如果存在数据则暂存该值 $isSameDay ? $beginTime->addHours(1) : $beginTime->addDays(1);
// $_value = $datalist[$key][$column]; } while ($beginTime->lte($endTime));
// }
// //判断是否超过离线时间; return [$field => $data];
// if(true){//未超过, 判断和设备离线时间关系-todo })
// $data[$column][$key] = $_value; );
// }else{
$data[$column][$key] = $datalist[$key][$column] ?? null;
// }
}
}
}
//强制统一气象降雨量,日和天字段不统一问题
if(isset($data['daily_rainfall'])) {
$data['rainfall'] = $data['daily_rainfall'];
}elseif(isset($data['current_rainfall'])){
$data['rainfall'] = $data['current_rainfall'];
}
return $this->json($data);
} }
public function getFfmpegServiceIp(){ public function getFfmpegServiceIp(){