From 7bf910c800aca93ac3b206e7213b7212bb84d2b6 Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Sat, 31 May 2025 09:57:26 +0530 Subject: [PATCH] Added testing_Panel_controller file with GET and POST API method --- .../Controllers/TestingPanelController.php | 492 ++++++++++++++++++ routes/api.php | 11 +- 2 files changed, 499 insertions(+), 4 deletions(-) create mode 100644 app/Http/Controllers/TestingPanelController.php diff --git a/app/Http/Controllers/TestingPanelController.php b/app/Http/Controllers/TestingPanelController.php new file mode 100644 index 0000000..22a85a0 --- /dev/null +++ b/app/Http/Controllers/TestingPanelController.php @@ -0,0 +1,492 @@ +header('Authorization'); + $expectedToken = $expectedUser . ':' . $expectedPw; + + if("Bearer " . $expectedToken !== $header_auth) + { + return response("Unauthorized", 403) + ->header('Content-Type', 'text/plain'); + } + $data = $request->all(); + + if ($data['plant_code'] == '' || !ctype_digit($data['plant_code'])) { + // return response("ERROR: Please provide a valid plant code.", 400) + // ->header('Content-Type', 'text/plain'); + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => 'Please provide a valid plant code.' + ], 400); + } + + $plant = Plant::where('code', $data['plant_code'])->first(); + if (!$plant) { + //return response("Plant not found.", 400)->header('Content-Type', 'text/plain'); + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => 'Plant not found.' + ], 400); + } + $plantId = $plant->id; + + $line = \App\Models\Line::where('name', $data['line_name'])->first(); + if (!$line) + { + //return response("Line not found.", 400)->header('Content-Type', 'text/plain'); + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => 'Line not found.' + ], 400); + } + + $line = \App\Models\Line::where('name', $data['line_name']) + ->where('plant_id', $plantId) + ->first(); + + if (!$line) + { + //return response( "Line not found for the specified plant : {$data['plant_code']}",400)->header('Content-Type', 'text/plain'); + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Line not found for the specified plant : {$data['plant_code']}." + ], 400); + } + + $lineId = $line->id; + + $machine = \App\Models\Machine::where('name', $data['machine_name']) + ->first(); + + if (!$machine) + { + // return response('Machine not found', 400)->header('Content-Type', 'text/plain'); + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => 'Machine not found.' + ], 400); + } + + $machine = \App\Models\Machine::where('name', $data['machine_name']) + ->where('plant_id', $plantId) + ->first(); + + if (!$machine) + { + // return response("Machine not found for the specified plant : {$data['plant_code']}", 400)->header('Content-Type', 'text/plain'); + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Machine not found for the specified plant : {$data['plant_code']}." + ], 400); + } + + $machine = \App\Models\Machine::where('name', $data['machine_name']) + ->where('line_id', $lineId) + ->first(); + + if (!$machine) + { + // return response("Machine not found for the specified line : {$data['line_name']}", 400)->header('Content-Type', 'text/plain'); + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Machine not found for the specified line : {$data['line_name']}." + ], 400); + + } + + $machine = \App\Models\Machine::where('name', $data['machine_name']) + ->where('plant_id', $plantId) + ->where('line_id', $lineId) + ->first(); + + if (!$machine) { + // return response('Machine not found for the specified plant and line', 400) + // ->header('Content-Type', 'text/plain'); + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => 'Machine not found for the specified plant and line.' + ], 400); + } + $machineId = $machine->id; + + try + { + $insertedSerials = []; + $missedItemCodes = []; + $duplicateItemCodes = []; + $existSnoCount = []; + + + if (!empty($data['item_codes']) && is_array($data['item_codes'])) + { + + foreach ($data['item_codes'] as $item) + { + $code = $item['item_code'] ?? null; + + // Check if item_code is present + if ($code == '') + { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => 'Item code cannot be empty.' + ], 400); + } + + // Collect duplicates + if (isset($itemCodeCounts[$code])) + { + $itemCodeCounts[$code]++; + // Only add to duplicates array once + if ($itemCodeCounts[$code] == 2) { + $duplicateItemCodes[] = $code; + } + } + else + { + $itemCodeCounts[$code] = 1; + } + + $motorTestingMaster = MotorTestingMaster::whereHas('item', function ($query) use ($item) { + $query->where('code', $item['item_code']); + })->where('plant_id', $plantId)->first(); + + if (!$motorTestingMaster) { + $missedItemCodes[] = $item['item_code']; + } + + if (!empty($item['serial_numbers']) && is_array($item['serial_numbers'])) { + foreach ($item['serial_numbers'] as $serial) + { + $existSnoCount[] = $serial['serial_number']; + } + } + } + + // If any duplicates found, return error + if (!empty($duplicateItemCodes)) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => 'Duplicate item codes found in request: ' . implode(', ', $duplicateItemCodes) + ], 400); + } + + $uniqueInvalidCodes = array_unique($missedItemCodes); + + if (!empty($uniqueInvalidCodes)) { + + // return response("Item codes : ". implode(', ', $uniqueInvalidCodes)." not found in motor testing master for the specified plant {$plant->name}", 400) + // ->header('Content-Type', 'text/plain'); + + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Item codes : ". implode(', ', $uniqueInvalidCodes)." not found in master for the specified plant : {$plant->name}" + ], 400); + } + + $insertedSnoCount = []; + + foreach ($data['item_codes'] as $item) + { + + $motorTestingMaster = \App\Models\MotorTestingMaster::whereHas('item', callback: function ($query) use ($item) { + $query->where('code', $item['item_code']); + })->where('plant_id', $plantId)->first(); + + $motorTestingMasterId = $motorTestingMaster->id; + + if (!empty($item['serial_numbers']) && is_array($item['serial_numbers'])) + { + foreach ($item['serial_numbers'] as $serial) + { + + //For update_count calculation + $updateCount = [ + 'plant_id' => $plantId, + 'line_id' => $lineId, + 'machine_id' => $machineId, + 'motor_testing_master_id' => $motorTestingMasterId, + 'serial_number' => $serial['serial_number'] ?? null, + 'rework_count' => $serial['rework_count'] ?? 0, + ]; + + // Find the current max update_count for this composite key + // $maxUpdateCount = \App\Models\TestingPanelReading::where($updateCount)->max('update_count'); + $maxUpdateCount = TestingPanelReading::where($updateCount) + ->select(TestingPanelReading::raw('MAX(CAST(update_count AS INTEGER)) AS max_update_count')) + ->value('max_update_count'); + + $newUpdateCount = ($maxUpdateCount === null || $maxUpdateCount === '') ? 0 : $maxUpdateCount + 1; + + $updateCountString = (string) $newUpdateCount; + + + $row = + [ + 'plant_id' => $plantId, + 'line_id' => $lineId, + 'machine_id' => $machineId, + 'motor_testing_master_id'=> $motorTestingMasterId, + 'serial_number' => $serial['serial_number'] ?? null, + 'output' => $serial['output'] ?? null, + 'before_fr_volt' => $serial['before_fr_volt'] ?? null, + 'before_fr_cur' => $serial['before_fr_cur'] ?? null, + 'before_fr_pow' => $serial['before_fr_pow'] ?? null, + 'before_fr_res_ry' => $serial['before_fr_res_ry'] ?? null, + 'before_fr_res_yb' => $serial['before_fr_res_yb'] ?? null, + 'before_fr_res_br' => $serial['before_fr_res_br'] ?? null, + 'before_fr_ir' => $serial['before_fr_ir'] ?? null, + 'before_fr_ir_r' => $serial['before_fr_ir_r'] ?? null, + 'before_fr_ir_y' => $serial['before_fr_ir_y'] ?? null, + 'before_fr_ir_b' => $serial['before_fr_ir_b'] ?? null, + 'before_fr_freq' => $serial['before_fr_freq'] ?? null, + 'before_fr_speed' => $serial['before_fr_speed'] ?? null, + 'after_fr_vol' => $serial['after_fr_vol'] ?? null, + 'after_fr_cur' => $serial['after_fr_cur'] ?? null, + 'after_fr_pow' => $serial['after_fr_pow'] ?? null, + 'after_fr_ir_hot' => $serial['after_fr_ir_hot'] ?? null, + 'after_fr_ir_hot_r' => $serial['after_fr_ir_hot_r'] ?? null, + 'after_fr_ir_hot_y' => $serial['after_fr_ir_hot_y'] ?? null, + 'after_fr_ir_hot_b' => $serial['after_fr_ir_hot_b'] ?? null, + 'after_fr_ir_cool' => $serial['after_fr_ir_cool'] ?? null, + 'after_fr_ir_cool_r' => $serial['after_fr_ir_cool_r'] ?? null, + 'after_fr_ir_cool_y' => $serial['after_fr_ir_cool_y'] ?? null, + 'after_fr_ir_cool_b' => $serial['after_fr_ir_cool_b'] ?? null, + 'after_fr_freq' => $serial['after_fr_freq'] ?? null, + 'after_fr_speed' => $serial['after_fr_speed'] ?? null, + 'after_fr_leak_cur' => $serial['after_fr_leak_cur'] ?? null, + 'locked_rt_volt' => $serial['locked_rt_volt'] ?? null, + 'locked_rt_cur' => $serial['locked_rt_cur'] ?? null, + 'locked_rt_pow' => $serial['locked_rt_pow'] ?? null, + 'no_load_pickup_volt' => $serial['no_load_pickup_volt'] ?? null, + 'room_temperature' => $serial['room_temperature'] ?? null, + 'hv_test' => $serial['hv_test'] ?? null, + 'batch_number' => $serial['batch_number'] ?? null, + 'batch_count' => $serial['batch_count'] ?? 0, + 'result' => $serial['result'] ?? null, + 'remark' => $serial['remark'] ?? null, + 'rework_count' => $serial['rework_count'] ?? 0, + 'output_flag' => $serial['output_flag'] ?? 0, + 'tested_by' => $serial['tested_by'] ?? null, + 'updated_by' => $serial['updated_by'] ?? null, + 'created_at' => $serial['created_at'] ?? null, + 'updated_at' => $serial['updated_at'] ?? $serial['created_at'], + 'scanned_at' => $serial['scanned_at'] ?? null, + 'update_count' => $updateCountString, + ]; + + // Insert the new record + TestingPanelReading::create($row); + $insertedSerials[] = $serial['serial_number'] ?? '[unknown]'; + $insertedSnoCount[] = $serial['serial_number']; + } + } + } + } + + if (!empty($insertedSerials)) + { + if(count($existSnoCount) == count($insertedSnoCount)) + { + // $messages[] = "Inserted serial numbers are: " . implode(', ', $insertedSerials); + return response()->json([ + 'status_code' => 'SUCCESS', + 'status_description' => 'Inserted serial numbers are: ' . implode(', ', $insertedSerials) + ], 200); + } + else + { + // $missingSno = array_diff($existSnoCount,$insertedSnoCount); + // $messages[] = "Missed serial numbers are: " . implode(', ', $missingSno); + + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => 'Missed serial numbers are: " . implode(', ', $missingSno)' + ], 400); + } + + } + + // return response("" . implode("\n", $messages), 200) + // ->header('Content-Type', 'text/plain'); + + + } + catch (\Exception $e) + { + // return response($e->getMessage(), 500)->header('Content-Type', 'text/plain'); + + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => 'Internal Sever Error : '.$e->getCode() + ], 500); + } + } + + /** + * Display the specified resource. + */ + public function get_motor_master(Request $request) + { + $expectedUser = env('API_AUTH_USER'); + $expectedPw = env('API_AUTH_PW'); + $header_auth = $request->header('Authorization'); + $expectedToken = $expectedUser . ':' . $expectedPw; + + if("Bearer " . $expectedToken !== $header_auth) + { + return response("Unauthorized", 403) + ->header('Content-Type', 'text/plain'); + } + + //$data = $request->all(); + + if ("Bearer " . $expectedToken !== $header_auth) + { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => 'Invalid authorization token' + ], 403); + } + + $plantCode = $request->header('plant-code'); + $itemCode = $request->header('item-code'); + // $description = $item ? $item->description : ''; + + // Fetch item by code + $item = Item::where('code', $itemCode)->first(); + + // Get description or empty string if not found + $description = $item ? $item->description : ''; + if ($plantCode === null || $plantCode === '') + { + // return response("ERROR: Plant Name can't be empty", 400) + // ->header('Content-Type', 'text/plain'); + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Plant Name cannot be empty" + ], 400); + } + else if($itemCode == null || $itemCode == '') + { + // return response("ERROR: OBD Number can't be empty", 400) + // ->header('Content-Type', 'text/plain'); + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Item Code cannot be empty" + ], 400); + } + + $plant = Plant::where('code', $plantCode)->first(); + + if (!$plant) { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Plant not found" + ], 400); + } + + $plantId = $plant->id; + + $item = Item::where('code', $itemCode)->first(); + + if (!$item) + { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Item Code not found for plant : $plant->name" + ], 404); + } + + $motorTestingMaster = MotorTestingMaster::where('plant_id', $plant->id) + ->where('item_id', $item->id) + ->first(); + + if (!$motorTestingMaster) + { + return response()->json([ + 'status_code' => 'ERROR', + 'status_description' => "Item Code not found in master for the plant : $plant->name" + ], 404); + } + + $output = [ + "mot_model_name" => $description?? "", + "mot_non_isi_model" => $motorTestingMaster->isi_model ? "0" :"1", + "mot_phase" => $motorTestingMaster->phase ?? "", + "mot_hp" => $motorTestingMaster->hp ?? "", + "mot_kw" => $motorTestingMaster->kw ?? "", + "mot_volt" => $motorTestingMaster->volt ?? "", + "mot_cur" => $motorTestingMaster->current ?? "", + "mot_rpm" => $motorTestingMaster->rpm ?? "", + "mot_rate_torque_kg" => $motorTestingMaster->torque ?? "", + "mot_freq" => $motorTestingMaster->frequency ?? "", + "mot_conn" => $motorTestingMaster->connection ?? "", + "mot_ins_res_limit" => $motorTestingMaster->ins_res_limit ?? "", + "mot_ins_res_type" => $motorTestingMaster->ins_res_type ?? "", + "mot_res_ry_ll" => $motorTestingMaster->res_ry_ll ?? "", + "mot_res_ry_ul" => $motorTestingMaster->res_ry_ul ?? "", + "mot_res_yb_ll" => $motorTestingMaster->res_yb_ll ?? "", + "mot_res_yb_ul" => $motorTestingMaster->res_yb_ul ?? "", + "mot_res_br_ll" => $motorTestingMaster->res_br_ll ?? "", + "mot_res_br_ul" => $motorTestingMaster->res_br_ul ?? "", + "mot_lock_volt_limit" => $motorTestingMaster->lock_volt_limit ?? "", + "mot_leak_cur_limit" => $motorTestingMaster->leak_cur_limit ?? "", + "mot_lock_cur_ll" => $motorTestingMaster->lock_cur_ll ?? "", + "mot_lock_cur_ul" => $motorTestingMaster->lock_cur_ul ?? "", + "mot_noload_cur_ll" => $motorTestingMaster->noload_cur_ll ?? "", + "mot_noload_cur_ul" => $motorTestingMaster->noload_cur_ul ?? "", + "mot_noload_pow_ll" => $motorTestingMaster->noload_pow_ll ?? "", + "mot_noload_pow_ul" => $motorTestingMaster->noload_pow_ul ?? "", + "mot_noload_spd_ll" => $motorTestingMaster->noload_spd_ll ?? "", + "mot_noload_spd_ul" => $motorTestingMaster->noload_spd_ul ?? "", + ]; + + + return response()->json($output, 200); + + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, string $id) + { + // + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(string $id) + { + // + } +} diff --git a/routes/api.php b/routes/api.php index 058f080..4516e70 100644 --- a/routes/api.php +++ b/routes/api.php @@ -1,6 +1,7 @@ withoutMiddleware(VerifyCsrfToken::class); +Route::post('obd/store-data', [ObdController::class, 'store']); -Route::post('obd/store-test-data', [ObdController::class, 'test']) - ->withoutMiddleware(VerifyCsrfToken::class); +Route::post('obd/store-test-datas', [ObdController::class, 'test']);//->withoutMiddleware(VerifyCsrfToken::class) Route::get('obd/store-data/get', [ObdController::class, 'get_obd']); +Route::post('testing/reading/store-data', [TestingPanelController::class, 'store']); + +Route::get('testing/item/get-master-data', [TestingPanelController::class, 'get_motor_master']); +