*/ protected $columnTexts = [ 'temperature' => '温度', 'conductivity' => '电导率', 'humidity'=>'湿度', 'n'=>'氮', 'p'=>'磷', 'k'=>'钾', 'oxygen' => '溶解氧', 'chlorine' => '余氯', 'turbidity' => '浊度', 'ph' => 'ph值', ]; protected $columnUnit = [ 'temperature' => '℃', 'conductivity' => 'us/cm', 'humidity'=>'%RH', 'n'=>'mg/kg', 'p'=>'mg/kg', 'k'=>'mg/kg', 'oxygen' => 'mg/L', 'chlorine' => 'mg/L', 'turbidity' => 'NTU', 'ph' => '', ]; public function judgeLog(Device $device, Model $log, Carbon $reportedAt){ $slug = ''; switch ($log::class) { case SoilMonitoringLog::class://土壤监测 $slug = 'device_warning_rule_soil'; break; case WaterQualityMonitoringLog::class://水质监测 $slug = 'device_warning_rule_waterquality'; break; } $rule = Setting::where('slug', $slug)->value('value'); if($rule){ $rule = json_decode($rule, true); }else{ $rule = []; } foreach($rule as $key => $values){ $_value = $log->$key ?? null; $_warning = false; $_lv = 0; if($_value){ foreach($values as $lv => $value){//1-4级警报 foreach ($value as $item){ if($item['min'] && empty($item['max'])){//设置了最小值,未设置最大值 if($_value >= $item['min']){ $_warning = true; $_lv = $lv; break 2;//跳出2层循环 } }elseif(empty($item['min']) && $item['max']){//设置最大值,未设置最小值 if($_value < $item['max']){ $_warning = true; $_lv = $lv; break 2;//跳出2层循环 } }elseif($item['min'] && $item['max']){//最大值,最小值都有设置 if($_value >= $item['min'] && $_value < $item['max']){ $_warning = true; $_lv = $lv; break 2;//跳出2层循环 } } } } } if($_warning){//插入警报内容 $this->inLog($device->sn, $reportedAt, $log, $_lv, $key); } } } private function inLog(string $deviceSn, Carbon $reportedAt, Model $log, $lv, $column){ DeviceWarning::create([ 'device_id' => $log->device_id, 'base_id' => $log->agricultural_base_id, 'lv' => $lv, 'content' => $this->columnTexts[$column] . '达到' .$log->$column. $this->columnUnit[$column], 'linkos_device_id' => $deviceSn, 'linkos_reported_at' => $reportedAt ]); } }