resp = array( "status" => "ERR", "message" => "" ); $this->resultCode= array( 0 , " --- ", 1 ,"1 2s", 8 ,"1 3s", 4 ,"10x", 5 ,"12x", 7 ,"2 2s", 10 ,"2 of 3 2s", 11 ,"3 1s", 3 ,"4 1s", 12 ,"6x", 6 ,"7t", 9 ,"8x", 2 ,"R 4s" ); } public function now() { return date("Y-m-d H:i:s"); } public function reply() { echo json_encode($this->resp); exit; } public function get_data($from, $to, $m_qcID) { $sql = "select Nat_QcControlName, Nat_QcControlLotNumber, Nat_QcControlExpired, Nat_QcLevelName, Nat_InstrumentName, Nat_TestName, M_QcResultDate, M_QcResultValue, ifnull(Nat_QcRuleCode,'') Marking, Nat_QcMean,Nat_QcSd,Nat_QcTea, M_QcIsStat, M_QcStatMean, M_QcStatSd from m_qc_result join m_qc on M_QcResultM_QcID = M_QcID and M_QcResultIsActive = 'Y' and M_QcID = ? and M_QcResultDate >= ? and M_QcResultDate <= ? join nat_qc on M_QcNat_QcID = Nat_QcID join nat_qc_control on Nat_QcNat_QcControlID = Nat_QcControlID join nat_qc_level on Nat_QcControlNat_QcLevelID = Nat_QcLevelID join nat_instrument on Nat_QcNat_InstrumentID = Nat_InstrumentID join nat_test on Nat_QcNat_TestID = Nat_TestID left join nat_qc_rule on M_QcResultNat_QcRuleID = Nat_QcRuleID order by M_QcResultDate "; $qry = $this->db->query($sql, array($m_qcID, $from, $to)); //echo $this->db->last_query(); if (!$qry) { $this->resp["message"] = "{$this->now()} ERR : " . $this->db->error()["message"] . "\n" . "|" . $this->db->last_query() . "\n"; $this->reply(); } $rows = $qry->result_array(); $result = array(); foreach ($rows as $idx => $r) { if ($idx == 0) { $isStat = $r["M_QcIsStat"] == "Y"; $result = array( "control" => $r["Nat_QcControlName"], "level" => $r["Nat_QcLevelName"], "lotNumber" => $r["Nat_QcControlLotNumber"], "instrument" => $r["Nat_InstrumentName"], "ed" => $r["Nat_QcControlExpired"], "test" => $r["Nat_TestName"], "mean" => $isStat ? $r["M_QcStatMean"] : $r["Nat_QcMean"], "sd" => $isStat ? $r["M_QcStatSd"] : $r["Nat_QcSd"], "tea" => $r["Nat_QcTea"], "value" => array(), "mark" => array(), "date" => array() ); } $result["date"][] = $r["M_QcResultDate"]; $result["value"][] = $r["M_QcResultValue"]; $result["mark"][] = $r["Marking"]; } return $result; } public function data($from, $to, $p_ids) { $result = array(); $ids = explode("-", $p_ids); foreach ($ids as $id) { $result[] = $this->get_data($from, $to, $id); } $this->resp["status"] = "OK"; $this->resp["data"] = $result; $this->reply(); } public function calc_multi($from, $to, $ids, $xruleID="",$is_debug = false) { $a_id = explode("-", $ids); $ids = implode(",", $a_id); $ruleIDs = explode("-",$xruleID); print_r($a_id); echo "
"; print_r($ids); echo "
"; echo "ruleIDs"; print_r($ruleIDs); echo "
"; $sql = "select M_QcResultID, M_QcResultDate, M_QcResultValue, if(M_QcIsStat = 'N', Nat_QcMean, M_QcStatMean ) Nat_QcMean, if(M_QcIsStat = 'N', Nat_QcSd, M_QcStatSd ) Nat_QcSd, Nat_QcTea from m_qc_result join m_qc on M_QcResultM_QcID = M_QcID and M_QcIsActive = 'Y' join nat_qc on M_QcNat_QcID = Nat_QcID and Nat_QcIsActive = 'Y' join nat_qc_control on Nat_QcNat_QcControlID = Nat_QcControlID where M_QcResultM_QcID in ($ids) and M_QcResultIsActive = 'Y' and M_QcResultDate >= ? and M_QcResultDate <= ? order by M_QcResultDate, Nat_QcControlNat_QcLevelID"; $qry = $this->db->query($sql, array($from,$to)); if (!$qry) { $this->resp["message"] = "{$this->now()} ERR : " . $this->db->error()["message"] . "\n" . "|" . $this->db->last_query() . "\n"; $this->reply(); } // echo $this->db->last_query(); echo "
"; $rows = $qry->result_array(); echo "
";
        echo count($rows);
        echo "\n";
        foreach ($rows as $idx => $r) {
            $mean = $r["Nat_QcMean"];
            $sd = $r["Nat_QcSd"];
            $TEa = $r["Nat_QcTea"];
            $value = $r["M_QcResultValue"];
            $id = $r["M_QcResultID"];
            $date = $r["M_QcResultDate"];
            $ruleID = 0;
            
            echo "loop check -> idx: $idx, resultID: $id , date: $date \n";
            if ($ruleID == 0 && $idx >= 0) {
                // r 1_3s
                if ($ruleID == 0) {
                    if (in_array(8, $ruleIDs)) {
                        $ruleID = $this->is_1_3s($idx, $value, $mean, $sd, $rows, $ruleIDs);
                        echo "checking 1_3s :";
                        echo $ruleID;
                        echo "
"; } } // r 2_2s if ($ruleID == 0 && $idx >= 1) { if (in_array(7, $ruleIDs)) { $xruleID = $this->is_2_2s($idx, $value, $mean, $sd, $rows,$ruleIDs); $cur_date = $rows[$idx]["M_QcResultDate"]; $prev_date = $rows[$idx-1]["M_QcResultDate"]; if (($xruleID > 0 && $ruleID <= 1) && ($cur_date == $prev_date)) { $ruleID = $xruleID; } echo "checking 2_2s :"; echo $ruleID; echo "
"; } } // r 4s if ($ruleID == 0 && $idx >= 1) { if (in_array(2, $ruleIDs)) { $xruleID = $this->is_r_4s($idx, $value, $mean, $sd, $rows,$ruleIDs); $cur_date = $rows[$idx]["M_QcResultDate"]; $prev_date = $rows[$idx-1]["M_QcResultDate"]; if (($xruleID > 0 && $ruleID <= 1) && ($cur_date == $prev_date)) { $ruleID = $xruleID; } echo "checking r_4s :"; echo $ruleID; echo "
"; } } // r 3_1s if ($ruleID == 0 && $idx >= 2) { if (in_array(11, $ruleIDs)) { $ruleID = $this->is_3_1s($idx, $value, $mean, $sd, $rows,$ruleIDs); echo "checking 3_1s :"; echo $ruleID; echo "
"; } } // r 2 of 3_2s if ($ruleID == 0 && $idx >= 2 ) { if (in_array(10,$ruleIDs)) { $ruleID = $this->is_2_of_3_2s($idx, $value, $mean, $sd, $rows,$ruleIDs); echo "checking 2_of_3_2s :"; echo $ruleID; echo "
"; } } // r 4_1s if ($ruleID == 0 && $idx >= 3) { if (in_array(3, $ruleIDs)) { $xruleID = $this->is_4_1s($idx, $value, $mean, $sd, $rows,$ruleIDs); $date = $rows[$idx]["M_QcResultDate"]; $date1 = $rows[$idx-1]["M_QcResultDate"]; $date2 = $rows[$idx-2]["M_QcResultDate"]; $date3 = $rows[$idx-3]["M_QcResultDate"]; if (($xruleID > 0 && $ruleID <= 0) && ($date == $date1) && ($date2 == $date3)) { $ruleID = $xruleID; } echo "checking 4_1s :"; echo $ruleID; echo "
"; } } // r 6x if ($ruleID == 0 && $idx >= 5) { if (in_array(12,$ruleIDs)) { $ruleID = $this->is_6x($idx, $value, $mean, $sd, $rows,$ruleIDs); $dates = []; for ($i = 0; $i <= 5; $i++) { $dates[$i] = $rows[$idx-$i]["M_QcResultDate"]; } if ( ($xruleID > 0 && $ruleID <= 0) && ($dates[0] == $dates[1]) && ($dates[2] == $dates[3]) && ($dates[4] == $dates[5]) ) { $ruleID = $xruleID; } echo "checking 6x :"; echo $ruleID; echo "
"; } } // r 7t if ($ruleID == 0 && $idx >= 6) { if (in_array(6,$ruleIDs)) { $ruleID = $this->is_7t($idx, $value, $mean, $sd, $rows,$ruleIDs); echo "checking 7t :"; echo $ruleID; echo "
"; } } // r 8x if ($ruleID == 0 && $idx >= 7) { if (in_array(9,$ruleIDs)) { $xruleID = $this->is_8x($idx, $value, $mean, $sd, $rows,$ruleIDs); $dates = []; for ($i = 0; $i <= 7; $i++) { $dates[$i] = $rows[$idx-$i]["M_QcResultDate"]; } if ( ($xruleID > 0 && $ruleID <= 0) && ($dates[0] == $dates[1]) && ($dates[2] == $dates[3]) && ($dates[4] == $dates[5]) && ($dates[6] == $dates[7]) ) { $ruleID = $xruleID; } echo "checking 8x :"; echo $ruleID; echo "
"; } } // r 10x if ($ruleID == 0 && $idx >= 9) { if (in_array(4,$ruleIDs)) { $ruleID = $this->is_10x($idx, $value, $mean, $sd, $rows,$ruleIDs); $dates = []; for ($i = 0; $i <= 9; $i++) { $dates[$i] = $rows[$idx-$i]["M_QcResultDate"]; } if ( ($xruleID > 0 && $ruleID <= 0) && ($dates[0] == $dates[1]) && ($dates[2] == $dates[3]) && ($dates[4] == $dates[5]) && ($dates[6] == $dates[7]) && ($dates[8] == $dates[9]) ) { $ruleID = $xruleID; } echo "checking 10x :"; echo $ruleID; echo "
"; } } // r 12x if ($ruleID == 0 && $idx >= 11) { if (in_array(5,$ruleIDs)) { $ruleID = $this->is_12x($idx, $value, $mean, $sd, $rows,$ruleIDs); $dates = []; for ($i = 0; $i <= 11; $i++) { $dates[$i] = $rows[$idx-$i]["M_QcResultDate"]; } if ( ($xruleID > 0 && $ruleID <= 0) && ($dates[0] == $dates[1]) && ($dates[2] == $dates[3]) && ($dates[4] == $dates[5]) && ($dates[6] == $dates[7]) && ($dates[8] == $dates[9]) && ($dates[10] == $dates[11]) ) { $ruleID = $xruleID; } echo "checking 12x :"; echo $ruleID; echo "
"; } } // r 1_2s if ($ruleID == 0) { if (in_array(1, $ruleIDs)) { $ruleID = $this->is_1_2s($idx, $value, $mean, $sd, $rows, $ruleIDs); echo "checking 1_2s :"; echo $ruleID; echo "
"; } } } else { $ruleID = $this->is_1_2s($idx, $value, $mean, $sd, $rows, $ruleIDs); } if ($is_debug) { echo "
";
                echo "---------\n";
                echo "Idx : $idx, Value : $value, Mean : $mean, Sd : $sd  => RuleID result : " . $this->resultCode[$ruleID] . "\n";
                echo "Rows Value : " ; print_r($rows);
                echo "\nrulesIDs : " ; print_r($tuleIDs);
                echo "\n\n";
                echo "
"; } $sql = "update m_qc_result set M_QcResultNat_QcRuleID = ? where M_QcResultID = ? "; $qry = $this->db->query($sql, array($ruleID,$id)); if (!$qry) { $this->resp["message"] = "{$this->now()} ERR : " . $this->db->error()["message"] . "\n" . "|" . $this->db->last_query() . "\n"; $this->reply(); } } $this->resp["status"] = "OK"; $this->reply(); } public function calc($from= null, $to= null, $qcID= null, $xruleID="",$is_debug = false) { $COUNT_THRESHOLD = 90; $ruleIDs = explode("-",$xruleID); $sql = "select count(*) count, avg(M_QcResultValue) mean, STDDEV_SAMP(M_QcResultValue) sd from m_qc_result where M_QcResultM_QcID = ? and M_QcResultIsActive = 'Y' and M_QcResultDate >= ? and M_QcResultDate <= ?"; $qry = $this->db->query($sql, array($qcID,$from,$to)); if (!$qry) { $this->resp["message"] = "{$this->now()} ERR : " . $this->db->error()["message"] . "\n" . "|" . $this->db->last_query() . "\n"; $this->reply(); } $rows = $qry->result_array(); $count_act = $rows[0]["count"]; $sd_act = $rows[0]["sd"]; $mean_act = $rows[0]["mean"]; //Sementara TEa di abaikan if ($count_act > $COUNT_THRESHOLD) { $sql = "update m_qc set M_QcIsStat = 'Y', M_QcStatSd = ?, M_QcStatMean = ? where M_QcID = ? and M_QcResultDate >= ? and M_QcResultDate <= ?"; $this->db->query($sql, array($sd_act,$mean_act,$qcID,$from,$to)); if (!$qry) { $this->resp["message"] = "{$this->now()} ERR : " . $this->db->error()["message"] . "\n" . "|" . $this->db->last_query() . "\n"; $this->reply(); } } else { $sql = "update m_qc set M_QcIsStat = 'N' where M_QcID = ?"; $this->db->query($sql, array($qcID)); if (!$qry) { $this->resp["message"] = "{$this->now()} ERR : " . $this->db->error()["message"] . "\n" . "|" . $this->db->last_query() . "\n"; $this->reply(); } } //reset M_QcResultNat_QcRuleID $sql = "update m_qc_result set M_QcResultNat_QcRuleID = 0 where M_QcResultM_QcID = ? and M_QcResultIsActive = 'Y' and M_QcResultDate >= ? and M_QcResultDate <= ? "; $qry = $this->db->query($sql, array($qcID,$from,$to)); if (!$qry) { $this->resp["message"] = "{$this->now()} ERR Reset Nat_QcRuleID : " . $this->db->error()["message"] . "\n" . "|" . $this->db->last_query() . "\n"; $this->reply(); } $sql = "select M_QcResultID, M_QcResultDate, M_QcResultValue, Nat_QcMean, Nat_QcSd, Nat_QcTea from m_qc_result join m_qc on M_QcResultM_QcID = M_QcID and M_QcIsActive = 'Y' join nat_qc on M_QcNat_QcID = Nat_QcID and Nat_QcIsActive = 'Y' where M_QcResultM_QcID = ? and M_QcResultIsActive = 'Y' and M_QcResultDate >= ? and M_QcResultDate <= ? order by M_QcResultDate"; $qry = $this->db->query($sql, array($qcID,$from,$to)); if (!$qry) { $this->resp["message"] = "{$this->now()} ERR : " . $this->db->error()["message"] . "\n" . "|" . $this->db->last_query() . "\n"; $this->reply(); } $rows = $qry->result_array(); foreach ($rows as $idx => $r) { $mean = $r["Nat_QcMean"]; $sd = $r["Nat_QcSd"]; $TEa = $r["Nat_QcTea"]; if ($count_act > $COUNT_THRESHOLD) { $mean = $mean_act; $sd = $sd_act; } $value = $r["M_QcResultValue"]; $id = $r["M_QcResultID"]; $date = $r["M_QcResultDate"]; $ruleID = 0; echo "
";
            echo "loop check -> idx: $idx, resultID: $id , date: $date \n";
            if ($ruleID == 0 && $idx >= 0) {
                // r 1_3s
                if ($ruleID == 0) {
                    if (in_array(8, $ruleIDs)) {
                        $ruleID = $this->is_1_3s($idx, $value, $mean, $sd, $rows, $ruleIDs);
                        echo "checking 1_3s :";
                        echo $ruleID;
                        echo "
"; } } // r 2_2s if ($ruleID == 0 && $idx >= 1) { if (in_array(7, $ruleIDs)) { $ruleID = $this->is_2_2s($idx, $value, $mean, $sd, $rows,$ruleIDs); echo "checking 2_2s :"; echo $ruleID; echo "
"; } } // r 4s if ($ruleID == 0 && $idx >= 1) { if (in_array(2, $ruleIDs)) { $ruleID = $this->is_r_4s($idx, $value, $mean, $sd, $rows,$ruleIDs); echo "checking r_4s :"; echo $ruleID; echo "
"; } } // r 3_1s if ($ruleID == 0 && $idx >= 2) { if (in_array(11, $ruleIDs)) { $ruleID = $this->is_3_1s($idx, $value, $mean, $sd, $rows,$ruleIDs); echo "checking 3_1s :"; echo $ruleID; echo "
"; } } // r 2 of 3_2s if ($ruleID == 0 && $idx >= 2 ) { if (in_array(10,$ruleIDs)) { $ruleID = $this->is_2_of_3_2s($idx, $value, $mean, $sd, $rows,$ruleIDs); echo "checking 2_of_3_2s :"; echo $ruleID; echo "
"; } } // r 4_1s if ($ruleID == 0 && $idx >= 3) { if (in_array(3, $ruleIDs)) { $ruleID = $this->is_4_1s($idx, $value, $mean, $sd, $rows,$ruleIDs); echo "checking 4_1s :"; echo $ruleID; echo "
"; } } // r 6x if ($ruleID == 0 && $idx >= 5) { if (in_array(12,$ruleIDs)) { $ruleID = $this->is_6x($idx, $value, $mean, $sd, $rows,$ruleIDs); echo "checking 6x :"; echo $ruleID; echo "
"; } } // r 7t if ($ruleID == 0 && $idx >= 6) { if (in_array(6,$ruleIDs)) { $ruleID = $this->is_7t($idx, $value, $mean, $sd, $rows,$ruleIDs); echo "checking 7t :"; echo $ruleID; echo "
"; } } // r 8x if ($ruleID == 0 && $idx >= 7) { if (in_array(9,$ruleIDs)) { $ruleID = $this->is_8x($idx, $value, $mean, $sd, $rows,$ruleIDs); echo "checking 8x :"; echo $ruleID; echo "
"; } } // r 10x if ($ruleID == 0 && $idx >= 9) { if (in_array(4,$ruleIDs)) { $ruleID = $this->is_10x($idx, $value, $mean, $sd, $rows,$ruleIDs); echo "checking 10x :"; echo $ruleID; echo "
"; } } // r 12x if ($ruleID == 0 && $idx >= 11) { if (in_array(5,$ruleIDs)) { $ruleID = $this->is_12x($idx, $value, $mean, $sd, $rows,$ruleIDs); echo "checking 12x :"; echo $ruleID; echo "
"; } } // r 1_2s if ($ruleID == 0) { if (in_array(1, $ruleIDs)) { $ruleID = $this->is_1_2s($idx, $value, $mean, $sd, $rows, $ruleIDs); echo "checking 1_2s :"; echo $ruleID; echo "
"; } } } else { $ruleID = $this->is_1_2s($idx, $value, $mean, $sd, $rows,$ruleIDs); } if ($is_debug) { echo "
";
                echo "---------\n";
                echo "Idx : $idx, Value : $value, Mean : $mean, Sd : $sd  => RuleID result " . $this->resultCode[$ruleID] . "\n";
                echo "Rows Value : " ; print_r($rows);
                echo "\nrulesIDs : " ; print_r($tuleIDs);
                echo "\n\n";
                echo "
"; } $sql = "update m_qc_result set M_QcResultNat_QcRuleID = ? where M_QcResultID = ? and M_QcResultDate >= ? and M_QcResultDate <= ?"; $qry = $this->db->query($sql, array($ruleID,$id,$from,$to)); if (!$qry) { $this->resp["message"] = "{$this->now()} ERR : " . $this->db->error()["message"] . "\n" . "|" . $this->db->last_query() . "\n"; $this->reply(); } } $this->resp["status"] = "OK"; $this->reply(); } // rule // 1 : 1 2s public function is_1_2s($idx, $value, $mean, $sd, $rows, $ruleIDs) { if(! in_array(1,$ruleIDs)) return 0; //echo "$value | $mean | $sd \n"; if ($value < $mean - 2 * $sd || $value > $mean + 2*$sd) { return 1; } return 0; } // 8 : 1 3s public function is_1_3s($idx, $value, $mean, $sd, $rows, $ruleIDs) { //echo "$value | $mean | $sd \n"; if(! in_array(8,$ruleIDs)) return 0; if ($value < $mean - 3 * $sd || $value > $mean + 3*$sd) { return 8; } return 0; } // 7 : 2 2s public function is_2_2s($idx, $value, $mean, $sd, $rows, $ruleIDs) { if(! in_array(7,$ruleIDs)) return 0; $prev_value = $rows[$idx-1]["M_QcResultValue"]; # edit -> add prev mean and sd (in case prev mean and sd has different value (multi level)) $prev_mean = $rows[$idx-1]["Nat_QcMean"]; $prev_sd = $rows[$idx-1]["Nat_QcSd"]; # edit => add limit 3SD if (($mean - 3 * $sd < $value && $value < $mean - 2 * $sd) && ($prev_mean - 3 * $prev_sd < $prev_value && $prev_value < $prev_mean - 2 * $prev_sd)) { return 7; } if (($mean + 3 * $sd > $value && $value > $mean + 2 * $sd) && ($prev_mean + 3 * $prev_sd > $prev_value && $prev_value > $prev_mean + 2 * $prev_sd)) { return 7; } return 0; } // 2 : R 4s public function is_R_4s($idx, $value, $mean, $sd, $rows, $ruleIDs) { if(! in_array(2,$ruleIDs)) return 0; $prev_value = $rows[$idx-1]["M_QcResultValue"]; # edit -> add prev mean and sd (in case prev mean and sd has different value (multi level)) $prev_mean = $rows[$idx-1]["Nat_QcMean"]; $prev_sd = $rows[$idx-1]["Nat_QcSd"]; # edit -> add limit 3SD if (($value > $mean - 3 * $sd && $value < $mean - 2 * $sd) && ($prev_value < $prev_mean + 3 * $prev_sd && $prev_value > $prev_mean + 2 * $prev_sd)) { return 2; } if (($value < $mean + 3 * $sd && $value > $mean + 2 * $sd) && ($prev_value > $prev_mean - 3 * $prev_sd && $prev_value < $prev_mean - 2 * $prev_sd)) { return 2; } return 0; } // 3 : 4 1s public function is_4_1s($idx, $value, $mean, $sd, $rows, $ruleIDs) { $result = 0; $values = []; $means = []; $sds = []; for ($i = 1; $i <= 3; $i++) { $values[$i] = $rows[$idx-$i]["M_QcResultValue"]; $means[$i] = $rows[$idx-$i]["Nat_QcMean"]; $sds[$i] = $rows[$idx-$i]["Nat_QcSd"]; } $upper = true; $lower = true; for ($i = 1; $i <= 3; $i++) { $upper &= ($values[$i] < $means[$i] + 2*$sds[$i] && $values[$i] > $means[$i] + $sds[$i]); $lower &= ($values[$i] > $means[$i] - 2*$sds[$i] && $values[$i] < $means[$i] - $sds[$i]); } $upper &= ($value < $mean + 2*$sd && $value > $mean + $sd); $lower &= ($value > $mean - 2*$sd && $value < $mean - $sd); if ($upper || $lower) { $result = 3; } return $result; } // 6 : 7t public function is_7t($idx, $value, $mean, $sd, $rows, $ruleIDs) { if(! in_array(6,$ruleIDs)) return 0; $values = []; for ($i = 1; $i <= 6; $i++) { $values[$i] = $rows[$idx-$i]["M_QcResultValue"]; } $increasing = true; $decreasing = true; for ($i = 1; $i < 6; $i++) { $increasing &= ($values[$i] < $values[$i+1]); $decreasing &= ($values[$i] > $values[$i+1]); } $increasing &= ($values[6] < $value); $decreasing &= ($values[6] > $value); if ($increasing || $decreasing) { return 6; } return 0; } // 9 : 8x public function is_8x($idx, $value, $mean, $sd, $rows, $ruleIDs) { if(! in_array(9,$ruleIDs)) return 0; $result = 0; $prev_values = []; $prev_means = []; $prev_sds = []; for ($i=1; $i <= 7 ; $i++) { $prev_values[$i] = $rows[$idx-$i]["M_QcResultValue"]; $prev_means[$i] = $rows[$idx-$i]["Nat_QcMean"]; $prev_sds[$i] = $rows[$idx-$i]["Nat_QcSd"]; } $upper = true; $lower = true; for ($i=1; $i <=7 ; $i++) { $upper &= ($prev_values[$i] < $prev_means[$i] + 3*$prev_sds[$i] && $prev_values[$i] > $prev_means[$i]); $lower &= ($prev_values[$i] > $prev_means[$i] - 3*$prev_sds[$i] && $prev_values[$i] < $prev_means[$i]); } $upper &= ($value < $mean + 3*$sd && $value > $mean); $lower &= ($value > $mean - 3*$sd && $value < $mean); if ($upper || $lower) { $result = 9; } return $result; } // 4 : 10x public function is_10x($idx, $value, $mean, $sd, $rows, $ruleIDs) { if(! in_array(4,$ruleIDs)) return 0; $result = 0; $prev_values = []; $prev_means = []; $prev_sds = []; for ($i=1; $i <= 9 ; $i++) { $prev_values[$i] = $rows[$idx-$i]["M_QcResultValue"]; $prev_means[$i] = $rows[$idx-$i]["Nat_QcMean"]; $prev_sds[$i] = $rows[$idx-$i]["Nat_QcSd"]; } $upper = true; $lower = true; for ($i=1; $i <=9 ; $i++) { $upper &= ($prev_values[$i] < $prev_means[$i] + 3*$prev_sds[$i] && $prev_values[$i] > $prev_means[$i]); $lower &= ($prev_values[$i] > $prev_means[$i] - 3*$prev_sds[$i] && $prev_values[$i] < $prev_means[$i]); } $upper &= ($value < $mean + 3*$sd && $value > $mean); $lower &= ($value > $mean - 3*$sd && $value < $mean); if ($upper || $lower) { $result = 4; } return $result; } // 5 : 12x public function is_12x($idx, $value, $mean, $sd, $rows, $ruleIDs) { if(! in_array(5,$ruleIDs)) return 0; $result = 0; $prev_values = []; $prev_means = []; $prev_sds = []; for ($i=1; $i <= 11 ; $i++) { $prev_values[$i] = $rows[$idx-$i]["M_QcResultValue"]; $prev_means[$i] = $rows[$idx-$i]["Nat_QcMean"]; $prev_sds[$i] = $rows[$idx-$i]["Nat_QcSd"]; } $upper = true; $lower = true; for ($i=1; $i <=11 ; $i++) { $upper &= ($prev_values[$i] < $prev_means[$i] + 3*$prev_sds[$i] && $prev_values[$i] > $prev_means[$i]); $lower &= ($prev_values[$i] > $prev_means[$i] - 3*$prev_sds[$i] && $prev_values[$i] < $prev_means[$i]); } $upper &= ($value < $mean + 3*$sd && $value > $mean); $lower &= ($value > $mean - 3*$sd && $value < $mean); if ($upper || $lower) { $result = 5; } return $result; } // 10 : 2 of 3-2s public function is_2_of_3_2s($idx, $value, $mean, $sd, $rows, $ruleIDs) { if(! in_array(10,$ruleIDs)) return 0; $value2 = $rows[$idx-8]["M_QcResultValue"]; $value1 = $rows[$idx-9]["M_QcResultValue"]; $val_2sd = $mean + 2 * $sd; $val_2sd_neg = $mean - 2 * $sd; $tot_2s = 0 ; if ($value > $val_2sd) $tot_2s++; if ($value1 > $val_2sd) $tot_2s++; if ($value1 > $val_2sd) $tot_2s++; if ($tot_2s >= 2 ) return 10; $tot_2s = 0; if ($value < $val_2sd_neg ) $tot_2s++; if ($value1 < $val_2sd_neg ) $tot_2s++; if ($value2 < $val_2sd_neg ) $tot_2s++; if ($tot_2s >= 2 ) return 10; return 0; } // 11 : 3 1s public function is_3_1s($idx, $value, $mean, $sd, $rows, $ruleIDs) { if(! in_array(11,$ruleIDs)) return 0; $result = 0; $values = []; $means = []; $sds = []; for ($i = 1; $i <= 2; $i++) { $values[$i] = $rows[$idx-$i]["M_QcResultValue"]; $means[$i] = $rows[$idx-$i]["Nat_QcMean"]; $sds[$i] = $rows[$idx-$i]["Nat_QcSd"]; } $upper = true; $lower = true; for ($i = 1; $i <= 2; $i++) { $upper &= ($values[$i] < $means[$i] + 2*$sds[$i] && $values[$i] > $means[$i] + $sds[$i]); $lower &= ($values[$i] > $means[$i] - 2*$sds[$i] && $values[$i] < $means[$i] - $sds[$i]); } $upper &= ($value < $mean + 2*$sd && $value > $mean + $sd); $lower &= ($value > $mean - 2*$sd && $value < $mean - $sd); if ($upper || $lower) { $result = 11; } return $result; } //12 : 6x public function is_6x($idx, $value, $mean, $sd, $rows, $ruleIDs) { if(! in_array(12,$ruleIDs)) return 0; $result = 0; $prev_values = []; $prev_means = []; $prev_sds = []; for ($i=1; $i <= 5 ; $i++) { $prev_values[$i] = $rows[$idx-$i]["M_QcResultValue"]; $prev_means[$i] = $rows[$idx-$i]["Nat_QcMean"]; $prev_sds[$i] = $rows[$idx-$i]["Nat_QcSd"]; } $upper = true; $lower = true; for ($i=1; $i <=5 ; $i++) { $upper &= ($prev_values[$i] < $prev_means[$i] + 3*$prev_sds[$i] && $prev_values[$i] > $prev_means[$i]); $lower &= ($prev_values[$i] > $prev_means[$i] - 3*$prev_sds[$i] && $prev_values[$i] < $prev_means[$i]); } $upper &= ($value < $mean + 3*$sd && $value > $mean); $lower &= ($value > $mean - 3*$sd && $value < $mean); if ($upper || $lower) { $result = 12; } return $result; } }