CMXX - Initial ML training

This commit is contained in:
“VeLiTi”
2024-09-30 10:20:25 +02:00
parent e51b1986ae
commit c9717cbdf9
5 changed files with 283 additions and 31 deletions

View File

@@ -2239,24 +2239,36 @@ $messages = $stmt->fetchAll(PDO::FETCH_ASSOC);
// ML data preparations
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++
function traintotalMeasurement($messages){
function traintotalMeasurement(){
//total measurement internal array
$total_measurement = [];
include dirname(__FILE__,2).'/settings/settings.php';
foreach ($messages as $message){
//total measurement internal array
$total_measurement = [];
//Connect to DB
$pdo = dbConnect($dbname);
//GET DATA
$sql = 'SELECT h.rowID, h.description,h.equipmentid,p.productcode,e.hw_version FROM history h JOIN equipment e ON h.equipmentid = e.rowID JOIN products p ON e.productrowid = p.rowID where type="Maintenance_Test" and description like "%doubletestvalues%"';
$stmt = $pdo->prepare($sql);
$stmt->execute();
$messages = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($messages as $message){
//Cleanup input array
$dataset = json_decode($message['description'],true);
$dataset = $dataset["doubletestvalues"];
foreach ($dataset as $measure){
//Filter out correct measurements
if ($measure['pass'] === true){
$measurementid = $message['equipmentid'].'-'.$message['rowID'];
$total_measurement[$measure['name']][$measurementid] = $measure['measure'];
$hw_version = (!empty($message['hw_version']))? $message['hw_version'] : 'blank';
$measurementid = $message['rowID'];
$total_measurement[$message['productcode']][$hw_version][$measure['name']][$measurementid] = $measure['measure'];
}
}
}
return $total_measurement;
return $total_measurement;
}
function statisticalAnalyses($total_measurement){
@@ -2265,20 +2277,24 @@ function statisticalAnalyses($total_measurement){
$total_results = [];
//STATISTICAL ANALYSES INTERNAL ARRAY
foreach ($total_measurement as $key => $value){
$average = $total_results[$key]['average'] = average($value);
$median = $total_results[$key]['median'] = calculateMedian($value);
$stdev = $total_results[$key]['stdev'] = standDeviation($value);
$total_results[$key]['n'] = count($value);
foreach ($total_measurement as $productcode => $versions){
foreach ($versions as $version => $ver){
//GET STDEV -/+
$total_results[$key]['stdev-1'] = $average - $stdev;
$total_results[$key]['stdev+1'] = $average + $stdev;
$total_results[$key]['stdev-2'] = $average - (2*$stdev);
$total_results[$key]['stdev+2'] = $average + (2*$stdev);
$total_results[$key]['stdev-3'] = $average - (3*$stdev);
$total_results[$key]['stdev+3'] = $average + (3*$stdev);
}
foreach ($ver as $measurement => $value){
$average = $total_results[$productcode][$version][$measurement]['average'] = average($value);
$median = $total_results[$productcode][$version][$measurement]['median'] = calculateMedian($value);
$stdev = $total_results[$productcode][$version][$measurement]['stdev'] = standDeviation($value);
$total_results[$productcode][$version][$measurement]['n'] = count($value);
//GET STDEV -/+
$total_results[$productcode][$version][$measurement]['stdev-1'] = $average - $stdev;
$total_results[$productcode][$version][$measurement]['stdev+1'] = $average + $stdev;
$total_results[$productcode][$version][$measurement]['stdev-2'] = $average - (2*$stdev);
$total_results[$productcode][$version][$measurement]['stdev+2'] = $average + (2*$stdev);
$total_results[$productcode][$version][$measurement]['stdev-3'] = $average - (3*$stdev);
$total_results[$productcode][$version][$measurement]['stdev+3'] = $average + (3*$stdev);
}
}
}
return $total_results;
}
@@ -2429,4 +2445,178 @@ foreach ($messages as $message){
}
}
}
}
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++
// store measurement data into product_version ++++++++++
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++
function storeMeasurementProduct($total_results, $token){
include dirname(__FILE__,2).'/settings/settings.php';
$pdo = dbConnect($dbname);
//Check if product version exists (else create) => store related measurement
foreach ($total_results as $products => $product){
//Product level
foreach ($product as $versions => $version){
//Version level
//Check version exist
$sql = 'SELECT p.*, pv.rowID as versionID, pv.productrowid as productID FROM products p JOIN products_versions pv ON p.rowID = pv.productrowid WHERE p.productcode = ? and version = ?;';
$stmt = $pdo->prepare($sql);
$versions = ($versions != 'blank')? $versions : '';
$stmt->execute([$products,$versions]);
$output = $stmt->fetchAll(PDO::FETCH_ASSOC);
//Prep data for api call
$api_url = '/v2/products_versions/';
$measurement = json_encode($version,JSON_UNESCAPED_UNICODE);
if (!empty($output)){
//Update version with latest measurement
$data = json_encode(array("rowID" => $output[0]['versionID'], "productrowid" => $output[0]['productID'], "status" => 1, "version" => $versions, "measurement" => $measurement), JSON_UNESCAPED_UNICODE);
ioApi($api_url,$data,$token);
}
else {
//Insert new version
//GET PRODUCT ID
$sql = 'SELECT * FROM products WHERE productcode = ?';
$stmt = $pdo->prepare($sql);
$stmt->execute([$products]);
$output = $stmt->fetchAll(PDO::FETCH_ASSOC);
//CALL API
$data = json_encode(array("productrowid" => $output[0]['rowID'], "status" => 1, "version" => $versions , "measurement" => $measurement), JSON_UNESCAPED_UNICODE);
ioApi($api_url,$data,$token);
}
}
}
}
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++
// store measurement data into equipment data ++++++++++
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++
function storeMeasurementEquipment($serialnumber){
include dirname(__FILE__,2).'/settings/settings.php';
//Connect to DB
$pdo = dbConnect($dbname);
//CHECK FOR SERIALNUMBER PROVIDED
$clause = (!empty($serialnumber) || $serialnumber !='')? 'e.serialnumber = "'.$serialnumber.'" AND': '';
//GET DATA
$sql = 'SELECT h.rowID, h.description,h.equipmentid,p.productcode,e.hw_version FROM history h JOIN equipment e ON h.equipmentid = e.rowID JOIN products p ON e.productrowid = p.rowID where '.$clause.' type="Maintenance_Test" and description like "%doubletestvalues%"';
$stmt = $pdo->prepare($sql);
$stmt->execute();
$messages = $stmt->fetchAll(PDO::FETCH_ASSOC);
$tests[] ='';
foreach ($messages as $message){
$dataset = json_decode($message['description'],true);
$dataset = $dataset["doubletestvalues"];
foreach ($dataset as $measure){
//Filter out correct measurements
if ($measure['pass'] === true){
$measurementid = $message['productcode'].'||'.$message['hw_version'].'||'.$message['equipmentid'].'||'.$message['rowID'];
$tests[$measurementid] [$measure['name']]= $measure['measure'];
}
}
}
//COMPARISON -- CHECK DEVIATIONS FROM STANDARD
//LOOP over all test results
foreach ($tests as $test => $test_values){
//GET the productcode and version from Test result
if (str_contains($test,'||')){
$identification = explode('||',$test);
//GET RELATED PRODUCT DATA
$sql = 'SELECT pv.measurement FROM products_versions pv JOIN products p ON pv.productrowid = p.rowID WHERE p.productcode = ? AND pv.version = ?';
$stmt = $pdo->prepare($sql);
$stmt->execute([$identification[0],$identification[1]]);
$product_measurements = $stmt->fetchAll(PDO::FETCH_ASSOC);
$product_measurements = $product_measurements[0]['measurement'];
if (!empty($product_measurements)){
//Only run when there is a product version found
$product_measurements = json_decode($product_measurements,true);
$equipment_watchlist[] = '';
//Filter out non array or non objects
if (is_object($test_values) || is_array($test_values)){
//get individual test_mesurements
foreach($test_values as $test_measurement => $measured_value){
//Loop over the related product measurements
foreach($product_measurements as $product_measurement => $product_measured_values){
//Compare measured test with product measured test
if ($test_measurement == $product_measurement){
//Get the measured value from test
if (($measured_value <= $product_measured_values['stdev-3']) && ($measured_value >= $product_measured_values['stdev+3'])){
$equipment_watchlist[$test][] = array(
"measurement" => $test_measurement,
"value" => $measured_value,
"deviation" => 3
);
}
elseif ((($measured_value <= $product_measured_values['stdev-2']) && ($measured_value >= $product_measured_values['stdev-3'])) || (($measured_value >= $product_measured_values['stdev+2']) && ($measured_value <= $product_measured_values['stdev+3']))){
$equipment_watchlist[$test][] = array(
"measurement" => $test_measurement,
"value" => $measured_value,
"deviation" => 2
);
}
elseif ((($measured_value <= $product_measured_values['stdev-1']) && ($measured_value >= $product_measured_values['stdev-2'])) || (($measured_value >= $product_measured_values['stdev+1']) && ($measured_value <= $product_measured_values['stdev+2']))){
$equipment_watchlist[$test][] = array(
"measurement" => $test_measurement,
"value" => $measured_value,
"deviation" => 1
);
}
}
}
}
}
}
}
}
//STORE RESULTS IN EQUIPMENT DATA
foreach ($equipment_watchlist as $equipment => $data){
//GET the equipmentid and historyid from watchlist
if (str_contains($equipment,'||')){
$identification = explode('||',$equipment);
//json_encode array
$data = json_encode($data,JSON_UNESCAPED_UNICODE);
//Check if record exists
$sql = 'SELECT * FROM equipment_data WHERE equipmentid = ? and historyid =?';
$stmt = $pdo->prepare($sql);
$stmt->execute([$identification[2],$identification[3]]);
$equipment_data = $stmt->fetchAll(PDO::FETCH_ASSOC);
if (!empty($equipment_data)){
//EXIST UPDATE
$sql = 'UPDATE equipment_data SET measurement = ? WHERE equipmentid = ? and historyid =?';
}
else {
//EXIST INSERT
$sql = 'INSERT INTO equipment_data (measurement, equipmentid, historyid) VALUES (?,?,?)';
}
//EXECUTE QUERY
$stmt = $pdo->prepare($sql);
$stmt->execute([$data, $identification[2],$identification[3]]);
$equipment_data = $stmt->fetchAll(PDO::FETCH_ASSOC);
}
}
}

View File

@@ -24,6 +24,7 @@ $update_allowed = isAllowed($page ,$_SESSION['profile'],$_SESSION['permission'],
$update_allowed_edit = isAllowed($page_manage ,$_SESSION['profile'],$_SESSION['permission'],'U');
$delete_allowed = isAllowed($page_manage ,$_SESSION['profile'],$_SESSION['permission'],'D');
$create_allowed = isAllowed($page_manage ,$_SESSION['profile'],$_SESSION['permission'],'C');
$view_product = isAllowed('product' ,$_SESSION['profile'],$_SESSION['permission'],'R');
//GET Details from URL
$GET_VALUES = urlGETdetails($_GET) ?? '';
@@ -142,11 +143,11 @@ $view .= ' <div class="content-block order-details">
</div>
<div class="order-detail">
<h3>'.$product_code.'</h3>
<p>'.$responses->productcode.'</p>
<p>'.(($view_product == 1)? '<a href="index.php?page=product&rowID='.$responses->productrowid.'" class="btn2">'.$responses->productcode.'</a>':$responses->productcode).'</p>
</div>
<div class="order-detail">
<h3>'.$product_name.'</h3>
<p>'.$responses->productname.'</p>
<p>'.(($view_product == 1)? '<a href="index.php?page=product&rowID='.$responses->productrowid.'" class="btn2">'.$responses->productname.'</a>':$responses->productname).'</p>
</div>';
$picture = glob("./assets/images/products/".$responses->productcode.".{jpg,jpeg,png,gif}", GLOB_BRACE);

View File

@@ -26,6 +26,16 @@ if ($update_allowed === 1){
//GEOLOCATION UPDATE
convertCartest();
}
if (isset($_POST['updateproductmeusurements'])){
$total_measurement = traintotalMeasurement();
$total_results = statisticalAnalyses($total_measurement);
storeMeasurementProduct($total_results, $_SESSION['userkey']);
}
if (isset($_POST['updateequipmentmeusurements'])){
storeMeasurementEquipment('');
}
}
// Handle success messages
@@ -56,21 +66,39 @@ $view .='
$view .= '<div class="tabs">
<a href="#" class="active">'.$general_actions .'</a>
<a href="#" class="">Learning</a>
</div>
';
if ($update_allowed === 1){
$view .= '<div class="content-block tab-content active">
<div class="form responsive-width-100">
<label for="service">Expired contract closure</label>
<input type="submit" name="closeContract" style="width: 15%;" value="closeContract" class="btn">
<label for="service">CarTestUpdate</label>
<input type="submit" name="updatecartest" style="width: 15%;" value="CarTestUpdate" class="btn">
<label for="service">GeoUpdate</label>
<input type="submit" name="geoupdate" style="width: 15%;" value="GeoUpdate" class="btn">
<div class="form responsive-width-100">
<label for="service">Expired contract closure</label>
<input type="submit" name="closeContract" style="width: 15%;" value="closeContract" class="btn">
</div>
<div class="form responsive-width-100">
<label for="service">CarTestUpdate</label>
<input type="submit" name="updatecartest" style="width: 15%;" value="CarTestUpdate" class="btn">
</div>
<div class="form responsive-width-100">
<label for="service">GeoUpdate</label>
<input type="submit" name="geoupdate" style="width: 15%;" value="GeoUpdate" class="btn">
</div>
</div>
</div>';
}
if ($update_allowed === 1){
$view .= '<div class="content-block tab-content">
<div class="form responsive-width-100">
<label for="service">Train Products</label>
<input type="submit" name="updateproductmeusurements" style="width: 15%;" value="Train Products" class="btn">
</div>
<div class="form responsive-width-100">
<label for="service">Train Assets</label>
<input type="submit" name="updateequipmentmeusurements" style="width: 15%;" value="Train Assets" class="btn">
</div>
</div>';
}
$view .= '</form>';
//Output

View File

@@ -164,6 +164,7 @@ $view .= '<div class="content-block">
<thead>
<tr>
<th>'.$product_version_number.'</th>
<th>'.$product_status.'</th>
<th>'.$product_version_version.'</th>
<th>'.$product_version_software .'</th>
<th>'.$general_actions.'</th>
@@ -171,8 +172,10 @@ $view .= '<div class="content-block">
</thead>
<tbody>';
foreach ($product_versions as $version){
$view .= '<tr>
<td>'.$version->rowID.'</td>
<td>'.(($version->status == 1)? '<span class="status enabled">'.$prod_status_1:'<span class="status">'.$prod_status_0).'</td>
<td>'.$version->version.'</td>
<td>'.$version->software.'</td>
<td><a href="index.php?page=products_versions&productrowid='.$_GET['rowID'].'&rowID='.$version->rowID.'" class="btn_link">'.$general_view.'</a></td>

View File

@@ -132,11 +132,41 @@ $view .= '<div class="content-block tab-content active">
<input id="name" type="text" name="software" placeholder="'.$product_version_software.'" value="'.$products_versions['software'].'" required>
';
if (isset($_GET['rowID']) && $_GET['rowID'] !=''){
if (isset($_GET['rowID']) && $_GET['rowID'] !='' && !empty($products_versions['measurement'])){
$measurements = json_decode($products_versions['measurement'],true);
$view .= '
<label for="">'.$product_version_measurement.'</label>
<textarea><pre>'.$products_versions['measurement'].'</pre></textarea>
<div class="table">
<table>
<thead>
<tr>
<td>Test</td>
<td>N</td>
<td>Average</td>
<td>Median</td>
<td>STdev</td>
</tr>
</thead>
<tbody>
';
foreach ($measurements as $name => $measurement){
$view .='
<tr>
<td>'.$name.'</td>
<td>'.$measurement['n'].'</td>
<td>'.$measurement['average'].'</td>
<td>'.$measurement['median'].'</td>
<td>'.$measurement['stdev'].'</td>
</tr>
';
}
$view .= '</tbody>
</table>
</div>';
}
$view .= '
<input type="hidden" name="rowID" value="'.$products_versions['rowID'].'">