returnDays($data['time'], false); if($day > 31) return [false, '查询时间仅支持范围区间在31天内']; $process_time = []; $result = SystemL::where('time','>=',$data['time'][0]) ->where('time','<',$data['time'][1]) ->where('data_point_name',SystemL::standBy) ->select('device_name','time','value') ->get()->toArray(); //所有的时间 $time_all = []; foreach ($result as $value){ $time = date('Y-m-d',$value['time'] / 1000); //工作 运行次数 if(isset($process_time[$value['device_name']][$time])){ $process_time[$value['device_name']][$time] += 1; }else{ $process_time[$value['device_name']][$time] = 1; } if(! in_array($time, $time_all)) $time_all[] = $time; } sort($time_all); //数据结构模型 foreach (SystemL::$device as $k => $v){ if(isset($process_time[$k])){ foreach ($time_all as $t){ if(! isset($process_time[$k][$t])){ $process_time[$k][$t] = 0; } } }else{ foreach ($time_all as $t){ $process_time[$k][$t] = 0; } } } $return = []; foreach ($process_time as $key => $value){ $tmp['title'] = $key; $tmp['list'] = []; foreach ($value as $k => $v){ $tmp['list'][] = [ 'time' => $k, 'num' => $v ]; } $return[] = $tmp; } return [true, $return]; } /** * 数据OEE分析图 * @param $data * @return array */ public function deviceStatisticsReportOEEChart($data){ if(empty($data['time'][0]) || empty($data['time'][1])) return [false, '时间必须选择!']; $day = $this->returnDays($data['time'], false); if($day > 31) return [false, '查询时间仅支持范围区间在31天内']; //获取数据 $result = SystemL::where('time','>=',$data['time'][0]) ->where('time','<',$data['time'][1]) ->select('device_name','time','value','data_point_name') ->get()->toArray(); if(empty($result)) return [true,[]]; $device_name = array_values(array_unique(array_column($result,'device_name'))); $run_time = $process_time = $fault = $time_all = []; foreach ($result as $value){ $time = date("Y-m-d",$value['time'] / 1000); if($value['data_point_name'] == SystemL::run || $value['data_point_name'] == SystemL::standBy){ //运行次数 if(isset($run_time[$value['device_name']][$time])){ $run_time[$value['device_name']][$time] += 1; }else{ $run_time[$value['device_name']][$time] = 1; } } if($value['data_point_name'] == SystemL::standBy){ //工作次数 if(isset($process_time[$value['device_name']][$time])){ $process_time[$value['device_name']][$time] += 1; }else{ $process_time[$value['device_name']][$time] = 1; } } if($value['data_point_name'] == SystemL::stop){ //故障次数 if(isset($fault[$value['device_name']][$time])){ $fault[$value['device_name']][$time] += 1; }else{ $fault[$value['device_name']][$time] = 1; } } if(! in_array($time, $time_all)) $time_all[] = $time; } sort($time_all); //组织模型 返回大致的数据结构 $models = []; foreach (SystemL::$device as $k => $v){ foreach ($time_all as $t){ $models[$k][$t] = 0; } } //填充模型里的数据 foreach ($device_name as $value){//设备名 foreach ($time_all as $d_val){ //运行次数 $run_num = $run_time[$value][$d_val] ?? 0; //工作次数 $process_num = $process_time[$value][$d_val] ?? 0; //故障次数 $fault_tmp = $fault[$value][$d_val] ?? 0; //运行时间 $run_time_tmp = $this->calTimeReturnMin($run_num); //工作时间 $process_time_tmp = $this->calTimeReturnMin($process_num); //故障时间 $fault_time_tmp = $this->calTimeReturnMin($fault_tmp); //计划运行时间 工作时间 - 计划停机 //实际运行时间 计划运行时间 -故障停机 - 设备调整 $true_process_time = $process_time_tmp - $fault_time_tmp; //有效率 实际/计划运行 时间 $efficient = $process_time_tmp > 0 ? number_format($true_process_time / $process_time_tmp,2) : 0; //表现性 加工数量/实际运行时间 $expressive = $true_process_time > 0 ? number_format($process_num / $true_process_time,2) : 0; //质量指数 加工数量- 废品数量 / 加工数量 $quality_index = $process_num > 0 ? number_format(($process_num - $fault_tmp) / $process_num,2) : 0; //OEE $oee = number_format($efficient * $expressive * $quality_index,2); //模型里赋值 if(isset($models[$value][$d_val])){ $models[$value][$d_val] = $oee; } } } //返回结果 $final = []; foreach ($models as $key => $value){ $tmp['title'] = $key; $tmp['list'] = []; foreach ($value as $k => $v){ $tmp['list'][] = [ 'time' => $k, 'num' => $v ]; } $final[] = $tmp; } return [true,$final]; } /** * 用于计算时间 * @param $minute * @return string */ public function calTimeReturnMin($minute){ return number_format($minute * 1.5 / 60,2); } function returnDays($time = [], $is_mirco_time = true){ // 示例时间戳 $timestamp1 = $time[0]; $timestamp2 = $time[1]; // 计算时间差 $difference = abs($timestamp2 - $timestamp1); // 将时间差转换为天数 $days = floor($difference / (60 * 60 * 24)); if($is_mirco_time) $days = $days / 1000; return $days; } }