添加监测数据统计接口

dev
vine_liutk 2022-11-09 15:46:46 +08:00
parent fc92a35521
commit 7a574df4fc
2 changed files with 99 additions and 0 deletions

View File

@ -9,10 +9,14 @@ use App\Http\Requestes\DeviceRequest;
use App\Http\Resources\DeviceResource;
use App\Models\Device;
use App\Models\MeteorologicalMonitoringLog;
use App\Models\MeteorologicalMonitoringDailyLog;
use App\Models\SoilMonitoringLog;
use App\Models\SoilMonitoringDailyLog;
use App\Models\WaterQualityMonitoringLog;
use App\Models\WaterQualityMonitoringDailyLog;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;
class DeviceController extends Controller
{
@ -218,4 +222,98 @@ class DeviceController extends Controller
return $this->json($data);
}
/**
* 查询设备今天(按天),近一周(按天),近一个月(按天)
*/
public function timeZoneList(Request $request){
$deviceId = $request->input('device_id');
//不传开始时间,结束时间,则默认是查当天(按小时)
$startTime = $request->input('start_time');
$endTime = $request->input('end_time');
$diffDays = 0;
//如果传了开始时间和结束时间,计算中间天数
if($startTime && $endTime){
$startDay = Carbon::parse($startTime);
$endDay = Carbon::parse($endTime);
$diffDays = $startDay->diffInDays($endDay, false);
}
$xKeys = [];
if($diffDays){
for ($i = 0; $i<=$diffDays; $i++) {
$xKeys[] =(clone $startDay)->addDays($i)->startOfDay()->format('Y-m-d H:i:s');
}
}else{
for ($i = 0; $i < 24; $i++) {
$xKeys[] = date('Y-m-d').' '.str_pad($i, 2, '0', STR_PAD_LEFT).':00:00';
}
}
$device = Device::find($deviceId);
$dataList = null;
$getArr = [];
switch ($device->type) {
case DeviceType::Meteorological://气象设备
$getArr = [
'wind_speed',
'wind_direction',
'wind_degree',
'air_humidity',
'air_temperature',
'air_pressure',
'co2',
'noise',
'illumination',
'daily_rainfall',
'pm25',
'pm10',
];
if($diffDays) {
$modelQuery = MeteorologicalMonitoringDailyLog::query()->whereBetween('monitored_at', [$startTime, $endTime]);
}else{
$modelQuery = MeteorologicalMonitoringLog::query()->whereDate('monitored_at', now());
}
break;
case DeviceType::Soil://土壤设备
$getArr = [
'conductivity',
'humidity',
'temperature',
'n',
'p',
'k',
];
if($diffDays) {
$modelQuery = SoilMonitoringDailyLog::query()->whereBetween('monitored_at', [$startTime, $endTime]);
}else{
$modelQuery = SoilMonitoringLog::query()->whereDate('monitored_at', now());
}
break;
case DeviceType::WaterQuality://水质设备
$getArr = [
'chlorine',
'conductivity',
'oxygen',
'ph',
'temperature',
'turbidity',
];
if($diffDays) {
$modelQuery = WaterQualityMonitoringDailyLog::query()->whereBetween('monitored_at', [$startTime, $endTime]);
}else{
$modelQuery = WaterQualityMonitoringLog::query()->whereDate('monitored_at', now());
}
break;
}
if($modelQuery){
$datalist = $modelQuery->where('device_id', $deviceId)->get()->keyBy('monitored_at')->toArray();
}
foreach ($getArr as $column){
$data[$column] = [];
foreach($xKeys as $key){
$data[$column][$key] = $datalist[$key][$column] ?? null;
}
}
return $this->json($data);
}
}

View File

@ -47,6 +47,7 @@ Route::group(['middleware' => 'auth:sanctum'], function () {
//设备管理
Route::apiResource('devices', DeviceController::class)->names('device');
Route::get('devices-num', [DeviceController::class, 'typeStatusNum'])->name('device.type_status_num');
Route::get('monitoring-data', [DeviceController::class, 'timeZoneList']);
//设备警报配置
Route::get('device-warning-rules', [DeviceWarningController::class, 'rules']); //预警规则
Route::put('device-warning-rules', [DeviceWarningController::class, 'updateRule']); //预警规则