Update
parent
5c28b8c093
commit
550ea41ab7
|
|
@ -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(){
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue